From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752460AbdFLHah (ORCPT ); Mon, 12 Jun 2017 03:30:37 -0400 Received: from mail-wr0-f182.google.com ([209.85.128.182]:35513 "EHLO mail-wr0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752431AbdFLHag (ORCPT ); Mon, 12 Jun 2017 03:30:36 -0400 Date: Mon, 12 Jun 2017 09:30:31 +0200 From: Daniel Lezcano To: Linus Walleij Cc: Thomas Gleixner , Joel Stanley , Jonas Jensen , Janos Laube , Paulius Zaleckas , linux-arm-kernel@lists.infradead.org, Hans Ulli Kroll , Florian Fainelli , linux-kernel@vger.kernel.org, Andrew Jeffery Subject: Re: [PATCH 2/2] drivers/clocksource/fttmr010: Implement delay timer Message-ID: <20170612073031.GA2261@mai> References: <20170611212617.6906-1-linus.walleij@linaro.org> <20170611212617.6906-2-linus.walleij@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20170611212617.6906-2-linus.walleij@linaro.org> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 > Cc: Joel Stanley > Cc: Jonas Jensen > Signed-off-by: Linus Walleij > --- > 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 > #include > #include > +#include > > /* > * 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 > -- Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog