diff options
author | Daniel Lezcano <daniel.lezcano@linaro.org> | 2016-06-06 17:27:44 -0400 |
---|---|---|
committer | Daniel Lezcano <daniel.lezcano@linaro.org> | 2016-06-28 04:19:30 -0400 |
commit | 53186505802c8845d5af4ed40ddb84e221acb92f (patch) | |
tree | a198dce3d4449de3bfce3f88b9b0f33e9469f40c /drivers/clocksource/timer-keystone.c | |
parent | 76804d052316d3562c58934200c932243f312c07 (diff) |
clocksource/drivers/keystone: 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: Santosh Shilimkar <ssantosh@kernel.org>
Diffstat (limited to 'drivers/clocksource/timer-keystone.c')
-rw-r--r-- | drivers/clocksource/timer-keystone.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/clocksource/timer-keystone.c b/drivers/clocksource/timer-keystone.c index 1cea08cf603e..4199823b2ec9 100644 --- a/drivers/clocksource/timer-keystone.c +++ b/drivers/clocksource/timer-keystone.c | |||
@@ -144,7 +144,7 @@ static int keystone_set_periodic(struct clock_event_device *evt) | |||
144 | return 0; | 144 | return 0; |
145 | } | 145 | } |
146 | 146 | ||
147 | static void __init keystone_timer_init(struct device_node *np) | 147 | static int __init keystone_timer_init(struct device_node *np) |
148 | { | 148 | { |
149 | struct clock_event_device *event_dev = &timer.event_dev; | 149 | struct clock_event_device *event_dev = &timer.event_dev; |
150 | unsigned long rate; | 150 | unsigned long rate; |
@@ -154,20 +154,20 @@ static void __init keystone_timer_init(struct device_node *np) | |||
154 | irq = irq_of_parse_and_map(np, 0); | 154 | irq = irq_of_parse_and_map(np, 0); |
155 | if (!irq) { | 155 | if (!irq) { |
156 | pr_err("%s: failed to map interrupts\n", __func__); | 156 | pr_err("%s: failed to map interrupts\n", __func__); |
157 | return; | 157 | return -EINVAL; |
158 | } | 158 | } |
159 | 159 | ||
160 | timer.base = of_iomap(np, 0); | 160 | timer.base = of_iomap(np, 0); |
161 | if (!timer.base) { | 161 | if (!timer.base) { |
162 | pr_err("%s: failed to map registers\n", __func__); | 162 | pr_err("%s: failed to map registers\n", __func__); |
163 | return; | 163 | return -ENXIO; |
164 | } | 164 | } |
165 | 165 | ||
166 | clk = of_clk_get(np, 0); | 166 | clk = of_clk_get(np, 0); |
167 | if (IS_ERR(clk)) { | 167 | if (IS_ERR(clk)) { |
168 | pr_err("%s: failed to get clock\n", __func__); | 168 | pr_err("%s: failed to get clock\n", __func__); |
169 | iounmap(timer.base); | 169 | iounmap(timer.base); |
170 | return; | 170 | return PTR_ERR(clk); |
171 | } | 171 | } |
172 | 172 | ||
173 | error = clk_prepare_enable(clk); | 173 | error = clk_prepare_enable(clk); |
@@ -219,11 +219,12 @@ static void __init keystone_timer_init(struct device_node *np) | |||
219 | clockevents_config_and_register(event_dev, rate, 1, ULONG_MAX); | 219 | clockevents_config_and_register(event_dev, rate, 1, ULONG_MAX); |
220 | 220 | ||
221 | pr_info("keystone timer clock @%lu Hz\n", rate); | 221 | pr_info("keystone timer clock @%lu Hz\n", rate); |
222 | return; | 222 | return 0; |
223 | err: | 223 | err: |
224 | clk_put(clk); | 224 | clk_put(clk); |
225 | iounmap(timer.base); | 225 | iounmap(timer.base); |
226 | return error; | ||
226 | } | 227 | } |
227 | 228 | ||
228 | CLOCKSOURCE_OF_DECLARE(keystone_timer, "ti,keystone-timer", | 229 | CLOCKSOURCE_OF_DECLARE_RET(keystone_timer, "ti,keystone-timer", |
229 | keystone_timer_init); | 230 | keystone_timer_init); |