diff options
| author | Ping Li <pingli@codeaurora.org> | 2015-12-29 20:47:41 -0800 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:14:41 -0700 |
| commit | 854f74456ca92923f33f92a129a6a3e0ee36a3a9 (patch) | |
| tree | d65b7b62581544db7979fcce0e23f5abc00f6071 | |
| parent | 207a40bd09ab4c9fe3c3d36e9ba8b314f08358df (diff) | |
msm: mdss: Optimize backlight mapping calculation for AD
Reduce the rounding error during AD backlight linearization and
attenuation.
Change-Id: Ibf181414512d457d3341bbccf8cf9338aef8ac76
Signed-off-by: Ping Li <pingli@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_pp.c | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_pp.c b/drivers/video/fbdev/msm/mdss_mdp_pp.c index 444029474157..e79010a6e3fe 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_pp.c +++ b/drivers/video/fbdev/msm/mdss_mdp_pp.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -5812,11 +5812,17 @@ static int pp_ad_attenuate_bl(struct mdss_ad_info *ad, u32 bl, u32 *bl_out) u32 shift = 0, ratio_temp = 0; u32 n, lut_interval, bl_att; - if (bl < 0) { - pr_err("Invalid backlight input\n"); + if (bl < 0 || ad->init.alpha < 0) { + pr_err("Invalid input: backlight = %d, alpha = %d\n", bl, + ad->init.alpha); return -EINVAL; } + if (ad->init.alpha == 0) { + pr_debug("alpha = %d, hence no attenuation needed\n", + ad->init.alpha); + return 0; + } pr_debug("bl_in = %d\n", bl); /* map panel backlight range to AD backlight range */ linear_map(bl, &bl, ad->bl_mfd->panel_info->bl_max, @@ -5839,12 +5845,9 @@ static int pp_ad_attenuate_bl(struct mdss_ad_info *ad, u32 bl, u32 *bl_out) lut_interval; pr_debug("n = %u, bl_att_lut[%u] = %u, bl_att_lut[%u] = %u, bl_att = %u\n", n, n, ad->bl_att_lut[n], n + 1, ad->bl_att_lut[n + 1], bl_att); - if (ad->init.alpha_base) - *bl_out = (ad->init.alpha * bl_att + - (ad->init.alpha_base - ad->init.alpha) * bl) / - ad->init.alpha_base; - else - *bl_out = bl; + *bl_out = (ad->init.alpha * bl_att + + (ad->init.alpha_base - ad->init.alpha) * bl) / + ad->init.alpha_base; pr_debug("After attenuation = %d\n", *bl_out); /* map AD backlight range back to panel backlight range */ @@ -5860,7 +5863,7 @@ static int pp_ad_linearize_bl(struct mdss_ad_info *ad, u32 bl, u32 *bl_out, int inv) { - u32 n; + u32 n, bl_lut_max_index = AD_BL_LIN_LEN - 1; uint32_t *bl_lut = NULL; int ret = -EINVAL; @@ -5885,20 +5888,24 @@ static int pp_ad_linearize_bl(struct mdss_ad_info *ad, u32 bl, u32 *bl_out, MDSS_MDP_AD_BL_SCALE); pr_debug("Before linearization = %d\n", bl); - n = bl * (AD_BL_LIN_LEN - 1) / MDSS_MDP_AD_BL_SCALE; + n = bl * bl_lut_max_index / MDSS_MDP_AD_BL_SCALE; pr_debug("n = %u\n", n); - if (n > (AD_BL_LIN_LEN - 1)) { + if (n > bl_lut_max_index) { pr_err("Invalid index for BL linearization: %d.\n", n); return ret; - } else if (n == (AD_BL_LIN_LEN - 1)) { + } else if (n == bl_lut_max_index) { + *bl_out = bl_lut[n]; + } else if (bl == n * MDSS_MDP_AD_BL_SCALE / bl_lut_max_index) { *bl_out = bl_lut[n]; + } else if (bl == (n + 1) * MDSS_MDP_AD_BL_SCALE / bl_lut_max_index) { + *bl_out = bl_lut[n + 1]; } else { /* linear piece-wise interpolation */ *bl_out = ((bl_lut[n + 1] - bl_lut[n]) * (bl - n * MDSS_MDP_AD_BL_SCALE / - (AD_BL_LIN_LEN - 1)) + bl_lut[n] * - MDSS_MDP_AD_BL_SCALE / (AD_BL_LIN_LEN - 1)) * - (AD_BL_LIN_LEN - 1) / MDSS_MDP_AD_BL_SCALE; + bl_lut_max_index) + bl_lut[n] * + MDSS_MDP_AD_BL_SCALE / bl_lut_max_index) * + bl_lut_max_index / MDSS_MDP_AD_BL_SCALE; } pr_debug("After linearization = %d\n", *bl_out); |
