Commit 22e978f1 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull sound fixes from Takashi Iwai:
 "Slightly a high amount of commits come from Adrian Knoth's HDSPM
  driver fixes.  Other than that, all small trival fixes or quirks that
  are pretty driver-specific."

* tag 'sound-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ASoC: wm8994: Only enable extra BCLK cycles when required
  ALSA: als3000: check for the kzalloc return value
  ALSA: sound/isa/opti9xx/miro.c: eliminate possible double free
  ALSA: hda - Fix silent headphone output from Toshiba P200
  ALSA: hdspm - Fix coding style in CTL_ELEM macros
  ALSA: hdspm - Fix typo in kcontrol element on RME MADI cards
  ALSA: hdspm - Fix sync_in detection on AES/AES32
  ALSA: hdspm - Fix sync_in reporting on RME MADI cards
  ALSA: hdspm - Also report autosync_sample_rate on MADI and MADIface
  ALSA: hdspm - Fix reported autosync_sample_rate
  ALSA: hdspm - Fix sync check reporting on all RME HDSPM cards
  ALSA: hdspm - Report external rate in slave mode on PCI MADI
  ALSA: hdspm - Allow DDS/Varispeed to be set from userspace
  ALSA: hda - add dock support for Thinkpad T430
  ASoC: ux500_msp_i2s: Fix devm_* and return code merge error
  ASoC: Ux500: Dispose of device nodes correctly
