ALSA: hda - Fix missing module loading with model=generic option
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 Cc: <stable@vger.kernel.org> # v4.4+ Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
bed2e98e1f
commit
bca8e98804
|
@ -174,14 +174,40 @@ static inline bool codec_probed(struct hda_codec *codec)
|
||||||
return device_attach(hda_codec_dev(codec)) > 0 && codec->preset;
|
return device_attach(hda_codec_dev(codec)) > 0 && codec->preset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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 */
|
||||||
|
}
|
||||||
|
|
||||||
/* try to auto-load and bind the codec module */
|
/* try to auto-load and bind the codec module */
|
||||||
static void codec_bind_module(struct hda_codec *codec)
|
static void codec_bind_module(struct hda_codec *codec)
|
||||||
{
|
{
|
||||||
#ifdef MODULE
|
#ifdef MODULE
|
||||||
char modalias[32];
|
request_codec_module(codec);
|
||||||
|
|
||||||
snd_hdac_codec_modalias(&codec->core, modalias, sizeof(modalias));
|
|
||||||
request_module(modalias);
|
|
||||||
if (codec_probed(codec))
|
if (codec_probed(codec))
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
@ -218,17 +244,13 @@ static int codec_bind_generic(struct hda_codec *codec)
|
||||||
|
|
||||||
if (is_likely_hdmi_codec(codec)) {
|
if (is_likely_hdmi_codec(codec)) {
|
||||||
codec->probe_id = HDA_CODEC_ID_GENERIC_HDMI;
|
codec->probe_id = HDA_CODEC_ID_GENERIC_HDMI;
|
||||||
#if IS_MODULE(CONFIG_SND_HDA_CODEC_HDMI)
|
request_codec_module(codec);
|
||||||
request_module("snd-hda-codec-hdmi");
|
|
||||||
#endif
|
|
||||||
if (codec_probed(codec))
|
if (codec_probed(codec))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
codec->probe_id = HDA_CODEC_ID_GENERIC;
|
codec->probe_id = HDA_CODEC_ID_GENERIC;
|
||||||
#if IS_MODULE(CONFIG_SND_HDA_GENERIC)
|
request_codec_module(codec);
|
||||||
request_module("snd-hda-codec-generic");
|
|
||||||
#endif
|
|
||||||
if (codec_probed(codec))
|
if (codec_probed(codec))
|
||||||
return 0;
|
return 0;
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
Loading…
Reference in New Issue