aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2021-10-27 14:37:58 +0200
committerTakashi Iwai <tiwai@suse.de>2021-10-27 14:37:58 +0200
commitc6c811457dfcf62a9bf140f60eb3360751035a2f (patch)
tree4a7defce3382960d52ff3fc7ef09991fcaf7faac
parentd43839d46fb24a61d246e168918e2d9025d9fea3 (diff)
downloadhda-emu-c6c811457dfcf62a9bf140f60eb3360751035a2f.tar.gz
Improved LED cdev trigger handling
Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--hda-ctlsh.c9
-rw-r--r--include/sound/control.h6
-rw-r--r--snd-wrapper.c18
3 files changed, 31 insertions, 2 deletions
diff --git a/hda-ctlsh.c b/hda-ctlsh.c
index f3d9b73..4492f8f 100644
--- a/hda-ctlsh.c
+++ b/hda-ctlsh.c
@@ -283,6 +283,10 @@ static void get_element(char *line)
}
}
+#ifdef SNDRV_CTL_ELEM_ACCESS_SPK_LED
+extern void __led_trigger(unsigned int flags, long *vals);
+#endif
+
static void set_element(char *line)
{
struct snd_kcontrol *kctl;
@@ -362,6 +366,11 @@ static void set_element(char *line)
hda_log(HDA_LOG_INFO, "Error in get for %d\n", numid);
return;
}
+#ifdef SNDRV_CTL_ELEM_ACCESS_SPK_LED
+ if (kctl->vd[0].access & (SNDRV_CTL_ELEM_ACCESS_SPK_LED | SNDRV_CTL_ELEM_ACCESS_MIC_LED))
+ __led_trigger(kctl->vd[0].access & (SNDRV_CTL_ELEM_ACCESS_SPK_LED | SNDRV_CTL_ELEM_ACCESS_MIC_LED),
+ uval.value.integer.value);
+#endif
}
static void dump_proc(char *line)
diff --git a/include/sound/control.h b/include/sound/control.h
index e780014..c501c3b 100644
--- a/include/sound/control.h
+++ b/include/sound/control.h
@@ -212,8 +212,10 @@ void snd_kctl_jack_report(struct snd_card *card,
#define SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK 0
-#define SNDRV_CTL_ELEM_ACCESS_MIC_LED 0 /* XXX */
-#define SNDRV_CTL_ELEM_ACCESS_SPK_LED 0 /* XXX */
+#define SNDRV_CTL_ELEM_ACCESS_LED_SHIFT 25
+#define SNDRV_CTL_ELEM_ACCESS_LED_MASK (7<<25) /* kernel three bits - LED group */
+#define SNDRV_CTL_ELEM_ACCESS_SPK_LED (1<<25) /* kernel speaker (output) LED flag */
+#define SNDRV_CTL_ELEM_ACCESS_MIC_LED (2<<25) /* kernel microphone (input) LED flag */
#define snd_ctl_led_request() do {} while (0)
diff --git a/snd-wrapper.c b/snd-wrapper.c
index 4863f31..b90afab 100644
--- a/snd-wrapper.c
+++ b/snd-wrapper.c
@@ -984,3 +984,21 @@ int devm_led_classdev_register_ext(struct device *parent,
led_cdev->dev->parent = parent;
return 0;
}
+
+#ifdef SNDRV_CTL_ELEM_ACCESS_SPK_LED
+/* XXX called from hda-ctlsh.c */
+void __led_trigger(unsigned int flags, long *vals)
+{
+ struct led_classdev *cdev;
+
+ if (flags & SNDRV_CTL_ELEM_ACCESS_SPK_LED)
+ cdev = led_devs[LED_AUDIO_MUTE];
+ else if (flags & SNDRV_CTL_ELEM_ACCESS_MIC_LED)
+ cdev = led_devs[LED_AUDIO_MICMUTE];
+ else
+ return;
+ if (!cdev)
+ return;
+ cdev->brightness_set_blocking(cdev, *vals);
+}
+#endif