**Next message:**Mark Brown: "Re: [PATCH] regulator: core: Skip balancing of the enabled regulators in regulator_enable()"**Previous message:**Rasmus Villemoes: "[PATCH v2 3/4] backlight: pwm_bl: drop use of int_pow()"**In reply to:**Lee Jones: "Re: [PATCH v2 3/4] backlight: pwm_bl: drop use of int_pow()"**Next in thread:**Lee Jones: "Re: [PATCH v2 4/4] backlight: pwm_bl: switch to power-of-2 base for fixed-point math"**Messages sorted by:**[ date ] [ thread ] [ subject ] [ author ]

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).

Reviewed-by: Daniel Thompson <daniel.thompson@xxxxxxxxxx>

Signed-off-by: Rasmus Villemoes <linux@xxxxxxxxxxxxxxxxxx>

---

drivers/video/backlight/pwm_bl.c | 22 ++++++++++++----------

1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c

index 273d3fb628a0..a99c2210c935 100644

--- a/drivers/video/backlight/pwm_bl.c

+++ b/drivers/video/backlight/pwm_bl.c

@@ -148,7 +148,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.

@@ -165,23 +166,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;

@@ -215,8 +218,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;

--

2.20.1

**Next message:**Mark Brown: "Re: [PATCH] regulator: core: Skip balancing of the enabled regulators in regulator_enable()"**Previous message:**Rasmus Villemoes: "[PATCH v2 3/4] backlight: pwm_bl: drop use of int_pow()"**In reply to:**Lee Jones: "Re: [PATCH v2 3/4] backlight: pwm_bl: drop use of int_pow()"**Next in thread:**Lee Jones: "Re: [PATCH v2 4/4] backlight: pwm_bl: switch to power-of-2 base for fixed-point math"**Messages sorted by:**[ date ] [ thread ] [ subject ] [ author ]