diff mbox

[5/9] clocksource/drivers/exynos_mct: Convert init function to return error

Message ID 1464770093-12667-6-git-send-email-daniel.lezcano@linaro.org (mailing list archive)
State New, archived
Headers show

Commit Message

Daniel Lezcano June 1, 2016, 8:34 a.m. UTC
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(-)

Comments

Krzysztof Kozlowski June 6, 2016, 10:51 a.m. UTC | #1
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);
>
Daniel Lezcano June 6, 2016, 11:23 a.m. UTC | #2
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
Krzysztof Kozlowski June 6, 2016, 11:28 a.m. UTC | #3
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
diff mbox

Patch

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);