xref: /linux-6.15/include/linux/backlight.h (revision 5461f3fd)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * Backlight Lowlevel Control Abstraction
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * Copyright (C) 2003,2004 Hewlett-Packard Company
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  */
81da177e4SLinus Torvalds 
91da177e4SLinus Torvalds #ifndef _LINUX_BACKLIGHT_H
101da177e4SLinus Torvalds #define _LINUX_BACKLIGHT_H
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds #include <linux/device.h>
13a55944caSLiu Ying #include <linux/fb.h>
1428ee086dSRichard Purdie #include <linux/mutex.h>
151da177e4SLinus Torvalds #include <linux/notifier.h>
160a4be726SThomas Zimmermann #include <linux/types.h>
171da177e4SLinus Torvalds 
182d15bb47SSam Ravnborg /**
192d15bb47SSam Ravnborg  * enum backlight_update_reason - what method was used to update backlight
202d15bb47SSam Ravnborg  *
212d15bb47SSam Ravnborg  * A driver indicates the method (reason) used for updating the backlight
222d15bb47SSam Ravnborg  * when calling backlight_force_update().
232d15bb47SSam Ravnborg  */
24325253a6SMatthew Garrett enum backlight_update_reason {
252d15bb47SSam Ravnborg 	/**
262d15bb47SSam Ravnborg 	 * @BACKLIGHT_UPDATE_HOTKEY: The backlight was updated using a hot-key.
272d15bb47SSam Ravnborg 	 */
28325253a6SMatthew Garrett 	BACKLIGHT_UPDATE_HOTKEY,
292d15bb47SSam Ravnborg 
302d15bb47SSam Ravnborg 	/**
312d15bb47SSam Ravnborg 	 * @BACKLIGHT_UPDATE_SYSFS: The backlight was updated using sysfs.
322d15bb47SSam Ravnborg 	 */
33325253a6SMatthew Garrett 	BACKLIGHT_UPDATE_SYSFS,
34325253a6SMatthew Garrett };
35325253a6SMatthew Garrett 
362d15bb47SSam Ravnborg /**
372d15bb47SSam Ravnborg  * enum backlight_type - the type of backlight control
382d15bb47SSam Ravnborg  *
392d15bb47SSam Ravnborg  * The type of interface used to control the backlight.
402d15bb47SSam Ravnborg  */
41bb7ca747SMatthew Garrett enum backlight_type {
422d15bb47SSam Ravnborg 	/**
432d15bb47SSam Ravnborg 	 * @BACKLIGHT_RAW:
442d15bb47SSam Ravnborg 	 *
452d15bb47SSam Ravnborg 	 * The backlight is controlled using hardware registers.
462d15bb47SSam Ravnborg 	 */
47bb7ca747SMatthew Garrett 	BACKLIGHT_RAW = 1,
482d15bb47SSam Ravnborg 
492d15bb47SSam Ravnborg 	/**
502d15bb47SSam Ravnborg 	 * @BACKLIGHT_PLATFORM:
512d15bb47SSam Ravnborg 	 *
522d15bb47SSam Ravnborg 	 * The backlight is controlled using a platform-specific interface.
532d15bb47SSam Ravnborg 	 */
54bb7ca747SMatthew Garrett 	BACKLIGHT_PLATFORM,
552d15bb47SSam Ravnborg 
562d15bb47SSam Ravnborg 	/**
572d15bb47SSam Ravnborg 	 * @BACKLIGHT_FIRMWARE:
582d15bb47SSam Ravnborg 	 *
592d15bb47SSam Ravnborg 	 * The backlight is controlled using a standard firmware interface.
602d15bb47SSam Ravnborg 	 */
61bb7ca747SMatthew Garrett 	BACKLIGHT_FIRMWARE,
622d15bb47SSam Ravnborg 
632d15bb47SSam Ravnborg 	/**
642d15bb47SSam Ravnborg 	 * @BACKLIGHT_TYPE_MAX: Number of entries.
652d15bb47SSam Ravnborg 	 */
66bb7ca747SMatthew Garrett 	BACKLIGHT_TYPE_MAX,
67bb7ca747SMatthew Garrett };
68bb7ca747SMatthew Garrett 
692d15bb47SSam Ravnborg /** enum backlight_scale - the type of scale used for brightness values
702d15bb47SSam Ravnborg  *
712d15bb47SSam Ravnborg  * The type of scale used for brightness values.
722d15bb47SSam Ravnborg  */
73d55c028fSMatthias Kaehlcke enum backlight_scale {
742d15bb47SSam Ravnborg 	/**
752d15bb47SSam Ravnborg 	 * @BACKLIGHT_SCALE_UNKNOWN: The scale is unknown.
762d15bb47SSam Ravnborg 	 */
77d55c028fSMatthias Kaehlcke 	BACKLIGHT_SCALE_UNKNOWN = 0,
782d15bb47SSam Ravnborg 
792d15bb47SSam Ravnborg 	/**
802d15bb47SSam Ravnborg 	 * @BACKLIGHT_SCALE_LINEAR: The scale is linear.
812d15bb47SSam Ravnborg 	 *
822d15bb47SSam Ravnborg 	 * The linear scale will increase brightness the same for each step.
832d15bb47SSam Ravnborg 	 */
84d55c028fSMatthias Kaehlcke 	BACKLIGHT_SCALE_LINEAR,
852d15bb47SSam Ravnborg 
862d15bb47SSam Ravnborg 	/**
872d15bb47SSam Ravnborg 	 * @BACKLIGHT_SCALE_NON_LINEAR: The scale is not linear.
882d15bb47SSam Ravnborg 	 *
892d15bb47SSam Ravnborg 	 * This is often used when the brightness values tries to adjust to
902d15bb47SSam Ravnborg 	 * the relative perception of the eye demanding a non-linear scale.
912d15bb47SSam Ravnborg 	 */
92d55c028fSMatthias Kaehlcke 	BACKLIGHT_SCALE_NON_LINEAR,
93d55c028fSMatthias Kaehlcke };
94d55c028fSMatthias Kaehlcke 
951da177e4SLinus Torvalds struct backlight_device;
961da177e4SLinus Torvalds 
97ca7c20b2SSam Ravnborg /**
98ca7c20b2SSam Ravnborg  * struct backlight_ops - backlight operations
99ca7c20b2SSam Ravnborg  *
100ca7c20b2SSam Ravnborg  * The backlight operations are specified when the backlight device is registered.
101ca7c20b2SSam Ravnborg  */
102599a52d1SRichard Purdie struct backlight_ops {
103ca7c20b2SSam Ravnborg 	/**
104ca7c20b2SSam Ravnborg 	 * @options: Configure how operations are called from the core.
105ca7c20b2SSam Ravnborg 	 *
106ca7c20b2SSam Ravnborg 	 * The options parameter is used to adjust the behaviour of the core.
107ca7c20b2SSam Ravnborg 	 * Set BL_CORE_SUSPENDRESUME to get the update_status() operation called
108ca7c20b2SSam Ravnborg 	 * upon suspend and resume.
109ca7c20b2SSam Ravnborg 	 */
110b4144e4fSRichard Purdie 	unsigned int options;
111c835ee7fSRichard Purdie 
112c835ee7fSRichard Purdie #define BL_CORE_SUSPENDRESUME	(1 << 0)
113c835ee7fSRichard Purdie 
114ca7c20b2SSam Ravnborg 	/**
115ca7c20b2SSam Ravnborg 	 * @update_status: Operation called when properties have changed.
116ca7c20b2SSam Ravnborg 	 *
117ca7c20b2SSam Ravnborg 	 * Notify the backlight driver some property has changed.
118ca7c20b2SSam Ravnborg 	 * The update_status operation is protected by the update_lock.
119ca7c20b2SSam Ravnborg 	 *
120ca7c20b2SSam Ravnborg 	 * The backlight driver is expected to use backlight_is_blank()
121ca7c20b2SSam Ravnborg 	 * to check if the display is blanked and set brightness accordingly.
122ca7c20b2SSam Ravnborg 	 * update_status() is called when any of the properties has changed.
123ca7c20b2SSam Ravnborg 	 *
124ca7c20b2SSam Ravnborg 	 * RETURNS:
125ca7c20b2SSam Ravnborg 	 *
126ca7c20b2SSam Ravnborg 	 * 0 on success, negative error code if any failure occurred.
127ca7c20b2SSam Ravnborg 	 */
128b4144e4fSRichard Purdie 	int (*update_status)(struct backlight_device *);
129ca7c20b2SSam Ravnborg 
130ca7c20b2SSam Ravnborg 	/**
131ca7c20b2SSam Ravnborg 	 * @get_brightness: Return the current backlight brightness.
132ca7c20b2SSam Ravnborg 	 *
133ca7c20b2SSam Ravnborg 	 * The driver may implement this as a readback from the HW.
134ca7c20b2SSam Ravnborg 	 * This operation is optional and if not present then the current
135ca7c20b2SSam Ravnborg 	 * brightness property value is used.
136ca7c20b2SSam Ravnborg 	 *
137ca7c20b2SSam Ravnborg 	 * RETURNS:
138ca7c20b2SSam Ravnborg 	 *
139ca7c20b2SSam Ravnborg 	 * A brightness value which is 0 or a positive number.
140ca7c20b2SSam Ravnborg 	 * On failure a negative error code is returned.
141ca7c20b2SSam Ravnborg 	 */
142b4144e4fSRichard Purdie 	int (*get_brightness)(struct backlight_device *);
143ca7c20b2SSam Ravnborg 
144ca7c20b2SSam Ravnborg 	/**
1450a4be726SThomas Zimmermann 	 * @controls_device: Check against the display device
146ca7c20b2SSam Ravnborg 	 *
1470a4be726SThomas Zimmermann 	 * Check if the backlight controls the given display device. This
1480a4be726SThomas Zimmermann 	 * operation is optional and if not implemented it is assumed that
1490a4be726SThomas Zimmermann 	 * the display is always the one controlled by the backlight.
150ca7c20b2SSam Ravnborg 	 *
151ca7c20b2SSam Ravnborg 	 * RETURNS:
152ca7c20b2SSam Ravnborg 	 *
1530a4be726SThomas Zimmermann 	 * If display_dev is NULL or display_dev matches the device controlled by
1540a4be726SThomas Zimmermann 	 * the backlight, return true. Otherwise return false.
155ca7c20b2SSam Ravnborg 	 */
1560a4be726SThomas Zimmermann 	bool (*controls_device)(struct backlight_device *bd, struct device *display_dev);
157599a52d1SRichard Purdie };
1586ca01765SRichard Purdie 
159cabf1613SSam Ravnborg /**
160cabf1613SSam Ravnborg  * struct backlight_properties - backlight properties
161cabf1613SSam Ravnborg  *
162cabf1613SSam Ravnborg  * This structure defines all the properties of a backlight.
163cabf1613SSam Ravnborg  */
164599a52d1SRichard Purdie struct backlight_properties {
165cabf1613SSam Ravnborg 	/**
166cabf1613SSam Ravnborg 	 * @brightness: The current brightness requested by the user.
167cabf1613SSam Ravnborg 	 *
168cabf1613SSam Ravnborg 	 * The backlight core makes sure the range is (0 to max_brightness)
169cabf1613SSam Ravnborg 	 * when the brightness is set via the sysfs attribute:
170cabf1613SSam Ravnborg 	 * /sys/class/backlight/<backlight>/brightness.
171cabf1613SSam Ravnborg 	 *
172cabf1613SSam Ravnborg 	 * This value can be set in the backlight_properties passed
173cabf1613SSam Ravnborg 	 * to devm_backlight_device_register() to set a default brightness
174cabf1613SSam Ravnborg 	 * value.
175cabf1613SSam Ravnborg 	 */
1766ca01765SRichard Purdie 	int brightness;
177cabf1613SSam Ravnborg 
178cabf1613SSam Ravnborg 	/**
179cabf1613SSam Ravnborg 	 * @max_brightness: The maximum brightness value.
180cabf1613SSam Ravnborg 	 *
181cabf1613SSam Ravnborg 	 * This value must be set in the backlight_properties passed to
182cabf1613SSam Ravnborg 	 * devm_backlight_device_register() and shall not be modified by the
183cabf1613SSam Ravnborg 	 * driver after registration.
184cabf1613SSam Ravnborg 	 */
1856ca01765SRichard Purdie 	int max_brightness;
186cabf1613SSam Ravnborg 
187cabf1613SSam Ravnborg 	/**
188cabf1613SSam Ravnborg 	 * @power: The current power mode.
189cabf1613SSam Ravnborg 	 *
190cabf1613SSam Ravnborg 	 * User space can configure the power mode using the sysfs
191cabf1613SSam Ravnborg 	 * attribute: /sys/class/backlight/<backlight>/bl_power
192cabf1613SSam Ravnborg 	 * When the power property is updated update_status() is called.
193cabf1613SSam Ravnborg 	 *
194*a1cacb8aSThomas Zimmermann 	 * The possible values are: (0: full on, 4: full off), see
195*a1cacb8aSThomas Zimmermann 	 * BACKLIGHT_POWER constants.
196cabf1613SSam Ravnborg 	 *
197*a1cacb8aSThomas Zimmermann 	 * When the backlight device is enabled, @power is set to
198*a1cacb8aSThomas Zimmermann 	 * BACKLIGHT_POWER_ON. When the backlight device is disabled,
199*a1cacb8aSThomas Zimmermann 	 * @power is set to BACKLIGHT_POWER_OFF.
200cabf1613SSam Ravnborg 	 */
2016ca01765SRichard Purdie 	int power;
202cabf1613SSam Ravnborg 
203*a1cacb8aSThomas Zimmermann #define BACKLIGHT_POWER_ON		(0)
204*a1cacb8aSThomas Zimmermann #define BACKLIGHT_POWER_OFF		(4)
205*a1cacb8aSThomas Zimmermann #define BACKLIGHT_POWER_REDUCED		(1) // deprecated; don't use in new code
206*a1cacb8aSThomas Zimmermann 
207cabf1613SSam Ravnborg 	/**
208cabf1613SSam Ravnborg 	 * @type: The type of backlight supported.
209cabf1613SSam Ravnborg 	 *
210cabf1613SSam Ravnborg 	 * The backlight type allows userspace to make appropriate
211cabf1613SSam Ravnborg 	 * policy decisions based on the backlight type.
212cabf1613SSam Ravnborg 	 *
213cabf1613SSam Ravnborg 	 * This value must be set in the backlight_properties
214cabf1613SSam Ravnborg 	 * passed to devm_backlight_device_register().
215cabf1613SSam Ravnborg 	 */
216bb7ca747SMatthew Garrett 	enum backlight_type type;
217cabf1613SSam Ravnborg 
218cabf1613SSam Ravnborg 	/**
219cabf1613SSam Ravnborg 	 * @state: The state of the backlight core.
220cabf1613SSam Ravnborg 	 *
221cabf1613SSam Ravnborg 	 * The state is a bitmask. BL_CORE_FBBLANK is set when the display
222cabf1613SSam Ravnborg 	 * is expected to be blank. BL_CORE_SUSPENDED is set when the
223cabf1613SSam Ravnborg 	 * driver is suspended.
224cabf1613SSam Ravnborg 	 *
225cabf1613SSam Ravnborg 	 * backlight drivers are expected to use backlight_is_blank()
226cabf1613SSam Ravnborg 	 * in their update_status() operation rather than reading the
227cabf1613SSam Ravnborg 	 * state property.
228cabf1613SSam Ravnborg 	 *
229cabf1613SSam Ravnborg 	 * The state is maintained by the core and drivers may not modify it.
230cabf1613SSam Ravnborg 	 */
231c835ee7fSRichard Purdie 	unsigned int state;
232c835ee7fSRichard Purdie 
233c835ee7fSRichard Purdie #define BL_CORE_SUSPENDED	(1 << 0)	/* backlight is suspended */
234c835ee7fSRichard Purdie #define BL_CORE_FBBLANK		(1 << 1)	/* backlight is under an fb blank event */
235c835ee7fSRichard Purdie 
236cabf1613SSam Ravnborg 	/**
237cabf1613SSam Ravnborg 	 * @scale: The type of the brightness scale.
238cabf1613SSam Ravnborg 	 */
239cabf1613SSam Ravnborg 	enum backlight_scale scale;
2401da177e4SLinus Torvalds };
2411da177e4SLinus Torvalds 
2426f10cd12SSam Ravnborg /**
2436f10cd12SSam Ravnborg  * struct backlight_device - backlight device data
2446f10cd12SSam Ravnborg  *
2456f10cd12SSam Ravnborg  * This structure holds all data required by a backlight device.
2466f10cd12SSam Ravnborg  */
2471da177e4SLinus Torvalds struct backlight_device {
2486f10cd12SSam Ravnborg 	/**
2496f10cd12SSam Ravnborg 	 * @props: Backlight properties
2506f10cd12SSam Ravnborg 	 */
251599a52d1SRichard Purdie 	struct backlight_properties props;
252599a52d1SRichard Purdie 
2536f10cd12SSam Ravnborg 	/**
2546f10cd12SSam Ravnborg 	 * @update_lock: The lock used when calling the update_status() operation.
2556f10cd12SSam Ravnborg 	 *
2566f10cd12SSam Ravnborg 	 * update_lock is an internal backlight lock that serialise access
2576f10cd12SSam Ravnborg 	 * to the update_status() operation. The backlight core holds the update_lock
2586f10cd12SSam Ravnborg 	 * when calling the update_status() operation. The update_lock shall not
2596f10cd12SSam Ravnborg 	 * be used by backlight drivers.
2606f10cd12SSam Ravnborg 	 */
26128ee086dSRichard Purdie 	struct mutex update_lock;
262599a52d1SRichard Purdie 
2636f10cd12SSam Ravnborg 	/**
2646f10cd12SSam Ravnborg 	 * @ops_lock: The lock used around everything related to backlight_ops.
2656f10cd12SSam Ravnborg 	 *
2666f10cd12SSam Ravnborg 	 * ops_lock is an internal backlight lock that protects the ops pointer
2676f10cd12SSam Ravnborg 	 * and is used around all accesses to ops and when the operations are
2686f10cd12SSam Ravnborg 	 * invoked. The ops_lock shall not be used by backlight drivers.
2696f10cd12SSam Ravnborg 	 */
270599a52d1SRichard Purdie 	struct mutex ops_lock;
2716f10cd12SSam Ravnborg 
2726f10cd12SSam Ravnborg 	/**
2736f10cd12SSam Ravnborg 	 * @ops: Pointer to the backlight operations.
2746f10cd12SSam Ravnborg 	 *
2756f10cd12SSam Ravnborg 	 * If ops is NULL, the driver that registered this device has been unloaded,
2766f10cd12SSam Ravnborg 	 * and if class_get_devdata() points to something in the body of that driver,
2776f10cd12SSam Ravnborg 	 * it is also invalid.
2786f10cd12SSam Ravnborg 	 */
2799905a43bSEmese Revfy 	const struct backlight_ops *ops;
280599a52d1SRichard Purdie 
2816f10cd12SSam Ravnborg 	/**
2826f10cd12SSam Ravnborg 	 * @fb_notif: The framebuffer notifier block
2836f10cd12SSam Ravnborg 	 */
2841da177e4SLinus Torvalds 	struct notifier_block fb_notif;
285655bfd7aSRichard Purdie 
2866f10cd12SSam Ravnborg 	/**
2876f10cd12SSam Ravnborg 	 * @entry: List entry of all registered backlight devices
2886f10cd12SSam Ravnborg 	 */
2895915a3dbSAaron Lu 	struct list_head entry;
2905915a3dbSAaron Lu 
2916f10cd12SSam Ravnborg 	/**
2926f10cd12SSam Ravnborg 	 * @dev: Parent device.
2936f10cd12SSam Ravnborg 	 */
294655bfd7aSRichard Purdie 	struct device dev;
295a55944caSLiu Ying 
2966f10cd12SSam Ravnborg 	/**
2976f10cd12SSam Ravnborg 	 * @fb_bl_on: The state of individual fbdev's.
2986f10cd12SSam Ravnborg 	 *
2996f10cd12SSam Ravnborg 	 * Multiple fbdev's may share one backlight device. The fb_bl_on
3006f10cd12SSam Ravnborg 	 * records the state of the individual fbdev.
3016f10cd12SSam Ravnborg 	 */
302a55944caSLiu Ying 	bool fb_bl_on[FB_MAX];
303a55944caSLiu Ying 
3046f10cd12SSam Ravnborg 	/**
3056f10cd12SSam Ravnborg 	 * @use_count: The number of uses of fb_bl_on.
3066f10cd12SSam Ravnborg 	 */
307a55944caSLiu Ying 	int use_count;
3081da177e4SLinus Torvalds };
3091da177e4SLinus Torvalds 
310d160fd4eSSam Ravnborg /**
311d160fd4eSSam Ravnborg  * backlight_update_status - force an update of the backlight device status
312d160fd4eSSam Ravnborg  * @bd: the backlight device
313d160fd4eSSam Ravnborg  */
backlight_update_status(struct backlight_device * bd)314cca0ba2dSHyungwon Hwang static inline int backlight_update_status(struct backlight_device *bd)
31528ee086dSRichard Purdie {
316cca0ba2dSHyungwon Hwang 	int ret = -ENOENT;
317cca0ba2dSHyungwon Hwang 
31828ee086dSRichard Purdie 	mutex_lock(&bd->update_lock);
319599a52d1SRichard Purdie 	if (bd->ops && bd->ops->update_status)
320cca0ba2dSHyungwon Hwang 		ret = bd->ops->update_status(bd);
32128ee086dSRichard Purdie 	mutex_unlock(&bd->update_lock);
322cca0ba2dSHyungwon Hwang 
323cca0ba2dSHyungwon Hwang 	return ret;
32428ee086dSRichard Purdie }
32528ee086dSRichard Purdie 
3265b698be0SMeghana Madhyastha /**
3275b698be0SMeghana Madhyastha  * backlight_enable - Enable backlight
3285b698be0SMeghana Madhyastha  * @bd: the backlight device to enable
3295b698be0SMeghana Madhyastha  */
backlight_enable(struct backlight_device * bd)3305b698be0SMeghana Madhyastha static inline int backlight_enable(struct backlight_device *bd)
3315b698be0SMeghana Madhyastha {
3325b698be0SMeghana Madhyastha 	if (!bd)
3335b698be0SMeghana Madhyastha 		return 0;
3345b698be0SMeghana Madhyastha 
335*a1cacb8aSThomas Zimmermann 	bd->props.power = BACKLIGHT_POWER_ON;
3365b698be0SMeghana Madhyastha 	bd->props.state &= ~BL_CORE_FBBLANK;
3375b698be0SMeghana Madhyastha 
3385b698be0SMeghana Madhyastha 	return backlight_update_status(bd);
3395b698be0SMeghana Madhyastha }
3405b698be0SMeghana Madhyastha 
3415b698be0SMeghana Madhyastha /**
3425b698be0SMeghana Madhyastha  * backlight_disable - Disable backlight
3435b698be0SMeghana Madhyastha  * @bd: the backlight device to disable
3445b698be0SMeghana Madhyastha  */
backlight_disable(struct backlight_device * bd)3455b698be0SMeghana Madhyastha static inline int backlight_disable(struct backlight_device *bd)
3465b698be0SMeghana Madhyastha {
3475b698be0SMeghana Madhyastha 	if (!bd)
3485b698be0SMeghana Madhyastha 		return 0;
3495b698be0SMeghana Madhyastha 
350*a1cacb8aSThomas Zimmermann 	bd->props.power = BACKLIGHT_POWER_OFF;
3515b698be0SMeghana Madhyastha 	bd->props.state |= BL_CORE_FBBLANK;
3525b698be0SMeghana Madhyastha 
3535b698be0SMeghana Madhyastha 	return backlight_update_status(bd);
3545b698be0SMeghana Madhyastha }
3555b698be0SMeghana Madhyastha 
356c2adda27SMeghana Madhyastha /**
3571c91b465SSam Ravnborg  * backlight_is_blank - Return true if display is expected to be blank
3581c91b465SSam Ravnborg  * @bd: the backlight device
3591c91b465SSam Ravnborg  *
3601c91b465SSam Ravnborg  * Display is expected to be blank if any of these is true::
3611c91b465SSam Ravnborg  *
3621c91b465SSam Ravnborg  *   1) if power in not UNBLANK
3634551978bSThomas Zimmermann  *   2) if state indicate BLANK or SUSPENDED
3641c91b465SSam Ravnborg  *
3651c91b465SSam Ravnborg  * Returns true if display is expected to be blank, false otherwise.
3661c91b465SSam Ravnborg  */
backlight_is_blank(const struct backlight_device * bd)3671c91b465SSam Ravnborg static inline bool backlight_is_blank(const struct backlight_device *bd)
3681c91b465SSam Ravnborg {
369*a1cacb8aSThomas Zimmermann 	return bd->props.power != BACKLIGHT_POWER_ON ||
3701c91b465SSam Ravnborg 	       bd->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK);
3711c91b465SSam Ravnborg }
3721c91b465SSam Ravnborg 
3732144d00eSSam Ravnborg /**
3742144d00eSSam Ravnborg  * backlight_get_brightness - Returns the current brightness value
3752144d00eSSam Ravnborg  * @bd: the backlight device
3762144d00eSSam Ravnborg  *
3772144d00eSSam Ravnborg  * Returns the current brightness value, taking in consideration the current
3782144d00eSSam Ravnborg  * state. If backlight_is_blank() returns true then return 0 as brightness
3792144d00eSSam Ravnborg  * otherwise return the current brightness property value.
3802144d00eSSam Ravnborg  *
3812144d00eSSam Ravnborg  * Backlight drivers are expected to use this function in their update_status()
3822144d00eSSam Ravnborg  * operation to get the brightness value.
3832144d00eSSam Ravnborg  */
backlight_get_brightness(const struct backlight_device * bd)3842144d00eSSam Ravnborg static inline int backlight_get_brightness(const struct backlight_device *bd)
3852144d00eSSam Ravnborg {
3862144d00eSSam Ravnborg 	if (backlight_is_blank(bd))
3872144d00eSSam Ravnborg 		return 0;
3882144d00eSSam Ravnborg 	else
3892144d00eSSam Ravnborg 		return bd->props.brightness;
3902144d00eSSam Ravnborg }
3912144d00eSSam Ravnborg 
3929c4aa311SSam Ravnborg struct backlight_device *
3939c4aa311SSam Ravnborg backlight_device_register(const char *name, struct device *dev, void *devdata,
3949c4aa311SSam Ravnborg 			  const struct backlight_ops *ops,
395a19a6ee6SMatthew Garrett 			  const struct backlight_properties *props);
3969c4aa311SSam Ravnborg struct backlight_device *
3979c4aa311SSam Ravnborg devm_backlight_device_register(struct device *dev, const char *name,
3989c4aa311SSam Ravnborg 			       struct device *parent, void *devdata,
3999c4aa311SSam Ravnborg 			       const struct backlight_ops *ops,
4008318fde4SJingoo Han 			       const struct backlight_properties *props);
4019c4aa311SSam Ravnborg void backlight_device_unregister(struct backlight_device *bd);
4029c4aa311SSam Ravnborg void devm_backlight_device_unregister(struct device *dev,
4038318fde4SJingoo Han 				      struct backlight_device *bd);
4049c4aa311SSam Ravnborg void backlight_force_update(struct backlight_device *bd,
405325253a6SMatthew Garrett 			    enum backlight_update_reason reason);
406479da1f5SNoralf Trønnes struct backlight_device *backlight_device_get_by_name(const char *name);
4079c4aa311SSam Ravnborg struct backlight_device *backlight_device_get_by_type(enum backlight_type type);
4089c4aa311SSam Ravnborg int backlight_device_set_brightness(struct backlight_device *bd,
4099c4aa311SSam Ravnborg 				    unsigned long brightness);
4101da177e4SLinus Torvalds 
411655bfd7aSRichard Purdie #define to_backlight_device(obj) container_of(obj, struct backlight_device, dev)
412655bfd7aSRichard Purdie 
413d160fd4eSSam Ravnborg /**
414d160fd4eSSam Ravnborg  * bl_get_data - access devdata
415d160fd4eSSam Ravnborg  * @bl_dev: pointer to backlight device
416d160fd4eSSam Ravnborg  *
417d160fd4eSSam Ravnborg  * When a backlight device is registered the driver has the possibility
418d160fd4eSSam Ravnborg  * to supply a void * devdata. bl_get_data() return a pointer to the
419d160fd4eSSam Ravnborg  * devdata.
420d160fd4eSSam Ravnborg  *
421d160fd4eSSam Ravnborg  * RETURNS:
422d160fd4eSSam Ravnborg  *
423d160fd4eSSam Ravnborg  * pointer to devdata stored while registering the backlight device.
424d160fd4eSSam Ravnborg  */
bl_get_data(struct backlight_device * bl_dev)425655bfd7aSRichard Purdie static inline void * bl_get_data(struct backlight_device *bl_dev)
426655bfd7aSRichard Purdie {
427655bfd7aSRichard Purdie 	return dev_get_drvdata(&bl_dev->dev);
428655bfd7aSRichard Purdie }
4291da177e4SLinus Torvalds 
430762a936fSThierry Reding #ifdef CONFIG_OF
431762a936fSThierry Reding struct backlight_device *of_find_backlight_by_node(struct device_node *node);
432762a936fSThierry Reding #else
433762a936fSThierry Reding static inline struct backlight_device *
of_find_backlight_by_node(struct device_node * node)434762a936fSThierry Reding of_find_backlight_by_node(struct device_node *node)
435762a936fSThierry Reding {
436762a936fSThierry Reding 	return NULL;
437762a936fSThierry Reding }
438762a936fSThierry Reding #endif
439762a936fSThierry Reding 
440c2adda27SMeghana Madhyastha #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
4412e4ef334SMeghana Madhyastha struct backlight_device *devm_of_find_backlight(struct device *dev);
442c2adda27SMeghana Madhyastha #else
4432e4ef334SMeghana Madhyastha static inline struct backlight_device *
devm_of_find_backlight(struct device * dev)4442e4ef334SMeghana Madhyastha devm_of_find_backlight(struct device *dev)
4452e4ef334SMeghana Madhyastha {
4462e4ef334SMeghana Madhyastha 	return NULL;
4472e4ef334SMeghana Madhyastha }
448c2adda27SMeghana Madhyastha #endif
449c2adda27SMeghana Madhyastha 
4501da177e4SLinus Torvalds #endif
451