mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
ALSA: hda - Fix missing module loading with model=generic option
commit bca8e98804 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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
658a9bb065
commit
5833733480
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user