ASoC: SOF: topology: use new sound control LED layer
authorJaroslav Kysela <perex@perex.cz>
Tue, 29 Mar 2022 12:00:39 +0000 (14:00 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 5 Apr 2022 09:22:55 +0000 (10:22 +0100)
Use the new sound control LED layer instead the direct ledtrig_audio_set()
call - see 22d8de62f11b ("ALSA: control - add generic LED trigger module
as the new control layer").

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Cc: Bard Liao <yung-chuan.liao@linux.intel.com>
Cc: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20220329120039.2394138-1-perex@perex.cz
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/control.c
sound/soc/sof/sof-priv.h
sound/soc/sof/topology.c

index de1778c4002bd231330b7b4b97d111ae1cdd50f9..3b5718a3516dec0674ba8bb25410a6a4c81952ea 100644 (file)
 #include "sof-priv.h"
 #include "sof-audio.h"
 
-static void update_mute_led(struct snd_sof_control *scontrol,
-                           struct snd_kcontrol *kcontrol,
-                           struct snd_ctl_elem_value *ucontrol)
-{
-       int temp = 0;
-       int mask;
-       int i;
-
-       mask = 1U << snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
-
-       for (i = 0; i < scontrol->num_channels; i++) {
-               if (ucontrol->value.integer.value[i]) {
-                       temp |= mask;
-                       break;
-               }
-       }
-
-       if (temp == scontrol->led_ctl.led_value)
-               return;
-
-       scontrol->led_ctl.led_value = temp;
-
-#if IS_REACHABLE(CONFIG_LEDS_TRIGGER_AUDIO)
-       if (!scontrol->led_ctl.direction)
-               ledtrig_audio_set(LED_AUDIO_MUTE, temp ? LED_OFF : LED_ON);
-       else
-               ledtrig_audio_set(LED_AUDIO_MICMUTE, temp ? LED_OFF : LED_ON);
-#endif
-}
-
 int snd_sof_volume_get(struct snd_kcontrol *kcontrol,
                       struct snd_ctl_elem_value *ucontrol)
 {
@@ -121,9 +91,6 @@ int snd_sof_switch_put(struct snd_kcontrol *kcontrol,
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
        const struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;
 
-       if (scontrol->led_ctl.use_led)
-               update_mute_led(scontrol, kcontrol, ucontrol);
-
        if (tplg_ops->control->switch_put)
                return tplg_ops->control->switch_put(scontrol, ucontrol);
 
index 0d9b640ae24cdda0d57f1409c270c1d872d0a81f..e537b1258aa88f91b1b6aaab326de158b1f97865 100644 (file)
@@ -473,6 +473,7 @@ struct snd_sof_dev {
        struct list_head route_list;
        struct snd_soc_component *component;
        u32 enabled_cores_mask; /* keep track of enabled cores */
+       bool led_present;
 
        /* FW configuration */
        struct sof_ipc_window *info_window;
index 9b11e9795a7a04378cfba08323991bad053ac166..e47a64934c047cf6d74d6d8789f74c3dbf2f489e 100644 (file)
@@ -773,6 +773,7 @@ static int sof_control_load_volume(struct snd_soc_component *scomp,
        struct snd_soc_tplg_mixer_control *mc =
                container_of(hdr, struct snd_soc_tplg_mixer_control, hdr);
        int tlv[TLV_ITEMS];
+       unsigned int mask;
        int ret;
 
        /* validate topology data */
@@ -821,6 +822,16 @@ skip:
                goto err;
        }
 
+       if (scontrol->led_ctl.use_led) {
+               mask = scontrol->led_ctl.direction ? SNDRV_CTL_ELEM_ACCESS_MIC_LED :
+                                                       SNDRV_CTL_ELEM_ACCESS_SPK_LED;
+               scontrol->access &= ~SNDRV_CTL_ELEM_ACCESS_LED_MASK;
+               scontrol->access |= mask;
+               kc->access &= ~SNDRV_CTL_ELEM_ACCESS_LED_MASK;
+               kc->access |= mask;
+               sdev->led_present = true;
+       }
+
        dev_dbg(scomp->dev, "tplg: load kcontrol index %d chans %d\n",
                scontrol->comp_id, scontrol->num_channels);
 
@@ -2027,6 +2038,7 @@ static struct snd_soc_tplg_ops sof_tplg_ops = {
 
 int snd_sof_load_topology(struct snd_soc_component *scomp, const char *file)
 {
+       struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
        const struct firmware *fw;
        int ret;
 
@@ -2049,6 +2061,10 @@ int snd_sof_load_topology(struct snd_soc_component *scomp, const char *file)
        }
 
        release_firmware(fw);
+
+       if (ret >= 0 && sdev->led_present)
+               ret = snd_ctl_led_request();
+
        return ret;
 }
 EXPORT_SYMBOL(snd_sof_load_topology);