[alsa-devel] [PATCH 04/19] ASoC: mrst_machine: add speaker widget to moorestown machine driver
Lu Guanqun
guanqun.lu at intel.com
Wed May 4 15:45:14 CEST 2011
This internal speaker needs an extra GPIO to control its power.
Signed-off-by: Lu Guanqun <guanqun.lu at intel.com>
---
sound/soc/mid-x86/mrst_machine.c | 31 +++++++++++++++++++++++++++++++
1 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/sound/soc/mid-x86/mrst_machine.c b/sound/soc/mid-x86/mrst_machine.c
index 11163e7..0bce388 100644
--- a/sound/soc/mid-x86/mrst_machine.c
+++ b/sound/soc/mid-x86/mrst_machine.c
@@ -36,8 +36,24 @@
#include <sound/pcm_params.h>
#include <sound/soc.h>
+/*
+ * GPIO pin to power on/off Internal Speaker
+ */
+static int mrst_gpio_amp;
+
+static int mrst_speaker_event(struct snd_soc_dapm_widget *widget,
+ struct snd_kcontrol *control, int event)
+{
+ if (mrst_gpio_amp)
+ gpio_set_value_cansleep(mrst_gpio_amp,
+ SND_SOC_DAPM_EVENT_ON(event));
+
+ return 0;
+}
+
static const struct snd_soc_dapm_widget mrst_audio_widgets[] = {
SND_SOC_DAPM_HP("Headphone", NULL),
+ SND_SOC_DAPM_SPK("Speaker", mrst_speaker_event),
};
static const struct snd_soc_dapm_route mrst_audio_map[] = {
@@ -46,6 +62,9 @@ static const struct snd_soc_dapm_route mrst_audio_map[] = {
{"Headphone", NULL, "HPOUTL"},
{"Headphone", NULL, "HPOUTR"},
+
+ {"Speaker", NULL, "PREOUTL"},
+ {"Speaker", NULL, "PREOUTR"},
};
static int mrst_audio_init(struct snd_soc_pcm_runtime *runtime)
@@ -72,6 +91,7 @@ static int mrst_audio_init(struct snd_soc_pcm_runtime *runtime)
snd_soc_dapm_nc_pin(dapm, "LINEOUTR");
snd_soc_dapm_enable_pin(dapm, "Headphone");
+ snd_soc_dapm_disable_pin(dapm, "Speaker");
snd_soc_dapm_sync(dapm);
@@ -118,6 +138,13 @@ static int __devinit snd_mrst_audio_probe(struct platform_device *pdev)
{
int ret;
+ if (pdev->dev.platform_data) {
+ mrst_gpio_amp = *(int *)pdev->dev.platform_data;
+ if (gpio_request_one(mrst_gpio_amp,
+ GPIOF_OUT_INIT_LOW, "amp power"))
+ mrst_gpio_amp = 0;
+ }
+
snd_soc_card_mrst.dev = &pdev->dev;
ret = snd_soc_register_card(&snd_soc_card_mrst);
if (ret)
@@ -126,11 +153,15 @@ static int __devinit snd_mrst_audio_probe(struct platform_device *pdev)
return 0;
fail_register_card:
+ if (mrst_gpio_amp)
+ gpio_free(mrst_gpio_amp);
return ret;
}
static int __devexit snd_mrst_audio_remove(struct platform_device *pdev)
{
+ if (mrst_gpio_amp)
+ gpio_free(mrst_gpio_amp);
snd_soc_unregister_card(&snd_soc_card_mrst);
return 0;
}
More information about the Alsa-devel
mailing list