Commit 05a88a43 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull sound fixes from Takashi Iwai:
 "This contains small fixes since the previous pull request:

   - A few regression fixes and small updates of HD-audio

   - Yet another fix for Haswell HDMI audio

   - A copule of trivial fixes in ASoC McASP, DPAM and WM8994"

* tag 'sound-3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  Revert "ALSA: hda - Don't set up active streams twice"
  ALSA: Add comment for control TLV API
  ALSA: hda - Apply pin-enablement workaround to all Haswell HDMI codecs
  ALSA: HDA: Fix Oops caused by dereference NULL pointer
  ALSA: mips/sgio2audio: Remove redundant platform_set_drvdata()
  ALSA: mips/hal2: Remove redundant platform_set_drvdata()
  ALSA: hda - Fix 3.9 regression of EAPD init on Conexant codecs
  sound: Fix make allmodconfig on MIPS
  ALSA: hda - Fix system panic when DMA > 40 bits for Nvidia audio controllers
  ALSA: atmel: Remove redundant platform_set_drvdata()
  ASoC: McASP: Fix receive clock polarity in DAIFMT_NB_NF mode.
  ASoC: wm8994: missing break in wm8994_aif3_hw_params()
  ASoC: McASP: Add pins output direction for rx clocks when configured in CBS_CFS format
  ASoC: dapm: use clk_prepare_enable and clk_disable_unprepare
