1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * SH-Mobile Timer 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2010 Magnus Damm 6*4882a593Smuzhiyun * Copyright (C) 2002 - 2009 Paul Mundt 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun #include <linux/platform_device.h> 9*4882a593Smuzhiyun #include <linux/clocksource.h> 10*4882a593Smuzhiyun #include <linux/delay.h> 11*4882a593Smuzhiyun #include <linux/of_address.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include "common.h" 14*4882a593Smuzhiyun shmobile_init_delay(void)15*4882a593Smuzhiyunvoid __init shmobile_init_delay(void) 16*4882a593Smuzhiyun { 17*4882a593Smuzhiyun struct device_node *np; 18*4882a593Smuzhiyun u32 max_freq = 0; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun for_each_of_cpu_node(np) { 21*4882a593Smuzhiyun u32 freq; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun if (!of_property_read_u32(np, "clock-frequency", &freq)) 24*4882a593Smuzhiyun max_freq = max(max_freq, freq); 25*4882a593Smuzhiyun } 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun if (!max_freq) 28*4882a593Smuzhiyun return; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* 31*4882a593Smuzhiyun * Calculate a worst-case loops-per-jiffy value 32*4882a593Smuzhiyun * based on maximum cpu core hz setting and the 33*4882a593Smuzhiyun * __delay() implementation in arch/arm/lib/delay.S. 34*4882a593Smuzhiyun * 35*4882a593Smuzhiyun * This will result in a longer delay than expected 36*4882a593Smuzhiyun * when the cpu core runs on lower frequencies. 37*4882a593Smuzhiyun */ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun if (!preset_lpj) 40*4882a593Smuzhiyun preset_lpj = max_freq / HZ; 41*4882a593Smuzhiyun } 42