Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: qcom: sdm845: Create and setup jack in init callback

Add a callback for init ops on dai_link to create and setup jack.

Signed-off-by: Rohit kumar <rohitkr@codeaurora.org>
Signed-off-by: Cheng-Yi Chiang <cychiang@chromium.org>
Acked-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Cheng-Yi Chiang and committed by
Mark Brown
80e733fd 7f1806eb

+55 -2
+55 -2
sound/soc/qcom/sdm845.c
··· 8 8 #include <linux/of_device.h> 9 9 #include <sound/pcm.h> 10 10 #include <sound/pcm_params.h> 11 + #include <sound/jack.h> 12 + #include <uapi/linux/input-event-codes.h> 11 13 #include "common.h" 12 14 #include "qdsp6/q6afe.h" 13 15 ··· 19 17 #define MI2S_BCLK_RATE 1536000 20 18 21 19 struct sdm845_snd_data { 20 + struct snd_soc_jack jack; 21 + bool jack_setup; 22 22 struct snd_soc_card *card; 23 23 uint32_t pri_mi2s_clk_count; 24 24 uint32_t sec_mi2s_clk_count; ··· 103 99 } 104 100 return ret; 105 101 } 102 + 103 + static int sdm845_dai_init(struct snd_soc_pcm_runtime *rtd) 104 + { 105 + struct snd_soc_component *component; 106 + struct snd_soc_dai_link *dai_link = rtd->dai_link; 107 + struct snd_soc_card *card = rtd->card; 108 + struct sdm845_snd_data *pdata = snd_soc_card_get_drvdata(card); 109 + int i, rval; 110 + 111 + if (!pdata->jack_setup) { 112 + struct snd_jack *jack; 113 + 114 + rval = snd_soc_card_jack_new(card, "Headset Jack", 115 + SND_JACK_HEADSET | 116 + SND_JACK_HEADPHONE | 117 + SND_JACK_BTN_0 | SND_JACK_BTN_1 | 118 + SND_JACK_BTN_2 | SND_JACK_BTN_3, 119 + &pdata->jack, NULL, 0); 120 + 121 + if (rval < 0) { 122 + dev_err(card->dev, "Unable to add Headphone Jack\n"); 123 + return rval; 124 + } 125 + 126 + jack = pdata->jack.jack; 127 + 128 + snd_jack_set_key(jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 129 + snd_jack_set_key(jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); 130 + snd_jack_set_key(jack, SND_JACK_BTN_2, KEY_VOLUMEUP); 131 + snd_jack_set_key(jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); 132 + pdata->jack_setup = true; 133 + } 134 + 135 + for (i = 0 ; i < dai_link->num_codecs; i++) { 136 + struct snd_soc_dai *dai = rtd->codec_dais[i]; 137 + 138 + component = dai->component; 139 + rval = snd_soc_component_set_jack( 140 + component, &pdata->jack, NULL); 141 + if (rval != 0 && rval != -ENOTSUPP) { 142 + dev_warn(card->dev, "Failed to set jack: %d\n", rval); 143 + return rval; 144 + } 145 + } 146 + 147 + return 0; 148 + } 149 + 106 150 107 151 static int sdm845_snd_startup(struct snd_pcm_substream *substream) 108 152 { ··· 272 220 SND_SOC_DAPM_MIC("Int Mic", NULL), 273 221 }; 274 222 275 - static void sdm845_add_be_ops(struct snd_soc_card *card) 223 + static void sdm845_add_ops(struct snd_soc_card *card) 276 224 { 277 225 struct snd_soc_dai_link *link; 278 226 int i; ··· 282 230 link->ops = &sdm845_be_ops; 283 231 link->be_hw_params_fixup = sdm845_be_hw_params_fixup; 284 232 } 233 + link->init = sdm845_dai_init; 285 234 } 286 235 } 287 236 ··· 317 264 data->card = card; 318 265 snd_soc_card_set_drvdata(card, data); 319 266 320 - sdm845_add_be_ops(card); 267 + sdm845_add_ops(card); 321 268 ret = snd_soc_register_card(card); 322 269 if (ret) { 323 270 dev_err(dev, "Sound card registration failed\n");