| From bca8e988043e39483afd7872a2641f03ed7201a6 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Wed, 20 Jan 2016 15:46:44 +0100 |
| Subject: ALSA: hda - Fix missing module loading with model=generic option |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit bca8e988043e39483afd7872a2641f03ed7201a6 upstream. |
| |
| When the generic codec driver is specified via model option or such, |
| the hda driver doesn't try to load the generic driver module but still |
| loads the codec-specific driver, and this ends up with the binding |
| failure. |
| |
| This patch fixes it by moving the generic module request in the common |
| helper code. |
| |
| Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=111021 |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/pci/hda/hda_bind.c | 42 ++++++++++++++++++++++++++++++++---------- |
| 1 file changed, 32 insertions(+), 10 deletions(-) |
| |
| --- a/sound/pci/hda/hda_bind.c |
| +++ b/sound/pci/hda/hda_bind.c |
| @@ -174,14 +174,40 @@ static inline bool codec_probed(struct h |
| return device_attach(hda_codec_dev(codec)) > 0 && codec->preset; |
| } |
| |
| -/* try to auto-load and bind the codec module */ |
| -static void codec_bind_module(struct hda_codec *codec) |
| +/* try to auto-load codec module */ |
| +static void request_codec_module(struct hda_codec *codec) |
| { |
| #ifdef MODULE |
| char modalias[32]; |
| + const char *mod = NULL; |
| + |
| + switch (codec->probe_id) { |
| + case HDA_CODEC_ID_GENERIC_HDMI: |
| +#if IS_MODULE(CONFIG_SND_HDA_CODEC_HDMI) |
| + mod = "snd-hda-codec-hdmi"; |
| +#endif |
| + break; |
| + case HDA_CODEC_ID_GENERIC: |
| +#if IS_MODULE(CONFIG_SND_HDA_GENERIC) |
| + mod = "snd-hda-codec-generic"; |
| +#endif |
| + break; |
| + default: |
| + snd_hdac_codec_modalias(&codec->core, modalias, sizeof(modalias)); |
| + mod = modalias; |
| + break; |
| + } |
| + |
| + if (mod) |
| + request_module(mod); |
| +#endif /* MODULE */ |
| +} |
| |
| - snd_hdac_codec_modalias(&codec->core, modalias, sizeof(modalias)); |
| - request_module(modalias); |
| +/* try to auto-load and bind the codec module */ |
| +static void codec_bind_module(struct hda_codec *codec) |
| +{ |
| +#ifdef MODULE |
| + request_codec_module(codec); |
| if (codec_probed(codec)) |
| return; |
| #endif |
| @@ -218,17 +244,13 @@ static int codec_bind_generic(struct hda |
| |
| if (is_likely_hdmi_codec(codec)) { |
| codec->probe_id = HDA_CODEC_ID_GENERIC_HDMI; |
| -#if IS_MODULE(CONFIG_SND_HDA_CODEC_HDMI) |
| - request_module("snd-hda-codec-hdmi"); |
| -#endif |
| + request_codec_module(codec); |
| if (codec_probed(codec)) |
| return 0; |
| } |
| |
| codec->probe_id = HDA_CODEC_ID_GENERIC; |
| -#if IS_MODULE(CONFIG_SND_HDA_GENERIC) |
| - request_module("snd-hda-codec-generic"); |
| -#endif |
| + request_codec_module(codec); |
| if (codec_probed(codec)) |
| return 0; |
| return -ENODEV; |