Re: [PATCH v2] ASoC: SOF: topology: use new sound control LED layer

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 3/29/22 07:00, Jaroslav Kysela wrote:
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@xxxxxxxx>
Cc: Mark Brown <broonie@xxxxxxxxxx>
Cc: Ranjani Sridharan <ranjani.sridharan@xxxxxxxxxxxxxxx>
Cc: Bard Liao <yung-chuan.liao@xxxxxxxxxxxxxxx>
Cc: Péter Ujfalusi <peter.ujfalusi@xxxxxxxxxxxxxxx>
Cc: Pierre-Louis Bossart <pierre-louis.bossart@xxxxxxxxxxxxxxx>


LGTM - how many engineers does it take to turn on a LED :-)

Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@xxxxxxxxxxxxxxx>


-----
v2:
   - add Mark to Cc:
   - add snd_ctl_led_request() call
---
  sound/soc/sof/control.c  | 33 ---------------------------------
  sound/soc/sof/sof-priv.h |  1 +
  sound/soc/sof/topology.c | 16 ++++++++++++++++
  3 files changed, 17 insertions(+), 33 deletions(-)

diff --git a/sound/soc/sof/control.c b/sound/soc/sof/control.c
index de1778c4002b..3b5718a3516d 100644
--- a/sound/soc/sof/control.c
+++ b/sound/soc/sof/control.c
@@ -15,36 +15,6 @@
  #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);
diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h
index 0d9b640ae24c..e537b1258aa8 100644
--- a/sound/soc/sof/sof-priv.h
+++ b/sound/soc/sof/sof-priv.h
@@ -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;
diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c
index 9b11e9795a7a..e47a64934c04 100644
--- a/sound/soc/sof/topology.c
+++ b/sound/soc/sof/topology.c
@@ -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 @@ static int sof_control_load_volume(struct snd_soc_component *scomp,
  		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);



[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux