Loading Documentation/devicetree/bindings/sound/st,sta350.txt +23 −1 Original line number Diff line number Diff line Loading @@ -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: Loading include/sound/sta350.h +5 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 */ sound/soc/codecs/sta350.c +45 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) Loading Loading @@ -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; Loading sound/soc/codecs/sta350.h +10 −0 Original line number Diff line number Diff line Loading @@ -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
Documentation/devicetree/bindings/sound/st,sta350.txt +23 −1 Original line number Diff line number Diff line Loading @@ -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: Loading
include/sound/sta350.h +5 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 */
sound/soc/codecs/sta350.c +45 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) Loading Loading @@ -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; Loading
sound/soc/codecs/sta350.h +10 −0 Original line number Diff line number Diff line Loading @@ -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 */