* [PATCH v1 0/3] Few more cleanups for tegra-timer
@ 2019-06-09 19:27 Dmitry Osipenko
2019-06-09 19:27 ` [PATCH v1 1/3] clocksource/drivers/tegra: Remove duplicated use of per_cpu_ptr Dmitry Osipenko
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Dmitry Osipenko @ 2019-06-09 19:27 UTC (permalink / raw)
To: Daniel Lezcano, Joseph Lo, Thierry Reding, Jonathan Hunter,
Peter De Schrijver
Cc: linux-tegra, linux-kernel
Hello,
I took a look at tegra-timer once again and spotted few more things that
could be improved in addition to [0] which is already in linux-next.
Please apply this small series in addition to [0], thanks in advance!
[0] https://patchwork.ozlabs.org/project/linux-tegra/list/?series=111529
Dmitry Osipenko (3):
clocksource/drivers/tegra: Remove duplicated use of per_cpu_ptr
clocksource/drivers/tegra: Set and use timer's period
clocksource/drivers/tegra: Drop unneeded typecasting in one place
drivers/clocksource/timer-tegra.c | 47 +++++++++++++++++++------------
1 file changed, 29 insertions(+), 18 deletions(-)
--
2.21.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v1 1/3] clocksource/drivers/tegra: Remove duplicated use of per_cpu_ptr
2019-06-09 19:27 [PATCH v1 0/3] Few more cleanups for tegra-timer Dmitry Osipenko
@ 2019-06-09 19:27 ` Dmitry Osipenko
2019-06-10 8:11 ` Daniel Lezcano
2019-06-09 19:27 ` [PATCH v1 2/3] clocksource/drivers/tegra: Set and use timer's period Dmitry Osipenko
2019-06-09 19:27 ` [PATCH v1 3/3] clocksource/drivers/tegra: Drop unneeded typecasting in one place Dmitry Osipenko
2 siblings, 1 reply; 6+ messages in thread
From: Dmitry Osipenko @ 2019-06-09 19:27 UTC (permalink / raw)
To: Daniel Lezcano, Joseph Lo, Thierry Reding, Jonathan Hunter,
Peter De Schrijver
Cc: linux-tegra, linux-kernel
It was left unnoticed by accident, which means that the code could be
cleaned up a tad more.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
drivers/clocksource/timer-tegra.c | 40 +++++++++++++++++++------------
1 file changed, 25 insertions(+), 15 deletions(-)
diff --git a/drivers/clocksource/timer-tegra.c b/drivers/clocksource/timer-tegra.c
index 9406855781ff..6da169de47f9 100644
--- a/drivers/clocksource/timer-tegra.c
+++ b/drivers/clocksource/timer-tegra.c
@@ -216,6 +216,19 @@ static inline unsigned int tegra_irq_idx_for_cpu(int cpu, bool tegra20)
return TIMER10_IRQ_IDX + cpu;
}
+static inline unsigned long tegra_rate_for_timer(struct timer_of *to,
+ bool tegra20)
+{
+ /*
+ * TIMER1-9 are fixed to 1MHz, TIMER10-13 are running off the
+ * parent clock.
+ */
+ if (tegra20)
+ return 1000000;
+
+ return to->of_clk.rate;
+}
+
static int __init tegra_init_timer(struct device_node *np, bool tegra20,
int rating)
{
@@ -268,30 +281,27 @@ static int __init tegra_init_timer(struct device_node *np, bool tegra20,
for_each_possible_cpu(cpu) {
struct timer_of *cpu_to = per_cpu_ptr(&tegra_to, cpu);
+ unsigned long flags = IRQF_TIMER | IRQF_NOBALANCING;
+ unsigned long rate = tegra_rate_for_timer(&tegra_to, tegra20);
unsigned int base = tegra_base_for_cpu(cpu, tegra20);
unsigned int idx = tegra_irq_idx_for_cpu(cpu, tegra20);
+ unsigned int irq = irq_of_parse_and_map(np, idx);
- /*
- * TIMER1-9 are fixed to 1MHz, TIMER10-13 are running off the
- * parent clock.
- */
- if (tegra20)
- cpu_to->of_clk.rate = 1000000;
-
- cpu_to = per_cpu_ptr(&tegra_to, cpu);
- cpu_to->of_base.base = timer_reg_base + base;
- cpu_to->clkevt.rating = rating;
- cpu_to->clkevt.cpumask = cpumask_of(cpu);
- cpu_to->clkevt.irq = irq_of_parse_and_map(np, idx);
- if (!cpu_to->clkevt.irq) {
+ if (!irq) {
pr_err("failed to map irq for cpu%d\n", cpu);
ret = -EINVAL;
goto out_irq;
}
+ cpu_to->clkevt.irq = irq;
+ cpu_to->clkevt.rating = rating;
+ cpu_to->clkevt.cpumask = cpumask_of(cpu);
+ cpu_to->of_base.base = timer_reg_base + base;
+ cpu_to->of_clk.rate = rate;
+
irq_set_status_flags(cpu_to->clkevt.irq, IRQ_NOAUTOEN);
- ret = request_irq(cpu_to->clkevt.irq, tegra_timer_isr,
- IRQF_TIMER | IRQF_NOBALANCING,
+
+ ret = request_irq(cpu_to->clkevt.irq, tegra_timer_isr, flags,
cpu_to->clkevt.name, &cpu_to->clkevt);
if (ret) {
pr_err("failed to set up irq for cpu%d: %d\n",
--
2.21.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v1 2/3] clocksource/drivers/tegra: Set and use timer's period
2019-06-09 19:27 [PATCH v1 0/3] Few more cleanups for tegra-timer Dmitry Osipenko
2019-06-09 19:27 ` [PATCH v1 1/3] clocksource/drivers/tegra: Remove duplicated use of per_cpu_ptr Dmitry Osipenko
@ 2019-06-09 19:27 ` Dmitry Osipenko
2019-06-09 19:27 ` [PATCH v1 3/3] clocksource/drivers/tegra: Drop unneeded typecasting in one place Dmitry Osipenko
2 siblings, 0 replies; 6+ messages in thread
From: Dmitry Osipenko @ 2019-06-09 19:27 UTC (permalink / raw)
To: Daniel Lezcano, Joseph Lo, Thierry Reding, Jonathan Hunter,
Peter De Schrijver
Cc: linux-tegra, linux-kernel
The of_clk structure has a period field that is set up initially by
timer_of_clk_init(), that period value need to be adjusted for a case of
TIMER1-9 that are running at a fixed rate that doesn't match the clock's
rate. Note that the period value is currently used only by some of the
clocksource drivers internally and hence this is just a minor cleanup
change that doesn't fix anything.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
drivers/clocksource/timer-tegra.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/clocksource/timer-tegra.c b/drivers/clocksource/timer-tegra.c
index 6da169de47f9..089c2f51ed40 100644
--- a/drivers/clocksource/timer-tegra.c
+++ b/drivers/clocksource/timer-tegra.c
@@ -71,9 +71,9 @@ static int tegra_timer_shutdown(struct clock_event_device *evt)
static int tegra_timer_set_periodic(struct clock_event_device *evt)
{
void __iomem *reg_base = timer_of_base(to_timer_of(evt));
+ unsigned long period = timer_of_period(to_timer_of(evt));
- writel_relaxed(TIMER_PTV_EN | TIMER_PTV_PER |
- ((timer_of_rate(to_timer_of(evt)) / HZ) - 1),
+ writel_relaxed(TIMER_PTV_EN | TIMER_PTV_PER | (period - 1),
reg_base + TIMER_PTV);
return 0;
@@ -297,6 +297,7 @@ static int __init tegra_init_timer(struct device_node *np, bool tegra20,
cpu_to->clkevt.rating = rating;
cpu_to->clkevt.cpumask = cpumask_of(cpu);
cpu_to->of_base.base = timer_reg_base + base;
+ cpu_to->of_clk.period = DIV_ROUND_UP(rate, HZ);
cpu_to->of_clk.rate = rate;
irq_set_status_flags(cpu_to->clkevt.irq, IRQ_NOAUTOEN);
--
2.21.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v1 3/3] clocksource/drivers/tegra: Drop unneeded typecasting in one place
2019-06-09 19:27 [PATCH v1 0/3] Few more cleanups for tegra-timer Dmitry Osipenko
2019-06-09 19:27 ` [PATCH v1 1/3] clocksource/drivers/tegra: Remove duplicated use of per_cpu_ptr Dmitry Osipenko
2019-06-09 19:27 ` [PATCH v1 2/3] clocksource/drivers/tegra: Set and use timer's period Dmitry Osipenko
@ 2019-06-09 19:27 ` Dmitry Osipenko
2 siblings, 0 replies; 6+ messages in thread
From: Dmitry Osipenko @ 2019-06-09 19:27 UTC (permalink / raw)
To: Daniel Lezcano, Joseph Lo, Thierry Reding, Jonathan Hunter,
Peter De Schrijver
Cc: linux-tegra, linux-kernel
There is no need to cast void because kernel allows to do that without
a warning message from a compiler.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
drivers/clocksource/timer-tegra.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/clocksource/timer-tegra.c b/drivers/clocksource/timer-tegra.c
index 089c2f51ed40..c208908fa288 100644
--- a/drivers/clocksource/timer-tegra.c
+++ b/drivers/clocksource/timer-tegra.c
@@ -81,7 +81,7 @@ static int tegra_timer_set_periodic(struct clock_event_device *evt)
static irqreturn_t tegra_timer_isr(int irq, void *dev_id)
{
- struct clock_event_device *evt = (struct clock_event_device *)dev_id;
+ struct clock_event_device *evt = dev_id;
void __iomem *reg_base = timer_of_base(to_timer_of(evt));
writel_relaxed(TIMER_PCR_INTR_CLR, reg_base + TIMER_PCR);
--
2.21.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v1 1/3] clocksource/drivers/tegra: Remove duplicated use of per_cpu_ptr
2019-06-09 19:27 ` [PATCH v1 1/3] clocksource/drivers/tegra: Remove duplicated use of per_cpu_ptr Dmitry Osipenko
@ 2019-06-10 8:11 ` Daniel Lezcano
2019-06-10 10:39 ` Dmitry Osipenko
0 siblings, 1 reply; 6+ messages in thread
From: Daniel Lezcano @ 2019-06-10 8:11 UTC (permalink / raw)
To: Dmitry Osipenko, Joseph Lo, Thierry Reding, Jonathan Hunter,
Peter De Schrijver
Cc: linux-tegra, linux-kernel
Hi Dmitry,
On 09/06/2019 21:27, Dmitry Osipenko wrote:
> It was left unnoticed by accident, which means that the code could be
> cleaned up a tad more.
>
> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
> ---
> drivers/clocksource/timer-tegra.c | 40 +++++++++++++++++++------------
> 1 file changed, 25 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/clocksource/timer-tegra.c b/drivers/clocksource/timer-tegra.c
> index 9406855781ff..6da169de47f9 100644
> --- a/drivers/clocksource/timer-tegra.c
> +++ b/drivers/clocksource/timer-tegra.c
> @@ -216,6 +216,19 @@ static inline unsigned int tegra_irq_idx_for_cpu(int cpu, bool tegra20)
> return TIMER10_IRQ_IDX + cpu;
> }
>
> +static inline unsigned long tegra_rate_for_timer(struct timer_of *to,
> + bool tegra20)
> +{
> + /*
> + * TIMER1-9 are fixed to 1MHz, TIMER10-13 are running off the
> + * parent clock.
> + */
> + if (tegra20)
> + return 1000000;
Mind to take the opportunity to convert the literal value to a constant?
> +
> + return to->of_clk.rate;
> +}
> +
> static int __init tegra_init_timer(struct device_node *np, bool tegra20,
> int rating)
> {
> @@ -268,30 +281,27 @@ static int __init tegra_init_timer(struct device_node *np, bool tegra20,
>
> for_each_possible_cpu(cpu) {
> struct timer_of *cpu_to = per_cpu_ptr(&tegra_to, cpu);
> + unsigned long flags = IRQF_TIMER | IRQF_NOBALANCING;
> + unsigned long rate = tegra_rate_for_timer(&tegra_to, tegra20);
> unsigned int base = tegra_base_for_cpu(cpu, tegra20);
> unsigned int idx = tegra_irq_idx_for_cpu(cpu, tegra20);
> + unsigned int irq = irq_of_parse_and_map(np, idx);
>
> - /*
> - * TIMER1-9 are fixed to 1MHz, TIMER10-13 are running off the
> - * parent clock.
> - */
> - if (tegra20)
> - cpu_to->of_clk.rate = 1000000;
> -
> - cpu_to = per_cpu_ptr(&tegra_to, cpu);
> - cpu_to->of_base.base = timer_reg_base + base;
> - cpu_to->clkevt.rating = rating;
> - cpu_to->clkevt.cpumask = cpumask_of(cpu);
> - cpu_to->clkevt.irq = irq_of_parse_and_map(np, idx);
> - if (!cpu_to->clkevt.irq) {
> + if (!irq) {
> pr_err("failed to map irq for cpu%d\n", cpu);
> ret = -EINVAL;
> goto out_irq;
> }
>
> + cpu_to->clkevt.irq = irq;
> + cpu_to->clkevt.rating = rating;
> + cpu_to->clkevt.cpumask = cpumask_of(cpu);
> + cpu_to->of_base.base = timer_reg_base + base;
> + cpu_to->of_clk.rate = rate;
> +
> irq_set_status_flags(cpu_to->clkevt.irq, IRQ_NOAUTOEN);
> - ret = request_irq(cpu_to->clkevt.irq, tegra_timer_isr,
> - IRQF_TIMER | IRQF_NOBALANCING,
> +
> + ret = request_irq(cpu_to->clkevt.irq, tegra_timer_isr, flags,
> cpu_to->clkevt.name, &cpu_to->clkevt);
> if (ret) {
> pr_err("failed to set up irq for cpu%d: %d\n",
>
--
<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
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v1 1/3] clocksource/drivers/tegra: Remove duplicated use of per_cpu_ptr
2019-06-10 8:11 ` Daniel Lezcano
@ 2019-06-10 10:39 ` Dmitry Osipenko
0 siblings, 0 replies; 6+ messages in thread
From: Dmitry Osipenko @ 2019-06-10 10:39 UTC (permalink / raw)
To: Daniel Lezcano, Joseph Lo, Thierry Reding, Jonathan Hunter,
Peter De Schrijver
Cc: linux-tegra, linux-kernel
10.06.2019 11:11, Daniel Lezcano пишет:
>
> Hi Dmitry,
>
>
> On 09/06/2019 21:27, Dmitry Osipenko wrote:
>> It was left unnoticed by accident, which means that the code could be
>> cleaned up a tad more.
>>
>> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
>> ---
>> drivers/clocksource/timer-tegra.c | 40 +++++++++++++++++++------------
>> 1 file changed, 25 insertions(+), 15 deletions(-)
>>
>> diff --git a/drivers/clocksource/timer-tegra.c b/drivers/clocksource/timer-tegra.c
>> index 9406855781ff..6da169de47f9 100644
>> --- a/drivers/clocksource/timer-tegra.c
>> +++ b/drivers/clocksource/timer-tegra.c
>> @@ -216,6 +216,19 @@ static inline unsigned int tegra_irq_idx_for_cpu(int cpu, bool tegra20)
>> return TIMER10_IRQ_IDX + cpu;
>> }
>>
>> +static inline unsigned long tegra_rate_for_timer(struct timer_of *to,
>> + bool tegra20)
>> +{
>> + /*
>> + * TIMER1-9 are fixed to 1MHz, TIMER10-13 are running off the
>> + * parent clock.
>> + */
>> + if (tegra20)
>> + return 1000000;
>
> Mind to take the opportunity to convert the literal value to a constant?
Sure!
>> +
>> + return to->of_clk.rate;
>> +}
>> +
>> static int __init tegra_init_timer(struct device_node *np, bool tegra20,
>> int rating)
>> {
>> @@ -268,30 +281,27 @@ static int __init tegra_init_timer(struct device_node *np, bool tegra20,
>>
>> for_each_possible_cpu(cpu) {
>> struct timer_of *cpu_to = per_cpu_ptr(&tegra_to, cpu);
>> + unsigned long flags = IRQF_TIMER | IRQF_NOBALANCING;
>> + unsigned long rate = tegra_rate_for_timer(&tegra_to, tegra20);
Oh, this actually shall be (to, tegra20). Will correct this in v2!
>> unsigned int base = tegra_base_for_cpu(cpu, tegra20);
>> unsigned int idx = tegra_irq_idx_for_cpu(cpu, tegra20);
>> + unsigned int irq = irq_of_parse_and_map(np, idx);
>>
>> - /*
>> - * TIMER1-9 are fixed to 1MHz, TIMER10-13 are running off the
>> - * parent clock.
>> - */
>> - if (tegra20)
>> - cpu_to->of_clk.rate = 1000000;
I also spotted that there is a bug here that I introduced in a previous
patch. The of_clk.rate is initialized only for the first per-cpu
clocksource and then we need to replicate it for the rest of CPU's in a
case of T210. I'll add an explicit fixup for this.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-06-10 10:39 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-09 19:27 [PATCH v1 0/3] Few more cleanups for tegra-timer Dmitry Osipenko
2019-06-09 19:27 ` [PATCH v1 1/3] clocksource/drivers/tegra: Remove duplicated use of per_cpu_ptr Dmitry Osipenko
2019-06-10 8:11 ` Daniel Lezcano
2019-06-10 10:39 ` Dmitry Osipenko
2019-06-09 19:27 ` [PATCH v1 2/3] clocksource/drivers/tegra: Set and use timer's period Dmitry Osipenko
2019-06-09 19:27 ` [PATCH v1 3/3] clocksource/drivers/tegra: Drop unneeded typecasting in one place Dmitry Osipenko
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).