diff options
| author | Benet Clark <benetc@codeaurora.org> | 2015-09-14 19:10:10 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:46:10 -0700 |
| commit | 5b73c7a4aa299a6e3533cc6efd5eb5bece5f9fb8 (patch) | |
| tree | 258273ffce20057df95e32bde540691ec72cf1f5 | |
| parent | 75d690232bb079385d0addc75e9ed2abd199def1 (diff) | |
msm: mdss: Clean up histogram software state when FB device is released
When framebuffer device is released, the software state for the histograms
attached to that FB remains unchanged. During the release of FB resources,
the histogram state should be reset back to idle. This change adds that
support.
Change-Id: I0e9adcb5b98b8ea219c0bd5b0afa791f5820dc95
Signed-off-by: Benet Clark <benetc@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.c | 7 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.h | 2 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_pp.c | 29 |
3 files changed, 28 insertions, 10 deletions
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c index 0ff203d39d97..79021678fa9d 100644 --- a/drivers/video/fbdev/msm/mdss_fb.c +++ b/drivers/video/fbdev/msm/mdss_fb.c @@ -2611,11 +2611,10 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all) if (mfd->mdp.release_fnc) mfd->mdp.release_fnc(mfd, NULL); - if (mfd->mdp.ad_shutdown_cleanup) { - ret = (*mfd->mdp.ad_shutdown_cleanup)(mfd); + if (mfd->mdp.pp_release_fnc) { + ret = (*mfd->mdp.pp_release_fnc)(mfd); if (ret) - pr_err("AD shutdown cleanup failed ret %d\n", - ret); + pr_err("PP release failed ret %d\n", ret); } ret = mdss_fb_blank_sub(FB_BLANK_POWERDOWN, info, diff --git a/drivers/video/fbdev/msm/mdss_fb.h b/drivers/video/fbdev/msm/mdss_fb.h index c68b2ef2c185..01ba5ea5ecb3 100644 --- a/drivers/video/fbdev/msm/mdss_fb.h +++ b/drivers/video/fbdev/msm/mdss_fb.h @@ -232,7 +232,7 @@ struct msm_mdp_interface { int (*configure_panel)(struct msm_fb_data_type *mfd, int mode, int dest_ctrl); int (*input_event_handler)(struct msm_fb_data_type *mfd); - int (*ad_shutdown_cleanup)(struct msm_fb_data_type *mfd); + int (*pp_release_fnc)(struct msm_fb_data_type *mfd); void *private1; }; diff --git a/drivers/video/fbdev/msm/mdss_mdp_pp.c b/drivers/video/fbdev/msm/mdss_mdp_pp.c index 17d30e67072a..4090b8d1f053 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_pp.c +++ b/drivers/video/fbdev/msm/mdss_mdp_pp.c @@ -395,9 +395,10 @@ static void mdss_mdp_hist_intr_notify(u32 disp); static int mdss_mdp_panel_default_dither_config(struct msm_fb_data_type *mfd, u32 panel_bpp); static int mdss_mdp_limited_lut_igc_config(struct msm_fb_data_type *mfd); -static int pp_ad_shutdown_cleanup(struct msm_fb_data_type *mfd); static inline int pp_validate_dspp_mfd_block(struct msm_fb_data_type *mfd, int block); +static int pp_mfd_release_all(struct msm_fb_data_type *mfd); +static int pp_mfd_ad_release_all(struct msm_fb_data_type *mfd); static u32 last_sts, last_state; @@ -2425,10 +2426,10 @@ int mdss_mdp_pp_overlay_init(struct msm_fb_data_type *mfd) pr_err("Invalid mfd %p mdata %p\n", mfd, mdata); return -EPERM; } - if (mdata->nad_cfgs) { + + if (mdata->nad_cfgs) mfd->mdp.ad_calc_bl = pp_ad_calc_bl; - mfd->mdp.ad_shutdown_cleanup = pp_ad_shutdown_cleanup; - } + mfd->mdp.pp_release_fnc = pp_mfd_release_all; return 0; } @@ -6597,7 +6598,25 @@ static int mdss_mdp_mfd_valid_ad(struct msm_fb_data_type *mfd) return valid_ad; } -static int pp_ad_shutdown_cleanup(struct msm_fb_data_type *mfd) +static int pp_mfd_release_all(struct msm_fb_data_type *mfd) +{ + struct mdss_data_type *mdata = mdss_mdp_get_mdata(); + int ret = 0; + + if (mdata->nad_cfgs) { + ret = pp_mfd_ad_release_all(mfd); + if (ret) + pr_err("ad release all failed on disp %d, ret %d\n", + mfd->index, ret); + } + + if (mdss_mdp_mfd_valid_dspp(mfd)) + mdss_mdp_hist_stop(mfd->index + MDP_LOGICAL_BLOCK_DISP_0); + + return ret; +} + +static int pp_mfd_ad_release_all(struct msm_fb_data_type *mfd) { struct mdss_data_type *mdata = mdss_mdp_get_mdata(); struct mdss_mdp_ctl *ctl = NULL; |
