summaryrefslogtreecommitdiff
path: root/drivers/clk/clk-s2mps11.c
diff options
context:
space:
mode:
authorChanwoo Choi <cw00.choi@samsung.com>2015-04-13 21:19:31 +0900
committerSeung-Woo Kim <sw0312.kim@samsung.com>2016-12-14 13:42:54 +0900
commitff7ab48054c66dcab9b59af1609446fd8c1e7c25 (patch)
treecc1dec35068fa3bba25bb76481a5ec7b5aa8886d /drivers/clk/clk-s2mps11.c
parent55fca1d61f076ad5e9d47a893074b7204cb49860 (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.c26
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++) {