public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
From: daniel.lezcano@linaro.org (Daniel Lezcano)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 04/25] clocksource: Add Owl timer
Date: Tue, 28 Feb 2017 18:39:50 +0100	[thread overview]
Message-ID: <20170228173950.GD30601@mai> (raw)
In-Reply-To: <1994faec-7936-aa96-87b4-df48f75f179b@suse.de>

On Tue, Feb 28, 2017 at 06:08:06PM +0100, Andreas F?rber wrote:

[ ... ]

> > Instead of computing again and again the base, why not just precompute:
> > 
> > 	owl_clksrc_base = owl_timer_base + owl_timer_info->timer_offset[OWL_TIMER0]
> > 	owl_clkevt_base = owl_timer_base + owl_timer_info->timer_offset[OWL_TIMER1]
> > 
> >   at init time.
> > 
> > And use these variables directly in the functions.
> 
> Either that, or revert to previous simpler behavior...

Not sure to get what the 'previous simpler behavior' is, but until it does not
recompute the offset each time, I'm fine with that.

> >> +}
> >> +
> >> +static inline void owl_timer_reset(unsigned index)
> >> +{
> >> +	void __iomem *base;
> >> +
> >> +	base = owl_timer_get_base(index);
> >> +	if (!base)
> >> +		return;
> > 
> > Same here, this test is pointless.
> 
> Seems like you didn't look at the following patch yet. It sets two S500
> offsets as -1, i.e. non-existant, which then results in NULL here.

May be I missed something, but so far, the base addresses must be setup before
reset is called, no?

> >> +	writel(0, base + OWL_Tx_CTL);
> >> +	writel(0, base + OWL_Tx_VAL);
> >> +	writel(0, base + OWL_Tx_CMP);
> >> +}
> > 
> > I suggest:
> > 
> > static inline void owl_timer_reset(void __iomem *addr)
> > {
> > 	writel(0, addr + OWL_Tx_CTL);
> > 	writel(0, addr + OWL_Tx_VAL);
> > 	writel(0, addr + OWL_Tx_CMP);
> > }
> 
> OK
> 
> >> +
> >> +static u64 notrace owl_timer_sched_read(void)
> >> +{
> >> +	return (u64)readl(owl_timer_get_base(0) + OWL_Tx_VAL);
> > 
> > 	return (u64)readl(owl_clksrc_base + OWL_Tx_VAL);
> > 
> >> +}
> >> +
> > 
> > static inline int owl_timer_set_state_disable(struct clock_event_device *evt)
> > {
> > 	return writel(0, owl_clkevt_base + OWL_Tx_CTL);
> > }
> 
> That I don't like. Disabling is just setting a bit. We save a readl by
> just writing where we know it's safe. An API like this is not safe.

I don't get the point. Writing this simple function has the benefit to give the
reader the information about the disabling register. Even if it does make sense
for you, for me it has its purpose when I try to factor out different drivers
code.

> >> +static int owl_timer_set_state_shutdown(struct clock_event_device *evt)
> >> +{
> >> +	writel(0, owl_timer_get_base(0) + OWL_Tx_CTL);
> > 
> > 	return owl_timer_set_state_disable(evt);
> > 
> >> +
> >> +	return 0;
> >> +}
> >> +
> >> +static int owl_timer_set_state_oneshot(struct clock_event_device *evt)
> >> +{
> >> +	owl_timer_reset(1);
> > 
> > Do you really need to do reset here ? Why not just owl_timer_set_state_disable(evt) ?
> 
> Matches downstream, will consider changing.
> 
> >> +	return 0;
> >> +}
> >> +
> >> +static int owl_timer_tick_resume(struct clock_event_device *evt)
> >> +{
> >> +	return 0;
> >> +}
> >> +
> >> +static int owl_timer_set_next_event(unsigned long evt,
> >> +				    struct clock_event_device *ev)
> >> +{
> >> +	void __iomem *base = owl_timer_get_base(1);
> >> +
> >> +	writel(0, base + OWL_Tx_CTL);
> >> +
> >> +	writel(0, base + OWL_Tx_VAL);
> > 
> 
> Are you suggesting a while line here? The point was disable first, then
> initialize (2x), then activate. Maybe add comments instead?

I meant, base + OWL_Tx_CTL and base + OWL_Tx_VAL are set to zero since the
beginning. If their values do not change, it is not necessary to set their
values to zero again.
 
> >> +	writel(evt, base + OWL_Tx_CMP);
> >> +
> >> +	writel(OWL_Tx_CTL_EN | OWL_Tx_CTL_INTEN, base + OWL_Tx_CTL);
> >> +
> >> +	return 0;
> >> +}
> >> +
> >> +static struct clock_event_device owl_clockevent = {
> >> +	.name			= "owl_tick",
> >> +	.rating			= 200,
> >> +	.features		= CLOCK_EVT_FEAT_ONESHOT |
> >> +				  CLOCK_EVT_FEAT_DYNIRQ,
> >> +	.set_state_shutdown	= owl_timer_set_state_shutdown,
> >> +	.set_state_oneshot	= owl_timer_set_state_oneshot,
> >> +	.tick_resume		= owl_timer_tick_resume,
> >> +	.set_next_event		= owl_timer_set_next_event,
> >> +};
> >> +
> >> +static irqreturn_t owl_timer1_interrupt(int irq, void *dev_id)
> >> +{
> >> +	struct clock_event_device *evt = (struct clock_event_device *)dev_id;
> >> +
> >> +	writel(OWL_Tx_CTL_PD, owl_timer_get_base(1) + OWL_Tx_CTL);
> >> +
> >> +	evt->event_handler(evt);
> 
> Is there any guideline as to whether to clear such flag before or after?

Mmh, good question. I'm not sure it makes a different.

> >> +
> >> +	return IRQ_HANDLED;
> >> +}
> 
> Regards,
> Andreas
> 
> -- 
> SUSE Linux GmbH, Maxfeldstr. 5, 90409 N?rnberg, Germany
> GF: Felix Imend?rffer, Jane Smithard, Graham Norton
> HRB 21284 (AG N?rnberg)

