| From 018d4671b9bbd4a5c55cf6eab3e1dbc70a50b66e Mon Sep 17 00:00:00 2001 |
| From: Marc Zyngier <maz@kernel.org> |
| Date: Tue, 5 May 2020 15:09:53 +0100 |
| Subject: clk: Unlink clock if failed to prepare or enable |
| |
| From: Marc Zyngier <maz@kernel.org> |
| |
| commit 018d4671b9bbd4a5c55cf6eab3e1dbc70a50b66e upstream. |
| |
| On failing to prepare or enable a clock, remove the core structure |
| from the list it has been inserted as it is about to be freed. |
| |
| This otherwise leads to random crashes when subsequent clocks get |
| registered, during which parsing of the clock tree becomes adventurous. |
| |
| Observed with QEMU's RPi-3 emulation. |
| |
| Fixes: 12ead77432f2 ("clk: Don't try to enable critical clocks if prepare failed") |
| Signed-off-by: Marc Zyngier <maz@kernel.org> |
| Cc: Guenter Roeck <linux@roeck-us.net> |
| Cc: Stephen Boyd <sboyd@kernel.org> |
| Cc: Michael Turquette <mturquette@baylibre.com> |
| Link: https://lkml.kernel.org/r/20200505140953.409430-1-maz@kernel.org |
| Signed-off-by: Stephen Boyd <sboyd@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/clk/clk.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/drivers/clk/clk.c |
| +++ b/drivers/clk/clk.c |
| @@ -3512,6 +3512,9 @@ static int __clk_core_init(struct clk_co |
| out: |
| clk_pm_runtime_put(core); |
| unlock: |
| + if (ret) |
| + hlist_del_init(&core->child_node); |
| + |
| clk_prepare_unlock(); |
| |
| if (!ret) |