diff options
author | Tao Huang <huangtao@rock-chips.com> | 2018-03-21 10:39:44 +0800 |
---|---|---|
committer | Tao Huang <huangtao@rock-chips.com> | 2018-03-21 10:45:13 +0800 |
commit | 3fa24cc5405206a785acc2022e8ddad574ed9083 (patch) | |
tree | 844e8c55ca9b2ea85b01b7ebd8f1293e9eba27b8 /sound | |
parent | 2aec6208816753d83a262a00e0d34e608be627c8 (diff) |
Revert "ASoC: rockchip: i2s: protect I2S_XFER_TXS/I2S_XFER_RXS with mutex"
This reverts commit 686662c6f15d52318821d449787eea75432940f6.
BUG: sleeping function called from invalid context at kernel/locking/mutex.c:620
in_atomic(): 1, irqs_disabled(): 128, pid: 385, name: FastMixer
2 locks held by FastMixer/385:
#0: (snd_pcm_link_rwlock){......}, at: [<ffffff9008f4130c>] snd_pcm_stream_lock+0x5c/0x68
#1: (&(&substream->self_group.lock)->rlock){......}, at: [<ffffff9008f41314>] snd_pcm_stream_lock+0x64/0x68
CPU: 4 PID: 385 Comm: FastMixer Not tainted 4.4.120 #4996
Hardware name: Rockchip RK3399 Excavator Board edp (Android) (DT)
Call trace:
[<ffffff900808cf7c>] dump_backtrace+0x0/0x2b4
[<ffffff900808d244>] show_stack+0x14/0x1c
[<ffffff90085670bc>] dump_stack+0xa8/0xd8
[<ffffff90080ead48>] ___might_sleep+0x178/0x17c
[<ffffff90080eae08>] __might_sleep+0xbc/0xd4
[<ffffff900935a6d0>] mutex_lock_nested+0xa4/0x504
[<ffffff9008fa431c>] rockchip_i2s_trigger+0x164/0x3d0
[<ffffff9008f89960>] soc_pcm_trigger+0x188/0x1b8
[<ffffff9008f3df74>] snd_pcm_do_start+0x54/0x68
[<ffffff9008f3ddcc>] snd_pcm_action_single+0x50/0x98
[<ffffff9008f3eafc>] snd_pcm_action+0x50/0x150
[<ffffff9008f49824>] snd_pcm_start+0x20/0x28
[<ffffff9008f4f5e0>] snd_pcm_lib_write1+0x4a4/0x508
[<ffffff9008f4f6d0>] snd_pcm_lib_write+0x8c/0xac
[<ffffff9008f3fd0c>] snd_pcm_ioctl_xferi_compat+0x188/0x35c
[<ffffff9008f49374>] snd_pcm_ioctl_compat+0x32c/0x7bc
[<ffffff90082f2de8>] compat_SyS_ioctl+0x1f4/0x258
[<ffffff90080832f0>] el0_svc_naked+0x24/0x28
Change-Id: Id4ad668bb5b8cdbb79aecc1d00fed200acf0d6da
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/rockchip/rockchip_i2s.c | 13 |
1 files changed, 2 insertions, 11 deletions
diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c index 650f6b5200ab..7687368779db 100644 --- a/sound/soc/rockchip/rockchip_i2s.c +++ b/sound/soc/rockchip/rockchip_i2s.c @@ -32,7 +32,6 @@ struct rk_i2s_pins { struct rk_i2s_dev { struct device *dev; - struct mutex lock; /* txctrl/rxctrl lock */ struct clk *hclk; struct clk *mclk; @@ -96,7 +95,6 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) unsigned int val = 0; int retry = 10; - mutex_lock(&i2s->lock); if (on) { regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE); @@ -131,14 +129,12 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) regmap_read(i2s->regmap, I2S_CLR, &val); retry--; if (!retry) { - dev_warn(i2s->dev, "%s: fail to clear\n", - __func__); + dev_warn(i2s->dev, "fail to clear\n"); break; } } } } - mutex_unlock(&i2s->lock); } static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) @@ -146,7 +142,6 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) unsigned int val = 0; int retry = 10; - mutex_lock(&i2s->lock); if (on) { regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE); @@ -181,14 +176,12 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) regmap_read(i2s->regmap, I2S_CLR, &val); retry--; if (!retry) { - dev_warn(i2s->dev, "%s: fail to clear\n", - __func__); + dev_warn(i2s->dev, "fail to clear\n"); break; } } } } - mutex_unlock(&i2s->lock); } static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai, @@ -608,8 +601,6 @@ static int rockchip_i2s_probe(struct platform_device *pdev) i2s->dev = &pdev->dev; - mutex_init(&i2s->lock); - i2s->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf"); if (!IS_ERR(i2s->grf)) { of_id = of_match_device(rockchip_i2s_match, &pdev->dev); |