| From fc8501e6248b55bed4bb8ef12050cfbcdfbae944 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 10 Jan 2019 14:22:07 +0800 |
| Subject: clocksource/drivers/sun5i: Fail gracefully when clock rate is |
| unavailable |
| |
| From: Chen-Yu Tsai <wens@csie.org> |
| |
| [ Upstream commit e7e7e0d7beafebd11b0c065cd5fbc1e5759c5aab ] |
| |
| If the clock tree is not fully populated when the timer-sun5i init code |
| is called, attempts to get the clock rate for the timer would fail and |
| return 0. |
| |
| Make the init code for both clock events and clocksource check the |
| returned clock rate and fail gracefully if the result is 0, instead of |
| causing a divide by 0 exception later on. |
| |
| Fixes: 4a59058f0b09 ("clocksource/drivers/sun5i: Refactor the current code") |
| Signed-off-by: Chen-Yu Tsai <wens@csie.org> |
| Acked-by: Maxime Ripard <maxime.ripard@bootlin.com> |
| Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/clocksource/timer-sun5i.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| diff --git a/drivers/clocksource/timer-sun5i.c b/drivers/clocksource/timer-sun5i.c |
| index 4f87f3e76d832..c3e96de525a24 100644 |
| --- a/drivers/clocksource/timer-sun5i.c |
| +++ b/drivers/clocksource/timer-sun5i.c |
| @@ -201,6 +201,11 @@ static int __init sun5i_setup_clocksource(struct device_node *node, |
| } |
| |
| rate = clk_get_rate(clk); |
| + if (!rate) { |
| + pr_err("Couldn't get parent clock rate\n"); |
| + ret = -EINVAL; |
| + goto err_disable_clk; |
| + } |
| |
| cs->timer.base = base; |
| cs->timer.clk = clk; |
| @@ -274,6 +279,11 @@ static int __init sun5i_setup_clockevent(struct device_node *node, void __iomem |
| } |
| |
| rate = clk_get_rate(clk); |
| + if (!rate) { |
| + pr_err("Couldn't get parent clock rate\n"); |
| + ret = -EINVAL; |
| + goto err_disable_clk; |
| + } |
| |
| ce->timer.base = base; |
| ce->timer.ticks_per_jiffy = DIV_ROUND_UP(rate, HZ); |
| -- |
| 2.20.1 |
| |