diff options
author | Chanwoo Choi <cw00.choi@samsung.com> | 2015-04-13 21:19:31 +0900 |
---|---|---|
committer | Seung-Woo Kim <sw0312.kim@samsung.com> | 2016-12-14 13:42:54 +0900 |
commit | ff7ab48054c66dcab9b59af1609446fd8c1e7c25 (patch) | |
tree | cc1dec35068fa3bba25bb76481a5ec7b5aa8886d /drivers/clk/clk-s2mps11.c | |
parent | 55fca1d61f076ad5e9d47a893074b7204cb49860 (diff) |
LOCAL / clk: s2mps11: Avoid deadlock issue between regmap and CCF
This patch avoids the deadlock issue between regmap framework and common clock
framework by remaining the always on state for S2MPS11 clocks without any i2c
operation. It is workaround solution to avoid the deadlock issue.
[ 2833.400071] INFO: task swapper/0:1 blocked for more than 120 seconds.
[ 2833.400211] Not tainted 4.0.0-00337-gee47844-dirty #4
[ 2833.400328] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this
message.
[ 2833.400489] swapper/0 D ffffffc000086e0c 0 1 0 0x00000000
[ 2833.404602] Call trace:
[ 2833.407042] [<ffffffc000086e0c>] __switch_to+0x74/0x8c
[ 2833.412251] [<ffffffc00089842c>] __schedule+0x21c/0x6d0
[ 2833.417363] [<ffffffc000898910>] schedule+0x30/0x8c
[ 2833.422253] [<ffffffc00089c234>] schedule_timeout+0x14c/0x204
[ 2833.427953] [<ffffffc0008993ec>] wait_for_common+0xa0/0x148
[ 2833.433533] [<ffffffc0008994a4>] wait_for_completion+0x10/0x1c
[ 2833.439324] [<ffffffc0000ae90c>] flush_workqueue+0x108/0x568
[ 2833.444992] [<ffffffc000447fc4>] deferred_probe_initcall+0x54/0x88
[ 2833.451151] [<ffffffc0000828d4>] do_one_initcall+0x88/0x1a0
[ 2833.456685] [<ffffffc000d62b34>] kernel_init_freeable+0x1bc/0x260
[ 2833.462783] [<ffffffc000893350>] kernel_init+0xc/0xd8
[ 2833.467793] INFO: task kworker/u16:0:6 blocked for more than 120 seconds.
[ 2833.474586] Not tainted 4.0.0-00337-gee47844-dirty #4
[ 2833.480138] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this
message.
[ 2833.487928] kworker/u16:0 D ffffffc000086e0c 0 6 2 0x00000000
[ 2833.494967] Workqueue: deferwq deferred_probe_work_func
[ 2833.500166] Call trace:
[ 2833.502602] [<ffffffc000086e0c>] __switch_to+0x74/0x8c
[ 2833.507721] [<ffffffc00089842c>] __schedule+0x21c/0x6d0
[ 2833.512950] [<ffffffc000898910>] schedule+0x30/0x8c
[ 2833.517791] [<ffffffc000898cd8>] schedule_preempt_disabled+0x10/0x24
[ 2833.524151] [<ffffffc00089b0f4>] __mutex_lock_slowpath+0x148/0x368
[ 2833.530310] [<ffffffc00089b324>] mutex_lock+0x10/0x30
[ 2833.535328] [<ffffffc00045bd14>] regmap_lock_mutex+0x8/0x14
[ 2833.540906] [<ffffffc00045e844>] regmap_update_bits+0x24/0x60
[ 2833.546611] [<ffffffc0005c6800>] s2mps11_clk_prepare+0x20/0x2c
[ 2833.552450] [<ffffffc0005c21bc>] clk_core_prepare+0x50/0x84
[ 2833.557979] [<ffffffc0005c220c>] clk_prepare+0x1c/0x48
[ 2833.563125] [<ffffffc000633084>] tm2_late_probe+0x54/0xc0
[ 2833.568658] [<ffffffc00061ae50>] snd_soc_register_card+0xe48/0xf3c
[ 2833.574844] [<ffffffc000627644>] devm_snd_soc_register_card+0x38/0x8c
[ 2833.581262] [<ffffffc0006332a8>] tm2_wm5110_probe+0x1b8/0x28c
[ 2833.587147] [<ffffffc000449f6c>] platform_drv_probe+0x48/0xb8
[ 2833.592897] [<ffffffc000448290>] driver_probe_device+0x8c/0x244
[ 2833.598776] [<ffffffc00044848c>] __device_attach+0x44/0x54
[ 2856.015428] [<ffffffc0004466c4>] bus_for_each_drv+0x50/0x94
[ 2856.020961] [<ffffffc0004481b8>] device_attach+0x9c/0xcc
[ 2856.026213] [<ffffffc0004477c8>] bus_probe_device+0x8c/0xb4
[ 2856.031786] [<ffffffc000447c28>] deferred_probe_work_func+0x70/0xa8
[ 2856.038019] [<ffffffc0000b0b78>] process_one_work+0x158/0x424
[ 2856.043761] [<ffffffc0000b16ec>] worker_thread+0x140/0x474
[ 2856.049216] [<ffffffc0000b5f44>] kthread+0xd8/0xf0
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
Diffstat (limited to 'drivers/clk/clk-s2mps11.c')
-rw-r--r-- | drivers/clk/clk-s2mps11.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c index bfa1e64e267d..ba983437b3fd 100644 --- a/drivers/clk/clk-s2mps11.c +++ b/drivers/clk/clk-s2mps11.c @@ -60,6 +60,12 @@ static int s2mps11_clk_prepare(struct clk_hw *hw) struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); int ret; + /* + * FIXME: There is deadlock issue between regmap frameowrk and CCF + * framework. It is workaroud solution to avoid the deadlock. + */ + return 0; + ret = regmap_update_bits(s2mps11->iodev->regmap_pmic, s2mps11->reg, s2mps11->mask, s2mps11->mask); @@ -72,6 +78,12 @@ static void s2mps11_clk_unprepare(struct clk_hw *hw) struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); int ret; + /* + * FIXME: There is deadlock issue between regmap frameowrk and CCF + * framework. It is workaroud solution to avoid the deadlock. + */ + return; + ret = regmap_update_bits(s2mps11->iodev->regmap_pmic, s2mps11->reg, s2mps11->mask, ~s2mps11->mask); } @@ -82,6 +94,12 @@ static int s2mps11_clk_is_prepared(struct clk_hw *hw) u32 val; struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); + /* + * FIXME: There is deadlock issue between regmap frameowrk and CCF + * framework. It is workaroud solution to avoid the deadlock. + */ + return 1; + ret = regmap_read(s2mps11->iodev->regmap_pmic, s2mps11->reg, &val); if (ret < 0) @@ -250,6 +268,14 @@ static int s2mps11_clk_probe(struct platform_device *pdev) } clkdev_add(s2mps11_clk->lookup); + + /* + * FIXME: There is deadlock issue between regmap frameowrk and CCF + * framework. It is workaroud solution to avoid the deadlock. + */ + ret = regmap_update_bits(s2mps11_clk->iodev->regmap_pmic, + s2mps11_clk->reg, + s2mps11_clk->mask, s2mps11_clk->mask); } for (i = 0; i < S2MPS11_CLKS_NUM; i++) { |