sound fixes for 3.12-rc4
All small, mostly driver-specific fixes: a few ASoC driver fixes (trivial stable fixes, sgtl5000 fixes), one DPCM fix, an old AC97 ID, and a fix for HD-audio Conexant GPIO. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.21 (GNU/Linux) iQIcBAABAgAGBQJSS/NwAAoJEGwxgFQ9KSmk3Q4P/RwWxFa8kaXouJitWfwC6eMt T+5nHdp3/fjQLhjjkKy7SIXKpIWk/H+qRgsWHhLybvBVK7vCQszf8FiJJOiasaTm mdEqgo5dWrIaaQueO9//MPy7iPRzQHUSbEoEsfRfZGcc56ITZCfO0ank/3WBfG/0 X/G0ohW0vgULrh/LNcwIbDT00aPX0aBP+8OWfvMHGOmfW5WR9GdfZ0OXqGQtzqdy XVfeBMAlwmmGkD7ERquJ3oE40fN/rPiFlQSqT/gSHnW9Q6yoxE45IGheXdRSzfSb 7rsGdns8xhjRLgxUEq0v96A5C669prG8gCMgOeIF0mJxiG55jyG6wSakuYUFczbF Fgh6+EZjjooVBxTF5k82ZCFOlkJBaYPWVnq+GTH8qKqavhaqgafIr2a0l6G5uzSH Zy8/h66O0GXKSAAxjTRf9NSPMiAerE/X3cCqSARLXMD+a2qGOOoJQJANTZ66mw05 ePtu6KzP0D0RbEVccHRW9hJZ4vJY8r7EIWzfTpd705R0A83bAJzyunVZP/a3r9yW 69OIB15510hGrFb3UozLiJSLNHKpB5g9xFsCBYXdiYMRbo0N3i0J882HNxbc15Ar SHyi3WQ/cd1EgSKtECZ80FCdc5vDzaXYrNqrDIX9+cQxxBce0M86/r8lH/XMFoeL jXIszWlJK+NFKzrEL9Qy =7zvu -----END PGP SIGNATURE----- Merge tag 'sound-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "All small, mostly driver-specific fixes: a few ASoC driver fixes (trivial stable fixes, sgtl5000 fixes), one DPCM fix, an old AC97 ID, and a fix for HD-audio Conexant GPIO" * tag 'sound-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda - Fix GPIO for Acer Aspire 3830TG ALSA: ac97: Add ID for TI TLV320AIC27 codec ASoC: imx-sgtl5000: Fix uninitialized pointer use in error path ASoC: imx-sgtl5000: do not use devres on a foreign device ASoC: blackfin: Add missing break statement to bf6xx ASoC: 88pm860x: array overflow in snd_soc_put_volsw_2r_st() ASoC: ab8500-codec: info leak in anc_status_control_put() ASoC: max98095: a couple array underflows ASoC: core: Only add platform DAI widgets once.
This commit is contained in:
Коммит
be0f52baa4
|
@ -175,6 +175,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = {
|
||||||
{ 0x54524106, 0xffffffff, "TR28026", NULL, NULL },
|
{ 0x54524106, 0xffffffff, "TR28026", NULL, NULL },
|
||||||
{ 0x54524108, 0xffffffff, "TR28028", patch_tritech_tr28028, NULL }, // added by xin jin [07/09/99]
|
{ 0x54524108, 0xffffffff, "TR28028", patch_tritech_tr28028, NULL }, // added by xin jin [07/09/99]
|
||||||
{ 0x54524123, 0xffffffff, "TR28602", NULL, NULL }, // only guess --jk [TR28023 = eMicro EM28023 (new CT1297)]
|
{ 0x54524123, 0xffffffff, "TR28602", NULL, NULL }, // only guess --jk [TR28023 = eMicro EM28023 (new CT1297)]
|
||||||
|
{ 0x54584e03, 0xffffffff, "TLV320AIC27", NULL, NULL },
|
||||||
{ 0x54584e20, 0xffffffff, "TLC320AD9xC", NULL, NULL },
|
{ 0x54584e20, 0xffffffff, "TLC320AD9xC", NULL, NULL },
|
||||||
{ 0x56494161, 0xffffffff, "VIA1612A", NULL, NULL }, // modified ICE1232 with S/PDIF
|
{ 0x56494161, 0xffffffff, "VIA1612A", NULL, NULL }, // modified ICE1232 with S/PDIF
|
||||||
{ 0x56494170, 0xffffffff, "VIA1617A", patch_vt1617a, NULL }, // modified VT1616 with S/PDIF
|
{ 0x56494170, 0xffffffff, "VIA1617A", patch_vt1617a, NULL }, // modified VT1616 with S/PDIF
|
||||||
|
|
|
@ -3231,6 +3231,7 @@ enum {
|
||||||
CXT_FIXUP_INC_MIC_BOOST,
|
CXT_FIXUP_INC_MIC_BOOST,
|
||||||
CXT_FIXUP_HEADPHONE_MIC_PIN,
|
CXT_FIXUP_HEADPHONE_MIC_PIN,
|
||||||
CXT_FIXUP_HEADPHONE_MIC,
|
CXT_FIXUP_HEADPHONE_MIC,
|
||||||
|
CXT_FIXUP_GPIO1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void cxt_fixup_stereo_dmic(struct hda_codec *codec,
|
static void cxt_fixup_stereo_dmic(struct hda_codec *codec,
|
||||||
|
@ -3375,6 +3376,15 @@ static const struct hda_fixup cxt_fixups[] = {
|
||||||
.type = HDA_FIXUP_FUNC,
|
.type = HDA_FIXUP_FUNC,
|
||||||
.v.func = cxt_fixup_headphone_mic,
|
.v.func = cxt_fixup_headphone_mic,
|
||||||
},
|
},
|
||||||
|
[CXT_FIXUP_GPIO1] = {
|
||||||
|
.type = HDA_FIXUP_VERBS,
|
||||||
|
.v.verbs = (const struct hda_verb[]) {
|
||||||
|
{ 0x01, AC_VERB_SET_GPIO_MASK, 0x01 },
|
||||||
|
{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01 },
|
||||||
|
{ 0x01, AC_VERB_SET_GPIO_DATA, 0x01 },
|
||||||
|
{ }
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct snd_pci_quirk cxt5051_fixups[] = {
|
static const struct snd_pci_quirk cxt5051_fixups[] = {
|
||||||
|
@ -3384,6 +3394,7 @@ static const struct snd_pci_quirk cxt5051_fixups[] = {
|
||||||
|
|
||||||
static const struct snd_pci_quirk cxt5066_fixups[] = {
|
static const struct snd_pci_quirk cxt5066_fixups[] = {
|
||||||
SND_PCI_QUIRK(0x1025, 0x0543, "Acer Aspire One 522", CXT_FIXUP_STEREO_DMIC),
|
SND_PCI_QUIRK(0x1025, 0x0543, "Acer Aspire One 522", CXT_FIXUP_STEREO_DMIC),
|
||||||
|
SND_PCI_QUIRK(0x1025, 0x054c, "Acer Aspire 3830TG", CXT_FIXUP_GPIO1),
|
||||||
SND_PCI_QUIRK(0x1043, 0x138d, "Asus", CXT_FIXUP_HEADPHONE_MIC_PIN),
|
SND_PCI_QUIRK(0x1043, 0x138d, "Asus", CXT_FIXUP_HEADPHONE_MIC_PIN),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400", CXT_PINCFG_LENOVO_TP410),
|
SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400", CXT_PINCFG_LENOVO_TP410),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo T410", CXT_PINCFG_LENOVO_TP410),
|
SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo T410", CXT_PINCFG_LENOVO_TP410),
|
||||||
|
|
|
@ -88,6 +88,7 @@ static int bfin_i2s_hw_params(struct snd_pcm_substream *substream,
|
||||||
case SNDRV_PCM_FORMAT_S8:
|
case SNDRV_PCM_FORMAT_S8:
|
||||||
param.spctl |= 0x70;
|
param.spctl |= 0x70;
|
||||||
sport->wdsize = 1;
|
sport->wdsize = 1;
|
||||||
|
break;
|
||||||
case SNDRV_PCM_FORMAT_S16_LE:
|
case SNDRV_PCM_FORMAT_S16_LE:
|
||||||
param.spctl |= 0xf0;
|
param.spctl |= 0xf0;
|
||||||
sport->wdsize = 2;
|
sport->wdsize = 2;
|
||||||
|
|
|
@ -349,6 +349,9 @@ static int snd_soc_put_volsw_2r_st(struct snd_kcontrol *kcontrol,
|
||||||
val = ucontrol->value.integer.value[0];
|
val = ucontrol->value.integer.value[0];
|
||||||
val2 = ucontrol->value.integer.value[1];
|
val2 = ucontrol->value.integer.value[1];
|
||||||
|
|
||||||
|
if (val >= ARRAY_SIZE(st_table) || val2 >= ARRAY_SIZE(st_table))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
err = snd_soc_update_bits(codec, reg, 0x3f, st_table[val].m);
|
err = snd_soc_update_bits(codec, reg, 0x3f, st_table[val].m);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -1225,13 +1225,18 @@ static int anc_status_control_put(struct snd_kcontrol *kcontrol,
|
||||||
struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(codec->dev);
|
struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(codec->dev);
|
||||||
struct device *dev = codec->dev;
|
struct device *dev = codec->dev;
|
||||||
bool apply_fir, apply_iir;
|
bool apply_fir, apply_iir;
|
||||||
int req, status;
|
unsigned int req;
|
||||||
|
int status;
|
||||||
|
|
||||||
dev_dbg(dev, "%s: Enter.\n", __func__);
|
dev_dbg(dev, "%s: Enter.\n", __func__);
|
||||||
|
|
||||||
mutex_lock(&drvdata->anc_lock);
|
mutex_lock(&drvdata->anc_lock);
|
||||||
|
|
||||||
req = ucontrol->value.integer.value[0];
|
req = ucontrol->value.integer.value[0];
|
||||||
|
if (req >= ARRAY_SIZE(enum_anc_state)) {
|
||||||
|
status = -EINVAL;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
if (req != ANC_APPLY_FIR_IIR && req != ANC_APPLY_FIR &&
|
if (req != ANC_APPLY_FIR_IIR && req != ANC_APPLY_FIR &&
|
||||||
req != ANC_APPLY_IIR) {
|
req != ANC_APPLY_IIR) {
|
||||||
dev_err(dev, "%s: ERROR: Unsupported status to set '%s'!\n",
|
dev_err(dev, "%s: ERROR: Unsupported status to set '%s'!\n",
|
||||||
|
|
|
@ -1863,7 +1863,7 @@ static int max98095_put_eq_enum(struct snd_kcontrol *kcontrol,
|
||||||
struct max98095_pdata *pdata = max98095->pdata;
|
struct max98095_pdata *pdata = max98095->pdata;
|
||||||
int channel = max98095_get_eq_channel(kcontrol->id.name);
|
int channel = max98095_get_eq_channel(kcontrol->id.name);
|
||||||
struct max98095_cdata *cdata;
|
struct max98095_cdata *cdata;
|
||||||
int sel = ucontrol->value.integer.value[0];
|
unsigned int sel = ucontrol->value.integer.value[0];
|
||||||
struct max98095_eq_cfg *coef_set;
|
struct max98095_eq_cfg *coef_set;
|
||||||
int fs, best, best_val, i;
|
int fs, best, best_val, i;
|
||||||
int regmask, regsave;
|
int regmask, regsave;
|
||||||
|
@ -2016,7 +2016,7 @@ static int max98095_put_bq_enum(struct snd_kcontrol *kcontrol,
|
||||||
struct max98095_pdata *pdata = max98095->pdata;
|
struct max98095_pdata *pdata = max98095->pdata;
|
||||||
int channel = max98095_get_bq_channel(codec, kcontrol->id.name);
|
int channel = max98095_get_bq_channel(codec, kcontrol->id.name);
|
||||||
struct max98095_cdata *cdata;
|
struct max98095_cdata *cdata;
|
||||||
int sel = ucontrol->value.integer.value[0];
|
unsigned int sel = ucontrol->value.integer.value[0];
|
||||||
struct max98095_biquad_cfg *coef_set;
|
struct max98095_biquad_cfg *coef_set;
|
||||||
int fs, best, best_val, i;
|
int fs, best, best_val, i;
|
||||||
int regmask, regsave;
|
int regmask, regsave;
|
||||||
|
|
|
@ -62,7 +62,7 @@ static int imx_sgtl5000_probe(struct platform_device *pdev)
|
||||||
struct device_node *ssi_np, *codec_np;
|
struct device_node *ssi_np, *codec_np;
|
||||||
struct platform_device *ssi_pdev;
|
struct platform_device *ssi_pdev;
|
||||||
struct i2c_client *codec_dev;
|
struct i2c_client *codec_dev;
|
||||||
struct imx_sgtl5000_data *data;
|
struct imx_sgtl5000_data *data = NULL;
|
||||||
int int_port, ext_port;
|
int int_port, ext_port;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ static int imx_sgtl5000_probe(struct platform_device *pdev)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
data->codec_clk = devm_clk_get(&codec_dev->dev, NULL);
|
data->codec_clk = clk_get(&codec_dev->dev, NULL);
|
||||||
if (IS_ERR(data->codec_clk)) {
|
if (IS_ERR(data->codec_clk)) {
|
||||||
ret = PTR_ERR(data->codec_clk);
|
ret = PTR_ERR(data->codec_clk);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -172,6 +172,8 @@ static int imx_sgtl5000_probe(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
if (data && !IS_ERR(data->codec_clk))
|
||||||
|
clk_put(data->codec_clk);
|
||||||
if (ssi_np)
|
if (ssi_np)
|
||||||
of_node_put(ssi_np);
|
of_node_put(ssi_np);
|
||||||
if (codec_np)
|
if (codec_np)
|
||||||
|
@ -185,6 +187,7 @@ static int imx_sgtl5000_remove(struct platform_device *pdev)
|
||||||
struct imx_sgtl5000_data *data = platform_get_drvdata(pdev);
|
struct imx_sgtl5000_data *data = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
snd_soc_unregister_card(&data->card);
|
snd_soc_unregister_card(&data->card);
|
||||||
|
clk_put(data->codec_clk);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1380,7 +1380,6 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
list_add(&cpu_dai->dapm.list, &card->dapm_list);
|
list_add(&cpu_dai->dapm.list, &card->dapm_list);
|
||||||
snd_soc_dapm_new_dai_widgets(&cpu_dai->dapm, cpu_dai);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cpu_dai->driver->probe) {
|
if (cpu_dai->driver->probe) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче