From: afaerber@suse.de (Andreas Färber)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 04/25] clocksource: Add Owl timer
Date: Tue, 28 Feb 2017 19:01:23 +0100 [thread overview]
Message-ID: <1e3b84be-12f5-bde7-a54d-e9ce835e4001@suse.de> (raw)
In-Reply-To: <20170228173950.GD30601@mai>
Am 28.02.2017 um 18:39 schrieb Daniel Lezcano:
> 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,
v2. :)
> 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?
They are known in advance, yes. Where/how we set them up is the culprit.
>>> 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.
I mean a proper _disable() function would need to do:
val = readl()
val &= ~bit;
writel(val)
Not just writel(0), overwriting any other bits. Therefore an inline
write would be faster - your concern elsewhere. I'll happily implement
the proper API if you prefer.
>>>> +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_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.
This is a callback, which I thought is re-entrant. VAL changes when the
timer is running, and CTL changes every time we enable the timer. We
could call _reset() here, but then we would be initializing CMP twice,
which again would be less performant then just setting the registers to
their final values directly.
>>>> + 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;
>>>> +}
Thanks,
Andreas
--
SUSE Linux GmbH, Maxfeldstr. 5, 90409 N?rnberg, Germany
GF: Felix Imend?rffer, Jane Smithard, Graham Norton
HRB 21284 (AG N?rnberg)
next prev parent reply other threads:[~2017-02-28 18:01 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
2017-02-28 18:01 ` Andreas Färber [this message]
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=1e3b84be-12f5-bde7-a54d-e9ce835e4001@suse.de \
--to=afaerber@suse.de \
--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;
as well as URLs for NNTP newsgroup(s).