ASoC: sta350: add support for bits in miscellaneous registers
authorDaniel Mack <zonque@gmail.com>
Mon, 5 May 2014 09:49:23 +0000 (11:49 +0200)
committerMark Brown <broonie@linaro.org>
Mon, 5 May 2014 19:52:59 +0000 (12:52 -0700)
Add support for RPDNEN, NSHHPEN, BRIDGOFF, CPWMEN and PNDLSL, and add DT
bindings to access them.

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

index ecd7a623c8bd3de1a89a0f19e382d8e3aeb56b70..b7e71bf5caf4f3e32a359bea9b6a5997847e1552 100644 (file)
@@ -86,7 +86,29 @@ Optional properties:
   -  st,invalid-input-detect-mute:
        If present, automatic invalid input detect mute is enabled.
 
-
+  -  st,activate-mute-output:
+       If present, a mute output will be activated in ase the volume will
+       reach a value lower than -76 dBFS.
+
+  -  st,bridge-immediate-off:
+       If present, the bridge will be switched off immediately after the
+       power-down-gpio goes low. Otherwise, the bridge will wait for 13
+       million clock cycles to pass before shutting down.
+
+  -  st,noise-shape-dc-cut:
+       If present, the noise-shaping technique on the DC cutoff filter are
+       enabled.
+
+  -  st,powerdown-master-volume:
+       If present, the power-down pin and I2C power-down functions will
+       act on the master volume. Otherwise, the functions will act on the
+       mute commands.
+
+  -  st,powerdown-delay-divider:
+       If present, the bridge power-down time will be divided by the provided
+       value. If not specified, a divider of 1 will be used. Allowed values
+       are 1, 2, 4, 8, 16, 32, 64 and 128.
+       This property has to be specified as '/bits/ 8' value.
 
 Example:
 
index 3a3298106b222dd46924a6362f936a01150992ea..42edceb096a0075f5b4fcb19e360f3ea1934b8ae 100644 (file)
@@ -37,6 +37,7 @@ struct sta350_platform_data {
        u8 ch3_output_mapping;
        u8 ffx_power_output_mode;
        u8 drop_compensation_ns;
+       u8 powerdown_delay_divider;
        unsigned int thermal_warning_recovery:1;
        unsigned int thermal_warning_adjustment:1;
        unsigned int fault_detect_recovery:1;
@@ -47,6 +48,10 @@ struct sta350_platform_data {
        unsigned int odd_pwm_speed_mode:1;
        unsigned int distortion_compensation:1;
        unsigned int invalid_input_detect_mute:1;
+       unsigned int activate_mute_output:1;
+       unsigned int bridge_immediate_off:1;
+       unsigned int noise_shape_dc_cut:1;
+       unsigned int powerdown_master_vol:1;
 };
 
 #endif /* __LINUX_SND__STA350_H */
index 12ebbaf5d95f72416f62cb5f3058ab25dd5c0461..cc97dd52aa9c51138cd32cdfbf1f18c975183744 100644 (file)
@@ -1020,6 +1020,29 @@ static int sta350_probe(struct snd_soc_codec *codec)
                           pdata->ch3_output_mapping
                                << STA350_CxCFG_OM_SHIFT);
 
+       /* miscellaneous registers */
+       regmap_update_bits(sta350->regmap, STA350_MISC1,
+                          STA350_MISC1_CPWMEN,
+                          pdata->activate_mute_output ?
+                               STA350_MISC1_CPWMEN : 0);
+       regmap_update_bits(sta350->regmap, STA350_MISC1,
+                          STA350_MISC1_BRIDGOFF,
+                          pdata->bridge_immediate_off ?
+                               STA350_MISC1_BRIDGOFF : 0);
+       regmap_update_bits(sta350->regmap, STA350_MISC1,
+                          STA350_MISC1_NSHHPEN,
+                          pdata->noise_shape_dc_cut ?
+                               STA350_MISC1_NSHHPEN : 0);
+       regmap_update_bits(sta350->regmap, STA350_MISC1,
+                          STA350_MISC1_RPDNEN,
+                          pdata->powerdown_master_vol ?
+                               STA350_MISC1_RPDNEN: 0);
+
+       regmap_update_bits(sta350->regmap, STA350_MISC2,
+                          STA350_MISC2_PNDLSL_MASK,
+                          pdata->powerdown_delay_divider
+                               << STA350_MISC2_PNDLSL_SHIFT);
+
        /* initialize coefficient shadow RAM with reset values */
        for (i = 4; i <= 49; i += 5)
                sta350->coef_shadow[i] = 0x400000;
@@ -1094,6 +1117,7 @@ static int sta350_probe_dt(struct device *dev, struct sta350_priv *sta350)
        struct sta350_platform_data *pdata;
        const char *ffx_power_mode;
        u16 tmp;
+       u8 tmp8;
 
        pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
        if (!pdata)
@@ -1158,6 +1182,27 @@ static int sta350_probe_dt(struct device *dev, struct sta350_priv *sta350)
        if (of_get_property(np, "st,invalid-input-detect-mute", NULL))
                pdata->invalid_input_detect_mute = 1;
 
+       /* MISC */
+       if (of_get_property(np, "st,activate-mute-output", NULL))
+               pdata->activate_mute_output = 1;
+
+       if (of_get_property(np, "st,bridge-immediate-off", NULL))
+               pdata->bridge_immediate_off = 1;
+
+       if (of_get_property(np, "st,noise-shape-dc-cut", NULL))
+               pdata->noise_shape_dc_cut = 1;
+
+       if (of_get_property(np, "st,powerdown-master-volume", NULL))
+               pdata->powerdown_master_vol = 1;
+
+       if (!of_property_read_u8(np, "st,powerdown-delay-divider", &tmp8)) {
+               if (is_power_of_2(tmp8) && tmp8 >= 1 && tmp8 <= 128)
+                       pdata->powerdown_delay_divider = ilog2(tmp8);
+               else
+                       dev_warn(dev, "Unsupported powerdown delay divider %d\n",
+                                tmp8);
+       }
+
        sta350->pdata = pdata;
 
        return 0;
index c3248f0fad2c7e4bb59ed364f35e79850ce4daf9..fb728529077946478e9ca5f0fc7b2c3f559d6c36 100644 (file)
 #define STA350_C3_MIX1         60
 #define STA350_C3_MIX2         61
 
+/* miscellaneous register 1 */
+#define STA350_MISC1_CPWMEN    BIT(2)
+#define STA350_MISC1_BRIDGOFF  BIT(5)
+#define STA350_MISC1_NSHHPEN   BIT(6)
+#define STA350_MISC1_RPDNEN    BIT(7)
+
+/* miscellaneous register 2 */
+#define STA350_MISC2_PNDLSL_MASK       0x1c
+#define STA350_MISC2_PNDLSL_SHIFT      2
+
 #endif /* _ASOC_STA_350_H */