static void mdss_dsi_panel_bklt_pwm(struct mdss_dsi_ctrl_pdata *ctrl, int level) { int ret; u32 duty; u32 period_ns; if (ctrl->pwm_bl == NULL) { pr_err("%s: no PWM\n", __func__); return; } if (level == 0) { if (ctrl->pwm_enabled) pwm_disable(ctrl->pwm_bl); ctrl->pwm_enabled = 0; return; } duty = level * ctrl->pwm_period; duty /= ctrl->bklt_max; pr_debug("%s: bklt_ctrl=%d pwm_period=%d pwm_gpio=%d pwm_lpg_chan=%d\n", __func__, ctrl->bklt_ctrl, ctrl->pwm_period, ctrl->pwm_pmic_gpio, ctrl->pwm_lpg_chan); pr_debug("%s: ndx=%d level=%d duty=%d\n", __func__, ctrl->ndx, level, duty); if (ctrl->pwm_enabled) { pwm_disable(ctrl->pwm_bl); ctrl->pwm_enabled = 0; } if (ctrl->pwm_period >= USEC_PER_SEC) { ret = pwm_config_us(ctrl->pwm_bl, duty, ctrl->pwm_period); if (ret) { pr_err("%s: pwm_config_us() failed err=%d.\n", __func__, ret); return; } } else { period_ns = ctrl->pwm_period * NSEC_PER_USEC; ret = pwm_config(ctrl->pwm_bl, level * period_ns / ctrl->bklt_max, period_ns); if (ret) { pr_err("%s: pwm_config() failed err=%d.\n", __func__, ret); return; } } ret = pwm_enable(ctrl->pwm_bl); if (ret) pr_err("%s: pwm_enable() failed err=%d\n", __func__, ret); ctrl->pwm_enabled = 1; }
void mdss_edp_set_backlight(struct mdss_panel_data *pdata, u32 bl_level) { int ret = 0; struct mdss_edp_drv_pdata *edp_drv = NULL; int bl_max; int period_ns; edp_drv = container_of(pdata, struct mdss_edp_drv_pdata, panel_data); if (!edp_drv) { pr_err("%s: Invalid input data\n", __func__); return; } if (edp_drv->bl_pwm != NULL) { bl_max = edp_drv->panel_data.panel_info.bl_max; if (bl_level > bl_max) bl_level = bl_max; /* In order to avoid overflow, use the microsecond version * of pwm_config if the pwm_period is greater than or equal * to 1 second. */ if (edp_drv->pwm_period >= USEC_PER_SEC) { ret = pwm_config_us(edp_drv->bl_pwm, bl_level * edp_drv->pwm_period / bl_max, edp_drv->pwm_period); if (ret) { pr_err("%s: pwm_config_us() failed err=%d.\n", __func__, ret); return; } } else { period_ns = edp_drv->pwm_period * NSEC_PER_USEC; ret = pwm_config(edp_drv->bl_pwm, bl_level * period_ns / bl_max, period_ns); if (ret) { pr_err("%s: pwm_config() failed err=%d.\n", __func__, ret); return; } } if (edp_drv->is_pwm_enabled) { pwm_disable(edp_drv->bl_pwm); edp_drv->is_pwm_enabled = 0; } ret = pwm_enable(edp_drv->bl_pwm); if (ret) { pr_err("%s: pwm_enable() failed err=%d\n", __func__, ret); return; } edp_drv->is_pwm_enabled = 1; } }