ASoC: tas6424: Add support for the standby pin
authorJean-Jacques Hiblot <jjhiblot@ti.com>
Fri, 27 Apr 2018 13:55:47 +0000 (15:55 +0200)
committerMark Brown <broonie@kernel.org>
Fri, 27 Apr 2018 18:24:00 +0000 (19:24 +0100)
The standby pin can be connected to a GPIO. In that case we have to drive
it to the correct values for the TAS6424 to operate properly.

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Documentation/devicetree/bindings/sound/ti,tas6424.txt
sound/soc/codecs/tas6424.c

index 1c4ada0eef4e1613d2a88f79e3d572c65e64b1e9..df71e414dc5be271e21480ed0280a7f004b6b3d5 100644 (file)
@@ -6,6 +6,7 @@ Required properties:
        - compatible: "ti,tas6424" - TAS6424
        - reg: I2C slave address
        - sound-dai-cells: must be equal to 0
+       - standby-gpios: GPIO used to shut the TAS6424 down.
 
 Example:
 
index 4f3a16c520a2c3158f0d5e77e60dca8098366559..5abb17f8d3dda2382e7c6843bf3b00197ab438cc 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/slab.h>
 #include <linux/regulator/consumer.h>
 #include <linux/delay.h>
+#include <linux/gpio/consumer.h>
 
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
@@ -43,6 +44,7 @@ struct tas6424_data {
        unsigned int last_fault1;
        unsigned int last_fault2;
        unsigned int last_warn;
+       struct gpio_desc *standby_gpio;
 };
 
 /*
@@ -627,6 +629,22 @@ static int tas6424_i2c_probe(struct i2c_client *client,
                return ret;
        }
 
+       /*
+        * Get control of the standby pin and set it LOW to take the codec
+        * out of the stand-by mode.
+        * Note: The actual pin polarity is taken care of in the GPIO lib
+        * according the polarity specified in the DTS.
+        */
+       tas6424->standby_gpio = devm_gpiod_get_optional(dev, "standby",
+                                                     GPIOD_OUT_LOW);
+       if (IS_ERR(tas6424->standby_gpio)) {
+               if (PTR_ERR(tas6424->standby_gpio) == -EPROBE_DEFER)
+                       return -EPROBE_DEFER;
+               dev_info(dev, "failed to get standby GPIO: %ld\n",
+                       PTR_ERR(tas6424->standby_gpio));
+               tas6424->standby_gpio = NULL;
+       }
+
        for (i = 0; i < ARRAY_SIZE(tas6424->supplies); i++)
                tas6424->supplies[i].supply = tas6424_supply_names[i];
        ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(tas6424->supplies),
@@ -671,6 +689,10 @@ static int tas6424_i2c_remove(struct i2c_client *client)
 
        cancel_delayed_work_sync(&tas6424->fault_check_work);
 
+       /* put the codec in stand-by */
+       if (tas6424->standby_gpio)
+               gpiod_set_value_cansleep(tas6424->standby_gpio, 1);
+
        ret = regulator_bulk_disable(ARRAY_SIZE(tas6424->supplies),
                                     tas6424->supplies);
        if (ret < 0) {