| From d4fbdc317768902663e591f050ce0c2cb8ae2557 Mon Sep 17 00:00:00 2001 |
| From: Guenter Roeck <linux@roeck-us.net> |
| Date: Mon, 13 May 2019 07:46:21 -0700 |
| Subject: drm/pl111: Initialize clock spinlock early |
| |
| [ Upstream commit 3e01ae2612bdd7975c74ec7123d7f8f5e6eed795 ] |
| |
| The following warning is seen on systems with broken clock divider. |
| |
| INFO: trying to register non-static key. |
| the code is fine but needs lockdep annotation. |
| turning off the locking correctness validator. |
| CPU: 0 PID: 1 Comm: swapper Not tainted 5.1.0-09698-g1fb3b52 #1 |
| Hardware name: ARM Integrator/CP (Device Tree) |
| [<c0011be8>] (unwind_backtrace) from [<c000ebb8>] (show_stack+0x10/0x18) |
| [<c000ebb8>] (show_stack) from [<c07d3fd0>] (dump_stack+0x18/0x24) |
| [<c07d3fd0>] (dump_stack) from [<c0060d48>] (register_lock_class+0x674/0x6f8) |
| [<c0060d48>] (register_lock_class) from [<c005de2c>] |
| (__lock_acquire+0x68/0x2128) |
| [<c005de2c>] (__lock_acquire) from [<c0060408>] (lock_acquire+0x110/0x21c) |
| [<c0060408>] (lock_acquire) from [<c07f755c>] (_raw_spin_lock+0x34/0x48) |
| [<c07f755c>] (_raw_spin_lock) from [<c0536c8c>] |
| (pl111_display_enable+0xf8/0x5fc) |
| [<c0536c8c>] (pl111_display_enable) from [<c0502f54>] |
| (drm_atomic_helper_commit_modeset_enables+0x1ec/0x244) |
| |
| Since commit eedd6033b4c8 ("drm/pl111: Support variants with broken clock |
| divider"), the spinlock is not initialized if the clock divider is broken. |
| Initialize it earlier to fix the problem. |
| |
| Fixes: eedd6033b4c8 ("drm/pl111: Support variants with broken clock divider") |
| Cc: Linus Walleij <linus.walleij@linaro.org> |
| Signed-off-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Linus Walleij <linus.walleij@linaro.org> |
| Link: https://patchwork.freedesktop.org/patch/msgid/1557758781-23586-1-git-send-email-linux@roeck-us.net |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/pl111/pl111_display.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/pl111/pl111_display.c b/drivers/gpu/drm/pl111/pl111_display.c |
| index 754f6b25f265..6d9f78612dee 100644 |
| --- a/drivers/gpu/drm/pl111/pl111_display.c |
| +++ b/drivers/gpu/drm/pl111/pl111_display.c |
| @@ -531,14 +531,15 @@ pl111_init_clock_divider(struct drm_device *drm) |
| dev_err(drm->dev, "CLCD: unable to get clcdclk.\n"); |
| return PTR_ERR(parent); |
| } |
| + |
| + spin_lock_init(&priv->tim2_lock); |
| + |
| /* If the clock divider is broken, use the parent directly */ |
| if (priv->variant->broken_clockdivider) { |
| priv->clk = parent; |
| return 0; |
| } |
| parent_name = __clk_get_name(parent); |
| - |
| - spin_lock_init(&priv->tim2_lock); |
| div->init = &init; |
| |
| ret = devm_clk_hw_register(drm->dev, div); |
| -- |
| 2.20.1 |
| |