| .. | .. |
|---|
| 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); |
|---|