diff options
author | UK KIM <w0806.kim@samsung.com> | 2011-06-28 04:08:15 -0700 |
---|---|---|
committer | Simon Wilson <simonwilson@google.com> | 2011-08-04 12:35:46 -0700 |
commit | 0067189d252de2294f500178b83ecb1380a4bd4a (patch) | |
tree | 9af1062ebc3b8d27f96075362e29476c5a77893c /sound | |
parent | d9ff7f86544c3357ad4c6cbaedcfec9111e1b0c9 (diff) | |
download | kernel_samsung_tuna-0067189d252de2294f500178b83ecb1380a4bd4a.zip kernel_samsung_tuna-0067189d252de2294f500178b83ecb1380a4bd4a.tar.gz kernel_samsung_tuna-0067189d252de2294f500178b83ecb1380a4bd4a.tar.bz2 |
HACK: ASoC: sdp4430: add widget for main and sub mic
Control mics bias according to dapm widget event
Change-Id: I5c9d2c7fa16eb6426b5e381d43ab89de3df79bd7
Signed-off-by: UK KIM <w0806.kim@samsung.com>
Signed-off-by: Pankaj Jindal <pankajjindal@ti.com>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/omap/sdp4430.c | 73 |
1 files changed, 66 insertions, 7 deletions
diff --git a/sound/soc/omap/sdp4430.c b/sound/soc/omap/sdp4430.c index c889042..d1aed30 100644 --- a/sound/soc/omap/sdp4430.c +++ b/sound/soc/omap/sdp4430.c @@ -35,6 +35,7 @@ #include <plat/mux.h> #include <plat/mcbsp.h> +#include <linux/gpio.h> #include "omap-mcpdm.h" #include "omap-abe.h" #include "omap-pcm.h" @@ -43,11 +44,28 @@ #include "../../../arch/arm/mach-omap2/board-tuna.h" +#define TUNA_MAIN_MIC_GPIO 48 +#define TUNA_SUB_MIC_GPIO 171 + static int twl6040_power_mode; static int mcbsp_cfg; int omap4_tuna_get_type(void); +static int main_mic_bias_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + gpio_set_value(TUNA_MAIN_MIC_GPIO, SND_SOC_DAPM_EVENT_ON(event)); + return 0; +} + +static int sub_mic_bias_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + gpio_set_value(TUNA_SUB_MIC_GPIO, SND_SOC_DAPM_EVENT_ON(event)); + return 0; +} + static int sdp4430_modem_mcbsp_configure(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, int flag) { @@ -323,7 +341,15 @@ static const struct snd_kcontrol_new sdp4430_controls[] = { /* SDP4430 machine DAPM */ static const struct snd_soc_dapm_widget sdp4430_twl6040_dapm_widgets[] = { - SND_SOC_DAPM_MIC("Ext Mic", NULL), + + SND_SOC_DAPM_MIC("Ext Main Mic", NULL), + SND_SOC_DAPM_MIC("Ext Sub Mic", NULL), + SND_SOC_DAPM_MICBIAS_E("Ext Main Mic Bias", SND_SOC_NOPM, 0, 0, + main_mic_bias_event, + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), + SND_SOC_DAPM_MICBIAS_E("Ext Sub Mic Bias", SND_SOC_NOPM, 0, 0, + sub_mic_bias_event, + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_SPK("Ext Spk", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_HP("Headset Stereophone", NULL), @@ -333,9 +359,10 @@ static const struct snd_soc_dapm_widget sdp4430_twl6040_dapm_widgets[] = { static const struct snd_soc_dapm_route audio_map[] = { /* External Mics: MAINMIC, SUBMIC with bias*/ - {"MAINMIC", NULL, "Main Mic Bias"}, - {"SUBMIC", NULL, "Main Mic Bias"}, - {"Main Mic Bias", NULL, "Ext Mic"}, + {"MAINMIC", NULL, "Ext Main Mic Bias"}, + {"SUBMIC", NULL, "Ext Sub Mic Bias"}, + {"Ext Main Mic Bias" , NULL, "Ext Main Mic"}, + {"Ext Sub Mic Bias" , NULL, "Ext Sub Mic"}, /* External Speakers: HFL, HFR */ {"Ext Spk", NULL, "HFL"}, @@ -379,7 +406,10 @@ static int sdp4430_twl6040_init(struct snd_soc_pcm_runtime *rtd) snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map)); /* SDP4430 connected pins */ - snd_soc_dapm_enable_pin(dapm, "Ext Mic"); + if (machine_is_tuna()) { + snd_soc_dapm_enable_pin(dapm, "Ext Main Mic"); + snd_soc_dapm_enable_pin(dapm, "Ext Sub Mic"); + } snd_soc_dapm_enable_pin(dapm, "Ext Spk"); snd_soc_dapm_enable_pin(dapm, "AFML"); snd_soc_dapm_enable_pin(dapm, "AFMR"); @@ -387,7 +417,10 @@ static int sdp4430_twl6040_init(struct snd_soc_pcm_runtime *rtd) snd_soc_dapm_enable_pin(dapm, "Headset Stereophone"); /* allow audio paths from the audio modem to run during suspend */ - snd_soc_dapm_ignore_suspend(dapm, "Ext Mic"); + if (machine_is_tuna()) { + snd_soc_dapm_ignore_suspend(dapm, "Ext Main Mic"); + snd_soc_dapm_ignore_suspend(dapm, "Ext Sub Mic"); + } snd_soc_dapm_ignore_suspend(dapm, "Ext Spk"); snd_soc_dapm_ignore_suspend(dapm, "AFML"); snd_soc_dapm_ignore_suspend(dapm, "AFMR"); @@ -796,6 +829,20 @@ static int __init sdp4430_soc_init(void) return -ENODEV; } printk(KERN_INFO "SDP4430 SoC init\n"); + + if (machine_is_tuna()) { + ret = gpio_request(TUNA_MAIN_MIC_GPIO, "MAIN_MICBIAS_EN"); + if (ret) + goto mainmic_gpio_err; + + gpio_direction_output(TUNA_MAIN_MIC_GPIO, 0); + + ret = gpio_request(TUNA_SUB_MIC_GPIO, "SUB_MICBIAS_EN"); + if (ret) + goto submic_gpio_err; + gpio_direction_output(TUNA_SUB_MIC_GPIO, 0); + } + if (machine_is_omap_4430sdp()) snd_soc_sdp4430.name = "SDP4430"; else if (machine_is_omap4_panda()) @@ -806,7 +853,8 @@ static int __init sdp4430_soc_init(void) sdp4430_snd_device = platform_device_alloc("soc-audio", -1); if (!sdp4430_snd_device) { printk(KERN_ERR "Platform device allocation failed\n"); - return -ENOMEM; + ret = -ENOMEM; + goto device_err; } ret = snd_soc_register_dais(&sdp4430_snd_device->dev, dai, ARRAY_SIZE(dai)); @@ -823,12 +871,23 @@ static int __init sdp4430_soc_init(void) err: printk(KERN_ERR "Unable to add platform device\n"); platform_device_put(sdp4430_snd_device); +device_err: + if (machine_is_tuna()) + gpio_free(TUNA_SUB_MIC_GPIO); +submic_gpio_err: + if (machine_is_tuna()) + gpio_free(TUNA_MAIN_MIC_GPIO); +mainmic_gpio_err: return ret; } module_init(sdp4430_soc_init); static void __exit sdp4430_soc_exit(void) { + if (machine_is_tuna()) { + gpio_free(TUNA_SUB_MIC_GPIO); + gpio_free(TUNA_MAIN_MIC_GPIO); + } platform_device_unregister(sdp4430_snd_device); } module_exit(sdp4430_soc_exit); |