diff options
-rw-r--r-- | sound/soc/intel/boards/bytcr_rt5640.c | 78 |
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 | ||
41 | static const struct snd_soc_dapm_route byt_rt5640_audio_map[] = { | 41 | static 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 | ||
61 | static const struct snd_soc_dapm_route byt_rt5640_intmic_dmic1_map[] = { | 59 | static 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 | ||
146 | static 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 | |||
148 | static const struct snd_soc_pcm_stream byt_rt5640_dai_params = { | 194 | static 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 */ |
252 | static struct snd_soc_card snd_soc_card_byt_rt5640 = { | 299 | static 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 | ||
265 | static int snd_byt_rt5640_mc_probe(struct platform_device *pdev) | 311 | static 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 | ||