diff options
author | Takashi Iwai <tiwai@suse.de> | 2021-10-27 14:37:58 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2021-10-27 14:37:58 +0200 |
commit | c6c811457dfcf62a9bf140f60eb3360751035a2f (patch) | |
tree | 4a7defce3382960d52ff3fc7ef09991fcaf7faac | |
parent | d43839d46fb24a61d246e168918e2d9025d9fea3 (diff) | |
download | hda-emu-c6c811457dfcf62a9bf140f60eb3360751035a2f.tar.gz |
Improved LED cdev trigger handling
Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r-- | hda-ctlsh.c | 9 | ||||
-rw-r--r-- | include/sound/control.h | 6 | ||||
-rw-r--r-- | snd-wrapper.c | 18 |
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 |