Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'sound-5.19-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
"Only undoes the Rockchip BCLK changes to address a regression"

* tag 'sound-5.19-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ASoC: rockchip-i2s: Undo BCLK pinctrl changes
ASoC: rockchip: i2s: Fix NULL pointer dereference when pinctrl is not found

+31 -129
+31 -129
sound/soc/rockchip/rockchip_i2s.c
··· 13 13 #include <linux/of_gpio.h> 14 14 #include <linux/of_device.h> 15 15 #include <linux/clk.h> 16 - #include <linux/pinctrl/consumer.h> 17 16 #include <linux/pm_runtime.h> 18 17 #include <linux/regmap.h> 19 18 #include <linux/spinlock.h> ··· 54 55 const struct rk_i2s_pins *pins; 55 56 unsigned int bclk_ratio; 56 57 spinlock_t lock; /* tx/rx lock */ 57 - struct pinctrl *pinctrl; 58 - struct pinctrl_state *bclk_on; 59 - struct pinctrl_state *bclk_off; 60 58 }; 61 - 62 - static int i2s_pinctrl_select_bclk_on(struct rk_i2s_dev *i2s) 63 - { 64 - int ret = 0; 65 - 66 - if (!IS_ERR(i2s->pinctrl) && !IS_ERR_OR_NULL(i2s->bclk_on)) 67 - ret = pinctrl_select_state(i2s->pinctrl, 68 - i2s->bclk_on); 69 - 70 - if (ret) 71 - dev_err(i2s->dev, "bclk enable failed %d\n", ret); 72 - 73 - return ret; 74 - } 75 - 76 - static int i2s_pinctrl_select_bclk_off(struct rk_i2s_dev *i2s) 77 - { 78 - 79 - int ret = 0; 80 - 81 - if (!IS_ERR(i2s->pinctrl) && !IS_ERR_OR_NULL(i2s->bclk_off)) 82 - ret = pinctrl_select_state(i2s->pinctrl, 83 - i2s->bclk_off); 84 - 85 - if (ret) 86 - dev_err(i2s->dev, "bclk disable failed %d\n", ret); 87 - 88 - return ret; 89 - } 90 59 91 60 static int i2s_runtime_suspend(struct device *dev) 92 61 { ··· 92 125 return snd_soc_dai_get_drvdata(dai); 93 126 } 94 127 95 - static int rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) 128 + static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) 96 129 { 97 130 unsigned int val = 0; 98 131 int retry = 10; 99 - int ret = 0; 100 132 101 133 spin_lock(&i2s->lock); 102 134 if (on) { 103 - ret = regmap_update_bits(i2s->regmap, I2S_DMACR, 104 - I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE); 105 - if (ret < 0) 106 - goto end; 135 + regmap_update_bits(i2s->regmap, I2S_DMACR, 136 + I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE); 107 137 108 - ret = regmap_update_bits(i2s->regmap, I2S_XFER, 109 - I2S_XFER_TXS_START | I2S_XFER_RXS_START, 110 - I2S_XFER_TXS_START | I2S_XFER_RXS_START); 111 - if (ret < 0) 112 - goto end; 138 + regmap_update_bits(i2s->regmap, I2S_XFER, 139 + I2S_XFER_TXS_START | I2S_XFER_RXS_START, 140 + I2S_XFER_TXS_START | I2S_XFER_RXS_START); 113 141 114 142 i2s->tx_start = true; 115 143 } else { 116 144 i2s->tx_start = false; 117 145 118 - ret = regmap_update_bits(i2s->regmap, I2S_DMACR, 119 - I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE); 120 - if (ret < 0) 121 - goto end; 146 + regmap_update_bits(i2s->regmap, I2S_DMACR, 147 + I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE); 122 148 123 149 if (!i2s->rx_start) { 124 - ret = regmap_update_bits(i2s->regmap, I2S_XFER, 125 - I2S_XFER_TXS_START | 126 - I2S_XFER_RXS_START, 127 - I2S_XFER_TXS_STOP | 128 - I2S_XFER_RXS_STOP); 129 - if (ret < 0) 130 - goto end; 150 + regmap_update_bits(i2s->regmap, I2S_XFER, 151 + I2S_XFER_TXS_START | 152 + I2S_XFER_RXS_START, 153 + I2S_XFER_TXS_STOP | 154 + I2S_XFER_RXS_STOP); 131 155 132 156 udelay(150); 133 - ret = regmap_update_bits(i2s->regmap, I2S_CLR, 134 - I2S_CLR_TXC | I2S_CLR_RXC, 135 - I2S_CLR_TXC | I2S_CLR_RXC); 136 - if (ret < 0) 137 - goto end; 157 + regmap_update_bits(i2s->regmap, I2S_CLR, 158 + I2S_CLR_TXC | I2S_CLR_RXC, 159 + I2S_CLR_TXC | I2S_CLR_RXC); 138 160 139 161 regmap_read(i2s->regmap, I2S_CLR, &val); 140 162 ··· 138 182 } 139 183 } 140 184 } 141 - end: 142 185 spin_unlock(&i2s->lock); 143 - if (ret < 0) 144 - dev_err(i2s->dev, "lrclk update failed\n"); 145 - 146 - return ret; 147 186 } 148 187 149 - static int rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) 188 + static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) 150 189 { 151 190 unsigned int val = 0; 152 191 int retry = 10; 153 - int ret = 0; 154 192 155 193 spin_lock(&i2s->lock); 156 194 if (on) { 157 - ret = regmap_update_bits(i2s->regmap, I2S_DMACR, 195 + regmap_update_bits(i2s->regmap, I2S_DMACR, 158 196 I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE); 159 - if (ret < 0) 160 - goto end; 161 197 162 - ret = regmap_update_bits(i2s->regmap, I2S_XFER, 198 + regmap_update_bits(i2s->regmap, I2S_XFER, 163 199 I2S_XFER_TXS_START | I2S_XFER_RXS_START, 164 200 I2S_XFER_TXS_START | I2S_XFER_RXS_START); 165 - if (ret < 0) 166 - goto end; 167 201 168 202 i2s->rx_start = true; 169 203 } else { 170 204 i2s->rx_start = false; 171 205 172 - ret = regmap_update_bits(i2s->regmap, I2S_DMACR, 206 + regmap_update_bits(i2s->regmap, I2S_DMACR, 173 207 I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_DISABLE); 174 - if (ret < 0) 175 - goto end; 176 208 177 209 if (!i2s->tx_start) { 178 - ret = regmap_update_bits(i2s->regmap, I2S_XFER, 210 + regmap_update_bits(i2s->regmap, I2S_XFER, 179 211 I2S_XFER_TXS_START | 180 212 I2S_XFER_RXS_START, 181 213 I2S_XFER_TXS_STOP | 182 214 I2S_XFER_RXS_STOP); 183 - if (ret < 0) 184 - goto end; 215 + 185 216 udelay(150); 186 - ret = regmap_update_bits(i2s->regmap, I2S_CLR, 217 + regmap_update_bits(i2s->regmap, I2S_CLR, 187 218 I2S_CLR_TXC | I2S_CLR_RXC, 188 219 I2S_CLR_TXC | I2S_CLR_RXC); 189 - if (ret < 0) 190 - goto end; 220 + 191 221 regmap_read(i2s->regmap, I2S_CLR, &val); 222 + 192 223 /* Should wait for clear operation to finish */ 193 224 while (val) { 194 225 regmap_read(i2s->regmap, I2S_CLR, &val); ··· 187 244 } 188 245 } 189 246 } 190 - end: 191 247 spin_unlock(&i2s->lock); 192 - if (ret < 0) 193 - dev_err(i2s->dev, "lrclk update failed\n"); 194 - 195 - return ret; 196 248 } 197 249 198 250 static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai, ··· 425 487 case SNDRV_PCM_TRIGGER_RESUME: 426 488 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 427 489 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) 428 - ret = rockchip_snd_rxctrl(i2s, 1); 490 + rockchip_snd_rxctrl(i2s, 1); 429 491 else 430 - ret = rockchip_snd_txctrl(i2s, 1); 431 - /* Do not turn on bclk if lrclk open fails. */ 432 - if (ret < 0) 433 - return ret; 434 - i2s_pinctrl_select_bclk_on(i2s); 492 + rockchip_snd_txctrl(i2s, 1); 435 493 break; 436 494 case SNDRV_PCM_TRIGGER_SUSPEND: 437 495 case SNDRV_PCM_TRIGGER_STOP: 438 496 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 439 - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { 440 - if (!i2s->tx_start) 441 - i2s_pinctrl_select_bclk_off(i2s); 442 - ret = rockchip_snd_rxctrl(i2s, 0); 443 - } else { 444 - if (!i2s->rx_start) 445 - i2s_pinctrl_select_bclk_off(i2s); 446 - ret = rockchip_snd_txctrl(i2s, 0); 447 - } 497 + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) 498 + rockchip_snd_rxctrl(i2s, 0); 499 + else 500 + rockchip_snd_txctrl(i2s, 0); 448 501 break; 449 502 default: 450 503 ret = -EINVAL; ··· 736 807 } 737 808 738 809 i2s->bclk_ratio = 64; 739 - i2s->pinctrl = devm_pinctrl_get(&pdev->dev); 740 - if (IS_ERR(i2s->pinctrl)) 741 - dev_err(&pdev->dev, "failed to find i2s pinctrl\n"); 742 - 743 - i2s->bclk_on = pinctrl_lookup_state(i2s->pinctrl, 744 - "bclk_on"); 745 - if (IS_ERR_OR_NULL(i2s->bclk_on)) 746 - dev_err(&pdev->dev, "failed to find i2s default state\n"); 747 - else 748 - dev_dbg(&pdev->dev, "find i2s bclk state\n"); 749 - 750 - i2s->bclk_off = pinctrl_lookup_state(i2s->pinctrl, 751 - "bclk_off"); 752 - if (IS_ERR_OR_NULL(i2s->bclk_off)) 753 - dev_err(&pdev->dev, "failed to find i2s gpio state\n"); 754 - else 755 - dev_dbg(&pdev->dev, "find i2s bclk_off state\n"); 756 - 757 - i2s_pinctrl_select_bclk_off(i2s); 758 - 759 - i2s->playback_dma_data.addr = res->start + I2S_TXDR; 760 - i2s->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; 761 - i2s->playback_dma_data.maxburst = 4; 762 - 763 - i2s->capture_dma_data.addr = res->start + I2S_RXDR; 764 - i2s->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; 765 - i2s->capture_dma_data.maxburst = 4; 766 810 767 811 dev_set_drvdata(&pdev->dev, i2s); 768 812