parents daf799cc 6c35ae3c
...@@ -74,7 +74,11 @@ ...@@ -74,7 +74,11 @@
#define DECLARE_TLV_DB_LINEAR(name, min_dB, max_dB) \ #define DECLARE_TLV_DB_LINEAR(name, min_dB, max_dB) \
unsigned int name[] = { TLV_DB_LINEAR_ITEM(min_dB, max_dB) } unsigned int name[] = { TLV_DB_LINEAR_ITEM(min_dB, max_dB) }
/* dB range container */ /* dB range container:
* Items in dB range container must be ordered by their values and by their
* dB values. This implies that larger values must correspond with larger
* dB values (which is also required for all other mixer controls).
*/
/* Each item is: <min> <max> <TLV> */ /* Each item is: <min> <max> <TLV> */
#define TLV_DB_RANGE_ITEM(...) \ #define TLV_DB_RANGE_ITEM(...) \
TLV_ITEM(SNDRV_CTL_TLVT_DB_RANGE, __VA_ARGS__) TLV_ITEM(SNDRV_CTL_TLVT_DB_RANGE, __VA_ARGS__)
......
...@@ -583,8 +583,6 @@ static int atmel_abdac_remove(struct platform_device *pdev) ...@@ -583,8 +583,6 @@ static int atmel_abdac_remove(struct platform_device *pdev)
free_irq(dac->irq, dac); free_irq(dac->irq, dac);
snd_card_free(card); snd_card_free(card);
platform_set_drvdata(pdev, NULL);
return 0; return 0;
} }
......
...@@ -1199,8 +1199,6 @@ static int atmel_ac97c_remove(struct platform_device *pdev) ...@@ -1199,8 +1199,6 @@ static int atmel_ac97c_remove(struct platform_device *pdev)
snd_card_set_dev(card, NULL); snd_card_set_dev(card, NULL);
snd_card_free(card); snd_card_free(card);
platform_set_drvdata(pdev, NULL);
return 0; return 0;
} }
......
...@@ -922,7 +922,6 @@ static int hal2_remove(struct platform_device *pdev) ...@@ -922,7 +922,6 @@ static int hal2_remove(struct platform_device *pdev)
struct snd_card *card = platform_get_drvdata(pdev); struct snd_card *card = platform_get_drvdata(pdev);
snd_card_free(card); snd_card_free(card);
platform_set_drvdata(pdev, NULL);
return 0; return 0;
} }
......
...@@ -963,7 +963,6 @@ static int snd_sgio2audio_remove(struct platform_device *pdev) ...@@ -963,7 +963,6 @@ static int snd_sgio2audio_remove(struct platform_device *pdev)
struct snd_card *card = platform_get_drvdata(pdev); struct snd_card *card = platform_get_drvdata(pdev);
snd_card_free(card); snd_card_free(card);
platform_set_drvdata(pdev, NULL);
return 0; return 0;
} }
......
...@@ -250,6 +250,7 @@ config MSND_FIFOSIZE ...@@ -250,6 +250,7 @@ config MSND_FIFOSIZE
menuconfig SOUND_OSS menuconfig SOUND_OSS
tristate "OSS sound modules" tristate "OSS sound modules"
depends on ISA_DMA_API && VIRT_TO_BUS depends on ISA_DMA_API && VIRT_TO_BUS
depends on !ISA_DMA_SUPPORT_BROKEN
help help
OSS is the Open Sound System suite of sound card drivers. They make OSS is the Open Sound System suite of sound card drivers. They make
sound programming easier since they provide a common API. Say Y or sound programming easier since they provide a common API. Say Y or
......
...@@ -681,6 +681,9 @@ int snd_hda_queue_unsol_event(struct hda_bus *bus, u32 res, u32 res_ex) ...@@ -681,6 +681,9 @@ int snd_hda_queue_unsol_event(struct hda_bus *bus, u32 res, u32 res_ex)
struct hda_bus_unsolicited *unsol; struct hda_bus_unsolicited *unsol;
unsigned int wp; unsigned int wp;
if (!bus || !bus->workq)
return 0;
trace_hda_unsol_event(bus, res, res_ex); trace_hda_unsol_event(bus, res, res_ex);
unsol = bus->unsol; unsol = bus->unsol;
if (!unsol) if (!unsol)
...@@ -1580,7 +1583,7 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, ...@@ -1580,7 +1583,7 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
"NID=0x%x, stream=0x%x, channel=%d, format=0x%x\n", "NID=0x%x, stream=0x%x, channel=%d, format=0x%x\n",
nid, stream_tag, channel_id, format); nid, stream_tag, channel_id, format);
p = get_hda_cvt_setup(codec, nid); p = get_hda_cvt_setup(codec, nid);
if (!p || p->active) if (!p)
return; return;
if (codec->pcm_format_first) if (codec->pcm_format_first)
...@@ -1627,7 +1630,7 @@ void __snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid, ...@@ -1627,7 +1630,7 @@ void __snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid,
snd_printdd("hda_codec_cleanup_stream: NID=0x%x\n", nid); snd_printdd("hda_codec_cleanup_stream: NID=0x%x\n", nid);
p = get_hda_cvt_setup(codec, nid); p = get_hda_cvt_setup(codec, nid);
if (p && p->active) { if (p) {
/* here we just clear the active flag when do_now isn't set; /* here we just clear the active flag when do_now isn't set;
* actual clean-ups will be done later in * actual clean-ups will be done later in
* purify_inactive_streams() called from snd_hda_codec_prpapre() * purify_inactive_streams() called from snd_hda_codec_prpapre()
......
...@@ -615,7 +615,7 @@ enum { ...@@ -615,7 +615,7 @@ enum {
/* quirks for Nvidia */ /* quirks for Nvidia */
#define AZX_DCAPS_PRESET_NVIDIA \ #define AZX_DCAPS_PRESET_NVIDIA \
(AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\ (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
AZX_DCAPS_ALIGN_BUFSIZE) AZX_DCAPS_ALIGN_BUFSIZE | AZX_DCAPS_NO_64BIT)
#define AZX_DCAPS_PRESET_CTHDA \ #define AZX_DCAPS_PRESET_CTHDA \
(AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY) (AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
......
...@@ -64,6 +64,7 @@ struct conexant_spec { ...@@ -64,6 +64,7 @@ struct conexant_spec {
/* extra EAPD pins */ /* extra EAPD pins */
unsigned int num_eapds; unsigned int num_eapds;
hda_nid_t eapds[4]; hda_nid_t eapds[4];
bool dynamic_eapd;
#ifdef ENABLE_CXT_STATIC_QUIRKS #ifdef ENABLE_CXT_STATIC_QUIRKS
const struct snd_kcontrol_new *mixers[5]; const struct snd_kcontrol_new *mixers[5];
...@@ -3155,7 +3156,7 @@ static void cx_auto_parse_eapd(struct hda_codec *codec) ...@@ -3155,7 +3156,7 @@ static void cx_auto_parse_eapd(struct hda_codec *codec)
* thus it might control over all pins. * thus it might control over all pins.
*/ */
if (spec->num_eapds > 2) if (spec->num_eapds > 2)
spec->gen.own_eapd_ctl = 1; spec->dynamic_eapd = 1;
} }
static void cx_auto_turn_eapd(struct hda_codec *codec, int num_pins, static void cx_auto_turn_eapd(struct hda_codec *codec, int num_pins,
...@@ -3194,10 +3195,19 @@ static int cx_auto_build_controls(struct hda_codec *codec) ...@@ -3194,10 +3195,19 @@ static int cx_auto_build_controls(struct hda_codec *codec)
return 0; return 0;
} }
static int cx_auto_init(struct hda_codec *codec)
{
struct conexant_spec *spec = codec->spec;
snd_hda_gen_init(codec);
if (!spec->dynamic_eapd)
cx_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, true);
return 0;
}
static const struct hda_codec_ops cx_auto_patch_ops = { static const struct hda_codec_ops cx_auto_patch_ops = {
.build_controls = cx_auto_build_controls, .build_controls = cx_auto_build_controls,
.build_pcms = snd_hda_gen_build_pcms, .build_pcms = snd_hda_gen_build_pcms,
.init = snd_hda_gen_init, .init = cx_auto_init,
.free = snd_hda_gen_free, .free = snd_hda_gen_free,
.unsol_event = snd_hda_jack_unsol_event, .unsol_event = snd_hda_jack_unsol_event,
#ifdef CONFIG_PM #ifdef CONFIG_PM
...@@ -3348,7 +3358,8 @@ static int patch_conexant_auto(struct hda_codec *codec) ...@@ -3348,7 +3358,8 @@ static int patch_conexant_auto(struct hda_codec *codec)
cx_auto_parse_beep(codec); cx_auto_parse_beep(codec);
cx_auto_parse_eapd(codec); cx_auto_parse_eapd(codec);
if (spec->gen.own_eapd_ctl) spec->gen.own_eapd_ctl = 1;
if (spec->dynamic_eapd)
spec->gen.vmaster_mute.hook = cx_auto_vmaster_hook; spec->gen.vmaster_mute.hook = cx_auto_vmaster_hook;
switch (codec->vendor_id) { switch (codec->vendor_id) {
......
...@@ -1832,12 +1832,10 @@ static void intel_haswell_fixup_connect_list(struct hda_codec *codec, ...@@ -1832,12 +1832,10 @@ static void intel_haswell_fixup_connect_list(struct hda_codec *codec,
#define INTEL_EN_ALL_PIN_CVTS 0x01 /* enable 2nd & 3rd pins and convertors */ #define INTEL_EN_ALL_PIN_CVTS 0x01 /* enable 2nd & 3rd pins and convertors */
static void intel_haswell_enable_all_pins(struct hda_codec *codec, static void intel_haswell_enable_all_pins(struct hda_codec *codec,
const struct hda_fixup *fix, int action) bool update_tree)
{ {
unsigned int vendor_param; unsigned int vendor_param;
if (action != HDA_FIXUP_ACT_PRE_PROBE)
return;
vendor_param = snd_hda_codec_read(codec, INTEL_VENDOR_NID, 0, vendor_param = snd_hda_codec_read(codec, INTEL_VENDOR_NID, 0,
INTEL_GET_VENDOR_VERB, 0); INTEL_GET_VENDOR_VERB, 0);
if (vendor_param == -1 || vendor_param & INTEL_EN_ALL_PIN_CVTS) if (vendor_param == -1 || vendor_param & INTEL_EN_ALL_PIN_CVTS)
...@@ -1849,8 +1847,8 @@ static void intel_haswell_enable_all_pins(struct hda_codec *codec, ...@@ -1849,8 +1847,8 @@ static void intel_haswell_enable_all_pins(struct hda_codec *codec,
if (vendor_param == -1) if (vendor_param == -1)
return; return;
snd_hda_codec_update_widgets(codec); if (update_tree)
return; snd_hda_codec_update_widgets(codec);
} }
static void intel_haswell_fixup_enable_dp12(struct hda_codec *codec) static void intel_haswell_fixup_enable_dp12(struct hda_codec *codec)
...@@ -1868,30 +1866,20 @@ static void intel_haswell_fixup_enable_dp12(struct hda_codec *codec) ...@@ -1868,30 +1866,20 @@ static void intel_haswell_fixup_enable_dp12(struct hda_codec *codec)
INTEL_SET_VENDOR_VERB, vendor_param); INTEL_SET_VENDOR_VERB, vendor_param);
} }
/* Haswell needs to re-issue the vendor-specific verbs before turning to D0.
* Otherwise you may get severe h/w communication errors.
*/
static void haswell_set_power_state(struct hda_codec *codec, hda_nid_t fg,
unsigned int power_state)
{
if (power_state == AC_PWRST_D0) {
intel_haswell_enable_all_pins(codec, false);
intel_haswell_fixup_enable_dp12(codec);
}
snd_hda_codec_read(codec, fg, 0, AC_VERB_SET_POWER_STATE, power_state);
/* available models for fixup */ snd_hda_codec_set_power_to_all(codec, fg, power_state);
enum { }
INTEL_HASWELL,
};
static const struct hda_model_fixup hdmi_models[] = {
{.id = INTEL_HASWELL, .name = "Haswell"},
{}
};
static const struct snd_pci_quirk hdmi_fixup_tbl[] = {
SND_PCI_QUIRK(0x8086, 0x2010, "Haswell", INTEL_HASWELL),
{} /* terminator */
};
static const struct hda_fixup hdmi_fixups[] = {
[INTEL_HASWELL] = {
.type = HDA_FIXUP_FUNC,
.v.func = intel_haswell_enable_all_pins,
},
};
static int patch_generic_hdmi(struct hda_codec *codec) static int patch_generic_hdmi(struct hda_codec *codec)
{ {
...@@ -1904,11 +1892,10 @@ static int patch_generic_hdmi(struct hda_codec *codec) ...@@ -1904,11 +1892,10 @@ static int patch_generic_hdmi(struct hda_codec *codec)
codec->spec = spec; codec->spec = spec;
hdmi_array_init(spec, 4); hdmi_array_init(spec, 4);
snd_hda_pick_fixup(codec, hdmi_models, hdmi_fixup_tbl, hdmi_fixups); if (codec->vendor_id == 0x80862807) {
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); intel_haswell_enable_all_pins(codec, true);
if (codec->vendor_id == 0x80862807)
intel_haswell_fixup_enable_dp12(codec); intel_haswell_fixup_enable_dp12(codec);
}
if (hdmi_parse_codec(codec) < 0) { if (hdmi_parse_codec(codec) < 0) {
codec->spec = NULL; codec->spec = NULL;
...@@ -1916,6 +1903,9 @@ static int patch_generic_hdmi(struct hda_codec *codec) ...@@ -1916,6 +1903,9 @@ static int patch_generic_hdmi(struct hda_codec *codec)
return -EINVAL; return -EINVAL;
} }
codec->patch_ops = generic_hdmi_patch_ops; codec->patch_ops = generic_hdmi_patch_ops;
if (codec->vendor_id == 0x80862807)
codec->patch_ops.set_power_state = haswell_set_power_state;
generic_hdmi_init_per_pins(codec); generic_hdmi_init_per_pins(codec);
init_channel_allocations(); init_channel_allocations();
......
...@@ -2882,6 +2882,7 @@ static int wm8994_aif3_hw_params(struct snd_pcm_substream *substream, ...@@ -2882,6 +2882,7 @@ static int wm8994_aif3_hw_params(struct snd_pcm_substream *substream,
default: default:
return 0; return 0;
} }
break;
default: default:
return 0; return 0;
} }
......
...@@ -505,7 +505,10 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, ...@@ -505,7 +505,10 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, ACLKX | AFSX); mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
ACLKX | ACLKR);
mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
AFSX | AFSR);
break; break;
case SND_SOC_DAIFMT_CBM_CFS: case SND_SOC_DAIFMT_CBM_CFS:
/* codec is clock master and frame slave */ /* codec is clock master and frame slave */
...@@ -565,7 +568,7 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, ...@@ -565,7 +568,7 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL); mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
mcasp_clr_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL); mcasp_clr_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL); mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL); mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
break; break;
......
...@@ -1095,9 +1095,9 @@ int dapm_clock_event(struct snd_soc_dapm_widget *w, ...@@ -1095,9 +1095,9 @@ int dapm_clock_event(struct snd_soc_dapm_widget *w,
#ifdef CONFIG_HAVE_CLK #ifdef CONFIG_HAVE_CLK
if (SND_SOC_DAPM_EVENT_ON(event)) { if (SND_SOC_DAPM_EVENT_ON(event)) {
return clk_enable(w->clk); return clk_prepare_enable(w->clk);
} else { } else {
clk_disable(w->clk); clk_disable_unprepare(w->clk);
return 0; return 0;
} }
#endif #endif
......
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