]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ASoC: twl4030: Configure extmute pinmux when the dedicated pin is in use
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Mon, 31 Dec 2012 10:51:46 +0000 (11:51 +0100)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Wed, 2 Jan 2013 13:04:25 +0000 (13:04 +0000)
When HS extmute is enabled without custom GPIO we should configure the mux
to allow the pin to be used as extmute signal.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/codecs/twl4030.c

index 5dd7c81623a6c46cbee923b8d1c69f7f63c5dd8a..7bfabe5750e895ea83bfa1357b82b84298785413 100644 (file)
 /* Register descriptions are here */
 #include <linux/mfd/twl4030-audio.h>
 
+/* TWL4030 PMBR1 Register */
+#define TWL4030_PMBR1_REG              0x0D
+/* TWL4030 PMBR1 Register GPIO6 mux bits */
+#define TWL4030_GPIO6_PWM0_MUTE(value) ((value & 0x03) << 2)
+
 /* Shadow register used by the audio driver */
 #define TWL4030_REG_SW_SHADOW          0x4A
 #define TWL4030_CACHEREGNUM    (TWL4030_REG_SW_SHADOW + 1)
@@ -348,19 +353,32 @@ static void twl4030_init_chip(struct snd_soc_codec *codec)
 
        pdata = twl4030_get_pdata(codec);
 
-       if (pdata && pdata->hs_extmute &&
-           gpio_is_valid(pdata->hs_extmute_gpio)) {
-               int ret;
-
-               if (!pdata->hs_extmute_gpio)
-                       dev_warn(codec->dev,
-                                "Extmute GPIO is 0 is this correct?\n");
-
-               ret = gpio_request_one(pdata->hs_extmute_gpio,
-                                      GPIOF_OUT_INIT_LOW, "hs_extmute");
-               if (ret) {
-                       dev_err(codec->dev, "Failed to get hs_extmute GPIO\n");
-                       pdata->hs_extmute_gpio = -1;
+       if (pdata && pdata->hs_extmute) {
+               if (gpio_is_valid(pdata->hs_extmute_gpio)) {
+                       int ret;
+
+                       if (!pdata->hs_extmute_gpio)
+                               dev_warn(codec->dev,
+                                       "Extmute GPIO is 0 is this correct?\n");
+
+                       ret = gpio_request_one(pdata->hs_extmute_gpio,
+                                              GPIOF_OUT_INIT_LOW,
+                                              "hs_extmute");
+                       if (ret) {
+                               dev_err(codec->dev,
+                                       "Failed to get hs_extmute GPIO\n");
+                               pdata->hs_extmute_gpio = -1;
+                       }
+               } else {
+                       u8 pin_mux;
+
+                       /* Set TWL4030 GPIO6 as EXTMUTE signal */
+                       twl_i2c_read_u8(TWL4030_MODULE_INTBR, &pin_mux,
+                                       TWL4030_PMBR1_REG);
+                       pin_mux &= ~TWL4030_GPIO6_PWM0_MUTE(0x03);
+                       pin_mux |= TWL4030_GPIO6_PWM0_MUTE(0x02);
+                       twl_i2c_write_u8(TWL4030_MODULE_INTBR, pin_mux,
+                                        TWL4030_PMBR1_REG);
                }
        }