ASoC: sta350: add support for bits in miscellaneous registers
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>
This commit is contained in:
parent
09af62ff18
commit
7c2fcccc32
|
@ -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:
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -225,4 +225,14 @@
|
|||
#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 */
|
||||
|
|
Loading…
Reference in New Issue