diff options
author | Jarkko Nikula <jhnikula@gmail.com> | 2011-01-31 07:43:48 -0500 |
---|---|---|
committer | Liam Girdwood <lrg@slimlogic.co.uk> | 2011-02-01 08:58:52 -0500 |
commit | 8cda975174945e3b7119d48341052d0dc0c87cf2 (patch) | |
tree | e600cea567b698928613703e883edc3963647b59 /sound/soc/omap/rx51.c | |
parent | 48529b3b7ca76e688146e13d1a1666fe69703f0c (diff) |
ASoC: omap: rx51: Add earphone support
Earphone in Nokia RX-51/N900 is connected to left HP output of B part of the
TLV320AIC34 dual codec. In RX-51 the codec A is used as a traditional codec
and the codec B as an auxiliary device.
Audio from codec A goes via the codec B to earphone:
MONO_LOUT of A -> LINE2R of B (B interconnects) -> HPLOUT of B -> Earphone.
Take earphone into use by utilizing the recent ASoC auxiliary and
cross-device support.
Signed-off-by: Jarkko Nikula <jhnikula@gmail.com>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'sound/soc/omap/rx51.c')
-rw-r--r-- | sound/soc/omap/rx51.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c index 251afbe303c6..2d7d4115cb71 100644 --- a/sound/soc/omap/rx51.c +++ b/sound/soc/omap/rx51.c | |||
@@ -242,6 +242,10 @@ static const struct snd_soc_dapm_widget aic34_dapm_widgets[] = { | |||
242 | SND_SOC_DAPM_HP("Headphone Jack", rx51_hp_event), | 242 | SND_SOC_DAPM_HP("Headphone Jack", rx51_hp_event), |
243 | }; | 243 | }; |
244 | 244 | ||
245 | static const struct snd_soc_dapm_widget aic34_dapm_widgetsb[] = { | ||
246 | SND_SOC_DAPM_SPK("Earphone", NULL), | ||
247 | }; | ||
248 | |||
245 | static const struct snd_soc_dapm_route audio_map[] = { | 249 | static const struct snd_soc_dapm_route audio_map[] = { |
246 | {"Ext Spk", NULL, "HPLOUT"}, | 250 | {"Ext Spk", NULL, "HPLOUT"}, |
247 | {"Ext Spk", NULL, "HPROUT"}, | 251 | {"Ext Spk", NULL, "HPROUT"}, |
@@ -252,6 +256,11 @@ static const struct snd_soc_dapm_route audio_map[] = { | |||
252 | {"Mic Bias 2V", NULL, "DMic"}, | 256 | {"Mic Bias 2V", NULL, "DMic"}, |
253 | }; | 257 | }; |
254 | 258 | ||
259 | static const struct snd_soc_dapm_route audio_mapb[] = { | ||
260 | {"b LINE2R", NULL, "MONO_LOUT"}, | ||
261 | {"Earphone", NULL, "b HPLOUT"}, | ||
262 | }; | ||
263 | |||
255 | static const char *spk_function[] = {"Off", "On"}; | 264 | static const char *spk_function[] = {"Off", "On"}; |
256 | static const char *input_function[] = {"ADC", "Digital Mic"}; | 265 | static const char *input_function[] = {"ADC", "Digital Mic"}; |
257 | static const char *jack_function[] = {"Off", "TV-OUT", "Headphone"}; | 266 | static const char *jack_function[] = {"Off", "TV-OUT", "Headphone"}; |
@@ -271,6 +280,10 @@ static const struct snd_kcontrol_new aic34_rx51_controls[] = { | |||
271 | rx51_get_jack, rx51_set_jack), | 280 | rx51_get_jack, rx51_set_jack), |
272 | }; | 281 | }; |
273 | 282 | ||
283 | static const struct snd_kcontrol_new aic34_rx51_controlsb[] = { | ||
284 | SOC_DAPM_PIN_SWITCH("Earphone"), | ||
285 | }; | ||
286 | |||
274 | static int rx51_aic34_init(struct snd_soc_pcm_runtime *rtd) | 287 | static int rx51_aic34_init(struct snd_soc_pcm_runtime *rtd) |
275 | { | 288 | { |
276 | struct snd_soc_codec *codec = rtd->codec; | 289 | struct snd_soc_codec *codec = rtd->codec; |
@@ -314,6 +327,24 @@ static int rx51_aic34_init(struct snd_soc_pcm_runtime *rtd) | |||
314 | return err; | 327 | return err; |
315 | } | 328 | } |
316 | 329 | ||
330 | static int rx51_aic34b_init(struct snd_soc_dapm_context *dapm) | ||
331 | { | ||
332 | int err; | ||
333 | |||
334 | err = snd_soc_add_controls(dapm->codec, aic34_rx51_controlsb, | ||
335 | ARRAY_SIZE(aic34_rx51_controlsb)); | ||
336 | if (err < 0) | ||
337 | return err; | ||
338 | |||
339 | err = snd_soc_dapm_new_controls(dapm, aic34_dapm_widgetsb, | ||
340 | ARRAY_SIZE(aic34_dapm_widgetsb)); | ||
341 | if (err < 0) | ||
342 | return 0; | ||
343 | |||
344 | return snd_soc_dapm_add_routes(dapm, audio_mapb, | ||
345 | ARRAY_SIZE(audio_mapb)); | ||
346 | } | ||
347 | |||
317 | /* Digital audio interface glue - connects codec <--> CPU */ | 348 | /* Digital audio interface glue - connects codec <--> CPU */ |
318 | static struct snd_soc_dai_link rx51_dai[] = { | 349 | static struct snd_soc_dai_link rx51_dai[] = { |
319 | { | 350 | { |
@@ -328,11 +359,30 @@ static struct snd_soc_dai_link rx51_dai[] = { | |||
328 | }, | 359 | }, |
329 | }; | 360 | }; |
330 | 361 | ||
362 | struct snd_soc_aux_dev rx51_aux_dev[] = { | ||
363 | { | ||
364 | .name = "TLV320AIC34b", | ||
365 | .codec_name = "tlv320aic3x-codec.2-0019", | ||
366 | .init = rx51_aic34b_init, | ||
367 | }, | ||
368 | }; | ||
369 | |||
370 | static struct snd_soc_codec_conf rx51_codec_conf[] = { | ||
371 | { | ||
372 | .dev_name = "tlv320aic3x-codec.2-0019", | ||
373 | .name_prefix = "b", | ||
374 | }, | ||
375 | }; | ||
376 | |||
331 | /* Audio card */ | 377 | /* Audio card */ |
332 | static struct snd_soc_card rx51_sound_card = { | 378 | static struct snd_soc_card rx51_sound_card = { |
333 | .name = "RX-51", | 379 | .name = "RX-51", |
334 | .dai_link = rx51_dai, | 380 | .dai_link = rx51_dai, |
335 | .num_links = ARRAY_SIZE(rx51_dai), | 381 | .num_links = ARRAY_SIZE(rx51_dai), |
382 | .aux_dev = rx51_aux_dev, | ||
383 | .num_aux_devs = ARRAY_SIZE(rx51_aux_dev), | ||
384 | .codec_conf = rx51_codec_conf, | ||
385 | .num_configs = ARRAY_SIZE(rx51_codec_conf), | ||
336 | }; | 386 | }; |
337 | 387 | ||
338 | static struct platform_device *rx51_snd_device; | 388 | static struct platform_device *rx51_snd_device; |