backlight: pwm_bl: Switch to power-of-2 base for fixed-point math
Using a power-of-2 instead of power-of-10 base makes the computations much cheaper. 2^16 is safe; retval never becomes more than 2^48 + 2^32/2. On a 32 bit platform, the very expensive 64/32 division at the end of cie1931() instead becomes essentially free (a shift by 32 is just a register rename). Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org> Signed-off-by: Lee Jones <lee.jones@linaro.org>
This commit is contained in:
parent
407feae1ca
commit
ca58b37034
|
@ -149,7 +149,8 @@ static const struct backlight_ops pwm_backlight_ops = {
|
|||
};
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
#define PWM_LUMINANCE_SCALE 10000 /* luminance scale */
|
||||
#define PWM_LUMINANCE_SHIFT 16
|
||||
#define PWM_LUMINANCE_SCALE (1 << PWM_LUMINANCE_SHIFT) /* luminance scale */
|
||||
|
||||
/*
|
||||
* CIE lightness to PWM conversion.
|
||||
|
@ -166,23 +167,25 @@ static const struct backlight_ops pwm_backlight_ops = {
|
|||
* The following function does the fixed point maths needed to implement the
|
||||
* above formula.
|
||||
*/
|
||||
static u64 cie1931(unsigned int lightness, unsigned int scale)
|
||||
static u64 cie1931(unsigned int lightness)
|
||||
{
|
||||
u64 retval;
|
||||
|
||||
/*
|
||||
* @lightness is given as a number between 0 and 1, expressed
|
||||
* as a fixed-point number in scale @scale. Convert to a
|
||||
* percentage, still expressed as a fixed-point number, so the
|
||||
* above formulas can be applied.
|
||||
* as a fixed-point number in scale
|
||||
* PWM_LUMINANCE_SCALE. Convert to a percentage, still
|
||||
* expressed as a fixed-point number, so the above formulas
|
||||
* can be applied.
|
||||
*/
|
||||
lightness *= 100;
|
||||
if (lightness <= (8 * scale)) {
|
||||
if (lightness <= (8 * PWM_LUMINANCE_SCALE)) {
|
||||
retval = DIV_ROUND_CLOSEST(lightness * 10, 9033);
|
||||
} else {
|
||||
retval = (lightness + (16 * scale)) / 116;
|
||||
retval = (lightness + (16 * PWM_LUMINANCE_SCALE)) / 116;
|
||||
retval *= retval * retval;
|
||||
retval = DIV_ROUND_CLOSEST_ULL(retval, (scale * scale));
|
||||
retval += 1ULL << (2*PWM_LUMINANCE_SHIFT - 1);
|
||||
retval >>= 2*PWM_LUMINANCE_SHIFT;
|
||||
}
|
||||
|
||||
return retval;
|
||||
|
@ -216,8 +219,7 @@ int pwm_backlight_brightness_default(struct device *dev,
|
|||
/* Fill the table using the cie1931 algorithm */
|
||||
for (i = 0; i < data->max_brightness; i++) {
|
||||
retval = cie1931((i * PWM_LUMINANCE_SCALE) /
|
||||
data->max_brightness, PWM_LUMINANCE_SCALE) *
|
||||
period;
|
||||
data->max_brightness) * period;
|
||||
retval = DIV_ROUND_CLOSEST_ULL(retval, PWM_LUMINANCE_SCALE);
|
||||
if (retval > UINT_MAX)
|
||||
return -EINVAL;
|
||||
|
|
Loading…
Reference in New Issue