Commit 9b1be0f976a158590b924ac8789afe69b06dd302

Authored by Linus Torvalds

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

Pull sound fixes from Takashi Iwai:
 "We have a bit more changes than usual in ASoC here, as it was slipped
  from the previous update.  There are one minr ASoC PCM code fix and
  ASoC dmaengine fix, in addition of a collection of small ASoC driver
  fixes.  The rest are a couple of HD-audio stable fixups, and a
  long-standing fix for the paused stream handling.

  So, all commits look not scary (and hopefully won't give you
  disastrous holiday season)"

* tag 'sound-3.13-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: hda - Add Dell headset detection quirk for one more laptop model
  ASoC: wm8904: fix DSP mode B configuration
  ASoC: wm_adsp: Add small delay while polling DSP RAM start
  ALSA: Add SNDRV_PCM_STATE_PAUSED case in wait_for_avail function
  ASoC: kirkwood: Fix the CPU DAI rates
  ASoC: wm5110: Correct HPOUT3 DAPM route typo
  ALSA: hda - Add Dell headset detection quirk for three laptop models
  ALSA: hda - Add enable_msi=0 workaround for four HP machines
  ASoC: don't leak on error in snd_dmaengine_pcm_register
  ASoC: fsl: imx-wm8962: Don't update bias_level in machine driver
  ASoC: tegra: fix uninitialized variables in set_fmt
  ASoC: wm8962: Enable SYSCLK provisonally before fetching generated DSPCLK_DIV
  ASoC: sam9x5_wm8731: change to work in DSP A mode
  ASoC: atmel_ssc_dai: add dai trigger ops
  ASoC: soc-pcm: Use valid condition for snd_soc_dai_digital_mute() in hw_free()

Showing 16 changed files Side-by-side Diff

sound/core/pcm_lib.c
... ... @@ -1937,6 +1937,8 @@
1937 1937 case SNDRV_PCM_STATE_DISCONNECTED:
1938 1938 err = -EBADFD;
1939 1939 goto _endloop;
  1940 + case SNDRV_PCM_STATE_PAUSED:
  1941 + continue;
