#include <sound/soc-dapm.h>
 #include <sound/pcm.h>
 #include <linux/soundwire/sdw.h>
+#include <sound/jack.h>
+#include <linux/input-event-codes.h>
 #include "qdsp6/q6afe.h"
 #include "common.h"
 
        bool stream_prepared[AFE_PORT_MAX];
        struct snd_soc_card *card;
        struct sdw_stream_runtime *sruntime[AFE_PORT_MAX];
+       struct snd_soc_jack jack;
+       bool jack_setup;
 };
 
+static int sm8250_snd_init(struct snd_soc_pcm_runtime *rtd)
+{
+       struct sm8250_snd_data *data = snd_soc_card_get_drvdata(rtd->card);
+       struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+       struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
+       struct snd_soc_card *card = rtd->card;
+       int rval, i;
+
+       if (!data->jack_setup) {
+               struct snd_jack *jack;
+
+               rval = snd_soc_card_jack_new(card, "Headset Jack",
+                                            SND_JACK_HEADSET | SND_JACK_LINEOUT |
+                                            SND_JACK_MECHANICAL |
+                                            SND_JACK_BTN_0 | SND_JACK_BTN_1 |
+                                            SND_JACK_BTN_2 | SND_JACK_BTN_3 |
+                                            SND_JACK_BTN_4 | SND_JACK_BTN_5,
+                                            &data->jack, NULL, 0);
+
+               if (rval < 0) {
+                       dev_err(card->dev, "Unable to add Headphone Jack\n");
+                       return rval;
+               }
+
+               jack = data->jack.jack;
+
+               snd_jack_set_key(jack, SND_JACK_BTN_0, KEY_MEDIA);
+               snd_jack_set_key(jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
+               snd_jack_set_key(jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
+               snd_jack_set_key(jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
+               data->jack_setup = true;
+       }
+
+       switch (cpu_dai->id) {
+       case TX_CODEC_DMA_TX_0:
+       case TX_CODEC_DMA_TX_1:
+       case TX_CODEC_DMA_TX_2:
+       case TX_CODEC_DMA_TX_3:
+               for_each_rtd_codec_dais(rtd, i, codec_dai) {
+                       rval = snd_soc_component_set_jack(codec_dai->component,
+                                                         &data->jack, NULL);
+                       if (rval != 0 && rval != -ENOTSUPP) {
+                               dev_warn(card->dev, "Failed to set jack: %d\n", rval);
+                               return rval;
+                       }
+               }
+
+               break;
+       default:
+               break;
+       }
+
+
+       return 0;
+}
+
 static int sm8250_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
                                     struct snd_pcm_hw_params *params)
 {
 
        for_each_card_prelinks(card, i, link) {
                if (link->no_pcm == 1) {
+                       link->init = sm8250_snd_init;
                        link->be_hw_params_fixup = sm8250_be_hw_params_fixup;
                        link->ops = &sm8250_be_ops;
                }