aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/intel_sst/intelmid_v2_control.c
diff options
context:
space:
mode:
authorLu Guanqun <guanqun.lu@intel.com>2011-05-03 17:43:40 +0100
committerGreg Kroah-Hartman <gregkh@suse.de>2011-05-10 13:00:49 -0700
commit2124f8dad0334270a26334c0c23b67abfeaef954 (patch)
treeff8f4b70ec2c5da3cb841e841f96ec54a3341612 /drivers/staging/intel_sst/intelmid_v2_control.c
parentb8df15b2a7479903eb7051ce96a5c8dac5e60a18 (diff)
downloadkernel_samsung_smdk4412-2124f8dad0334270a26334c0c23b67abfeaef954.zip
kernel_samsung_smdk4412-2124f8dad0334270a26334c0c23b67abfeaef954.tar.gz
kernel_samsung_smdk4412-2124f8dad0334270a26334c0c23b67abfeaef954.tar.bz2
intel_sst: internal speaker needs setting a GPIO line
On Moorestown platform, internal speaker's power line is connected to a GPIO line, so we need to enable or disable it properly. Reviewed-by: Wu Fengguang <fengguang.wu@intel.com> Signed-off-by: Jeff Cheng <jeff_cheng@wistron.com> Signed-off-by: Lu Guanqun <guanqun.lu@intel.com> Signed-off-by: Wang Xingchao <xingchao.wang@intel.com> Signed-off-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/intel_sst/intelmid_v2_control.c')
-rw-r--r--drivers/staging/intel_sst/intelmid_v2_control.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/drivers/staging/intel_sst/intelmid_v2_control.c b/drivers/staging/intel_sst/intelmid_v2_control.c
index 82191dc..5c5bd5e 100644
--- a/drivers/staging/intel_sst/intelmid_v2_control.c
+++ b/drivers/staging/intel_sst/intelmid_v2_control.c
@@ -28,6 +28,7 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+#include <linux/gpio.h>
#include <linux/pci.h>
#include <linux/file.h>
#include <sound/control.h>
@@ -86,6 +87,12 @@ enum reg_v3 {
AUXDBNC = 0x12f,
};
+static void nc_set_amp_power(int power)
+{
+ if (snd_pmic_ops_nc.gpio_amp)
+ gpio_set_value(snd_pmic_ops_nc.gpio_amp, power);
+}
+
/****
* nc_init_card - initialize the sound card
*
@@ -212,6 +219,16 @@ static int nc_power_up_pb(unsigned int port)
msleep(30);
+ /*
+ * There is a mismatch between Playback Sources and the enumerated
+ * values of output sources. This mismatch causes ALSA upper to send
+ * Item 1 for Internal Speaker, but the expected enumeration is 2! For
+ * now, treat MONO_EARPIECE and INTERNAL_SPKR identically and power up
+ * the needed resources
+ */
+ if (snd_pmic_ops_nc.output_dev_id == MONO_EARPIECE ||
+ snd_pmic_ops_nc.output_dev_id == INTERNAL_SPKR)
+ nc_set_amp_power(1);
return nc_enable_audiodac(UNMUTE);
}
@@ -273,7 +290,6 @@ static int nc_power_down(void)
int retval = 0;
struct sc_reg_access sc_access[5];
-
if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
retval = nc_init_card();
if (retval)
@@ -283,6 +299,10 @@ static int nc_power_down(void)
pr_debug("powering dn nc_power_down ....\n");
+ if (snd_pmic_ops_nc.output_dev_id == MONO_EARPIECE ||
+ snd_pmic_ops_nc.output_dev_id == INTERNAL_SPKR)
+ nc_set_amp_power(0);
+
msleep(30);
sc_access[0].reg_addr = DRVPOWERCTRL;
@@ -518,9 +538,12 @@ static int nc_set_selected_output_dev(u8 value)
switch (value) {
case STEREO_HEADPHONE:
retval = sst_sc_reg_access(sc_access_HP, PMIC_WRITE, 2);
+ nc_set_amp_power(0);
break;
+ case MONO_EARPIECE:
case INTERNAL_SPKR:
retval = sst_sc_reg_access(sc_access_IS, PMIC_WRITE, 2);
+ nc_set_amp_power(1);
break;
default:
pr_err("rcvd illegal request: %d\n", value);