Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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()

+115 -45
+2
sound/core/pcm_lib.c
··· 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",
+4
sound/pci/hda/hda_intel.c
··· 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 */
+4
sound/pci/hda/patch_realtek.c
··· 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),
+29 -1
sound/soc/atmel/atmel_ssc_dai.c
··· 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", ··· 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; 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 + } 660 687 661 688 #ifdef CONFIG_PM 662 689 static int atmel_ssc_suspend(struct snd_soc_dai *cpu_dai) ··· 758 731 .startup = atmel_ssc_startup, 759 732 .shutdown = atmel_ssc_shutdown, 760 733 .prepare = atmel_ssc_prepare, 734 + .trigger = atmel_ssc_trigger, 761 735 .hw_params = atmel_ssc_hw_params, 762 736 .set_fmt = atmel_ssc_set_dai_fmt, 763 737 .set_clkdiv = atmel_ssc_set_dai_clkdiv,
+1 -1
sound/soc/atmel/sam9x5_wm8731.c
··· 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");
+1 -1
sound/soc/codecs/wm5110.c
··· 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" },
+1 -1
sound/soc/codecs/wm8904.c
··· 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;
+13
sound/soc/codecs/wm8962.c
··· 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;
+7 -3
sound/soc/codecs/wm_adsp.c
··· 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");
-2
sound/soc/fsl/imx-wm8962.c
··· 130 130 break; 131 131 } 132 132 133 - dapm->bias_level = level; 134 - 135 133 return 0; 136 134 } 137 135
+12 -12
sound/soc/kirkwood/kirkwood-i2s.c
··· 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, ··· 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,
+27 -11
sound/soc/soc-generic-dmaengine-pcm.c
··· 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 ··· 329 315 const struct snd_dmaengine_pcm_config *config, unsigned int flags) 330 316 { 331 317 struct dmaengine_pcm *pcm; 318 + int ret; 332 319 333 320 pcm = kzalloc(sizeof(*pcm), GFP_KERNEL); 334 321 if (!pcm) ··· 341 326 dmaengine_pcm_request_chan_of(pcm, dev); 342 327 343 328 if (flags & SND_DMAENGINE_PCM_FLAG_NO_RESIDUE) 344 - return snd_soc_add_platform(dev, &pcm->platform, 329 + ret = snd_soc_add_platform(dev, &pcm->platform, 345 330 &dmaengine_no_residue_pcm_platform); 346 331 else 347 - return snd_soc_add_platform(dev, &pcm->platform, 332 + ret = snd_soc_add_platform(dev, &pcm->platform, 348 333 &dmaengine_pcm_platform); 334 + if (ret) 335 + goto err_free_dma; 336 + 337 + return 0; 338 + 339 + err_free_dma: 340 + dmaengine_pcm_release_chan(pcm); 341 + kfree(pcm); 342 + return ret; 349 343 } 350 344 EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_register); 351 345 ··· 369 345 { 370 346 struct snd_soc_platform *platform; 371 347 struct dmaengine_pcm *pcm; 372 - unsigned int i; 373 348 374 349 platform = snd_soc_lookup_platform(dev); 375 350 if (!platform) ··· 376 353 377 354 pcm = soc_platform_to_pcm(platform); 378 355 379 - for (i = SNDRV_PCM_STREAM_PLAYBACK; i <= SNDRV_PCM_STREAM_CAPTURE; i++) { 380 - if (pcm->chan[i]) { 381 - dma_release_channel(pcm->chan[i]); 382 - if (pcm->flags & SND_DMAENGINE_PCM_FLAG_HALF_DUPLEX) 383 - break; 384 - } 385 - } 386 - 387 356 snd_soc_remove_platform(platform); 357 + dmaengine_pcm_release_chan(pcm); 388 358 kfree(pcm); 389 359 } 390 360 EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_unregister);
+3 -2
sound/soc/soc-pcm.c
··· 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 */
+3 -3
sound/soc/tegra/tegra20_i2s.c
··· 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: ··· 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;
+5 -5
sound/soc/tegra/tegra20_spdif.c
··· 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;
+3 -3
sound/soc/tegra/tegra30_i2s.c
··· 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: ··· 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;