-- 

 <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

  reply	other threads:[~2017-02-28 17:39 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-28  6:35 [PATCH v3 00/25] ARM: Initial Actions Semi S500 and S900 enablement Andreas Färber
2017-02-28  6:35 ` [PATCH v3 01/25] dt-bindings: Add vendor prefix for Actions Semi Andreas Färber
2017-02-28  6:35 ` [PATCH v3 02/25] dt-bindings: arm: Document Actions Semi S500 Andreas Färber
2017-02-28  6:35 ` [PATCH v3 03/25] dt-bindings: timer: Document Owl timer Andreas Färber
2017-02-28 12:39   ` Mark Rutland
2017-03-03  6:20     ` Rob Herring
2017-03-03 21:36       ` Andreas Färber
2017-02-28  6:35 ` [PATCH v3 04/25] clocksource: Add " Andreas Färber
2017-02-28 16:47   ` Daniel Lezcano
2017-02-28 17:08     ` Andreas Färber
2017-02-28 17:39       ` Daniel Lezcano [this message]
2017-02-28 18:01         ` Andreas Färber
2017-02-28 18:56           ` Thomas Gleixner
2017-02-28 18:53         ` Thomas Gleixner
2017-02-28  6:35 ` [PATCH v3 05/25] clocksource: owl: Add S900 support Andreas Färber
2017-02-28 17:16   ` Andreas Färber
2017-02-28 17:42     ` Daniel Lezcano
2017-02-28  6:35 ` [PATCH v3 06/25] ARM: Prepare Actions Semi S500 Andreas Färber
2017-02-28  6:35 ` [PATCH v3 07/25] ARM64: Prepare Actions Semi S900 Andreas Färber
2017-02-28  6:35 ` [PATCH v3 08/25] dt-bindings: serial: Document Actions Semi Owl UARTs Andreas Färber
2017-02-28  6:35 ` [PATCH v3 09/25] tty: serial: Add Actions Semi Owl UART earlycon Andreas Färber
2017-02-28  6:35 ` [PATCH v3 10/25] Documentation: kernel-parameters: Document owl earlycon Andreas Färber
2017-02-28  6:35 ` [PATCH v3 11/25] ARM: dts: Add Actions Semi S500 and LeMaker Guitar Andreas Färber
2017-02-28 12:32   ` Mark Rutland
2017-02-28 15:13     ` Andreas Färber
2017-03-01 18:43       ` Mark Rutland
2017-02-28  6:35 ` [PATCH v3 12/25] dt-bindings: Add vendor prefix for uCRobotics Andreas Färber
2017-02-28  6:35 ` [PATCH v3 13/25] dt-bindings: arm: Document Actions Semi S900 Andreas Färber
2017-02-28  6:35 ` [PATCH v3 14/25] ARM64: dts: Add Actions Semi S900 and Bubblegum-96 Andreas Färber
2017-02-28  6:35 ` [PATCH v3 15/25] MAINTAINERS: Add Actions Semi Owl section Andreas Färber
2017-02-28  6:35 ` [PATCH v3 16/25] tty: serial: owl: Implement console driver Andreas Färber
2017-02-28  6:35 ` [PATCH v3 17/25] ARM64: dts: actions: s900-bubblegum-96: Add fake uart5 clock Andreas Färber
2017-02-28  6:35 ` [PATCH v3 18/25] ARM: dts: s500-guitar-bb-rev-b: Add fake uart3 clock Andreas Färber
2017-02-28  6:35 ` [PATCH v3 19/25] dt-bindings: arm: cpus: Add S500 enable-method Andreas Färber
2017-03-03  6:21   ` Rob Herring
2017-02-28  6:35 ` [PATCH v3 20/25] ARM: owl: Implement CPU enable-method for S500 Andreas Färber
2017-03-01  7:19   ` kbuild test robot
2017-03-01 10:40     ` Andreas Färber
2017-03-03 23:00       ` Andreas Färber
2017-02-28  6:35 ` [PATCH v3 21/25] ARM: dts: s500: Set CPU enable-method Andreas Färber
2017-02-28  6:35 ` [PATCH v3 22/25] dt-bindings: power: Add Owl SPS power domains Andreas Färber
2017-03-03  6:21   ` Rob Herring
2017-02-28  6:35 ` [PATCH v3 23/25] soc: actions: Add Owl SPS Andreas Färber
2017-02-28  6:35 ` [PATCH v3 24/25] ARM: dts: s500: Add SPS node Andreas Färber
2017-02-28  6:35 ` [PATCH v3 25/25] ARM: owl: smp: Reimplement SPS power-gating for CPU2 and CPU3 Andreas Färber

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170228173950.GD30601@mai \
    --to=daniel.lezcano@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox