diff --git a/drivers/video/backlight/qcom-spmi-wled.c b/drivers/video/backlight/qcom-spmi-wled.c index 231b69b39e9e..e3b4d7f29ba7 100644 --- a/drivers/video/backlight/qcom-spmi-wled.c +++ b/drivers/video/backlight/qcom-spmi-wled.c @@ -183,6 +183,7 @@ #define WLED5_SINK_BRIGHTNESS_SLEW_RATE_CTL_REG 0xb8 #define WLED5_EN_SLEW_CTL BIT(7) #define WLED5_EN_EXP_LUT BIT(6) +#define WLED5_SLEW_RAMP_TIME_SEL GENMASK(3, 0) #define WLED5_SINK_DIMMING_EXP_LUT0_LSB_REG 0xc0 #define WLED5_SINK_DIMMING_EXP_LUT0_MSB_REG 0xc1 @@ -223,6 +224,7 @@ struct wled_config { int string_cfg; int mod_sel; int cabc_sel; + int slew_ramp_time; bool en_cabc; bool ext_pfet_sc_pro_en; bool auto_calib_enabled; @@ -558,6 +560,17 @@ static int wled_update_status(struct backlight_device *bl) pr_err("wled enable failed rc:%d\n", rc); goto unlock_mutex; } + + if (*wled->version == WLED_PM7325B) { + rc = regmap_update_bits(wled->regmap, + wled->sink_addr + WLED5_SINK_BRIGHTNESS_SLEW_RATE_CTL_REG, + WLED5_SLEW_RAMP_TIME_SEL, + wled->cfg.slew_ramp_time); + if (rc < 0) { + pr_err("Failed to write to SLEW_RATE_REGISTER rc:%d\n", rc); + goto unlock_mutex; + } + } } if (is_wled5(wled)) { @@ -569,6 +582,16 @@ static int wled_update_status(struct backlight_device *bl) } } } else { + if (*wled->version == WLED_PM7325B) { + rc = regmap_update_bits(wled->regmap, + wled->sink_addr + WLED5_SINK_BRIGHTNESS_SLEW_RATE_CTL_REG, + WLED5_SLEW_RAMP_TIME_SEL, 0); + if (rc < 0) { + pr_err("Failed to write to SLEW_RATE_REGISTER rc:%d\n", rc); + goto unlock_mutex; + } + } + rc = wled_module_enable(wled, brightness); if (rc < 0) { pr_err("wled disable failed rc:%d\n", rc); @@ -1305,6 +1328,16 @@ static int wled5_setup(struct wled *wled) if (rc < 0) return rc; + if (*wled->version == WLED_PM7325B) { + val = WLED5_EN_SLEW_CTL | wled->cfg.slew_ramp_time; + rc = regmap_update_bits(wled->regmap, + wled->sink_addr + WLED5_SINK_BRIGHTNESS_SLEW_RATE_CTL_REG, + WLED5_EN_SLEW_CTL | WLED5_SLEW_RAMP_TIME_SEL, + val); + if (rc < 0) + return rc; + } + if (wled->cfg.use_exp_dimming) { rc = wled_program_exp_dimming(wled); if (rc < 0) { @@ -1485,6 +1518,7 @@ static const struct wled_config wled4_config_defaults = { .string_cfg = 0xf, .mod_sel = -EINVAL, .cabc_sel = -EINVAL, + .slew_ramp_time = -EINVAL, .en_cabc = 0, .ext_pfet_sc_pro_en = 0, .auto_calib_enabled = 0, @@ -1499,6 +1533,7 @@ static const struct wled_config wled5_config_defaults = { .string_cfg = 0xf, .mod_sel = 0, .cabc_sel = 0, + .slew_ramp_time = 6, /* 256 ms */ .en_cabc = 0, .ext_pfet_sc_pro_en = 0, .auto_calib_enabled = 0, @@ -1586,6 +1621,17 @@ static const struct wled_var_cfg wled5_cabc_sel_cfg = { .size = 4, }; +/* Applicable only for PM7325B */ +static const u32 wled5_slew_ramp_time_values[] = { + 2, 4, 8, 64, 128, 192, 256, 320, 384, 448, 512, 704, + 896, 1024, 2048, 4096, +}; + +static const struct wled_var_cfg wled5_slew_ramp_time_cfg = { + .values = wled5_slew_ramp_time_values, + .size = ARRAY_SIZE(wled5_slew_ramp_time_values), +}; + static u32 wled_values(const struct wled_var_cfg *cfg, u32 idx) { if (!cfg) @@ -2359,6 +2405,11 @@ static int wled_configure(struct wled *wled, struct device *dev) .val_ptr = &cfg->cabc_sel, .cfg = &wled5_cabc_sel_cfg, }, + { + .name = "qcom,slew-ramp-time", + .val_ptr = &cfg->slew_ramp_time, + .cfg = &wled5_slew_ramp_time_cfg, + }, }; const struct {