diff options
author | Daniel Lezcano <daniel.lezcano@linaro.org> | 2016-06-06 17:02:59 -0400 |
---|---|---|
committer | Daniel Lezcano <daniel.lezcano@linaro.org> | 2016-06-28 04:19:29 -0400 |
commit | de23484dd50829fb2f2fffbe2a97cfe5d50aa8b7 (patch) | |
tree | e79201b14fd9e61add58841fd27a23db490c236e /drivers/clocksource/timer-prima2.c | |
parent | adbaf5254152f322b873d0a9cd0f150dd30c64aa (diff) |
clocksource/drivers/prima2: 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>
Diffstat (limited to 'drivers/clocksource/timer-prima2.c')
-rw-r--r-- | drivers/clocksource/timer-prima2.c | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/drivers/clocksource/timer-prima2.c b/drivers/clocksource/timer-prima2.c index 2854c663e8b5..7b1084d0b45e 100644 --- a/drivers/clocksource/timer-prima2.c +++ b/drivers/clocksource/timer-prima2.c | |||
@@ -189,24 +189,36 @@ static void __init sirfsoc_clockevent_init(void) | |||
189 | } | 189 | } |
190 | 190 | ||
191 | /* initialize the kernel jiffy timer source */ | 191 | /* initialize the kernel jiffy timer source */ |
192 | static void __init sirfsoc_prima2_timer_init(struct device_node *np) | 192 | static int __init sirfsoc_prima2_timer_init(struct device_node *np) |
193 | { | 193 | { |
194 | unsigned long rate; | 194 | unsigned long rate; |
195 | struct clk *clk; | 195 | struct clk *clk; |
196 | int ret; | ||
196 | 197 | ||
197 | clk = of_clk_get(np, 0); | 198 | clk = of_clk_get(np, 0); |
198 | BUG_ON(IS_ERR(clk)); | 199 | if (IS_ERR(clk)) { |
200 | pr_err("Failed to get clock"); | ||
201 | return PTR_ERR(clk); | ||
202 | } | ||
199 | 203 | ||
200 | BUG_ON(clk_prepare_enable(clk)); | 204 | ret = clk_prepare_enable(clk); |
205 | if (ret) { | ||
206 | pr_err("Failed to enable clock"); | ||
207 | return ret; | ||
208 | } | ||
201 | 209 | ||
202 | rate = clk_get_rate(clk); | 210 | rate = clk_get_rate(clk); |
203 | 211 | ||
204 | BUG_ON(rate < PRIMA2_CLOCK_FREQ); | 212 | if (rate < PRIMA2_CLOCK_FREQ || rate % PRIMA2_CLOCK_FREQ) { |
205 | BUG_ON(rate % PRIMA2_CLOCK_FREQ); | 213 | pr_err("Invalid clock rate"); |
214 | return -EINVAL; | ||
215 | } | ||
206 | 216 | ||
207 | sirfsoc_timer_base = of_iomap(np, 0); | 217 | sirfsoc_timer_base = of_iomap(np, 0); |
208 | if (!sirfsoc_timer_base) | 218 | if (!sirfsoc_timer_base) { |
209 | panic("unable to map timer cpu registers\n"); | 219 | pr_err("unable to map timer cpu registers\n"); |
220 | return -ENXIO; | ||
221 | } | ||
210 | 222 | ||
211 | sirfsoc_timer_irq.irq = irq_of_parse_and_map(np, 0); | 223 | sirfsoc_timer_irq.irq = irq_of_parse_and_map(np, 0); |
212 | 224 | ||
@@ -216,14 +228,23 @@ static void __init sirfsoc_prima2_timer_init(struct device_node *np) | |||
216 | writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_HI); | 228 | writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_HI); |
217 | writel_relaxed(BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_STATUS); | 229 | writel_relaxed(BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_STATUS); |
218 | 230 | ||
219 | BUG_ON(clocksource_register_hz(&sirfsoc_clocksource, | 231 | ret = clocksource_register_hz(&sirfsoc_clocksource, PRIMA2_CLOCK_FREQ); |
220 | PRIMA2_CLOCK_FREQ)); | 232 | if (ret) { |
233 | pr_err("Failed to register clocksource"); | ||
234 | return ret; | ||
235 | } | ||
221 | 236 | ||
222 | sched_clock_register(sirfsoc_read_sched_clock, 64, PRIMA2_CLOCK_FREQ); | 237 | sched_clock_register(sirfsoc_read_sched_clock, 64, PRIMA2_CLOCK_FREQ); |
223 | 238 | ||
224 | BUG_ON(setup_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq)); | 239 | ret = setup_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq); |
240 | if (ret) { | ||
241 | pr_err("Failed to setup irq"); | ||
242 | return ret; | ||
243 | } | ||
225 | 244 | ||
226 | sirfsoc_clockevent_init(); | 245 | sirfsoc_clockevent_init(); |
246 | |||
247 | return 0; | ||
227 | } | 248 | } |
228 | CLOCKSOURCE_OF_DECLARE(sirfsoc_prima2_timer, | 249 | CLOCKSOURCE_OF_DECLARE_RET(sirfsoc_prima2_timer, |
229 | "sirf,prima2-tick", sirfsoc_prima2_timer_init); | 250 | "sirf,prima2-tick", sirfsoc_prima2_timer_init); |