aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/omap/rx51.c
diff options
context:
space:
mode:
authorJarkko Nikula <jhnikula@gmail.com>2011-01-31 07:43:48 -0500
committerLiam Girdwood <lrg@slimlogic.co.uk>2011-02-01 08:58:52 -0500
commit8cda975174945e3b7119d48341052d0dc0c87cf2 (patch)
treee600cea567b698928613703e883edc3963647b59 /sound/soc/omap/rx51.c
parent48529b3b7ca76e688146e13d1a1666fe69703f0c (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.c50
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
245static const struct snd_soc_dapm_widget aic34_dapm_widgetsb[] = {
246 SND_SOC_DAPM_SPK("Earphone", NULL),
247};
248
245static const struct snd_soc_dapm_route audio_map[] = { 249static 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
259static const struct snd_soc_dapm_route audio_mapb[] = {
260 {"b LINE2R", NULL, "MONO_LOUT"},
261 {"Earphone", NULL, "b HPLOUT"},
262};
263
255static const char *spk_function[] = {"Off", "On"}; 264static const char *spk_function[] = {"Off", "On"};
256static const char *input_function[] = {"ADC", "Digital Mic"}; 265static const char *input_function[] = {"ADC", "Digital Mic"};
257static const char *jack_function[] = {"Off", "TV-OUT", "Headphone"}; 266static 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
283static const struct snd_kcontrol_new aic34_rx51_controlsb[] = {
284 SOC_DAPM_PIN_SWITCH("Earphone"),
285};
286
274static int rx51_aic34_init(struct snd_soc_pcm_runtime *rtd) 287static 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
330static 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 */
318static struct snd_soc_dai_link rx51_dai[] = { 349static 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
362struct 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
370static 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 */
332static struct snd_soc_card rx51_sound_card = { 378static 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
338static struct platform_device *rx51_snd_device; 388static struct platform_device *rx51_snd_device;