* [PATCH 5/9] clocksource/drivers/exynos_mct: Convert init function to return error
[not found] <1464770093-12667-1-git-send-email-daniel.lezcano@linaro.org>
@ 2016-06-01 8:34 ` Daniel Lezcano
2016-06-06 10:51 ` Krzysztof Kozlowski
0 siblings, 1 reply; 4+ messages in thread
From: Daniel Lezcano @ 2016-06-01 8:34 UTC (permalink / raw)
To: daniel.lezcano, tglx
Cc: moderated list:ARM/SAMSUNG EXYNO..., Krzysztof Kozlowski,
Kukjin Kim, linux-kernel, moderated list:ARM/SAMSUNG EXYNO...
The init functions do not return any error. They behave as the following:
- panic, thus leading to a kernel crash while another timer may work and
make the system boot up correctly
or
- print an error and let the caller unaware if the state of the system
Change that by converting the init functions to return an error conforming
to the CLOCKSOURCE_OF_RET prototype.
Proper error handling (rollback, errno value) will be changed later case
by case, thus this change just return back an error or success in the init
function.
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/exynos_mct.c | 36 ++++++++++++++++++++++++------------
1 file changed, 24 insertions(+), 12 deletions(-)
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index be09bc0..f6caed0 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -232,7 +232,7 @@ static cycles_t exynos4_read_current_timer(void)
return exynos4_read_count_32();
}
-static void __init exynos4_clocksource_init(void)
+static int __init exynos4_clocksource_init(void)
{
exynos4_mct_frc_start();
@@ -244,6 +244,8 @@ static void __init exynos4_clocksource_init(void)
panic("%s: can't register clocksource\n", mct_frc.name);
sched_clock_register(exynos4_read_sched_clock, 32, clk_rate);
+
+ return 0;
}
static void exynos4_mct_comp0_stop(void)
@@ -335,12 +337,14 @@ static struct irqaction mct_comp_event_irq = {
.dev_id = &mct_comp_device,
};
-static void exynos4_clockevent_init(void)
+static int exynos4_clockevent_init(void)
{
mct_comp_device.cpumask = cpumask_of(0);
clockevents_config_and_register(&mct_comp_device, clk_rate,
0xf, 0xffffffff);
setup_irq(mct_irqs[MCT_G0_IRQ], &mct_comp_event_irq);
+
+ return 0;
}
static DEFINE_PER_CPU(struct mct_clock_event_device, percpu_mct_tick);
@@ -516,7 +520,7 @@ static struct notifier_block exynos4_mct_cpu_nb = {
.notifier_call = exynos4_mct_cpu_notify,
};
-static void __init exynos4_timer_resources(struct device_node *np, void __iomem *base)
+static int __init exynos4_timer_resources(struct device_node *np, void __iomem *base)
{
int err, cpu;
struct mct_clock_event_device *mevt = this_cpu_ptr(&percpu_mct_tick);
@@ -572,15 +576,17 @@ static void __init exynos4_timer_resources(struct device_node *np, void __iomem
/* Immediately configure the timer on the boot CPU */
exynos4_local_timer_setup(mevt);
- return;
+ return 0;
out_irq:
free_percpu_irq(mct_irqs[MCT_L0_IRQ], &percpu_mct_tick);
+ return err;
}
-static void __init mct_init_dt(struct device_node *np, unsigned int int_type)
+static int __init mct_init_dt(struct device_node *np, unsigned int int_type)
{
u32 nr_irqs, i;
+ int ret;
mct_int_type = int_type;
@@ -600,20 +606,26 @@ static void __init mct_init_dt(struct device_node *np, unsigned int int_type)
for (i = MCT_L0_IRQ; i < nr_irqs; i++)
mct_irqs[i] = irq_of_parse_and_map(np, i);
- exynos4_timer_resources(np, of_iomap(np, 0));
- exynos4_clocksource_init();
- exynos4_clockevent_init();
+ ret = exynos4_timer_resources(np, of_iomap(np, 0));
+ if (ret)
+ return ret;
+
+ ret = exynos4_clocksource_init();
+ if (ret)
+ return ret;
+
+ return exynos4_clockevent_init();
}
-static void __init mct_init_spi(struct device_node *np)
+static int __init mct_init_spi(struct device_node *np)
{
return mct_init_dt(np, MCT_INT_SPI);
}
-static void __init mct_init_ppi(struct device_node *np)
+static int __init mct_init_ppi(struct device_node *np)
{
return mct_init_dt(np, MCT_INT_PPI);
}
-CLOCKSOURCE_OF_DECLARE(exynos4210, "samsung,exynos4210-mct", mct_init_spi);
-CLOCKSOURCE_OF_DECLARE(exynos4412, "samsung,exynos4412-mct", mct_init_ppi);
+CLOCKSOURCE_OF_DECLARE_RET(exynos4210, "samsung,exynos4210-mct", mct_init_spi);
+CLOCKSOURCE_OF_DECLARE_RET(exynos4412, "samsung,exynos4412-mct", mct_init_ppi);
--
1.9.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 5/9] clocksource/drivers/exynos_mct: Convert init function to return error
2016-06-01 8:34 ` [PATCH 5/9] clocksource/drivers/exynos_mct: Convert init function to return error Daniel Lezcano
@ 2016-06-06 10:51 ` Krzysztof Kozlowski
2016-06-06 11:23 ` Daniel Lezcano
0 siblings, 1 reply; 4+ messages in thread
From: Krzysztof Kozlowski @ 2016-06-06 10:51 UTC (permalink / raw)
To: Daniel Lezcano, tglx
Cc: linux-kernel, Kukjin Kim, moderated list:ARM/SAMSUNG EXYNO...,
moderated list:ARM/SAMSUNG EXYNO...
On 06/01/2016 10:34 AM, Daniel Lezcano wrote:
> The init functions do not return any error. They behave as the following:
>
> - panic, thus leading to a kernel crash while another timer may work and
> make the system boot up correctly
>
> or
>
> - print an error and let the caller unaware if the state of the system
>
> Change that by converting the init functions to return an error conforming
> to the CLOCKSOURCE_OF_RET prototype.
>
> Proper error handling (rollback, errno value) will be changed later case
> by case, thus this change just return back an error or success in the init
> function.
I don't see the benefits of this change alone. You are replacing one
non-return code to another always-return-success code. The effect is
exactly the same. It would make sense to change it to CLOCKSOURCE_OF_RET
along with proper error handling.
Best regards,
Krzysztof
>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> ---
> drivers/clocksource/exynos_mct.c | 36 ++++++++++++++++++++++++------------
> 1 file changed, 24 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
> index be09bc0..f6caed0 100644
> --- a/drivers/clocksource/exynos_mct.c
> +++ b/drivers/clocksource/exynos_mct.c
> @@ -232,7 +232,7 @@ static cycles_t exynos4_read_current_timer(void)
> return exynos4_read_count_32();
> }
>
> -static void __init exynos4_clocksource_init(void)
> +static int __init exynos4_clocksource_init(void)
> {
> exynos4_mct_frc_start();
>
> @@ -244,6 +244,8 @@ static void __init exynos4_clocksource_init(void)
> panic("%s: can't register clocksource\n", mct_frc.name);
>
> sched_clock_register(exynos4_read_sched_clock, 32, clk_rate);
> +
> + return 0;
> }
>
> static void exynos4_mct_comp0_stop(void)
> @@ -335,12 +337,14 @@ static struct irqaction mct_comp_event_irq = {
> .dev_id = &mct_comp_device,
> };
>
> -static void exynos4_clockevent_init(void)
> +static int exynos4_clockevent_init(void)
> {
> mct_comp_device.cpumask = cpumask_of(0);
> clockevents_config_and_register(&mct_comp_device, clk_rate,
> 0xf, 0xffffffff);
> setup_irq(mct_irqs[MCT_G0_IRQ], &mct_comp_event_irq);
> +
> + return 0;
> }
>
> static DEFINE_PER_CPU(struct mct_clock_event_device, percpu_mct_tick);
> @@ -516,7 +520,7 @@ static struct notifier_block exynos4_mct_cpu_nb = {
> .notifier_call = exynos4_mct_cpu_notify,
> };
>
> -static void __init exynos4_timer_resources(struct device_node *np, void __iomem *base)
> +static int __init exynos4_timer_resources(struct device_node *np, void __iomem *base)
> {
> int err, cpu;
> struct mct_clock_event_device *mevt = this_cpu_ptr(&percpu_mct_tick);
> @@ -572,15 +576,17 @@ static void __init exynos4_timer_resources(struct device_node *np, void __iomem
>
> /* Immediately configure the timer on the boot CPU */
> exynos4_local_timer_setup(mevt);
> - return;
> + return 0;
>
> out_irq:
> free_percpu_irq(mct_irqs[MCT_L0_IRQ], &percpu_mct_tick);
> + return err;
> }
>
> -static void __init mct_init_dt(struct device_node *np, unsigned int int_type)
> +static int __init mct_init_dt(struct device_node *np, unsigned int int_type)
> {
> u32 nr_irqs, i;
> + int ret;
>
> mct_int_type = int_type;
>
> @@ -600,20 +606,26 @@ static void __init mct_init_dt(struct device_node *np, unsigned int int_type)
> for (i = MCT_L0_IRQ; i < nr_irqs; i++)
> mct_irqs[i] = irq_of_parse_and_map(np, i);
>
> - exynos4_timer_resources(np, of_iomap(np, 0));
> - exynos4_clocksource_init();
> - exynos4_clockevent_init();
> + ret = exynos4_timer_resources(np, of_iomap(np, 0));
> + if (ret)
> + return ret;
> +
> + ret = exynos4_clocksource_init();
> + if (ret)
> + return ret;
> +
> + return exynos4_clockevent_init();
> }
>
>
> -static void __init mct_init_spi(struct device_node *np)
> +static int __init mct_init_spi(struct device_node *np)
> {
> return mct_init_dt(np, MCT_INT_SPI);
> }
>
> -static void __init mct_init_ppi(struct device_node *np)
> +static int __init mct_init_ppi(struct device_node *np)
> {
> return mct_init_dt(np, MCT_INT_PPI);
> }
> -CLOCKSOURCE_OF_DECLARE(exynos4210, "samsung,exynos4210-mct", mct_init_spi);
> -CLOCKSOURCE_OF_DECLARE(exynos4412, "samsung,exynos4412-mct", mct_init_ppi);
> +CLOCKSOURCE_OF_DECLARE_RET(exynos4210, "samsung,exynos4210-mct", mct_init_spi);
> +CLOCKSOURCE_OF_DECLARE_RET(exynos4412, "samsung,exynos4412-mct", mct_init_ppi);
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 5/9] clocksource/drivers/exynos_mct: Convert init function to return error
2016-06-06 10:51 ` Krzysztof Kozlowski
@ 2016-06-06 11:23 ` Daniel Lezcano
2016-06-06 11:28 ` Krzysztof Kozlowski
0 siblings, 1 reply; 4+ messages in thread
From: Daniel Lezcano @ 2016-06-06 11:23 UTC (permalink / raw)
To: Krzysztof Kozlowski, tglx
Cc: linux-kernel, Kukjin Kim, moderated list:ARM/SAMSUNG EXYNO...,
moderated list:ARM/SAMSUNG EXYNO...
On 06/06/2016 12:51 PM, Krzysztof Kozlowski wrote:
> On 06/01/2016 10:34 AM, Daniel Lezcano wrote:
>> The init functions do not return any error. They behave as the following:
>>
>> - panic, thus leading to a kernel crash while another timer may work and
>> make the system boot up correctly
>>
>> or
>>
>> - print an error and let the caller unaware if the state of the system
>>
>> Change that by converting the init functions to return an error conforming
>> to the CLOCKSOURCE_OF_RET prototype.
>>
>> Proper error handling (rollback, errno value) will be changed later case
>> by case, thus this change just return back an error or success in the init
>> function.
>
> I don't see the benefits of this change alone. You are replacing one
> non-return code to another always-return-success code. The effect is
> exactly the same. It would make sense to change it to CLOCKSOURCE_OF_RET
> along with proper error handling.
>
Hi Krzysztof,
I can understand you expect an error handling but, as stated in the
changelog, proper error handling will be done later. Currently, there
are roughly 80 drivers to changes the init function to return a value in
order change the CLOCKSOURCE_OF_DECLARE macro. That is a quite important
number and changing also the internals will introduce bugs.
So the series (and there is a huge one coming right after this one),
will focus only on changing the init function to return a value, so we
can swap the clocksource table and rename CLOCKSOURCE_OF_DECLARE_RET
without the '_RET'. I want this to be done before the next PR in order
to prevent to have a double clksrc table.
If error handling is already taken into account and is trivial, I try to
do the change, otherwise I let the function to return a success value.
Regarding the important number of drivers, if you have time to change
the init function in the exynos_mct, that will be more than welcome :)
-- Daniel
--
<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] 4+ messages in thread
* Re: [PATCH 5/9] clocksource/drivers/exynos_mct: Convert init function to return error
2016-06-06 11:23 ` Daniel Lezcano
@ 2016-06-06 11:28 ` Krzysztof Kozlowski
0 siblings, 0 replies; 4+ messages in thread
From: Krzysztof Kozlowski @ 2016-06-06 11:28 UTC (permalink / raw)
To: Daniel Lezcano, tglx
Cc: linux-kernel, Kukjin Kim, moderated list:ARM/SAMSUNG EXYNO...,
moderated list:ARM/SAMSUNG EXYNO...
On 06/06/2016 01:23 PM, Daniel Lezcano wrote:
> On 06/06/2016 12:51 PM, Krzysztof Kozlowski wrote:
>> On 06/01/2016 10:34 AM, Daniel Lezcano wrote:
>>> The init functions do not return any error. They behave as the
>>> following:
>>>
>>> - panic, thus leading to a kernel crash while another timer may
>>> work and
>>> make the system boot up correctly
>>>
>>> or
>>>
>>> - print an error and let the caller unaware if the state of the system
>>>
>>> Change that by converting the init functions to return an error
>>> conforming
>>> to the CLOCKSOURCE_OF_RET prototype.
>>>
>>> Proper error handling (rollback, errno value) will be changed later case
>>> by case, thus this change just return back an error or success in the
>>> init
>>> function.
>>
>> I don't see the benefits of this change alone. You are replacing one
>> non-return code to another always-return-success code. The effect is
>> exactly the same. It would make sense to change it to CLOCKSOURCE_OF_RET
>> along with proper error handling.
>>
>
> Hi Krzysztof,
>
> I can understand you expect an error handling but, as stated in the
> changelog, proper error handling will be done later. Currently, there
> are roughly 80 drivers to changes the init function to return a value in
> order change the CLOCKSOURCE_OF_DECLARE macro. That is a quite important
> number and changing also the internals will introduce bugs.
>
> So the series (and there is a huge one coming right after this one),
> will focus only on changing the init function to return a value, so we
> can swap the clocksource table and rename CLOCKSOURCE_OF_DECLARE_RET
> without the '_RET'. I want this to be done before the next PR in order
> to prevent to have a double clksrc table.
>
> If error handling is already taken into account and is trivial, I try to
> do the change, otherwise I let the function to return a success value.
>
> Regarding the important number of drivers, if you have time to change
> the init function in the exynos_mct, that will be more than welcome :)
Ah, okay, you are planning to get rid of CLOCKSOURCE_OF_DECLARE. I
didn't receive the cover letter so the big picture remained hidden. Now
it looks good:
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-06-06 11:28 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1464770093-12667-1-git-send-email-daniel.lezcano@linaro.org>
2016-06-01 8:34 ` [PATCH 5/9] clocksource/drivers/exynos_mct: Convert init function to return error Daniel Lezcano
2016-06-06 10:51 ` Krzysztof Kozlowski
2016-06-06 11:23 ` Daniel Lezcano
2016-06-06 11:28 ` Krzysztof Kozlowski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox