Skip to content

Commit 1e347f8

Browse files
committed
ASoC: rockchip-i2s: Undo BCLK pinctrl changes
The version of the BCLK pinctrl management changes that made it into v5.19 has caused problems on some systems due to overly strict DT requirements but attempts to fix it have caused further breakage on other platforms. Just drop the changes for this release, we already have a better version queued for -next. Fixes: 26b9f2f ("ASoC: rockchip: i2s: Fix NULL pointer dereference when pinctrl is not found") Fixes: a5450ab ("ASoC: rockchip: i2s: switch BCLK to GPIO") Signed-off-by: Mark Brown <broonie@kernel.org> Link: https://lore.kernel.org/r/20220713130451.31481-1-broonie@kernel.org Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 26b9f2f commit 1e347f8

File tree

1 file changed

+31
-132
lines changed

1 file changed

+31
-132
lines changed

sound/soc/rockchip/rockchip_i2s.c

Lines changed: 31 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
#include <linux/of_gpio.h>
1414
#include <linux/of_device.h>
1515
#include <linux/clk.h>
16-
#include <linux/pinctrl/consumer.h>
1716
#include <linux/pm_runtime.h>
1817
#include <linux/regmap.h>
1918
#include <linux/spinlock.h>
@@ -55,40 +54,8 @@ struct rk_i2s_dev {
5554
const struct rk_i2s_pins *pins;
5655
unsigned int bclk_ratio;
5756
spinlock_t lock; /* tx/rx lock */
58-
struct pinctrl *pinctrl;
59-
struct pinctrl_state *bclk_on;
60-
struct pinctrl_state *bclk_off;
6157
};
6258

63-
static int i2s_pinctrl_select_bclk_on(struct rk_i2s_dev *i2s)
64-
{
65-
int ret = 0;
66-
67-
if (!IS_ERR(i2s->pinctrl) && !IS_ERR_OR_NULL(i2s->bclk_on))
68-
ret = pinctrl_select_state(i2s->pinctrl,
69-
i2s->bclk_on);
70-
71-
if (ret)
72-
dev_err(i2s->dev, "bclk enable failed %d\n", ret);
73-
74-
return ret;
75-
}
76-
77-
static int i2s_pinctrl_select_bclk_off(struct rk_i2s_dev *i2s)
78-
{
79-
80-
int ret = 0;
81-
82-
if (!IS_ERR(i2s->pinctrl) && !IS_ERR_OR_NULL(i2s->bclk_off))
83-
ret = pinctrl_select_state(i2s->pinctrl,
84-
i2s->bclk_off);
85-
86-
if (ret)
87-
dev_err(i2s->dev, "bclk disable failed %d\n", ret);
88-
89-
return ret;
90-
}
91-
9259
static int i2s_runtime_suspend(struct device *dev)
9360
{
9461
struct rk_i2s_dev *i2s = dev_get_drvdata(dev);
@@ -125,49 +92,38 @@ static inline struct rk_i2s_dev *to_info(struct snd_soc_dai *dai)
12592
return snd_soc_dai_get_drvdata(dai);
12693
}
12794

128-
static int rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on)
95+
static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on)
12996
{
13097
unsigned int val = 0;
13198
int retry = 10;
132-
int ret = 0;
13399

134100
spin_lock(&i2s->lock);
135101
if (on) {
136-
ret = regmap_update_bits(i2s->regmap, I2S_DMACR,
137-
I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE);
138-
if (ret < 0)
139-
goto end;
102+
regmap_update_bits(i2s->regmap, I2S_DMACR,
103+
I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE);
140104

141-
ret = regmap_update_bits(i2s->regmap, I2S_XFER,
142-
I2S_XFER_TXS_START | I2S_XFER_RXS_START,
143-
I2S_XFER_TXS_START | I2S_XFER_RXS_START);
144-
if (ret < 0)
145-
goto end;
105+
regmap_update_bits(i2s->regmap, I2S_XFER,
106+
I2S_XFER_TXS_START | I2S_XFER_RXS_START,
107+
I2S_XFER_TXS_START | I2S_XFER_RXS_START);
146108

147109
i2s->tx_start = true;
148110
} else {
149111
i2s->tx_start = false;
150112

151-
ret = regmap_update_bits(i2s->regmap, I2S_DMACR,
152-
I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE);
153-
if (ret < 0)
154-
goto end;
113+
regmap_update_bits(i2s->regmap, I2S_DMACR,
114+
I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE);
155115

156116
if (!i2s->rx_start) {
157-
ret = regmap_update_bits(i2s->regmap, I2S_XFER,
158-
I2S_XFER_TXS_START |
159-
I2S_XFER_RXS_START,
160-
I2S_XFER_TXS_STOP |
161-
I2S_XFER_RXS_STOP);
162-
if (ret < 0)
163-
goto end;
117+
regmap_update_bits(i2s->regmap, I2S_XFER,
118+
I2S_XFER_TXS_START |
119+
I2S_XFER_RXS_START,
120+
I2S_XFER_TXS_STOP |
121+
I2S_XFER_RXS_STOP);
164122

165123
udelay(150);
166-
ret = regmap_update_bits(i2s->regmap, I2S_CLR,
167-
I2S_CLR_TXC | I2S_CLR_RXC,
168-
I2S_CLR_TXC | I2S_CLR_RXC);
169-
if (ret < 0)
170-
goto end;
124+
regmap_update_bits(i2s->regmap, I2S_CLR,
125+
I2S_CLR_TXC | I2S_CLR_RXC,
126+
I2S_CLR_TXC | I2S_CLR_RXC);
171127

172128
regmap_read(i2s->regmap, I2S_CLR, &val);
173129

@@ -182,57 +138,44 @@ static int rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on)
182138
}
183139
}
184140
}
185-
end:
186141
spin_unlock(&i2s->lock);
187-
if (ret < 0)
188-
dev_err(i2s->dev, "lrclk update failed\n");
189-
190-
return ret;
191142
}
192143

