From d8ec598e5d0d66e68184664073e06b432e3dd140 Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Mon, 14 Feb 2011 17:20:20 +0200 Subject: [PATCH 1/5] ASoC: omap: rx51: Use gpio_request_one to configure tvout_sel gpio Just slight cleanup to be sync with upcoming change. Signed-off-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/omap/rx51.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c index 2d7d4115cb71..9411969d6f79 100644 --- a/sound/soc/omap/rx51.c +++ b/sound/soc/omap/rx51.c @@ -394,10 +394,10 @@ static int __init rx51_soc_init(void) if (!machine_is_nokia_rx51()) return -ENODEV; - err = gpio_request(RX51_TVOUT_SEL_GPIO, "tvout_sel"); + err = gpio_request_one(RX51_TVOUT_SEL_GPIO, + GPIOF_DIR_OUT | GPIOF_INIT_LOW, "tvout_sel"); if (err) goto err_gpio_tvout_sel; - gpio_direction_output(RX51_TVOUT_SEL_GPIO, 0); rx51_snd_device = platform_device_alloc("soc-audio", -1); if (!rx51_snd_device) { From 31164c7cf1190729292126b2d6d27d792adfcec5 Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Mon, 14 Feb 2011 17:20:21 +0200 Subject: [PATCH 2/5] ASoC: omap: rx51: Add headset support This patch adds support for headset microphone in Nokia RX-51/N900. The mic signal from audio jack is routed to codec A LINE1L via two switches and the mic bias is coming from codec B part. First switch is the tv-out switch that is already supported and the second switch selects between voltage detection circuit and codecs. As there is no use for voltage detection at the moment the second switch is connected statically to codecs in rx51_soc_init. Headset can be active when control "Jack Function" is set to "Headset". Signed-off-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/omap/rx51.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c index 9411969d6f79..9860018cc2e5 100644 --- a/sound/soc/omap/rx51.c +++ b/sound/soc/omap/rx51.c @@ -40,6 +40,7 @@ #define RX51_TVOUT_SEL_GPIO 40 #define RX51_JACK_DETECT_GPIO 177 +#define RX51_ECI_SW_GPIO 182 /* * REVISIT: TWL4030 GPIO base in RX-51. Now statically defined to 192. This * gpio is reserved in arch/arm/mach-omap2/board-rx51-peripherals.c @@ -50,6 +51,7 @@ enum { RX51_JACK_DISABLED, RX51_JACK_TVOUT, /* tv-out with stereo output */ RX51_JACK_HP, /* headphone: stereo output, no mic */ + RX51_JACK_HS, /* headset: stereo output with mic */ }; static int rx51_spk_func; @@ -59,11 +61,15 @@ static int rx51_jack_func; static void rx51_ext_control(struct snd_soc_codec *codec) { struct snd_soc_dapm_context *dapm = &codec->dapm; - int hp = 0, tvout = 0; + int hp = 0, hs = 0, tvout = 0; switch (rx51_jack_func) { case RX51_JACK_TVOUT: tvout = 1; + hp = 1; + break; + case RX51_JACK_HS: + hs = 1; case RX51_JACK_HP: hp = 1; break; @@ -81,6 +87,10 @@ static void rx51_ext_control(struct snd_soc_codec *codec) snd_soc_dapm_enable_pin(dapm, "Headphone Jack"); else snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); + if (hs) + snd_soc_dapm_enable_pin(dapm, "HS Mic"); + else + snd_soc_dapm_disable_pin(dapm, "HS Mic"); gpio_set_value(RX51_TVOUT_SEL_GPIO, tvout); @@ -240,6 +250,7 @@ static const struct snd_soc_dapm_widget aic34_dapm_widgets[] = { SND_SOC_DAPM_SPK("Ext Spk", rx51_spk_event), SND_SOC_DAPM_MIC("DMic", NULL), SND_SOC_DAPM_HP("Headphone Jack", rx51_hp_event), + SND_SOC_DAPM_MIC("HS Mic", NULL), }; static const struct snd_soc_dapm_widget aic34_dapm_widgetsb[] = { @@ -259,11 +270,14 @@ static const struct snd_soc_dapm_route audio_map[] = { static const struct snd_soc_dapm_route audio_mapb[] = { {"b LINE2R", NULL, "MONO_LOUT"}, {"Earphone", NULL, "b HPLOUT"}, + + {"LINE1L", NULL, "b Mic Bias 2.5V"}, + {"b Mic Bias 2.5V", NULL, "HS Mic"} }; static const char *spk_function[] = {"Off", "On"}; static const char *input_function[] = {"ADC", "Digital Mic"}; -static const char *jack_function[] = {"Off", "TV-OUT", "Headphone"}; +static const char *jack_function[] = {"Off", "TV-OUT", "Headphone", "Headset"}; static const struct soc_enum rx51_enum[] = { SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spk_function), spk_function), @@ -398,6 +412,10 @@ static int __init rx51_soc_init(void) GPIOF_DIR_OUT | GPIOF_INIT_LOW, "tvout_sel"); if (err) goto err_gpio_tvout_sel; + err = gpio_request_one(RX51_ECI_SW_GPIO, + GPIOF_DIR_OUT | GPIOF_INIT_HIGH, "eci_sw"); + if (err) + goto err_gpio_eci_sw; rx51_snd_device = platform_device_alloc("soc-audio", -1); if (!rx51_snd_device) { @@ -415,6 +433,8 @@ static int __init rx51_soc_init(void) err2: platform_device_put(rx51_snd_device); err1: + gpio_free(RX51_ECI_SW_GPIO); +err_gpio_eci_sw: gpio_free(RX51_TVOUT_SEL_GPIO); err_gpio_tvout_sel: @@ -427,6 +447,7 @@ static void __exit rx51_soc_exit(void) rx51_av_jack_gpios); platform_device_unregister(rx51_snd_device); + gpio_free(RX51_ECI_SW_GPIO); gpio_free(RX51_TVOUT_SEL_GPIO); } From 178406195755293bf63799ae41ed0c92968ded8c Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Mon, 14 Feb 2011 17:20:22 +0200 Subject: [PATCH 3/5] ASoC: omap: rx51: Report headset insertion instead of video out cable It is more usefull to report headset instead of video out cable in response to jack insertion as this is more usual use-case and because now the headset feature is supported. Automatic accessory detection is not possible at the moment so most sensible static accessory type have to be used. Signed-off-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/omap/rx51.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c index 9860018cc2e5..e28f089b38d6 100644 --- a/sound/soc/omap/rx51.c +++ b/sound/soc/omap/rx51.c @@ -240,7 +240,7 @@ static struct snd_soc_jack_gpio rx51_av_jack_gpios[] = { { .gpio = RX51_JACK_DETECT_GPIO, .name = "avdet-gpio", - .report = SND_JACK_VIDEOOUT, + .report = SND_JACK_HEADSET, .invert = 1, .debounce_time = 200, }, @@ -331,7 +331,8 @@ static int rx51_aic34_init(struct snd_soc_pcm_runtime *rtd) /* AV jack detection */ err = snd_soc_jack_new(codec, "AV Jack", - SND_JACK_VIDEOOUT, &rx51_av_jack); + SND_JACK_HEADSET | SND_JACK_VIDEOOUT, + &rx51_av_jack); if (err) return err; err = snd_soc_jack_add_gpios(&rx51_av_jack, From 9d7e584b3fb4d9f581b83c0916e10b91de78e663 Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Mon, 21 Feb 2011 14:57:22 +0200 Subject: [PATCH 4/5] ASoC: omap: rx51: Add FM transmitter support Si4713 FM transmitter on Nokia RX-51/N900 is connected to same Line out signals of TLV320AIC34 than TPA6130 headphone amplifier. This patch adds route to transmitter and "FM Transmitter" control to keep route active when needed. Signed-off-by: Jarkko Nikula Acked-by: Mark Brown Acked-by: Peter Ujfalusi Signed-off-by: Liam Girdwood --- sound/soc/omap/rx51.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c index e28f089b38d6..055e447b2ed6 100644 --- a/sound/soc/omap/rx51.c +++ b/sound/soc/omap/rx51.c @@ -251,6 +251,7 @@ static const struct snd_soc_dapm_widget aic34_dapm_widgets[] = { SND_SOC_DAPM_MIC("DMic", NULL), SND_SOC_DAPM_HP("Headphone Jack", rx51_hp_event), SND_SOC_DAPM_MIC("HS Mic", NULL), + SND_SOC_DAPM_LINE("FM Transmitter", NULL), }; static const struct snd_soc_dapm_widget aic34_dapm_widgetsb[] = { @@ -262,6 +263,8 @@ static const struct snd_soc_dapm_route audio_map[] = { {"Ext Spk", NULL, "HPROUT"}, {"Headphone Jack", NULL, "LLOUT"}, {"Headphone Jack", NULL, "RLOUT"}, + {"FM Transmitter", NULL, "LLOUT"}, + {"FM Transmitter", NULL, "RLOUT"}, {"DMic Rate 64", NULL, "Mic Bias 2V"}, {"Mic Bias 2V", NULL, "DMic"}, @@ -292,6 +295,7 @@ static const struct snd_kcontrol_new aic34_rx51_controls[] = { rx51_get_input, rx51_set_input), SOC_ENUM_EXT("Jack Function", rx51_enum[2], rx51_get_jack, rx51_set_jack), + SOC_DAPM_PIN_SWITCH("FM Transmitter"), }; static const struct snd_kcontrol_new aic34_rx51_controlsb[] = { From fa4d1f595a89234647b34a7f507436be873091bc Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Wed, 9 Mar 2011 11:25:00 +0200 Subject: [PATCH 5/5] ASoC: omap: rx51: Enable McBSP2 sidetone McBSP sidetone is needed in telephony applications. McBSP sidetone is a configurable FIR filter that forms a loopback from McBSP input to output. This patch enables the McBSP2 sidetone ALSA controls so that it can be used on Nokia RX-51/N900. Sidetone feature can be tested with following commands: (set up codec input and output paths) # Enable and configure sidetone amixer -D hw:0 set 'McBSP2 Sidetone' on amixer set -D hw:0 'McBSP2 Sidetone Channel 0' 32767 echo 32767 >/sys/devices/platform/omap-mcbsp.2/st_taps # Do not loop audio via CPU arecord -f dat >/dev/null |aplay /dev/zero Signed-off-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/omap/rx51.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c index 055e447b2ed6..d0986220eff9 100644 --- a/sound/soc/omap/rx51.c +++ b/sound/soc/omap/rx51.c @@ -331,6 +331,10 @@ static int rx51_aic34_init(struct snd_soc_pcm_runtime *rtd) return err; snd_soc_limit_volume(codec, "TPA6130A2 Headphone Playback Volume", 42); + err = omap_mcbsp_st_add_controls(codec, 1); + if (err < 0) + return err; + snd_soc_dapm_sync(dapm); /* AV jack detection */