.. | .. |
---|
132 | 132 | |
---|
133 | 133 | /* Error Handling: TX */ |
---|
134 | 134 | if (isr[i] & ISR_TXFO) { |
---|
135 | | - dev_err(dev->dev, "TX overrun (ch_id=%d)\n", i); |
---|
| 135 | + dev_err_ratelimited(dev->dev, "TX overrun (ch_id=%d)\n", i); |
---|
136 | 136 | irq_valid = true; |
---|
137 | 137 | } |
---|
138 | 138 | |
---|
139 | 139 | /* Error Handling: TX */ |
---|
140 | 140 | if (isr[i] & ISR_RXFO) { |
---|
141 | | - dev_err(dev->dev, "RX overrun (ch_id=%d)\n", i); |
---|
| 141 | + dev_err_ratelimited(dev->dev, "RX overrun (ch_id=%d)\n", i); |
---|
142 | 142 | irq_valid = true; |
---|
143 | 143 | } |
---|
144 | 144 | } |
---|
.. | .. |
---|
181 | 181 | i2s_write_reg(dev->i2s_base, CER, 0); |
---|
182 | 182 | i2s_write_reg(dev->i2s_base, IER, 0); |
---|
183 | 183 | } |
---|
184 | | -} |
---|
185 | | - |
---|
186 | | -static int dw_i2s_startup(struct snd_pcm_substream *substream, |
---|
187 | | - struct snd_soc_dai *cpu_dai) |
---|
188 | | -{ |
---|
189 | | - struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); |
---|
190 | | - union dw_i2s_snd_dma_data *dma_data = NULL; |
---|
191 | | - |
---|
192 | | - if (!(dev->capability & DWC_I2S_RECORD) && |
---|
193 | | - (substream->stream == SNDRV_PCM_STREAM_CAPTURE)) |
---|
194 | | - return -EINVAL; |
---|
195 | | - |
---|
196 | | - if (!(dev->capability & DWC_I2S_PLAY) && |
---|
197 | | - (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)) |
---|
198 | | - return -EINVAL; |
---|
199 | | - |
---|
200 | | - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
---|
201 | | - dma_data = &dev->play_dma_data; |
---|
202 | | - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) |
---|
203 | | - dma_data = &dev->capture_dma_data; |
---|
204 | | - |
---|
205 | | - snd_soc_dai_set_dma_data(cpu_dai, substream, (void *)dma_data); |
---|
206 | | - |
---|
207 | | - return 0; |
---|
208 | 184 | } |
---|
209 | 185 | |
---|
210 | 186 | static void dw_i2s_config(struct dw_i2s_dev *dev, int stream) |
---|
.. | .. |
---|
305 | 281 | return 0; |
---|
306 | 282 | } |
---|
307 | 283 | |
---|
308 | | -static void dw_i2s_shutdown(struct snd_pcm_substream *substream, |
---|
309 | | - struct snd_soc_dai *dai) |
---|
310 | | -{ |
---|
311 | | - snd_soc_dai_set_dma_data(dai, substream, NULL); |
---|
312 | | -} |
---|
313 | | - |
---|
314 | 284 | static int dw_i2s_prepare(struct snd_pcm_substream *substream, |
---|
315 | 285 | struct snd_soc_dai *dai) |
---|
316 | 286 | { |
---|
.. | .. |
---|
382 | 352 | } |
---|
383 | 353 | |
---|
384 | 354 | static const struct snd_soc_dai_ops dw_i2s_dai_ops = { |
---|
385 | | - .startup = dw_i2s_startup, |
---|
386 | | - .shutdown = dw_i2s_shutdown, |
---|
387 | 355 | .hw_params = dw_i2s_hw_params, |
---|
388 | 356 | .prepare = dw_i2s_prepare, |
---|
389 | 357 | .trigger = dw_i2s_trigger, |
---|
.. | .. |
---|
624 | 592 | |
---|
625 | 593 | } |
---|
626 | 594 | |
---|
| 595 | +static int dw_i2s_dai_probe(struct snd_soc_dai *dai) |
---|
| 596 | +{ |
---|
| 597 | + struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(dai); |
---|
| 598 | + |
---|
| 599 | + snd_soc_dai_init_dma_data(dai, &dev->play_dma_data, &dev->capture_dma_data); |
---|
| 600 | + return 0; |
---|
| 601 | +} |
---|
| 602 | + |
---|
627 | 603 | static int dw_i2s_probe(struct platform_device *pdev) |
---|
628 | 604 | { |
---|
629 | 605 | const struct i2s_platform_data *pdata = pdev->dev.platform_data; |
---|
.. | .. |
---|
642 | 618 | return -ENOMEM; |
---|
643 | 619 | |
---|
644 | 620 | dw_i2s_dai->ops = &dw_i2s_dai_ops; |
---|
| 621 | + dw_i2s_dai->probe = dw_i2s_dai_probe; |
---|
645 | 622 | |
---|
646 | 623 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
---|
647 | 624 | dev->i2s_base = devm_ioremap_resource(&pdev->dev, res); |
---|