summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPing Li <pingli@codeaurora.org>2015-12-29 20:47:41 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:14:41 -0700
commit854f74456ca92923f33f92a129a6a3e0ee36a3a9 (patch)
treed65b7b62581544db7979fcce0e23f5abc00f6071
parent207a40bd09ab4c9fe3c3d36e9ba8b314f08358df (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.c39
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);