Loading drivers/video/msm/mdss/mdss_fb.c +26 −7 Original line number Diff line number Diff line Loading @@ -123,16 +123,21 @@ void mdss_fb_no_update_notify_timer_cb(unsigned long data) complete(&mfd->no_update.comp); } void mdss_fb_bl_update_notify(struct msm_fb_data_type *mfd) void mdss_fb_bl_update_notify(struct msm_fb_data_type *mfd, uint32_t notification_type) { if (!mfd) { pr_err("%s mfd NULL\n", __func__); return; } mutex_lock(&mfd->update.lock); if (mfd->update.is_suspend) { mutex_unlock(&mfd->update.lock); return; } if (mfd->update.ref_count > 0) { mutex_unlock(&mfd->update.lock); mfd->update.value = NOTIFY_TYPE_BL_UPDATE; mfd->update.value = notification_type; complete(&mfd->update.comp); mutex_lock(&mfd->update.lock); } Loading @@ -141,7 +146,7 @@ void mdss_fb_bl_update_notify(struct msm_fb_data_type *mfd) mutex_lock(&mfd->no_update.lock); if (mfd->no_update.ref_count > 0) { mutex_unlock(&mfd->no_update.lock); mfd->no_update.value = NOTIFY_TYPE_BL_UPDATE; mfd->no_update.value = notification_type; complete(&mfd->no_update.comp); mutex_lock(&mfd->no_update.lock); } Loading Loading @@ -1195,6 +1200,7 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl) { struct mdss_panel_data *pdata; u32 temp = bkl_lvl; bool ad_bl_notify_needed = false; bool bl_notify_needed = false; if ((((mdss_fb_is_power_off(mfd) && mfd->dcm_state != DCM_ENTER) Loading @@ -1211,9 +1217,7 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl) if ((pdata) && (pdata->set_backlight)) { if (mfd->mdp.ad_calc_bl) (*mfd->mdp.ad_calc_bl)(mfd, temp, &temp, &bl_notify_needed); if (bl_notify_needed) mdss_fb_bl_update_notify(mfd); &ad_bl_notify_needed); if (!IS_CALIB_MODE_BL(mfd)) mdss_fb_scale_bl(mfd, &temp); /* Loading @@ -1227,11 +1231,20 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl) if (mfd->bl_level_scaled == temp) { mfd->bl_level = bkl_lvl; } else { if (mfd->bl_level != bkl_lvl) bl_notify_needed = true; pr_debug("backlight sent to panel :%d\n", temp); pdata->set_backlight(pdata, temp); mfd->bl_level = bkl_lvl; mfd->bl_level_scaled = temp; } if (ad_bl_notify_needed) mdss_fb_bl_update_notify(mfd, NOTIFY_TYPE_BL_AD_ATTEN_UPDATE); else if (bl_notify_needed) mdss_fb_bl_update_notify(mfd, NOTIFY_TYPE_BL_UPDATE); } } Loading @@ -1253,7 +1266,8 @@ void mdss_fb_update_backlight(struct msm_fb_data_type *mfd) (*mfd->mdp.ad_calc_bl)(mfd, temp, &temp, &bl_notify); if (bl_notify) mdss_fb_bl_update_notify(mfd); mdss_fb_bl_update_notify(mfd, NOTIFY_TYPE_BL_AD_ATTEN_UPDATE); pdata->set_backlight(pdata, temp); mfd->bl_level_scaled = mfd->unset_bl_level; mfd->bl_updated = 1; Loading Loading @@ -1353,6 +1367,11 @@ static int mdss_fb_blank_blank(struct msm_fb_data_type *mfd, del_timer(&mfd->no_update.timer); mfd->no_update.value = NOTIFY_TYPE_SUSPEND; complete(&mfd->no_update.comp); if (mfd->mdp.stop_histogram) ret = (*mfd->mdp.stop_histogram)(mfd); if (ret) pr_err("Failed to stop histogram before suspend, fb idx = %d\n", mfd->index); mfd->op_enable = false; if (mdss_panel_is_power_off(req_power_state)) { Loading drivers/video/msm/mdss/mdss_fb.h +1 −0 Original line number Diff line number Diff line Loading @@ -202,6 +202,7 @@ struct msm_mdp_interface { int (*lut_update)(struct msm_fb_data_type *mfd, struct fb_cmap *cmap); int (*do_histogram)(struct msm_fb_data_type *mfd, struct mdp_histogram *hist); int (*stop_histogram)(struct msm_fb_data_type *mfd); int (*ad_calc_bl)(struct msm_fb_data_type *mfd, int bl_in, int *bl_out, bool *bl_out_notify); int (*panel_register_done)(struct mdss_panel_data *pdata); Loading drivers/video/msm/mdss/mdss_mdp_pp.c +7 −0 Original line number Diff line number Diff line Loading @@ -351,6 +351,7 @@ struct mdss_pp_res_type { static DEFINE_MUTEX(mdss_pp_mutex); static struct mdss_pp_res_type *mdss_pp_res; static int pp_hist_stop_wrapper(struct msm_fb_data_type *mfd); static u32 pp_hist_read(char __iomem *v_addr, struct pp_hist_col_info *hist_info); static int pp_hist_setup(u32 *op, u32 block, struct mdss_mdp_mixer *mix); Loading Loading @@ -2191,6 +2192,7 @@ int mdss_mdp_pp_overlay_init(struct msm_fb_data_type *mfd) } mfd->mdp.ad_calc_bl = pp_ad_calc_bl; mfd->mdp.stop_histogram = pp_hist_stop_wrapper; return 0; } Loading Loading @@ -3601,6 +3603,11 @@ exit: return ret; } static int pp_hist_stop_wrapper(struct msm_fb_data_type *mfd) { return mdss_mdp_hist_stop(mfd->index + MDP_LOGICAL_BLOCK_DISP_0); } int mdss_mdp_hist_stop(u32 block) { int i, ret = 0; Loading include/uapi/linux/msm_mdp.h +1 −0 Original line number Diff line number Diff line Loading @@ -116,6 +116,7 @@ enum { NOTIFY_TYPE_SUSPEND, NOTIFY_TYPE_UPDATE, NOTIFY_TYPE_BL_UPDATE, NOTIFY_TYPE_BL_AD_ATTEN_UPDATE, }; enum { Loading Loading
drivers/video/msm/mdss/mdss_fb.c +26 −7 Original line number Diff line number Diff line Loading @@ -123,16 +123,21 @@ void mdss_fb_no_update_notify_timer_cb(unsigned long data) complete(&mfd->no_update.comp); } void mdss_fb_bl_update_notify(struct msm_fb_data_type *mfd) void mdss_fb_bl_update_notify(struct msm_fb_data_type *mfd, uint32_t notification_type) { if (!mfd) { pr_err("%s mfd NULL\n", __func__); return; } mutex_lock(&mfd->update.lock); if (mfd->update.is_suspend) { mutex_unlock(&mfd->update.lock); return; } if (mfd->update.ref_count > 0) { mutex_unlock(&mfd->update.lock); mfd->update.value = NOTIFY_TYPE_BL_UPDATE; mfd->update.value = notification_type; complete(&mfd->update.comp); mutex_lock(&mfd->update.lock); } Loading @@ -141,7 +146,7 @@ void mdss_fb_bl_update_notify(struct msm_fb_data_type *mfd) mutex_lock(&mfd->no_update.lock); if (mfd->no_update.ref_count > 0) { mutex_unlock(&mfd->no_update.lock); mfd->no_update.value = NOTIFY_TYPE_BL_UPDATE; mfd->no_update.value = notification_type; complete(&mfd->no_update.comp); mutex_lock(&mfd->no_update.lock); } Loading Loading @@ -1195,6 +1200,7 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl) { struct mdss_panel_data *pdata; u32 temp = bkl_lvl; bool ad_bl_notify_needed = false; bool bl_notify_needed = false; if ((((mdss_fb_is_power_off(mfd) && mfd->dcm_state != DCM_ENTER) Loading @@ -1211,9 +1217,7 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl) if ((pdata) && (pdata->set_backlight)) { if (mfd->mdp.ad_calc_bl) (*mfd->mdp.ad_calc_bl)(mfd, temp, &temp, &bl_notify_needed); if (bl_notify_needed) mdss_fb_bl_update_notify(mfd); &ad_bl_notify_needed); if (!IS_CALIB_MODE_BL(mfd)) mdss_fb_scale_bl(mfd, &temp); /* Loading @@ -1227,11 +1231,20 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl) if (mfd->bl_level_scaled == temp) { mfd->bl_level = bkl_lvl; } else { if (mfd->bl_level != bkl_lvl) bl_notify_needed = true; pr_debug("backlight sent to panel :%d\n", temp); pdata->set_backlight(pdata, temp); mfd->bl_level = bkl_lvl; mfd->bl_level_scaled = temp; } if (ad_bl_notify_needed) mdss_fb_bl_update_notify(mfd, NOTIFY_TYPE_BL_AD_ATTEN_UPDATE); else if (bl_notify_needed) mdss_fb_bl_update_notify(mfd, NOTIFY_TYPE_BL_UPDATE); } } Loading @@ -1253,7 +1266,8 @@ void mdss_fb_update_backlight(struct msm_fb_data_type *mfd) (*mfd->mdp.ad_calc_bl)(mfd, temp, &temp, &bl_notify); if (bl_notify) mdss_fb_bl_update_notify(mfd); mdss_fb_bl_update_notify(mfd, NOTIFY_TYPE_BL_AD_ATTEN_UPDATE); pdata->set_backlight(pdata, temp); mfd->bl_level_scaled = mfd->unset_bl_level; mfd->bl_updated = 1; Loading Loading @@ -1353,6 +1367,11 @@ static int mdss_fb_blank_blank(struct msm_fb_data_type *mfd, del_timer(&mfd->no_update.timer); mfd->no_update.value = NOTIFY_TYPE_SUSPEND; complete(&mfd->no_update.comp); if (mfd->mdp.stop_histogram) ret = (*mfd->mdp.stop_histogram)(mfd); if (ret) pr_err("Failed to stop histogram before suspend, fb idx = %d\n", mfd->index); mfd->op_enable = false; if (mdss_panel_is_power_off(req_power_state)) { Loading
drivers/video/msm/mdss/mdss_fb.h +1 −0 Original line number Diff line number Diff line Loading @@ -202,6 +202,7 @@ struct msm_mdp_interface { int (*lut_update)(struct msm_fb_data_type *mfd, struct fb_cmap *cmap); int (*do_histogram)(struct msm_fb_data_type *mfd, struct mdp_histogram *hist); int (*stop_histogram)(struct msm_fb_data_type *mfd); int (*ad_calc_bl)(struct msm_fb_data_type *mfd, int bl_in, int *bl_out, bool *bl_out_notify); int (*panel_register_done)(struct mdss_panel_data *pdata); Loading
drivers/video/msm/mdss/mdss_mdp_pp.c +7 −0 Original line number Diff line number Diff line Loading @@ -351,6 +351,7 @@ struct mdss_pp_res_type { static DEFINE_MUTEX(mdss_pp_mutex); static struct mdss_pp_res_type *mdss_pp_res; static int pp_hist_stop_wrapper(struct msm_fb_data_type *mfd); static u32 pp_hist_read(char __iomem *v_addr, struct pp_hist_col_info *hist_info); static int pp_hist_setup(u32 *op, u32 block, struct mdss_mdp_mixer *mix); Loading Loading @@ -2191,6 +2192,7 @@ int mdss_mdp_pp_overlay_init(struct msm_fb_data_type *mfd) } mfd->mdp.ad_calc_bl = pp_ad_calc_bl; mfd->mdp.stop_histogram = pp_hist_stop_wrapper; return 0; } Loading Loading @@ -3601,6 +3603,11 @@ exit: return ret; } static int pp_hist_stop_wrapper(struct msm_fb_data_type *mfd) { return mdss_mdp_hist_stop(mfd->index + MDP_LOGICAL_BLOCK_DISP_0); } int mdss_mdp_hist_stop(u32 block) { int i, ret = 0; Loading
include/uapi/linux/msm_mdp.h +1 −0 Original line number Diff line number Diff line Loading @@ -116,6 +116,7 @@ enum { NOTIFY_TYPE_SUSPEND, NOTIFY_TYPE_UPDATE, NOTIFY_TYPE_BL_UPDATE, NOTIFY_TYPE_BL_AD_ATTEN_UPDATE, }; enum { Loading