ASoC: tas5086: add support for pwm start mode config
authorDaniel Mack <zonque@gmail.com>
Mon, 24 Jun 2013 14:25:32 +0000 (16:25 +0200)
committerMark Brown <broonie@linaro.org>
Tue, 25 Jun 2013 09:26:49 +0000 (10:26 +0100)
The TAS5086 has two alternative modes to start its PWM channels, Mid-Z
and Low-Z. Which one to use depends on how the PWM power stages are
connected to the TAS5086.

This patch adds 6 optional boolean properties to the DT bindings of the
driver which allow the user to configure each individual channel to the
Mid-Z scheme, and leaves all the others to the default (Low-Z).

Signed-off-by: Daniel Mack <zonque@gmail.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
Documentation/devicetree/bindings/sound/ti,tas5086.txt
sound/soc/codecs/tas5086.c

index 8ea4f5b..d2866a0 100644 (file)
@@ -20,6 +20,17 @@ Optional properties:
                        When not specified, the hardware default of 1300ms
                        is retained.
 
+ - ti,mid-z-channel-X: Boolean properties, X being a number from 1 to 6.
+                       If given, channel X will start with the Mid-Z start
+                       sequence, otherwise the default Low-Z scheme is used.
+
+                       The correct configuration depends on how the power
+                       stages connected to the PWM output pins work. Not all
+                       power stages are compatible to Mid-Z - please refer
+                       to the datasheets for more details.
+
+                       Most systems should not set any of these properties.
+
 Examples:
 
        i2c_bus {
index bcbbec1..72067f7 100644 (file)
 
 #define TAS5086_MAX_REGISTER           TAS5086_PWM_OUTPUT_MUX
 
+#define TAS5086_PWM_START_MIDZ_FOR_START_1     (1 << 7)
+#define TAS5086_PWM_START_MIDZ_FOR_START_2     (1 << 6)
+#define TAS5086_PWM_START_CHANNEL_MASK         (0x3f)
+
 /*
  * Default TAS5086 power-up configuration
  */
@@ -717,13 +721,31 @@ static int tas5086_probe(struct snd_soc_codec *codec)
 {
        struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
        int charge_period = 1300000; /* hardware default is 1300 ms */
+       u8 pwm_start = TAS5086_PWM_START_CHANNEL_MASK;
        int i, ret;
 
        if (of_match_device(of_match_ptr(tas5086_dt_ids), codec->dev)) {
                struct device_node *of_node = codec->dev->of_node;
                of_property_read_u32(of_node, "ti,charge-period", &charge_period);
+
+               for (i = 0; i < 6; i++) {
+                       char name[25];
+
+                       snprintf(name, sizeof(name),
+                                "ti,mid-z-channel-%d", i + 1);
+
+                       if (of_get_property(of_node, name, NULL) != NULL)
+                               pwm_start &= ~(1 << i);
+               }
        }
 
+       /*
+        * Configure 'part 2' of the PWM starts to always use MID-Z, and tell
+        * all configured mid-z channels to start start under 'part 2'.
+        */
+       regmap_write(priv->regmap, TAS5086_PWM_START,
+                    TAS5086_PWM_START_MIDZ_FOR_START_2 | pwm_start);
+
        /* lookup and set split-capacitor charge period */
        if (charge_period == 0) {
                regmap_write(priv->regmap, TAS5086_SPLIT_CAP_CHARGE, 0);