1940 1942 }
1941 1943 if (!tout) {
1942 1944 snd_printd("%s write error (DMA or IRQ trouble?)\n",
sound/pci/hda/hda_intel.c
... ... @@ -3433,6 +3433,10 @@
3433 3433 * white/black-list for enable_msi
3434 3434 */
3435 3435 static struct snd_pci_quirk msi_black_list[] = {
  3436 + SND_PCI_QUIRK(0x103c, 0x2191, "HP", 0), /* AMD Hudson */
  3437 + SND_PCI_QUIRK(0x103c, 0x2192, "HP", 0), /* AMD Hudson */
  3438 + SND_PCI_QUIRK(0x103c, 0x21f7, "HP", 0), /* AMD Hudson */
  3439 + SND_PCI_QUIRK(0x103c, 0x21fa, "HP", 0), /* AMD Hudson */
3436 3440 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
3437 3441 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
3438 3442 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
sound/pci/hda/patch_realtek.c
... ... @@ -4247,12 +4247,16 @@
4247 4247 SND_PCI_QUIRK(0x1028, 0x0606, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
4248 4248 SND_PCI_QUIRK(0x1028, 0x0608, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
4249 4249 SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
  4250 + SND_PCI_QUIRK(0x1028, 0x0610, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
4250 4251 SND_PCI_QUIRK(0x1028, 0x0613, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
4251 4252 SND_PCI_QUIRK(0x1028, 0x0614, "Dell Inspiron 3135", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
4252 4253 SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_MONO_SPEAKERS),
4253 4254 SND_PCI_QUIRK(0x1028, 0x061f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
  4255 + SND_PCI_QUIRK(0x1028, 0x0629, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
4254 4256 SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS),
  4257 + SND_PCI_QUIRK(0x1028, 0x063e, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
4255 4258 SND_PCI_QUIRK(0x1028, 0x063f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
  4259 + SND_PCI_QUIRK(0x1028, 0x0640, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
4256 4260 SND_PCI_QUIRK(0x1028, 0x15cc, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
4257 4261 SND_PCI_QUIRK(0x1028, 0x15cd, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
4258 4262 SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
sound/soc/atmel/atmel_ssc_dai.c
... ... @@ -648,7 +648,7 @@
648 648  
649 649 dma_params = ssc_p->dma_params[dir];
650 650  
651   - ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_enable);
  651 + ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_disable);
652 652 ssc_writel(ssc_p->ssc->regs, IDR, dma_params->mask->ssc_error);
653 653  
654 654 pr_debug("%s enabled SSC_SR=0x%08x\n",
655 655  
... ... @@ -657,7 +657,34 @@
657 657 return 0;
658 658 }
659 659  
  660 +static int atmel_ssc_trigger(struct snd_pcm_substream *substream,
  661 + int cmd, struct snd_soc_dai *dai)
  662 +{
  663 + struct atmel_ssc_info *ssc_p = &ssc_info[dai->id];
  664 + struct atmel_pcm_dma_params *dma_params;
  665 + int dir;
660 666  
  667 + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  668 + dir = 0;
  669 + else
  670 + dir = 1;
  671 +
  672 + dma_params = ssc_p->dma_params[dir];
  673 +
  674 + switch (cmd) {
  675 + case SNDRV_PCM_TRIGGER_START:
  676 + case SNDRV_PCM_TRIGGER_RESUME:
  677 + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  678 + ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_enable);
  679 + break;
  680 + default:
  681 + ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_disable);
  682 + break;
  683 + }
  684 +
  685 + return 0;
  686 +}
  687 +
661 688 #ifdef CONFIG_PM
662 689 static int atmel_ssc_suspend(struct snd_soc_dai *cpu_dai)
663 690 {
... ... @@ -731,6 +758,7 @@
731 758 .startup = atmel_ssc_startup,
732 759 .shutdown = atmel_ssc_shutdown,
733 760 .prepare = atmel_ssc_prepare,
  761 + .trigger = atmel_ssc_trigger,
734 762 .hw_params = atmel_ssc_hw_params,
735 763 .set_fmt = atmel_ssc_set_dai_fmt,
736 764 .set_clkdiv = atmel_ssc_set_dai_clkdiv,
sound/soc/atmel/sam9x5_wm8731.c
... ... @@ -109,7 +109,7 @@
109 109 dai->stream_name = "WM8731 PCM";
110 110 dai->codec_dai_name = "wm8731-hifi";
111 111 dai->init = sam9x5_wm8731_init;
112   - dai->dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
  112 + dai->dai_fmt = SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_NB_NF
113 113 | SND_SOC_DAIFMT_CBM_CFM;
114 114  
115 115 ret = snd_soc_of_parse_card_name(card, "atmel,model");
sound/soc/codecs/wm5110.c
... ... @@ -1012,7 +1012,7 @@
1012 1012 { "AEC Loopback", "HPOUT3L", "OUT3L" },
1013 1013 { "AEC Loopback", "HPOUT3R", "OUT3R" },
1014 1014 { "HPOUT3L", NULL, "OUT3L" },
1015   - { "HPOUT3R", NULL, "OUT3L" },
  1015 + { "HPOUT3R", NULL, "OUT3R" },
1016 1016  
1017 1017 { "AEC Loopback", "SPKOUTL", "OUT4L" },
1018 1018 { "SPKOUTLN", NULL, "OUT4L" },
sound/soc/codecs/wm8904.c
... ... @@ -1444,7 +1444,7 @@
1444 1444  
1445 1445 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1446 1446 case SND_SOC_DAIFMT_DSP_B:
1447   - aif1 |= WM8904_AIF_LRCLK_INV;
  1447 + aif1 |= 0x3 | WM8904_AIF_LRCLK_INV;
1448 1448 case SND_SOC_DAIFMT_DSP_A:
1449 1449 aif1 |= 0x3;
1450 1450 break;
sound/soc/codecs/wm8962.c
... ... @@ -2439,7 +2439,20 @@
2439 2439 snd_soc_update_bits(codec, WM8962_CLOCKING_4,
2440 2440 WM8962_SYSCLK_RATE_MASK, clocking4);
2441 2441  
  2442 + /* DSPCLK_DIV can be only generated correctly after enabling SYSCLK.
  2443 + * So we here provisionally enable it and then disable it afterward
  2444 + * if current bias_level hasn't reached SND_SOC_BIAS_ON.
  2445 + */
  2446 + if (codec->dapm.bias_level != SND_SOC_BIAS_ON)
  2447 + snd_soc_update_bits(codec, WM8962_CLOCKING2,
  2448 + WM8962_SYSCLK_ENA_MASK, WM8962_SYSCLK_ENA);
  2449 +
2442 2450 dspclk = snd_soc_read(codec, WM8962_CLOCKING1);
  2451 +
  2452 + if (codec->dapm.bias_level != SND_SOC_BIAS_ON)
  2453 + snd_soc_update_bits(codec, WM8962_CLOCKING2,
  2454 + WM8962_SYSCLK_ENA_MASK, 0);
  2455 +
2443 2456 if (dspclk < 0) {
2444 2457 dev_err(codec->dev, "Failed to read DSPCLK: %d\n", dspclk);
2445 2458 return;
sound/soc/codecs/wm_adsp.c
... ... @@ -1474,13 +1474,17 @@
1474 1474 return ret;
1475 1475  
1476 1476 /* Wait for the RAM to start, should be near instantaneous */
1477   - count = 0;
1478   - do {
  1477 + for (count = 0; count < 10; ++count) {
1479 1478 ret = regmap_read(dsp->regmap, dsp->base + ADSP2_STATUS1,
1480 1479 &val);
1481 1480 if (ret != 0)
1482 1481 return ret;
1483   - } while (!(val & ADSP2_RAM_RDY) && ++count < 10);
  1482 +
  1483 + if (val & ADSP2_RAM_RDY)
  1484 + break;
  1485 +
  1486 + msleep(1);
  1487 + }
1484 1488  
1485 1489 if (!(val & ADSP2_RAM_RDY)) {
1486 1490 adsp_err(dsp, "Failed to start DSP RAM\n");
sound/soc/fsl/imx-wm8962.c
... ... @@ -130,8 +130,6 @@
130 130 break;
131 131 }
132 132  
133   - dapm->bias_level = level;
134   -
135 133 return 0;
136 134 }
137 135  
sound/soc/kirkwood/kirkwood-i2s.c
... ... @@ -473,17 +473,17 @@
473 473 .playback = {
474 474 .channels_min = 1,
475 475 .channels_max = 2,
476   - .rates = SNDRV_PCM_RATE_8000_192000 |
477   - SNDRV_PCM_RATE_CONTINUOUS |
478   - SNDRV_PCM_RATE_KNOT,
  476 + .rates = SNDRV_PCM_RATE_CONTINUOUS,
  477 + .rate_min = 5512,
  478 + .rate_max = 192000,
479 479 .formats = KIRKWOOD_I2S_FORMATS,
480 480 },
481 481 .capture = {
482 482 .channels_min = 1,
483 483 .channels_max = 2,
484   - .rates = SNDRV_PCM_RATE_8000_192000 |
485   - SNDRV_PCM_RATE_CONTINUOUS |
486   - SNDRV_PCM_RATE_KNOT,
  484 + .rates = SNDRV_PCM_RATE_CONTINUOUS,
  485 + .rate_min = 5512,
  486 + .rate_max = 192000,
487 487 .formats = KIRKWOOD_I2S_FORMATS,
488 488 },
489 489 .ops = &kirkwood_i2s_dai_ops,
490 490  
... ... @@ -494,17 +494,17 @@
494 494 .playback = {
495 495 .channels_min = 1,
496 496 .channels_max = 2,
497   - .rates = SNDRV_PCM_RATE_8000_192000 |
498   - SNDRV_PCM_RATE_CONTINUOUS |
499   - SNDRV_PCM_RATE_KNOT,
  497 + .rates = SNDRV_PCM_RATE_CONTINUOUS,
  498 + .rate_min = 5512,
  499 + .rate_max = 192000,
500 500 .formats = KIRKWOOD_SPDIF_FORMATS,
501 501 },
502 502 .capture = {
503 503 .channels_min = 1,
504 504 .channels_max = 2,
505   - .rates = SNDRV_PCM_RATE_8000_192000 |
506   - SNDRV_PCM_RATE_CONTINUOUS |
507   - SNDRV_PCM_RATE_KNOT,
  505 + .rates = SNDRV_PCM_RATE_CONTINUOUS,
  506 + .rate_min = 5512,
  507 + .rate_max = 192000,
508 508 .formats = KIRKWOOD_SPDIF_FORMATS,
509 509 },
510 510 .ops = &kirkwood_i2s_dai_ops,
sound/soc/soc-generic-dmaengine-pcm.c
... ... @@ -305,6 +305,20 @@
305 305 }
306 306 }
307 307  
  308 +static void dmaengine_pcm_release_chan(struct dmaengine_pcm *pcm)
  309 +{
  310 + unsigned int i;
  311 +
  312 + for (i = SNDRV_PCM_STREAM_PLAYBACK; i <= SNDRV_PCM_STREAM_CAPTURE;
  313 + i++) {
  314 + if (!pcm->chan[i])
  315 + continue;
  316 + dma_release_channel(pcm->chan[i]);
  317 + if (pcm->flags & SND_DMAENGINE_PCM_FLAG_HALF_DUPLEX)
  318 + break;
  319 + }
  320 +}
  321 +
308 322 /**
309 323 * snd_dmaengine_pcm_register - Register a dmaengine based PCM device
310 324 * @dev: The parent device for the PCM device
... ... @@ -315,6 +329,7 @@
315 329 const struct snd_dmaengine_pcm_config *config, unsigned int flags)
316 330 {
317 331 struct dmaengine_pcm *pcm;
  332 + int ret;
318 333  
319 334 pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
320 335 if (!pcm)
321 336  
322 337  
... ... @@ -326,11 +341,20 @@
326 341 dmaengine_pcm_request_chan_of(pcm, dev);
327 342  
328 343 if (flags & SND_DMAENGINE_PCM_FLAG_NO_RESIDUE)
329   - return snd_soc_add_platform(dev, &pcm->platform,
  344 + ret = snd_soc_add_platform(dev, &pcm->platform,
330 345 &dmaengine_no_residue_pcm_platform);
331 346 else
332   - return snd_soc_add_platform(dev, &pcm->platform,
  347 + ret = snd_soc_add_platform(dev, &pcm->platform,
333 348 &dmaengine_pcm_platform);
  349 + if (ret)
  350 + goto err_free_dma;
  351 +
  352 + return 0;
  353 +
  354 +err_free_dma:
  355 + dmaengine_pcm_release_chan(pcm);
  356 + kfree(pcm);
  357 + return ret;
334 358 }
335 359 EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_register);
336 360  
... ... @@ -345,7 +369,6 @@
345 369 {
346 370 struct snd_soc_platform *platform;
347 371 struct dmaengine_pcm *pcm;
348   - unsigned int i;
349 372  
350 373 platform = snd_soc_lookup_platform(dev);
351 374 if (!platform)
352 375  
... ... @@ -353,15 +376,8 @@
353 376  
354 377 pcm = soc_platform_to_pcm(platform);
355 378  
356   - for (i = SNDRV_PCM_STREAM_PLAYBACK; i <= SNDRV_PCM_STREAM_CAPTURE; i++) {
357   - if (pcm->chan[i]) {
358   - dma_release_channel(pcm->chan[i]);
359   - if (pcm->flags & SND_DMAENGINE_PCM_FLAG_HALF_DUPLEX)
360   - break;
361   - }
362   - }
363   -
364 379 snd_soc_remove_platform(platform);
  380 + dmaengine_pcm_release_chan(pcm);
365 381 kfree(pcm);
366 382 }
367 383 EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_unregister);
... ... @@ -600,12 +600,13 @@
600 600 struct snd_soc_platform *platform = rtd->platform;
601 601 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
602 602 struct snd_soc_dai *codec_dai = rtd->codec_dai;
603   - struct snd_soc_codec *codec = rtd->codec;
  603 + bool playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
604 604  
605 605 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
606 606  
607 607 /* apply codec digital mute */
608   - if (!codec->active)
  608 + if ((playback && codec_dai->playback_active == 1) ||
  609 + (!playback && codec_dai->capture_active == 1))
609 610 snd_soc_dai_digital_mute(codec_dai, 1, substream->stream);
610 611  
611 612 /* free any machine hw params */
sound/soc/tegra/tegra20_i2s.c
... ... @@ -74,7 +74,7 @@
74 74 unsigned int fmt)
75 75 {
76 76 struct tegra20_i2s *i2s = snd_soc_dai_get_drvdata(dai);
77   - unsigned int mask, val;
  77 + unsigned int mask = 0, val = 0;
78 78  
79 79 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
80 80 case SND_SOC_DAIFMT_NB_NF:
81 81  
... ... @@ -83,10 +83,10 @@
83 83 return -EINVAL;
84 84 }
85 85  
86   - mask = TEGRA20_I2S_CTRL_MASTER_ENABLE;
  86 + mask |= TEGRA20_I2S_CTRL_MASTER_ENABLE;
87 87 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
88 88 case SND_SOC_DAIFMT_CBS_CFS:
89   - val = TEGRA20_I2S_CTRL_MASTER_ENABLE;
  89 + val |= TEGRA20_I2S_CTRL_MASTER_ENABLE;
90 90 break;
91 91 case SND_SOC_DAIFMT_CBM_CFM:
92 92 break;
sound/soc/tegra/tegra20_spdif.c
... ... @@ -67,15 +67,15 @@
67 67 {
68 68 struct device *dev = dai->dev;
69 69 struct tegra20_spdif *spdif = snd_soc_dai_get_drvdata(dai);
70   - unsigned int mask, val;
  70 + unsigned int mask = 0, val = 0;
71 71 int ret, spdifclock;
72 72  
73   - mask = TEGRA20_SPDIF_CTRL_PACK |
74   - TEGRA20_SPDIF_CTRL_BIT_MODE_MASK;
  73 + mask |= TEGRA20_SPDIF_CTRL_PACK |
  74 + TEGRA20_SPDIF_CTRL_BIT_MODE_MASK;
75 75 switch (params_format(params)) {
76 76 case SNDRV_PCM_FORMAT_S16_LE:
77   - val = TEGRA20_SPDIF_CTRL_PACK |
78   - TEGRA20_SPDIF_CTRL_BIT_MODE_16BIT;
  77 + val |= TEGRA20_SPDIF_CTRL_PACK |
  78 + TEGRA20_SPDIF_CTRL_BIT_MODE_16BIT;
79 79 break;
80 80 default:
81 81 return -EINVAL;
sound/soc/tegra/tegra30_i2s.c
... ... @@ -118,7 +118,7 @@
118 118 unsigned int fmt)
119 119 {
120 120 struct tegra30_i2s *i2s = snd_soc_dai_get_drvdata(dai);
121   - unsigned int mask, val;
  121 + unsigned int mask = 0, val = 0;
122 122  
123 123 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
124 124 case SND_SOC_DAIFMT_NB_NF:
125 125  
... ... @@ -127,10 +127,10 @@
127 127 return -EINVAL;
128 128 }
129 129  
130   - mask = TEGRA30_I2S_CTRL_MASTER_ENABLE;
  130 + mask |= TEGRA30_I2S_CTRL_MASTER_ENABLE;
131 131 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
132 132 case SND_SOC_DAIFMT_CBS_CFS:
133   - val = TEGRA30_I2S_CTRL_MASTER_ENABLE;
  133 + val |= TEGRA30_I2S_CTRL_MASTER_ENABLE;
134 134 break;
135 135 case SND_SOC_DAIFMT_CBM_CFM:
136 136 break;