parents ef48bfd6 c64064ce
...@@ -1286,7 +1286,6 @@ static int __devinit snd_miro_probe(struct snd_card *card) ...@@ -1286,7 +1286,6 @@ static int __devinit snd_miro_probe(struct snd_card *card)
error = snd_card_miro_aci_detect(card, miro); error = snd_card_miro_aci_detect(card, miro);
if (error < 0) { if (error < 0) {
snd_card_free(card);
snd_printk(KERN_ERR "unable to detect aci chip\n"); snd_printk(KERN_ERR "unable to detect aci chip\n");
return -ENODEV; return -ENODEV;
} }
......
...@@ -394,6 +394,8 @@ static int snd_als300_playback_open(struct snd_pcm_substream *substream) ...@@ -394,6 +394,8 @@ static int snd_als300_playback_open(struct snd_pcm_substream *substream)
struct snd_als300_substream_data *data = kzalloc(sizeof(*data), struct snd_als300_substream_data *data = kzalloc(sizeof(*data),
GFP_KERNEL); GFP_KERNEL);
if (!data)
return -ENOMEM;
snd_als300_dbgcallenter(); snd_als300_dbgcallenter();
chip->playback_substream = substream; chip->playback_substream = substream;
runtime->hw = snd_als300_playback_hw; runtime->hw = snd_als300_playback_hw;
...@@ -425,6 +427,8 @@ static int snd_als300_capture_open(struct snd_pcm_substream *substream) ...@@ -425,6 +427,8 @@ static int snd_als300_capture_open(struct snd_pcm_substream *substream)
struct snd_als300_substream_data *data = kzalloc(sizeof(*data), struct snd_als300_substream_data *data = kzalloc(sizeof(*data),
GFP_KERNEL); GFP_KERNEL);
if (!data)
return -ENOMEM;
snd_als300_dbgcallenter(); snd_als300_dbgcallenter();
chip->capture_substream = substream; chip->capture_substream = substream;
runtime->hw = snd_als300_capture_hw; runtime->hw = snd_als300_capture_hw;
......
...@@ -5677,6 +5677,7 @@ static const struct hda_verb alc268_beep_init_verbs[] = { ...@@ -5677,6 +5677,7 @@ static const struct hda_verb alc268_beep_init_verbs[] = {
enum { enum {
ALC268_FIXUP_INV_DMIC, ALC268_FIXUP_INV_DMIC,
ALC268_FIXUP_HP_EAPD,
}; };
static const struct alc_fixup alc268_fixups[] = { static const struct alc_fixup alc268_fixups[] = {
...@@ -5684,10 +5685,26 @@ static const struct alc_fixup alc268_fixups[] = { ...@@ -5684,10 +5685,26 @@ static const struct alc_fixup alc268_fixups[] = {
.type = ALC_FIXUP_FUNC, .type = ALC_FIXUP_FUNC,
.v.func = alc_fixup_inv_dmic_0x12, .v.func = alc_fixup_inv_dmic_0x12,
}, },
[ALC268_FIXUP_HP_EAPD] = {
.type = ALC_FIXUP_VERBS,
.v.verbs = (const struct hda_verb[]) {
{0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
{}
}
},
}; };
static const struct alc_model_fixup alc268_fixup_models[] = { static const struct alc_model_fixup alc268_fixup_models[] = {
{.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"}, {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
{.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
{}
};
static const struct snd_pci_quirk alc268_fixup_tbl[] = {
/* below is codec SSID since multiple Toshiba laptops have the
* same PCI SSID 1179:ff00
*/
SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
{} {}
}; };
...@@ -5722,7 +5739,7 @@ static int patch_alc268(struct hda_codec *codec) ...@@ -5722,7 +5739,7 @@ static int patch_alc268(struct hda_codec *codec)
spec = codec->spec; spec = codec->spec;
alc_pick_fixup(codec, alc268_fixup_models, NULL, alc268_fixups); alc_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
/* automatic parse from the BIOS config */ /* automatic parse from the BIOS config */
...@@ -6188,6 +6205,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { ...@@ -6188,6 +6205,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE), SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK), SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK),
SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK), SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK), SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK), SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
......
This diff is collapsed.
...@@ -1045,6 +1045,7 @@ static int aif1clk_ev(struct snd_soc_dapm_widget *w, ...@@ -1045,6 +1045,7 @@ static int aif1clk_ev(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event) struct snd_kcontrol *kcontrol, int event)
{ {
struct snd_soc_codec *codec = w->codec; struct snd_soc_codec *codec = w->codec;
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
struct wm8994 *control = codec->control_data; struct wm8994 *control = codec->control_data;
int mask = WM8994_AIF1DAC1L_ENA | WM8994_AIF1DAC1R_ENA; int mask = WM8994_AIF1DAC1L_ENA | WM8994_AIF1DAC1R_ENA;
int i; int i;
...@@ -1063,6 +1064,10 @@ static int aif1clk_ev(struct snd_soc_dapm_widget *w, ...@@ -1063,6 +1064,10 @@ static int aif1clk_ev(struct snd_soc_dapm_widget *w,
switch (event) { switch (event) {
case SND_SOC_DAPM_PRE_PMU: case SND_SOC_DAPM_PRE_PMU:
/* Don't enable timeslot 2 if not in use */
if (wm8994->channels[0] <= 2)
mask &= ~(WM8994_AIF1DAC2L_ENA | WM8994_AIF1DAC2R_ENA);
val = snd_soc_read(codec, WM8994_AIF1_CONTROL_1); val = snd_soc_read(codec, WM8994_AIF1_CONTROL_1);
if ((val & WM8994_AIF1ADCL_SRC) && if ((val & WM8994_AIF1ADCL_SRC) &&
(val & WM8994_AIF1ADCR_SRC)) (val & WM8994_AIF1ADCR_SRC))
...@@ -2687,7 +2692,7 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream, ...@@ -2687,7 +2692,7 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream,
return -EINVAL; return -EINVAL;
} }
bclk_rate = params_rate(params) * 4; bclk_rate = params_rate(params);
switch (params_format(params)) { switch (params_format(params)) {
case SNDRV_PCM_FORMAT_S16_LE: case SNDRV_PCM_FORMAT_S16_LE:
bclk_rate *= 16; bclk_rate *= 16;
...@@ -2708,6 +2713,17 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream, ...@@ -2708,6 +2713,17 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream,
return -EINVAL; return -EINVAL;
} }
wm8994->channels[id] = params_channels(params);
switch (params_channels(params)) {
case 1:
case 2:
bclk_rate *= 2;
break;
default:
bclk_rate *= 4;
break;
}
/* Try to find an appropriate sample rate; look for an exact match. */ /* Try to find an appropriate sample rate; look for an exact match. */
for (i = 0; i < ARRAY_SIZE(srs); i++) for (i = 0; i < ARRAY_SIZE(srs); i++)
if (srs[i].rate == params_rate(params)) if (srs[i].rate == params_rate(params))
......
...@@ -77,6 +77,7 @@ struct wm8994_priv { ...@@ -77,6 +77,7 @@ struct wm8994_priv {
int sysclk_rate[2]; int sysclk_rate[2];
int mclk[2]; int mclk[2];
int aifclk[2]; int aifclk[2];
int channels[2];
struct wm8994_fll_config fll[2], fll_suspend[2]; struct wm8994_fll_config fll[2], fll_suspend[2];
struct completion fll_locked[2]; struct completion fll_locked[2];
bool fll_locked_irq; bool fll_locked_irq;
......
...@@ -57,6 +57,20 @@ static struct snd_soc_card mop500_card = { ...@@ -57,6 +57,20 @@ static struct snd_soc_card mop500_card = {
.num_links = ARRAY_SIZE(mop500_dai_links), .num_links = ARRAY_SIZE(mop500_dai_links),
}; };
static void mop500_of_node_put(void)
{
int i;
for (i = 0; i < 2; i++) {
if (mop500_dai_links[i].cpu_of_node)
of_node_put((struct device_node *)
mop500_dai_links[i].cpu_of_node);
if (mop500_dai_links[i].codec_of_node)
of_node_put((struct device_node *)
mop500_dai_links[i].codec_of_node);
}
}
static int __devinit mop500_of_probe(struct platform_device *pdev, static int __devinit mop500_of_probe(struct platform_device *pdev,
struct device_node *np) struct device_node *np)
{ {
...@@ -69,6 +83,7 @@ static int __devinit mop500_of_probe(struct platform_device *pdev, ...@@ -69,6 +83,7 @@ static int __devinit mop500_of_probe(struct platform_device *pdev,
if (!(msp_np[0] && msp_np[1] && codec_np)) { if (!(msp_np[0] && msp_np[1] && codec_np)) {
dev_err(&pdev->dev, "Phandle missing or invalid\n"); dev_err(&pdev->dev, "Phandle missing or invalid\n");
mop500_of_node_put();
return -EINVAL; return -EINVAL;
} }
...@@ -83,6 +98,7 @@ static int __devinit mop500_of_probe(struct platform_device *pdev, ...@@ -83,6 +98,7 @@ static int __devinit mop500_of_probe(struct platform_device *pdev,
return 0; return 0;
} }
static int __devinit mop500_probe(struct platform_device *pdev) static int __devinit mop500_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
...@@ -128,6 +144,7 @@ static int __devexit mop500_remove(struct platform_device *pdev) ...@@ -128,6 +144,7 @@ static int __devexit mop500_remove(struct platform_device *pdev)
snd_soc_unregister_card(mop500_card); snd_soc_unregister_card(mop500_card);
mop500_ab8500_remove(mop500_card); mop500_ab8500_remove(mop500_card);
mop500_of_node_put();
return 0; return 0;
} }
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/pinctrl/consumer.h> #include <linux/pinctrl/consumer.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/io.h>
#include <linux/of.h> #include <linux/of.h>
#include <mach/hardware.h> #include <mach/hardware.h>
...@@ -697,14 +698,11 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev, ...@@ -697,14 +698,11 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev,
platform_data = devm_kzalloc(&pdev->dev, platform_data = devm_kzalloc(&pdev->dev,
sizeof(struct msp_i2s_platform_data), GFP_KERNEL); sizeof(struct msp_i2s_platform_data), GFP_KERNEL);
if (!platform_data) if (!platform_data)
ret = -ENOMEM; return -ENOMEM;
} }
} else } else
if (!platform_data) if (!platform_data)
ret = -EINVAL; return -EINVAL;
if (ret)
goto err_res;
dev_dbg(&pdev->dev, "%s: Enter (name: %s, id: %d).\n", __func__, dev_dbg(&pdev->dev, "%s: Enter (name: %s, id: %d).\n", __func__,
pdev->name, platform_data->id); pdev->name, platform_data->id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment