video: imxfb: Do not crash on reboot
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>