aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/intel/boards/bytcr_rt5640.c78
1 files changed, 62 insertions, 16 deletions
diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c
index 8dfb57d96985..944283f569c6 100644
--- a/sound/soc/intel/boards/bytcr_rt5640.c
+++ b/sound/soc/intel/boards/bytcr_rt5640.c
@@ -39,6 +39,13 @@ static const struct snd_soc_dapm_widget byt_rt5640_widgets[] = {
39}; 39};
40 40
41static const struct snd_soc_dapm_route byt_rt5640_audio_map[] = { 41static const struct snd_soc_dapm_route byt_rt5640_audio_map[] = {
42 {"AIF1 Playback", NULL, "ssp2 Tx"},
43 {"ssp2 Tx", NULL, "codec_out0"},
44 {"ssp2 Tx", NULL, "codec_out1"},
45 {"codec_in0", NULL, "ssp2 Rx"},
46 {"codec_in1", NULL, "ssp2 Rx"},
47 {"ssp2 Rx", NULL, "AIF1 Capture"},
48
42 {"Headset Mic", NULL, "MICBIAS1"}, 49 {"Headset Mic", NULL, "MICBIAS1"},
43 {"IN2P", NULL, "Headset Mic"}, 50 {"IN2P", NULL, "Headset Mic"},
44 {"Headphone", NULL, "HPOL"}, 51 {"Headphone", NULL, "HPOL"},
@@ -47,15 +54,6 @@ static const struct snd_soc_dapm_route byt_rt5640_audio_map[] = {
47 {"Speaker", NULL, "SPOLN"}, 54 {"Speaker", NULL, "SPOLN"},
48 {"Speaker", NULL, "SPORP"}, 55 {"Speaker", NULL, "SPORP"},
49 {"Speaker", NULL, "SPORN"}, 56 {"Speaker", NULL, "SPORN"},
50 {"Internal Mic", NULL, "MICBIAS1"},
51 {"IN1P", NULL, "Internal Mic"},
52
53 {"AIF1 Playback", NULL, "ssp2 Tx"},
54 {"ssp2 Tx", NULL, "codec_out0"},
55 {"ssp2 Tx", NULL, "codec_out1"},
56 {"codec_in0", NULL, "ssp2 Rx"},
57 {"codec_in1", NULL, "ssp2 Rx"},
58 {"ssp2 Rx", NULL, "AIF1 Capture"},
59}; 57};
60 58
61static const struct snd_soc_dapm_route byt_rt5640_intmic_dmic1_map[] = { 59static const struct snd_soc_dapm_route byt_rt5640_intmic_dmic1_map[] = {
@@ -145,6 +143,54 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
145 {} 143 {}
146}; 144};
147 145
146static int byt_rt5640_init(struct snd_soc_pcm_runtime *runtime)
147{
148 int ret;
149 struct snd_soc_codec *codec = runtime->codec;
150 struct snd_soc_card *card = runtime->card;
151 const struct snd_soc_dapm_route *custom_map;
152 int num_routes;
153
154 card->dapm.idle_bias_off = true;
155
156 ret = snd_soc_add_card_controls(card, byt_rt5640_controls,
157 ARRAY_SIZE(byt_rt5640_controls));
158 if (ret) {
159 dev_err(card->dev, "unable to add card controls\n");
160 return ret;
161 }
162
163 dmi_check_system(byt_rt5640_quirk_table);
164 switch (BYT_RT5640_MAP(byt_rt5640_quirk)) {
165 case BYT_RT5640_IN1_MAP:
166 custom_map = byt_rt5640_intmic_in1_map;
167 num_routes = ARRAY_SIZE(byt_rt5640_intmic_in1_map);
168 break;
169 case BYT_RT5640_DMIC2_MAP:
170 custom_map = byt_rt5640_intmic_dmic2_map;
171 num_routes = ARRAY_SIZE(byt_rt5640_intmic_dmic2_map);
172 break;
173 default:
174 custom_map = byt_rt5640_intmic_dmic1_map;
175 num_routes = ARRAY_SIZE(byt_rt5640_intmic_dmic1_map);
176 }
177
178 ret = snd_soc_dapm_add_routes(&card->dapm, custom_map, num_routes);
179 if (ret)
180 return ret;
181
182 if (byt_rt5640_quirk & BYT_RT5640_DMIC_EN) {
183 ret = rt5640_dmic_enable(codec, 0, 0);
184 if (ret)
185 return ret;
186 }
187
188 snd_soc_dapm_ignore_suspend(&card->dapm, "Headphone");
189 snd_soc_dapm_ignore_suspend(&card->dapm, "Speaker");
190
191 return ret;
192}
193
148static const struct snd_soc_pcm_stream byt_rt5640_dai_params = { 194static const struct snd_soc_pcm_stream byt_rt5640_dai_params = {
149 .formats = SNDRV_PCM_FMTBIT_S24_LE, 195 .formats = SNDRV_PCM_FMTBIT_S24_LE,
150 .rate_min = 48000, 196 .rate_min = 48000,
@@ -244,12 +290,13 @@ static struct snd_soc_dai_link byt_rt5640_dais[] = {
244 .ignore_suspend = 1, 290 .ignore_suspend = 1,
245 .dpcm_playback = 1, 291 .dpcm_playback = 1,
246 .dpcm_capture = 1, 292 .dpcm_capture = 1,
293 .init = byt_rt5640_init,
247 .ops = &byt_rt5640_be_ssp2_ops, 294 .ops = &byt_rt5640_be_ssp2_ops,
248 }, 295 },
249}; 296};
250 297
251/* SoC card */ 298/* SoC card */
252static struct snd_soc_card snd_soc_card_byt_rt5640 = { 299static struct snd_soc_card byt_rt5640_card = {
253 .name = "bytcr-rt5640", 300 .name = "bytcr-rt5640",
254 .owner = THIS_MODULE, 301 .owner = THIS_MODULE,
255 .dai_link = byt_rt5640_dais, 302 .dai_link = byt_rt5640_dais,
@@ -258,8 +305,7 @@ static struct snd_soc_card snd_soc_card_byt_rt5640 = {
258 .num_dapm_widgets = ARRAY_SIZE(byt_rt5640_widgets), 305 .num_dapm_widgets = ARRAY_SIZE(byt_rt5640_widgets),
259 .dapm_routes = byt_rt5640_audio_map, 306 .dapm_routes = byt_rt5640_audio_map,
260 .num_dapm_routes = ARRAY_SIZE(byt_rt5640_audio_map), 307 .num_dapm_routes = ARRAY_SIZE(byt_rt5640_audio_map),
261 .controls = byt_rt5640_controls, 308 .fully_routed = true,
262 .num_controls = ARRAY_SIZE(byt_rt5640_controls),
263}; 309};
264 310
265static int snd_byt_rt5640_mc_probe(struct platform_device *pdev) 311static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
@@ -267,16 +313,16 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
267 int ret_val = 0; 313 int ret_val = 0;
268 314
269 /* register the soc card */ 315 /* register the soc card */
270 snd_soc_card_byt_rt5640.dev = &pdev->dev; 316 byt_rt5640_card.dev = &pdev->dev;
317
318 ret_val = devm_snd_soc_register_card(&pdev->dev, &byt_rt5640_card);
271 319
272 ret_val = devm_snd_soc_register_card(&pdev->dev,
273 &snd_soc_card_byt_rt5640);
274 if (ret_val) { 320 if (ret_val) {
275 dev_err(&pdev->dev, "devm_snd_soc_register_card failed %d\n", 321 dev_err(&pdev->dev, "devm_snd_soc_register_card failed %d\n",
276 ret_val); 322 ret_val);
277 return ret_val; 323 return ret_val;
278 } 324 }
279 platform_set_drvdata(pdev, &snd_soc_card_byt_rt5640); 325 platform_set_drvdata(pdev, &byt_rt5640_card);
280 return ret_val; 326 return ret_val;
281} 327}
282 328