193-
static int rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on)
144+
static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on)
194145
{
195146
unsigned int val = 0;
196147
int retry = 10;
197-
int ret = 0;
198148

199149
spin_lock(&i2s->lock);
200150
if (on) {
201-
ret = regmap_update_bits(i2s->regmap, I2S_DMACR,
151+
regmap_update_bits(i2s->regmap, I2S_DMACR,
202152
I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE);
203-
if (ret < 0)
204-
goto end;
205153

206-
ret = regmap_update_bits(i2s->regmap, I2S_XFER,
154+
regmap_update_bits(i2s->regmap, I2S_XFER,
207155
I2S_XFER_TXS_START | I2S_XFER_RXS_START,
208156
I2S_XFER_TXS_START | I2S_XFER_RXS_START);
209-
if (ret < 0)
210-
goto end;
211157

212158
i2s->rx_start = true;
213159
} else {
214160
i2s->rx_start = false;
215161

216-
ret = regmap_update_bits(i2s->regmap, I2S_DMACR,
162+
regmap_update_bits(i2s->regmap, I2S_DMACR,
217163
I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_DISABLE);
218-
if (ret < 0)
219-
goto end;
220164

221165
if (!i2s->tx_start) {
222-
ret = regmap_update_bits(i2s->regmap, I2S_XFER,
166+
regmap_update_bits(i2s->regmap, I2S_XFER,
223167
I2S_XFER_TXS_START |
224168
I2S_XFER_RXS_START,
225169
I2S_XFER_TXS_STOP |
226170
I2S_XFER_RXS_STOP);
227-
if (ret < 0)
228-
goto end;
171+
229172
udelay(150);
230-
ret = regmap_update_bits(i2s->regmap, I2S_CLR,
173+
regmap_update_bits(i2s->regmap, I2S_CLR,
231174
I2S_CLR_TXC | I2S_CLR_RXC,
232175
I2S_CLR_TXC | I2S_CLR_RXC);
233-
if (ret < 0)
234-
goto end;
176+
235177
regmap_read(i2s->regmap, I2S_CLR, &val);
178+
236179
/* Should wait for clear operation to finish */
237180
while (val) {
238181
regmap_read(i2s->regmap, I2S_CLR, &val);
@@ -244,12 +187,7 @@ static int rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on)
244187
}
245188
}
246189
}
247-
end:
248190
spin_unlock(&i2s->lock);
249-
if (ret < 0)
250-
dev_err(i2s->dev, "lrclk update failed\n");
251-
252-
return ret;
253191
}
254192

255193
static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
@@ -487,26 +425,17 @@ static int rockchip_i2s_trigger(struct snd_pcm_substream *substream,
487425
case SNDRV_PCM_TRIGGER_RESUME:
488426
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
489427
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
490-
ret = rockchip_snd_rxctrl(i2s, 1);
428+
rockchip_snd_rxctrl(i2s, 1);
491429
else
492-
ret = rockchip_snd_txctrl(i2s, 1);
493-
/* Do not turn on bclk if lrclk open fails. */
494-
if (ret < 0)
495-
return ret;
496-
i2s_pinctrl_select_bclk_on(i2s);
430+
rockchip_snd_txctrl(i2s, 1);
497431
break;
498432
case SNDRV_PCM_TRIGGER_SUSPEND:
499433
case SNDRV_PCM_TRIGGER_STOP:
500434
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
501-
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
502-
if (!i2s->tx_start)
503-
i2s_pinctrl_select_bclk_off(i2s);
504-
ret = rockchip_snd_rxctrl(i2s, 0);
505-
} else {
506-
if (!i2s->rx_start)
507-
i2s_pinctrl_select_bclk_off(i2s);
508-
ret = rockchip_snd_txctrl(i2s, 0);
509-
}
435+
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
436+
rockchip_snd_rxctrl(i2s, 0);
437+
else
438+
rockchip_snd_txctrl(i2s, 0);
510439
break;
511440
default:
512441
ret = -EINVAL;
@@ -807,36 +736,6 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
807736
}
808737

809738
i2s->bclk_ratio = 64;
810-
i2s->pinctrl = devm_pinctrl_get(&pdev->dev);
811-
if (IS_ERR(i2s->pinctrl)) {
812-
dev_err(&pdev->dev, "failed to find i2s pinctrl\n");
813-
ret = PTR_ERR(i2s->pinctrl);
814-
goto err_clk;
815-
}
816-
817-
i2s->bclk_on = pinctrl_lookup_state(i2s->pinctrl,
818-
"bclk_on");
819-
if (IS_ERR_OR_NULL(i2s->bclk_on))
820-
dev_err(&pdev->dev, "failed to find i2s default state\n");
821-
else
822-
dev_dbg(&pdev->dev, "find i2s bclk state\n");
823-
824-
i2s->bclk_off = pinctrl_lookup_state(i2s->pinctrl,
825-
"bclk_off");
826-
if (IS_ERR_OR_NULL(i2s->bclk_off))
827-
dev_err(&pdev->dev, "failed to find i2s gpio state\n");
828-
else
829-
dev_dbg(&pdev->dev, "find i2s bclk_off state\n");
830-
831-
i2s_pinctrl_select_bclk_off(i2s);
832-
833-
i2s->playback_dma_data.addr = res->start + I2S_TXDR;
834-
i2s->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
835-
i2s->playback_dma_data.maxburst = 4;
836-
837-
i2s->capture_dma_data.addr = res->start + I2S_RXDR;
838-
i2s->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
839-
i2s->capture_dma_data.maxburst = 4;
840739

841740
dev_set_drvdata(&pdev->dev, i2s);
842741

0 commit comments

Comments
 (0)