diff options
author | Daniel Lezcano <daniel.lezcano@linaro.org> | 2016-06-06 17:28:17 -0400 |
---|---|---|
committer | Daniel Lezcano <daniel.lezcano@linaro.org> | 2016-06-28 04:19:31 -0400 |
commit | 38d94c5ae2dc60d6b54127695df9447e86a7d402 (patch) | |
tree | 015b25d0dad60fe830d684a9a0388d410f04214b /drivers/clocksource/timer-stm32.c | |
parent | 2ef2538bc613af45baf9f2a032c9a8259c4c6672 (diff) |
clocksource/drivers/stm32: Convert init function to return error
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>
Acked-by: Maxime Coquelin <mcoquelin.stm32@gmail.com>
Diffstat (limited to 'drivers/clocksource/timer-stm32.c')
-rw-r--r-- | drivers/clocksource/timer-stm32.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/clocksource/timer-stm32.c b/drivers/clocksource/timer-stm32.c index f3dcb76799b4..d5bf352905c8 100644 --- a/drivers/clocksource/timer-stm32.c +++ b/drivers/clocksource/timer-stm32.c | |||
@@ -98,7 +98,7 @@ static struct stm32_clock_event_ddata clock_event_ddata = { | |||
98 | }, | 98 | }, |
99 | }; | 99 | }; |
100 | 100 | ||
101 | static void __init stm32_clockevent_init(struct device_node *np) | 101 | static int __init stm32_clockevent_init(struct device_node *np) |
102 | { | 102 | { |
103 | struct stm32_clock_event_ddata *data = &clock_event_ddata; | 103 | struct stm32_clock_event_ddata *data = &clock_event_ddata; |
104 | struct clk *clk; | 104 | struct clk *clk; |
@@ -130,12 +130,14 @@ static void __init stm32_clockevent_init(struct device_node *np) | |||
130 | 130 | ||
131 | data->base = of_iomap(np, 0); | 131 | data->base = of_iomap(np, 0); |
132 | if (!data->base) { | 132 | if (!data->base) { |
133 | ret = -ENXIO; | ||
133 | pr_err("failed to map registers for clockevent\n"); | 134 | pr_err("failed to map registers for clockevent\n"); |
134 | goto err_iomap; | 135 | goto err_iomap; |
135 | } | 136 | } |
136 | 137 | ||
137 | irq = irq_of_parse_and_map(np, 0); | 138 | irq = irq_of_parse_and_map(np, 0); |
138 | if (!irq) { | 139 | if (!irq) { |
140 | ret = -EINVAL; | ||
139 | pr_err("%s: failed to get irq.\n", np->full_name); | 141 | pr_err("%s: failed to get irq.\n", np->full_name); |
140 | goto err_get_irq; | 142 | goto err_get_irq; |
141 | } | 143 | } |
@@ -173,7 +175,7 @@ static void __init stm32_clockevent_init(struct device_node *np) | |||
173 | pr_info("%s: STM32 clockevent driver initialized (%d bits)\n", | 175 | pr_info("%s: STM32 clockevent driver initialized (%d bits)\n", |
174 | np->full_name, bits); | 176 | np->full_name, bits); |
175 | 177 | ||
176 | return; | 178 | return ret; |
177 | 179 | ||
178 | err_get_irq: | 180 | err_get_irq: |
179 | iounmap(data->base); | 181 | iounmap(data->base); |
@@ -182,7 +184,7 @@ err_iomap: | |||
182 | err_clk_enable: | 184 | err_clk_enable: |
183 | clk_put(clk); | 185 | clk_put(clk); |
184 | err_clk_get: | 186 | err_clk_get: |
185 | return; | 187 | return ret; |
186 | } | 188 | } |
187 | 189 | ||
188 | CLOCKSOURCE_OF_DECLARE(stm32, "st,stm32-timer", stm32_clockevent_init); | 190 | CLOCKSOURCE_OF_DECLARE_RET(stm32, "st,stm32-timer", stm32_clockevent_init); |