Issuing a "reboot" command after the LCD times out causes the following
warnings:
Requesting system reboot
------------[ cut here ]------------
WARNING: at drivers/clk/clk.c:471 clk_disable+0x24/0x50()
Modules linked in:
[<
c001ad90>] (unwind_backtrace+0x0/0xf4) from [<
c0025aac>] (warn_slowpath_common+0x48/0x60)
[<
c0025aac>] (warn_slowpath_common+0x48/0x60) from [<
c0025ae0>] (warn_slowpath_null+0x1c/0x24)
[<
c0025ae0>] (warn_slowpath_null+0x1c/0x24) from [<
c03960a0>] (clk_disable+0x24/0x50)
[<
c03960a0>] (clk_disable+0x24/0x50) from [<
c02695a0>] (imxfb_disable_controller+0x48/0x7c)
[<
c02695a0>] (imxfb_disable_controller+0x48/0x7c) from [<
c029d838>] (platform_drv_shutdown+0x18/0x1c)
[<
c029d838>] (platform_drv_shutdown+0x18/0x1c) from [<
c02990fc>] (device_shutdown+0x48/0x14c)
[<
c02990fc>] (device_shutdown+0x48/0x14c) from [<
c003d09c>] (kernel_restart_prepare+0x2c/0x3c)
[<
c003d09c>] (kernel_restart_prepare+0x2c/0x3c) from [<
c003d0e4>] (kernel_restart+0xc/0x48)
[<
c003d0e4>] (kernel_restart+0xc/0x48) from [<
c003d1e8>] (sys_reboot+0xc0/0x1bc)
[<
c003d1e8>] (sys_reboot+0xc0/0x1bc) from [<
c0014ca0>] (ret_fast_syscall+0x0/0x2c)
---[ end trace
da6b502ca79c854f ]---
------------[ cut here ]------------
WARNING: at drivers/clk/clk.c:380 clk_unprepare+0x1c/0x2c()
Modules linked in:
[<
c001ad90>] (unwind_backtrace+0x0/0xf4) from [<
c0025aac>] (warn_slowpath_common+0x48/0x60)
[<
c0025aac>] (warn_slowpath_common+0x48/0x60) from [<
c0025ae0>] (warn_slowpath_null+0x1c/0x24)
[<
c0025ae0>] (warn_slowpath_null+0x1c/0x24) from [<
c0396338>] (clk_unprepare+0x1c/0x2c)
[<
c0396338>] (clk_unprepare+0x1c/0x2c) from [<
c02695a8>] (imxfb_disable_controller+0x50/0x7c)
[<
c02695a8>] (imxfb_disable_controller+0x50/0x7c) from [<
c029d838>] (platform_drv_shutdown+0x18/0x1c)
[<
c029d838>] (platform_drv_shutdown+0x18/0x1c) from [<
c02990fc>] (device_shutdown+0x48/0x14c)
[<
c02990fc>] (device_shutdown+0x48/0x14c) from [<
c003d09c>] (kernel_restart_prepare+0x2c/0x3c)
[<
c003d09c>] (kernel_restart_prepare+0x2c/0x3c) from [<
c003d0e4>] (kernel_restart+0xc/0x48)
[<
c003d0e4>] (kernel_restart+0xc/0x48) from [<
c003d1e8>] (sys_reboot+0xc0/0x1bc)
[<
c003d1e8>] (sys_reboot+0xc0/0x1bc) from [<
c0014ca0>] (ret_fast_syscall+0x0/0x2c)
---[ end trace
da6b502ca79c8550 ]---
------------[ cut here ]------------
This happens because "reboot" triggers imxfb_shutdown(), which calls
imxfb_disable_controller with the clocks already disabled.
To prevent this, add a clock enabled status so that we can check if the clocks
are enabled before disabling them.
Acked-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
struct clk *clk_ahb;
struct clk *clk_per;
enum imxfb_type devtype;
+ bool enabled;
/*
* These are the addresses we mapped
static void imxfb_enable_controller(struct imxfb_info *fbi)
{
+
+ if (fbi->enabled)
+ return;
+
pr_debug("Enabling LCD controller\n");
writel(fbi->screen_dma, fbi->regs + LCDC_SSA);
clk_prepare_enable(fbi->clk_ipg);
clk_prepare_enable(fbi->clk_ahb);
clk_prepare_enable(fbi->clk_per);
+ fbi->enabled = true;
if (fbi->backlight_power)
fbi->backlight_power(1);
static void imxfb_disable_controller(struct imxfb_info *fbi)
{
+ if (!fbi->enabled)
+ return;
+
pr_debug("Disabling LCD controller\n");
if (fbi->backlight_power)
clk_disable_unprepare(fbi->clk_per);
clk_disable_unprepare(fbi->clk_ipg);
clk_disable_unprepare(fbi->clk_ahb);
+ fbi->enabled = false;
writel(0, fbi->regs + LCDC_RMCR);
}