[PATCH] clocksource/drivers/timer-mediatek: error out on probe defer

From: Matthias Brugger
Date: Fri Nov 23 2018 - 11:04:08 EST


If the clocks are not yet present, because they are loaded after
the timer is initialized, we are unable to boot.
Check if the return value of timer_of_init and return on EPROBE_DEFER.

Error seen is:
[ 0.008337] Failed to get clock for /timer@10004000
[ 0.013435] WARNING: CPU: 0 PID: 0 at ../drivers/clk/clk.c:3615
__clk_put+0xf0/0x120
[ 0.021453] Modules linked in:
[ 0.024614] CPU: 0 PID: 0 Comm: swapper/0 Not tainted
4.20.0-rc1-00063-g2859d9abd7e8 #2
[ 0.032902] Hardware name: MediaTek MT7622 RFB1 board (DT)
[ 0.038580] pstate: 20000085 (nzCv daIf -PAN -UAO)
[ 0.043538] pc : __clk_put+0xf0/0x120
[ 0.047328] lr : clk_put+0xc/0x18
[ 0.050753] sp : ffff000009163ed0
[ 0.054178] x29: ffff000009163ed0 x28: 0000000041010018
[ 0.059676] x27: 0000000000000000 x26: 0000000000000000
[ 0.065174] x25: ffff0000090cb008 x24: ffff80001dfd7800
[ 0.070672] x23: ffff000008f934b8 x22: ffff80001dfdeae0
[ 0.076169] x21: ffff80001dfdeae0 x20: fffffffffffffdfb
[ 0.081668] x19: ffff00000929ac40 x18: ffffffffffffffff
[ 0.087166] x17: 0000000000000000 x16: 0000000000000000
[ 0.092664] x15: ffff0000091696c8 x14: ffff0000892cd70f
[ 0.098162] x13: ffff0000092cd71d x12: ffff000009181348
[ 0.103661] x11: ffff000009181000 x10: 0000000005f5e0ff
[ 0.109159] x9 : 0000000000000040 x8 : ffff000009181400
[ 0.114657] x7 : ffff80001c800270 x6 : 0000000000000000
[ 0.120155] x5 : ffff80001c800248 x4 : 0000000000000000
[ 0.125653] x3 : 0000000000000000 x2 : 0000000000000000
[ 0.131151] x1 : 0000000000000000 x0 : fffffffffffffdfb
[ 0.136649] Call trace:
[ 0.139175] __clk_put+0xf0/0x120
[ 0.142605] timer_of_cleanup+0x60/0x7c
[ 0.146572] mtk_gpt_init+0x18c/0x1a0
[ 0.150359] timer_probe+0x74/0x10c
[ 0.153969] time_init+0x14/0x44
[ 0.157307] start_kernel+0x29c/0x414
[ 0.161098] ---[ end trace c3137b005300b618 ]---

Fixes: a0858f937960 ("clocksource/drivers/timer-mediatek: Convert the driver to
timer-of")
Fixes: e3af677607d9 ("clocksource/drivers/timer-mediatek: Add support for system
timer")
Signed-off-by: Matthias Brugger <matthias.bgg@xxxxxxxxx>
---
drivers/clocksource/timer-mediatek.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/clocksource/timer-mediatek.c
b/drivers/clocksource/timer-mediatek.c
index eb10321f8517..d40c77a65b08 100644
--- a/drivers/clocksource/timer-mediatek.c
+++ b/drivers/clocksource/timer-mediatek.c
@@ -276,8 +276,12 @@ static int __init mtk_syst_init(struct device_node *node)
to.of_irq.handler = mtk_syst_handler;

ret = timer_of_init(node, &to);
- if (ret)
+ if (ret) {
+ if (ret == -EPROBE_DEFER)
+ return ret;
+
goto err;
+ }

clockevents_config_and_register(&to.clkevt, timer_of_rate(&to),
TIMER_SYNC_TICKS, 0xffffffff);
@@ -301,8 +305,12 @@ static int __init mtk_gpt_init(struct device_node *node)
to.of_irq.handler = mtk_gpt_interrupt;

ret = timer_of_init(node, &to);
- if (ret)
+ if (ret) {
+ if (ret == -EPROBE_DEFER)
+ return ret;
+
goto err;
+ }

/* Configure clock source */
mtk_gpt_setup(&to, TIMER_CLK_SRC, GPT_CTRL_OP_FREERUN);
--
2.19.1