[...] > --- > arch/mips/kernel/csrc-r4k.c | 37 +++++++++++++++++++++++++++++++++++++ > 1 files changed, 37 insertions(+), 0 deletions(-) > > diff --git a/arch/mips/kernel/csrc-r4k.c b/arch/mips/kernel/csrc-r4k.c > index e95a3cd..865035d 100644 > --- a/arch/mips/kernel/csrc-r4k.c > +++ b/arch/mips/kernel/csrc-r4k.c > @@ -6,10 +6,45 @@ > * Copyright (C) 2007 by Ralf Baechle > */ > #include <linux/clocksource.h> > +#include <linux/cnt32_to_63.h> > +#include <linux/timer.h> Sorry, <linux/timer.h> is not needed here, I have used it in the old version with setup_timer()/mod_timer(). > #include <linux/init.h> > > #include <asm/time.h> > > +/* > + * MIPS' sched_clock implementation. > + * > + * NOTE: because cnt32_to_63() needs to be called at least once per half period > + * to work properly, and some of the MIPS' frequency is very low, perhaps a > + * kernel timer is needed to be set up to ensure this requirement is always > + * met. please refer to arch/arm/plat-orion/time.c and > + * include/linux/cnt32_to_63.h > + */ > +static unsigned long tclk2ns_scale, tclk2ns_scale_factor; > + > +unsigned long long notrace sched_clock(void) > +{ > + unsigned long long v = cnt32_to_63(read_c0_count()); > + return (v * tclk2ns_scale) >> tclk2ns_scale_factor; > +} > + > +static void __init setup_sched_clock(struct clocksource *cs, unsigned long tclk) the tclk is not used, I have also used it in the old version with setup_timer()/mod_timer(). so, we can remove it for this version. > +{ > + unsigned long long v; > + > + v = cs->mult; > + /* > + * We want an even value to automatically clear the top bit > + * returned by cnt32_to_63() without an additional run time > + * instruction. So if the LSB is 1 then round it up. > + */ > + if (v & 1) > + v++; > + tclk2ns_scale = v; > + tclk2ns_scale_factor = cs->shift; > +} > + > static cycle_t c0_hpt_read(struct clocksource *cs) > { > return read_c0_count(); > @@ -32,6 +67,8 @@ int __init init_r4k_clocksource(void) > > clocksource_set_clock(&clocksource_mips, mips_hpt_frequency); > > + setup_sched_clock(&clocksource_mips, mips_hpt_frequency); > + And here should be setup_sched_clock(&clocksource_mips); Regards, Wu Zhangjin