1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 2022c03a2SMarc Zyngier /* 3022c03a2SMarc Zyngier * linux/arch/arm/kernel/arch_timer.c 4022c03a2SMarc Zyngier * 5022c03a2SMarc Zyngier * Copyright (C) 2011 ARM Ltd. 6022c03a2SMarc Zyngier * All Rights Reserved 7022c03a2SMarc Zyngier */ 8022c03a2SMarc Zyngier #include <linux/init.h> 98a4da6e3SMark Rutland #include <linux/types.h> 10fe7dc720SArnd Bergmann #include <linux/errno.h> 11022c03a2SMarc Zyngier 1256942fecSJonathan Austin #include <asm/delay.h> 13*05b1fd8bSBen Dooks #include <asm/arch_timer.h> 14022c03a2SMarc Zyngier 158a4da6e3SMark Rutland #include <clocksource/arm_arch_timer.h> 16f48b5f12SMarc Zyngier arch_timer_read_counter_long(void)178a4da6e3SMark Rutlandstatic unsigned long arch_timer_read_counter_long(void) 188a4da6e3SMark Rutland { 198a4da6e3SMark Rutland return arch_timer_read_counter(); 208a4da6e3SMark Rutland } 21f48b5f12SMarc Zyngier 2256942fecSJonathan Austin static struct delay_timer arch_delay_timer; 23d0a533b1SWill Deacon arch_timer_delay_timer_register(void)248a4da6e3SMark Rutlandstatic void __init arch_timer_delay_timer_register(void) 25f48b5f12SMarc Zyngier { 2656942fecSJonathan Austin /* Use the architected timer for the delay loop. */ 278a4da6e3SMark Rutland arch_delay_timer.read_current_timer = arch_timer_read_counter_long; 288a4da6e3SMark Rutland arch_delay_timer.freq = arch_timer_get_rate(); 2956942fecSJonathan Austin register_current_timer_delay(&arch_delay_timer); 30f48b5f12SMarc Zyngier } 31022c03a2SMarc Zyngier arch_timer_arch_init(void)320583fe47SRob Herringint __init arch_timer_arch_init(void) 333f61c80eSMarc Zyngier { 34023796b9SRob Herring u32 arch_timer_rate = arch_timer_get_rate(); 35023796b9SRob Herring 36023796b9SRob Herring if (arch_timer_rate == 0) 378a4da6e3SMark Rutland return -ENXIO; 383f61c80eSMarc Zyngier 390583fe47SRob Herring arch_timer_delay_timer_register(); 400583fe47SRob Herring 413f61c80eSMarc Zyngier return 0; 423f61c80eSMarc Zyngier } 43