|
@@ -2082,6 +2082,16 @@ static struct snd_kcontrol_new vmaster_mute_mode = {
|
|
|
.put = vmaster_mute_mode_put,
|
|
|
};
|
|
|
|
|
|
+/* meta hook to call each driver's vmaster hook */
|
|
|
+static void vmaster_hook(void *private_data, int enabled)
|
|
|
+{
|
|
|
+ struct hda_vmaster_mute_hook *hook = private_data;
|
|
|
+
|
|
|
+ if (hook->mute_mode != HDA_VMUTE_FOLLOW_MASTER)
|
|
|
+ enabled = hook->mute_mode;
|
|
|
+ hook->hook(hook->codec, enabled);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* snd_hda_add_vmaster_hook - Add a vmaster hook for mute-LED
|
|
|
* @codec: the HDA codec
|
|
@@ -2100,9 +2110,9 @@ int snd_hda_add_vmaster_hook(struct hda_codec *codec,
|
|
|
|
|
|
if (!hook->hook || !hook->sw_kctl)
|
|
|
return 0;
|
|
|
- snd_ctl_add_vmaster_hook(hook->sw_kctl, hook->hook, codec);
|
|
|
hook->codec = codec;
|
|
|
hook->mute_mode = HDA_VMUTE_FOLLOW_MASTER;
|
|
|
+ snd_ctl_add_vmaster_hook(hook->sw_kctl, vmaster_hook, hook);
|
|
|
if (!expose_enum_ctl)
|
|
|
return 0;
|
|
|
kctl = snd_ctl_new1(&vmaster_mute_mode, hook);
|
|
@@ -2128,14 +2138,7 @@ void snd_hda_sync_vmaster_hook(struct hda_vmaster_mute_hook *hook)
|
|
|
*/
|
|
|
if (hook->codec->bus->shutdown)
|
|
|
return;
|
|
|
- switch (hook->mute_mode) {
|
|
|
- case HDA_VMUTE_FOLLOW_MASTER:
|
|
|
- snd_ctl_sync_vmaster_hook(hook->sw_kctl);
|
|
|
- break;
|
|
|
- default:
|
|
|
- hook->hook(hook->codec, hook->mute_mode);
|
|
|
- break;
|
|
|
- }
|
|
|
+ snd_ctl_sync_vmaster_hook(hook->sw_kctl);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(snd_hda_sync_vmaster_hook);
|
|
|
|