diff options
Diffstat (limited to 'drivers/clocksource/mips-gic-timer.c')
| -rw-r--r-- | drivers/clocksource/mips-gic-timer.c | 20 | 
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/clocksource/mips-gic-timer.c b/drivers/clocksource/mips-gic-timer.c index b3ae38f36720..110347707ff9 100644 --- a/drivers/clocksource/mips-gic-timer.c +++ b/drivers/clocksource/mips-gic-timer.c @@ -19,6 +19,7 @@  static DEFINE_PER_CPU(struct clock_event_device, gic_clockevent_device);  static int gic_timer_irq;  static unsigned int gic_frequency; +static unsigned int gic_count_width;  static bool __read_mostly gic_clock_unstable;  static void gic_clocksource_unstable(char *reason); @@ -186,18 +187,21 @@ static void gic_clocksource_unstable(char *reason)  static int __init __gic_clocksource_init(void)  { -	unsigned int count_width;  	int ret;  	/* Set clocksource mask. */ -	count_width = read_gic_config() & GIC_CONFIG_COUNTBITS; -	count_width >>= __ffs(GIC_CONFIG_COUNTBITS); -	count_width *= 4; -	count_width += 32; -	gic_clocksource.mask = CLOCKSOURCE_MASK(count_width); +	gic_count_width = read_gic_config() & GIC_CONFIG_COUNTBITS; +	gic_count_width >>= __ffs(GIC_CONFIG_COUNTBITS); +	gic_count_width *= 4; +	gic_count_width += 32; +	gic_clocksource.mask = CLOCKSOURCE_MASK(gic_count_width);  	/* Calculate a somewhat reasonable rating value. */ -	gic_clocksource.rating = 200 + gic_frequency / 10000000; +	if (mips_cm_revision() >= CM_REV_CM3 || !IS_ENABLED(CONFIG_CPU_FREQ)) +		gic_clocksource.rating = 300; /* Good when frequecy is stable */ +	else +		gic_clocksource.rating = 200; +	gic_clocksource.rating += clamp(gic_frequency / 10000000, 0, 99);  	ret = clocksource_register_hz(&gic_clocksource, gic_frequency);  	if (ret < 0) @@ -260,7 +264,7 @@ static int __init gic_clocksource_of_init(struct device_node *node)  	if (mips_cm_revision() >= CM_REV_CM3 || !IS_ENABLED(CONFIG_CPU_FREQ)) {  		sched_clock_register(mips_cm_is64 ?  				     gic_read_count_64 : gic_read_count_2x32, -				     64, gic_frequency); +				     gic_count_width, gic_frequency);  	}  	return 0;  |