Messages in this thread Patch in this message | | | Date | Mon, 12 Jun 2017 09:30:31 +0200 | From | Daniel Lezcano <> | Subject | Re: [PATCH 2/2] drivers/clocksource/fttmr010: Implement delay timer |
| |
On Sun, Jun 11, 2017 at 11:26:17PM +0200, Linus Walleij wrote: > This timer is often used on the ARM architecture, so as with so > many siblings, we can implement delay timers, removing the need > for the system to calibrate jiffys at boot, and potentially > handling CPU frequency scaling on targets. > > We cannot just protect the Kconfig with a "depends on ARM" because > it is already known that different architectures are using Faraday > IP blocks, so it is better to make things open-ended and use > > Result on boot dmesg: > > Switching to timer-based delay loop, resolution 40n > Calibrating delay loop (skipped), value calculated using > timer frequency.. 50.00 BogoMIPS (lpj=250000) > > This is accurately the timer frequency, 250MHz on the APB > bus. > > Cc: Andrew Jeffery <andrew@aj.id.au> > Cc: Joel Stanley <joel@jms.id.au> > Cc: Jonas Jensen <jonas.jensen@gmail.com> > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > --- > drivers/clocksource/timer-fttmr010.c | 35 ++++++++++++++++++++++++++++++++++- > 1 file changed, 34 insertions(+), 1 deletion(-) > > diff --git a/drivers/clocksource/timer-fttmr010.c b/drivers/clocksource/timer-fttmr010.c > index 5e82469995cb..0074d89cd2ce 100644 > --- a/drivers/clocksource/timer-fttmr010.c > +++ b/drivers/clocksource/timer-fttmr010.c > @@ -17,6 +17,7 @@ > #include <linux/clk.h> > #include <linux/slab.h> > #include <linux/bitops.h> > +#include <linux/delay.h> > > /* > * Register definitions for the timers > @@ -81,9 +82,15 @@ struct fttmr010 { > bool count_down; > u32 t1_enable_val; > struct clock_event_device clkevt; > +#ifdef CONFIG_ARM > + struct delay_timer delay_timer; > +#endif > }; > > -/* A local singleton used by sched_clock, which is stateless */ > +/* > + * A local singleton used by sched_clock and delay timer reads, which are > + * fast and stateless > + */ > static struct fttmr010 *local_fttmr; > > static inline struct fttmr010 *to_fttmr010(struct clock_event_device *evt) > @@ -101,6 +108,20 @@ static u64 notrace fttmr010_read_sched_clock_down(void) > return ~readl(local_fttmr->base + TIMER2_COUNT); > } > > +#ifdef CONFIG_ARM > + > +static unsigned long fttmr010_read_current_timer_up(void) > +{ > + return readl(local_fttmr->base + TIMER2_COUNT); > +} > + > +static unsigned long fttmr010_read_current_timer_down(void) > +{ > + return ~readl(local_fttmr->base + TIMER2_COUNT); > +} > + > +#endif > +
These functions are duplicated with fttmr010_read_sched_clock_down() / fttmr010_read_sched_clock_up().
Could you factor them out?
eg.
static inline unsigned long fttmr010_read_current_timer_up(void) { return readl(local_fttmr->base + TIMER2_COUNT); }
static inline unsigned long fttmr010_read_current_timer_down(void) { return ~readl(local_fttmr->base + TIMER2_COUNT); }
static u64 notrace fttmr010_read_sched_clock_down(void) { return fttmr010_read_current_timer_down() }
static u64 notrace fttmr010_read_sched_clock_up(void) { return fttmr010_read_current_timer_up(); }
So we get rid of these CONFIG_ARM section above.
> static int fttmr010_timer_set_next_event(unsigned long cycles, > struct clock_event_device *evt) > { > @@ -349,6 +370,18 @@ static int __init fttmr010_timer_init(struct device_node *np) > fttmr010->tick_rate, > 1, 0xffffffff); > > +#ifdef CONFIG_ARM > + /* Also use this timer for delays */ > + if (fttmr010->count_down) > + fttmr010->delay_timer.read_current_timer = > + fttmr010_read_current_timer_down; > + else > + fttmr010->delay_timer.read_current_timer = > + fttmr010_read_current_timer_up; > + fttmr010->delay_timer.freq = fttmr010->tick_rate; > + register_current_timer_delay(&fttmr010->delay_timer); > +#endif > + > return 0; > > out_unmap: > -- > 2.9.4 >
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog
| |