aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-11-08 05:43:29 -0500
committerMark Brown <broonie@linaro.org>2013-11-08 05:43:29 -0500
commitca2b2252fc42b20c4050937ba1a82a6af4fb83aa (patch)
tree9eb7aeb2fefc6a17a2fc2643516eda5387a2f42c
parentec7118e39181a66144e6ae77ea7e24894362145a (diff)
parent99d8d3ba512810feb13e158042975dcda75cef31 (diff)
Merge remote-tracking branch 'asoc/topic/kirkwood' into asoc-next
-rw-r--r--sound/soc/kirkwood/kirkwood-dma.c6
-rw-r--r--sound/soc/kirkwood/kirkwood-i2s.c108
-rw-r--r--sound/soc/kirkwood/kirkwood-openrd.c2
-rw-r--r--sound/soc/kirkwood/kirkwood-t5325.c2
-rw-r--r--sound/soc/kirkwood/kirkwood.h4
5 files changed, 94 insertions, 28 deletions
diff --git a/sound/soc/kirkwood/kirkwood-dma.c b/sound/soc/kirkwood/kirkwood-dma.c
index b238434f92b0..55d0d9d3a9fd 100644
--- a/sound/soc/kirkwood/kirkwood-dma.c
+++ b/sound/soc/kirkwood/kirkwood-dma.c
@@ -29,9 +29,7 @@
29#define KIRKWOOD_FORMATS \ 29#define KIRKWOOD_FORMATS \
30 (SNDRV_PCM_FMTBIT_S16_LE | \ 30 (SNDRV_PCM_FMTBIT_S16_LE | \
31 SNDRV_PCM_FMTBIT_S24_LE | \ 31 SNDRV_PCM_FMTBIT_S24_LE | \
32 SNDRV_PCM_FMTBIT_S32_LE | \ 32 SNDRV_PCM_FMTBIT_S32_LE)
33 SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE | \
34 SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE)
35 33
36static struct kirkwood_dma_data *kirkwood_priv(struct snd_pcm_substream *subs) 34static struct kirkwood_dma_data *kirkwood_priv(struct snd_pcm_substream *subs)
37{ 35{
@@ -161,7 +159,7 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream)
161 * Enable Error interrupts. We're only ack'ing them but 159 * Enable Error interrupts. We're only ack'ing them but
162 * it's useful for diagnostics 160 * it's useful for diagnostics
163 */ 161 */
164 writel((unsigned long)-1, priv->io + KIRKWOOD_ERR_MASK); 162 writel((unsigned int)-1, priv->io + KIRKWOOD_ERR_MASK);
165 } 163 }
166 164
167 dram = mv_mbus_dram_info(); 165 dram = mv_mbus_dram_info();
diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c
index 0f3d73d4ef48..d34d91743e3f 100644
--- a/sound/soc/kirkwood/kirkwood-i2s.c
+++ b/sound/soc/kirkwood/kirkwood-i2s.c
@@ -103,7 +103,7 @@ static void kirkwood_set_rate(struct snd_soc_dai *dai,
103{ 103{
104 uint32_t clks_ctrl; 104 uint32_t clks_ctrl;
105 105
106 if (rate == 44100 || rate == 48000 || rate == 96000) { 106 if (IS_ERR(priv->extclk)) {
107 /* use internal dco for the supported rates 107 /* use internal dco for the supported rates
108 * defined in kirkwood_i2s_dai */ 108 * defined in kirkwood_i2s_dai */
109 dev_dbg(dai->dev, "%s: dco set rate = %lu\n", 109 dev_dbg(dai->dev, "%s: dco set rate = %lu\n",
@@ -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,10 @@ 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,
410 .playback = { 428 .playback = {
411 .channels_min = 1, 429 .channels_min = 1,
412 .channels_max = 2, 430 .channels_max = 2,
@@ -422,10 +440,53 @@ static struct snd_soc_dai_driver kirkwood_i2s_dai = {
422 .formats = KIRKWOOD_I2S_FORMATS, 440 .formats = KIRKWOOD_I2S_FORMATS,
423 }, 441 },
424 .ops = &kirkwood_i2s_dai_ops, 442 .ops = &kirkwood_i2s_dai_ops,
443 },
444 {
445 .name = "spdif",
446 .id = 1,
447 .playback = {
448 .channels_min = 1,
449 .channels_max = 2,
450 .rates = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
451 SNDRV_PCM_RATE_96000,
452 .formats = KIRKWOOD_I2S_FORMATS,
453 },
454 .capture = {
455 .channels_min = 1,
456 .channels_max = 2,
457 .rates = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
458 SNDRV_PCM_RATE_96000,
459 .formats = KIRKWOOD_I2S_FORMATS,
460 },
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;
@@ -496,14 +558,17 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev)
496 return err; 558 return err;
497 559
498 priv->extclk = devm_clk_get(&pdev->dev, "extclk"); 560 priv->extclk = devm_clk_get(&pdev->dev, "extclk");
499 if (!IS_ERR(priv->extclk)) { 561 if (IS_ERR(priv->extclk)) {
562 if (PTR_ERR(priv->extclk) == -EPROBE_DEFER)
563 return -EPROBE_DEFER;
564 } else {
500 if (priv->extclk == priv->clk) { 565 if (priv->extclk == priv->clk) {
501 devm_clk_put(&pdev->dev, priv->extclk); 566 devm_clk_put(&pdev->dev, priv->extclk);
502 priv->extclk = ERR_PTR(-EINVAL); 567 priv->extclk = ERR_PTR(-EINVAL);
503 } else { 568 } else {
504 dev_info(&pdev->dev, "found external clock\n"); 569 dev_info(&pdev->dev, "found external clock\n");
505 clk_prepare_enable(priv->extclk); 570 clk_prepare_enable(priv->extclk);
506 soc_dai = &kirkwood_i2s_dai_extclk; 571 soc_dai = kirkwood_i2s_dai_extclk;
507 } 572 }
508 } 573 }
509 574
@@ -521,7 +586,7 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev)
521 } 586 }
522 587
523 err = snd_soc_register_component(&pdev->dev, &kirkwood_i2s_component, 588 err = snd_soc_register_component(&pdev->dev, &kirkwood_i2s_component,
524 soc_dai, 1); 589 soc_dai, 2);
525 if (err) { 590 if (err) {
526 dev_err(&pdev->dev, "snd_soc_register_component failed\n"); 591 dev_err(&pdev->dev, "snd_soc_register_component failed\n");
527 goto err_component; 592 goto err_component;
@@ -532,6 +597,9 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev)
532 dev_err(&pdev->dev, "snd_soc_register_platform failed\n"); 597 dev_err(&pdev->dev, "snd_soc_register_platform failed\n");
533 goto err_platform; 598 goto err_platform;
534 } 599 }
600
601 kirkwood_i2s_init(priv);
602
535 return 0; 603 return 0;
536 err_platform: 604 err_platform:
537 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",
diff --git a/sound/soc/kirkwood/kirkwood.h b/sound/soc/kirkwood/kirkwood.h
index f8e1ccc1c58c..bf23afbba1d7 100644
--- a/sound/soc/kirkwood/kirkwood.h
+++ b/sound/soc/kirkwood/kirkwood.h
@@ -123,8 +123,8 @@
123/* need to find where they come from */ 123/* need to find where they come from */
124#define KIRKWOOD_SND_MIN_PERIODS 8 124#define KIRKWOOD_SND_MIN_PERIODS 8
125#define KIRKWOOD_SND_MAX_PERIODS 16 125#define KIRKWOOD_SND_MAX_PERIODS 16
126#define KIRKWOOD_SND_MIN_PERIOD_BYTES 0x4000 126#define KIRKWOOD_SND_MIN_PERIOD_BYTES 0x800
127#define KIRKWOOD_SND_MAX_PERIOD_BYTES 0x4000 127#define KIRKWOOD_SND_MAX_PERIOD_BYTES 0x8000
128#define KIRKWOOD_SND_MAX_BUFFER_BYTES (KIRKWOOD_SND_MAX_PERIOD_BYTES \ 128#define KIRKWOOD_SND_MAX_BUFFER_BYTES (KIRKWOOD_SND_MAX_PERIOD_BYTES \
129 * KIRKWOOD_SND_MAX_PERIODS) 129 * KIRKWOOD_SND_MAX_PERIODS)
130 130