aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/kirkwood/kirkwood-i2s.c99
-rw-r--r--sound/soc/kirkwood/kirkwood-openrd.c2
-rw-r--r--sound/soc/kirkwood/kirkwood-t5325.c2
3 files changed, 84 insertions, 19 deletions
diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c
index d0504a2d8c63..9ec38d15df9e 100644
--- a/sound/soc/kirkwood/kirkwood-i2s.c
+++ b/sound/soc/kirkwood/kirkwood-i2s.c
@@ -160,9 +160,11 @@ static int kirkwood_i2s_hw_params(struct snd_pcm_substream *substream,
160 case SNDRV_PCM_FORMAT_S16_LE: 160 case SNDRV_PCM_FORMAT_S16_LE:
161 i2s_value |= KIRKWOOD_I2S_CTL_SIZE_16; 161 i2s_value |= KIRKWOOD_I2S_CTL_SIZE_16;
162 ctl_play = KIRKWOOD_PLAYCTL_SIZE_16_C | 162 ctl_play = KIRKWOOD_PLAYCTL_SIZE_16_C |
163 KIRKWOOD_PLAYCTL_I2S_EN; 163 KIRKWOOD_PLAYCTL_I2S_EN |
164 KIRKWOOD_PLAYCTL_SPDIF_EN;
164 ctl_rec = KIRKWOOD_RECCTL_SIZE_16_C | 165 ctl_rec = KIRKWOOD_RECCTL_SIZE_16_C |
165 KIRKWOOD_RECCTL_I2S_EN; 166 KIRKWOOD_RECCTL_I2S_EN |
167 KIRKWOOD_RECCTL_SPDIF_EN;
166 break; 168 break;
167 /* 169 /*
168 * doesn't work... S20_3LE != kirkwood 20bit format ? 170 * doesn't work... S20_3LE != kirkwood 20bit format ?
@@ -178,9 +180,11 @@ static int kirkwood_i2s_hw_params(struct snd_pcm_substream *substream,
178 case SNDRV_PCM_FORMAT_S24_LE: 180 case SNDRV_PCM_FORMAT_S24_LE:
179 i2s_value |= KIRKWOOD_I2S_CTL_SIZE_24; 181 i2s_value |= KIRKWOOD_I2S_CTL_SIZE_24;
180 ctl_play = KIRKWOOD_PLAYCTL_SIZE_24 | 182 ctl_play = KIRKWOOD_PLAYCTL_SIZE_24 |
181 KIRKWOOD_PLAYCTL_I2S_EN; 183 KIRKWOOD_PLAYCTL_I2S_EN |
184 KIRKWOOD_PLAYCTL_SPDIF_EN;
182 ctl_rec = KIRKWOOD_RECCTL_SIZE_24 | 185 ctl_rec = KIRKWOOD_RECCTL_SIZE_24 |
183 KIRKWOOD_RECCTL_I2S_EN; 186 KIRKWOOD_RECCTL_I2S_EN |
187 KIRKWOOD_RECCTL_SPDIF_EN;
184 break; 188 break;
185 case SNDRV_PCM_FORMAT_S32_LE: 189 case SNDRV_PCM_FORMAT_S32_LE:
186 i2s_value |= KIRKWOOD_I2S_CTL_SIZE_32; 190 i2s_value |= KIRKWOOD_I2S_CTL_SIZE_32;
@@ -240,6 +244,11 @@ static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream,
240 ctl); 244 ctl);
241 } 245 }
242 246
247 if (dai->id == 0)
248 ctl &= ~KIRKWOOD_PLAYCTL_SPDIF_EN; /* i2s */
249 else
250 ctl &= ~KIRKWOOD_PLAYCTL_I2S_EN; /* spdif */
251
243 switch (cmd) { 252 switch (cmd) {
244 case SNDRV_PCM_TRIGGER_START: 253 case SNDRV_PCM_TRIGGER_START:
245 /* configure */ 254 /* configure */
@@ -258,7 +267,8 @@ static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream,
258 267
259 case SNDRV_PCM_TRIGGER_STOP: 268 case SNDRV_PCM_TRIGGER_STOP:
260 /* stop audio, disable interrupts */ 269 /* stop audio, disable interrupts */
261 ctl |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE; 270 ctl |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE |
271 KIRKWOOD_PLAYCTL_SPDIF_MUTE;
262 writel(ctl, priv->io + KIRKWOOD_PLAYCTL); 272 writel(ctl, priv->io + KIRKWOOD_PLAYCTL);
263 273
264 value = readl(priv->io + KIRKWOOD_INT_MASK); 274 value = readl(priv->io + KIRKWOOD_INT_MASK);
@@ -272,13 +282,15 @@ static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream,
272 282
273 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 283 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
274 case SNDRV_PCM_TRIGGER_SUSPEND: 284 case SNDRV_PCM_TRIGGER_SUSPEND:
275 ctl |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE; 285 ctl |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE |
286 KIRKWOOD_PLAYCTL_SPDIF_MUTE;
276 writel(ctl, priv->io + KIRKWOOD_PLAYCTL); 287 writel(ctl, priv->io + KIRKWOOD_PLAYCTL);
277 break; 288 break;
278 289
279 case SNDRV_PCM_TRIGGER_RESUME: 290 case SNDRV_PCM_TRIGGER_RESUME:
280 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 291 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
281 ctl &= ~(KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE); 292 ctl &= ~(KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE |
293 KIRKWOOD_PLAYCTL_SPDIF_MUTE);
282 writel(ctl, priv->io + KIRKWOOD_PLAYCTL); 294 writel(ctl, priv->io + KIRKWOOD_PLAYCTL);
283 break; 295 break;
284 296
@@ -301,7 +313,13 @@ static int kirkwood_i2s_rec_trigger(struct snd_pcm_substream *substream,
301 case SNDRV_PCM_TRIGGER_START: 313 case SNDRV_PCM_TRIGGER_START:
302 /* configure */ 314 /* configure */
303 ctl = priv->ctl_rec; 315 ctl = priv->ctl_rec;
304 value = ctl & ~KIRKWOOD_RECCTL_I2S_EN; 316 if (dai->id == 0)
317 ctl &= ~KIRKWOOD_RECCTL_SPDIF_EN; /* i2s */
318 else
319 ctl &= ~KIRKWOOD_RECCTL_I2S_EN; /* spdif */
320
321 value = ctl & ~(KIRKWOOD_RECCTL_I2S_EN |
322 KIRKWOOD_RECCTL_SPDIF_EN);
305 writel(value, priv->io + KIRKWOOD_RECCTL); 323 writel(value, priv->io + KIRKWOOD_RECCTL);
306 324
307 /* enable interrupts */ 325 /* enable interrupts */
@@ -361,9 +379,8 @@ static int kirkwood_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
361 return 0; 379 return 0;
362} 380}
363 381
364static int kirkwood_i2s_probe(struct snd_soc_dai *dai) 382static int kirkwood_i2s_init(struct kirkwood_dma_data *priv)
365{ 383{
366 struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai);
367 unsigned long value; 384 unsigned long value;
368 unsigned int reg_data; 385 unsigned int reg_data;
369 386
@@ -404,9 +421,29 @@ static const struct snd_soc_dai_ops kirkwood_i2s_dai_ops = {
404 .set_fmt = kirkwood_i2s_set_fmt, 421 .set_fmt = kirkwood_i2s_set_fmt,
405}; 422};
406 423
407 424static struct snd_soc_dai_driver kirkwood_i2s_dai[2] = {
408static struct snd_soc_dai_driver kirkwood_i2s_dai = { 425 {
409 .probe = kirkwood_i2s_probe, 426 .name = "i2s",
427 .id = 0,
428 .playback = {
429 .channels_min = 1,
430 .channels_max = 2,
431 .rates = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
432 SNDRV_PCM_RATE_96000,
433 .formats = KIRKWOOD_I2S_FORMATS,
434 },
435 .capture = {
436 .channels_min = 1,
437 .channels_max = 2,
438 .rates = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
439 SNDRV_PCM_RATE_96000,
440 .formats = KIRKWOOD_I2S_FORMATS,
441 },
442 .ops = &kirkwood_i2s_dai_ops,
443 },
444 {
445 .name = "spdif",
446 .id = 1,
410 .playback = { 447 .playback = {
411 .channels_min = 1, 448 .channels_min = 1,
412 .channels_max = 2, 449 .channels_max = 2,
@@ -422,10 +459,34 @@ static struct snd_soc_dai_driver kirkwood_i2s_dai = {
422 .formats = KIRKWOOD_I2S_FORMATS, 459 .formats = KIRKWOOD_I2S_FORMATS,
423 }, 460 },
424 .ops = &kirkwood_i2s_dai_ops, 461 .ops = &kirkwood_i2s_dai_ops,
462 },
425}; 463};
426 464
427static struct snd_soc_dai_driver kirkwood_i2s_dai_extclk = { 465static struct snd_soc_dai_driver kirkwood_i2s_dai_extclk[2] = {
428 .probe = kirkwood_i2s_probe, 466 {
467 .name = "i2s",
468 .id = 0,
469 .playback = {
470 .channels_min = 1,
471 .channels_max = 2,
472 .rates = SNDRV_PCM_RATE_8000_192000 |
473 SNDRV_PCM_RATE_CONTINUOUS |
474 SNDRV_PCM_RATE_KNOT,
475 .formats = KIRKWOOD_I2S_FORMATS,
476 },
477 .capture = {
478 .channels_min = 1,
479 .channels_max = 2,
480 .rates = SNDRV_PCM_RATE_8000_192000 |
481 SNDRV_PCM_RATE_CONTINUOUS |
482 SNDRV_PCM_RATE_KNOT,
483 .formats = KIRKWOOD_I2S_FORMATS,
484 },
485 .ops = &kirkwood_i2s_dai_ops,
486 },
487 {
488 .name = "spdif",
489 .id = 1,
429 .playback = { 490 .playback = {
430 .channels_min = 1, 491 .channels_min = 1,
431 .channels_max = 2, 492 .channels_max = 2,
@@ -443,6 +504,7 @@ static struct snd_soc_dai_driver kirkwood_i2s_dai_extclk = {
443 .formats = KIRKWOOD_I2S_FORMATS, 504 .formats = KIRKWOOD_I2S_FORMATS,
444 }, 505 },
445 .ops = &kirkwood_i2s_dai_ops, 506 .ops = &kirkwood_i2s_dai_ops,
507 },
446}; 508};
447 509
448static const struct snd_soc_component_driver kirkwood_i2s_component = { 510static const struct snd_soc_component_driver kirkwood_i2s_component = {
@@ -452,7 +514,7 @@ static const struct snd_soc_component_driver kirkwood_i2s_component = {
452static int kirkwood_i2s_dev_probe(struct platform_device *pdev) 514static int kirkwood_i2s_dev_probe(struct platform_device *pdev)
453{ 515{
454 struct kirkwood_asoc_platform_data *data = pdev->dev.platform_data; 516 struct kirkwood_asoc_platform_data *data = pdev->dev.platform_data;
455 struct snd_soc_dai_driver *soc_dai = &kirkwood_i2s_dai; 517 struct snd_soc_dai_driver *soc_dai = kirkwood_i2s_dai;
456 struct kirkwood_dma_data *priv; 518 struct kirkwood_dma_data *priv;
457 struct resource *mem; 519 struct resource *mem;
458 struct device_node *np = pdev->dev.of_node; 520 struct device_node *np = pdev->dev.of_node;
@@ -524,7 +586,7 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev)
524 } 586 }
525 587
526 err = snd_soc_register_component(&pdev->dev, &kirkwood_i2s_component, 588 err = snd_soc_register_component(&pdev->dev, &kirkwood_i2s_component,
527 soc_dai, 1); 589 soc_dai, 2);
528 if (err) { 590 if (err) {
529 dev_err(&pdev->dev, "snd_soc_register_component failed\n"); 591 dev_err(&pdev->dev, "snd_soc_register_component failed\n");
530 goto err_component; 592 goto err_component;
@@ -535,6 +597,9 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev)
535 dev_err(&pdev->dev, "snd_soc_register_platform failed\n"); 597 dev_err(&pdev->dev, "snd_soc_register_platform failed\n");
536 goto err_platform; 598 goto err_platform;
537 } 599 }
600
601 kirkwood_i2s_init(priv);
602
538 return 0; 603 return 0;
539 err_platform: 604 err_platform:
540 snd_soc_unregister_component(&pdev->dev); 605 snd_soc_unregister_component(&pdev->dev);
diff --git a/sound/soc/kirkwood/kirkwood-openrd.c b/sound/soc/kirkwood/kirkwood-openrd.c
index 025be0e97164..65f2a5b9ec3b 100644
--- a/sound/soc/kirkwood/kirkwood-openrd.c
+++ b/sound/soc/kirkwood/kirkwood-openrd.c
@@ -52,7 +52,7 @@ static struct snd_soc_dai_link openrd_client_dai[] = {
52{ 52{
53 .name = "CS42L51", 53 .name = "CS42L51",
54 .stream_name = "CS42L51 HiFi", 54 .stream_name = "CS42L51 HiFi",
55 .cpu_dai_name = "mvebu-audio", 55 .cpu_dai_name = "i2s",
56 .platform_name = "mvebu-audio", 56 .platform_name = "mvebu-audio",
57 .codec_dai_name = "cs42l51-hifi", 57 .codec_dai_name = "cs42l51-hifi",
58 .codec_name = "cs42l51-codec.0-004a", 58 .codec_name = "cs42l51-codec.0-004a",
diff --git a/sound/soc/kirkwood/kirkwood-t5325.c b/sound/soc/kirkwood/kirkwood-t5325.c
index 27545b0c4856..d213832b0c72 100644
--- a/sound/soc/kirkwood/kirkwood-t5325.c
+++ b/sound/soc/kirkwood/kirkwood-t5325.c
@@ -68,7 +68,7 @@ static struct snd_soc_dai_link t5325_dai[] = {
68{ 68{
69 .name = "ALC5621", 69 .name = "ALC5621",
70 .stream_name = "ALC5621 HiFi", 70 .stream_name = "ALC5621 HiFi",
71 .cpu_dai_name = "mvebu-audio", 71 .cpu_dai_name = "i2s",
72 .platform_name = "mvebu-audio", 72 .platform_name = "mvebu-audio",
73 .codec_dai_name = "alc5621-hifi", 73 .codec_dai_name = "alc5621-hifi",
74 .codec_name = "alc562x-codec.0-001a", 74 .codec_name = "alc562x-codec.0-001a",