/* ESAI */
 #define SOF_TKN_IMX_ESAI_MCLK_ID               1100
 
+/* Led control for mute switches */
+#define SOF_TKN_MUTE_LED_USE                   1300
+#define SOF_TKN_MUTE_LED_DIRECTION             1301
+
 #endif
 
 /* Mixer Controls */
 
 #include <linux/pm_runtime.h>
+#include <linux/leds.h>
 #include "sof-priv.h"
 
+static void update_mute_led(struct snd_sof_control *scontrol,
+                           struct snd_kcontrol *kcontrol,
+                           struct snd_ctl_elem_value *ucontrol)
+{
+       unsigned int temp = 0;
+       unsigned 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 (!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);
+}
+
 static inline u32 mixer_to_ipc(unsigned int value, u32 *volume_map, int size)
 {
        if (value >= size)
                cdata->chanv[i].channel = i;
        }
 
+       if (scontrol->led_ctl.use_led)
+               update_mute_led(scontrol, kcontrol, ucontrol);
+
        /* notify DSP of mixer updates */
        if (pm_runtime_active(sdev->dev))
                snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
 
 
 #include <sound/hdaudio.h>
 #include <sound/soc.h>
+#include <sound/control.h>
 
 #include <sound/sof.h>
 #include <sound/sof/stream.h> /* needs to be included before control.h */
        bool prepared[2]; /* PCM_PARAMS set successfully */
 };
 
+struct snd_sof_led_control {
+       unsigned int use_led;
+       unsigned int direction;
+       unsigned int led_value;
+};
+
 /* ALSA SOF Kcontrol device */
 struct snd_sof_control {
        struct snd_sof_dev *sdev;
        u32 *volume_table; /* volume table computed from tlv data*/
 
        struct list_head list;  /* list in sdev control list */
+
+       struct snd_sof_led_control led_ctl;
 };
 
 /* ASoC SOF DAPM widget */
 
 static const struct sof_topology_token hda_tokens[] = {
 };
 
+/* Leds */
+static const struct sof_topology_token led_tokens[] = {
+       {SOF_TKN_MUTE_LED_USE, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
+        offsetof(struct snd_sof_led_control, use_led), 0},
+       {SOF_TKN_MUTE_LED_DIRECTION, SND_SOC_TPLG_TUPLE_TYPE_WORD,
+        get_token_u32, offsetof(struct snd_sof_led_control, direction), 0},
+};
+
 static void sof_parse_uuid_tokens(struct snd_soc_component *scomp,
                                  void *object,
                                  const struct sof_topology_token *tokens,
        }
 
 out:
+       /* set up possible led control from mixer private data */
+       ret = sof_parse_tokens(scomp, &scontrol->led_ctl, led_tokens,
+                              ARRAY_SIZE(led_tokens), mc->priv.array,
+                              le32_to_cpu(mc->priv.size));
+
        dev_dbg(sdev->dev, "tplg: load kcontrol index %d chans %d\n",
                scontrol->comp_id, scontrol->num_channels);