aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorUK KIM <w0806.kim@samsung.com>2011-06-28 04:08:15 -0700
committerSimon Wilson <simonwilson@google.com>2011-08-04 12:35:46 -0700
commit0067189d252de2294f500178b83ecb1380a4bd4a (patch)
tree9af1062ebc3b8d27f96075362e29476c5a77893c /sound
parentd9ff7f86544c3357ad4c6cbaedcfec9111e1b0c9 (diff)
downloadkernel_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.c73
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);