1*f0f6839bSThomas Zimmermann // SPDX-License-Identifier: GPL-2.0-or-later
2*f0f6839bSThomas Zimmermann 
3*f0f6839bSThomas Zimmermann #include <linux/export.h>
4*f0f6839bSThomas Zimmermann #include <linux/fb.h>
5*f0f6839bSThomas Zimmermann #include <linux/mutex.h>
6*f0f6839bSThomas Zimmermann 
7*f0f6839bSThomas Zimmermann #if IS_ENABLED(CONFIG_FB_BACKLIGHT)
8*f0f6839bSThomas Zimmermann /*
9*f0f6839bSThomas Zimmermann  * This function generates a linear backlight curve
10*f0f6839bSThomas Zimmermann  *
11*f0f6839bSThomas Zimmermann  *     0: off
12*f0f6839bSThomas Zimmermann  *   1-7: min
13*f0f6839bSThomas Zimmermann  * 8-127: linear from min to max
14*f0f6839bSThomas Zimmermann  */
fb_bl_default_curve(struct fb_info * fb_info,u8 off,u8 min,u8 max)15*f0f6839bSThomas Zimmermann void fb_bl_default_curve(struct fb_info *fb_info, u8 off, u8 min, u8 max)
16*f0f6839bSThomas Zimmermann {
17*f0f6839bSThomas Zimmermann 	unsigned int i, flat, count, range = (max - min);
18*f0f6839bSThomas Zimmermann 
19*f0f6839bSThomas Zimmermann 	mutex_lock(&fb_info->bl_curve_mutex);
20*f0f6839bSThomas Zimmermann 
21*f0f6839bSThomas Zimmermann 	fb_info->bl_curve[0] = off;
22*f0f6839bSThomas Zimmermann 
23*f0f6839bSThomas Zimmermann 	for (flat = 1; flat < (FB_BACKLIGHT_LEVELS / 16); ++flat)
24*f0f6839bSThomas Zimmermann 		fb_info->bl_curve[flat] = min;
25*f0f6839bSThomas Zimmermann 
26*f0f6839bSThomas Zimmermann 	count = FB_BACKLIGHT_LEVELS * 15 / 16;
27*f0f6839bSThomas Zimmermann 	for (i = 0; i < count; ++i)
28*f0f6839bSThomas Zimmermann 		fb_info->bl_curve[flat + i] = min + (range * (i + 1) / count);
29*f0f6839bSThomas Zimmermann 
30*f0f6839bSThomas Zimmermann 	mutex_unlock(&fb_info->bl_curve_mutex);
31*f0f6839bSThomas Zimmermann }
32*f0f6839bSThomas Zimmermann EXPORT_SYMBOL_GPL(fb_bl_default_curve);
33*f0f6839bSThomas Zimmermann #endif
34