diff options
Diffstat (limited to 'include/linux/backlight.h')
| -rw-r--r-- | include/linux/backlight.h | 399 | 
1 files changed, 325 insertions, 74 deletions
diff --git a/include/linux/backlight.h b/include/linux/backlight.h index 56e4580d4f55..614653e07e3a 100644 --- a/include/linux/backlight.h +++ b/include/linux/backlight.h @@ -14,113 +14,336 @@  #include <linux/mutex.h>  #include <linux/notifier.h> -/* Notes on locking: - * - * backlight_device->ops_lock is an internal backlight lock protecting the - * ops pointer and no code outside the core should need to touch it. - * - * Access to update_status() is serialised by the update_lock mutex since - * most drivers seem to need this and historically get it wrong. - * - * Most drivers don't need locking on their get_brightness() method. - * If yours does, you need to implement it in the driver. You can use the - * update_lock mutex if appropriate. +/** + * enum backlight_update_reason - what method was used to update backlight   * - * Any other use of the locks below is probably wrong. + * A driver indicates the method (reason) used for updating the backlight + * when calling backlight_force_update().   */ -  enum backlight_update_reason { +	/** +	 * @BACKLIGHT_UPDATE_HOTKEY: The backlight was updated using a hot-key. +	 */  	BACKLIGHT_UPDATE_HOTKEY, + +	/** +	 * @BACKLIGHT_UPDATE_SYSFS: The backlight was updated using sysfs. +	 */  	BACKLIGHT_UPDATE_SYSFS,  }; +/** + * enum backlight_type - the type of backlight control + * + * The type of interface used to control the backlight. + */  enum backlight_type { +	/** +	 * @BACKLIGHT_RAW: +	 * +	 * The backlight is controlled using hardware registers. +	 */  	BACKLIGHT_RAW = 1, + +	/** +	 * @BACKLIGHT_PLATFORM: +	 * +	 * The backlight is controlled using a platform-specific interface. +	 */  	BACKLIGHT_PLATFORM, + +	/** +	 * @BACKLIGHT_FIRMWARE: +	 * +	 * The backlight is controlled using a standard firmware interface. +	 */  	BACKLIGHT_FIRMWARE, + +	/** +	 * @BACKLIGHT_TYPE_MAX: Number of entries. +	 */  	BACKLIGHT_TYPE_MAX,  }; +/** + * enum backlight_notification - the type of notification + * + * The notifications that is used for notification sent to the receiver + * that registered notifications using backlight_register_notifier(). + */  enum backlight_notification { +	/** +	 * @BACKLIGHT_REGISTERED: The backlight device is registered. +	 */  	BACKLIGHT_REGISTERED, + +	/** +	 * @BACKLIGHT_UNREGISTERED: The backlight revice is unregistered. +	 */  	BACKLIGHT_UNREGISTERED,  }; +/** enum backlight_scale - the type of scale used for brightness values + * + * The type of scale used for brightness values. + */  enum backlight_scale { +	/** +	 * @BACKLIGHT_SCALE_UNKNOWN: The scale is unknown. +	 */  	BACKLIGHT_SCALE_UNKNOWN = 0, + +	/** +	 * @BACKLIGHT_SCALE_LINEAR: The scale is linear. +	 * +	 * The linear scale will increase brightness the same for each step. +	 */  	BACKLIGHT_SCALE_LINEAR, + +	/** +	 * @BACKLIGHT_SCALE_NON_LINEAR: The scale is not linear. +	 * +	 * This is often used when the brightness values tries to adjust to +	 * the relative perception of the eye demanding a non-linear scale. +	 */  	BACKLIGHT_SCALE_NON_LINEAR,  };  struct backlight_device;  struct fb_info; +/** + * struct backlight_ops - backlight operations + * + * The backlight operations are specified when the backlight device is registered. + */  struct backlight_ops { +	/** +	 * @options: Configure how operations are called from the core. +	 * +	 * The options parameter is used to adjust the behaviour of the core. +	 * Set BL_CORE_SUSPENDRESUME to get the update_status() operation called +	 * upon suspend and resume. +	 */  	unsigned int options;  #define BL_CORE_SUSPENDRESUME	(1 << 0) -	/* Notify the backlight driver some property has changed */ +	/** +	 * @update_status: Operation called when properties have changed. +	 * +	 * Notify the backlight driver some property has changed. +	 * The update_status operation is protected by the update_lock. +	 * +	 * The backlight driver is expected to use backlight_is_blank() +	 * to check if the display is blanked and set brightness accordingly. +	 * update_status() is called when any of the properties has changed. +	 * +	 * RETURNS: +	 * +	 * 0 on success, negative error code if any failure occurred. +	 */  	int (*update_status)(struct backlight_device *); -	/* Return the current backlight brightness (accounting for power, -	   fb_blank etc.) */ + +	/** +	 * @get_brightness: Return the current backlight brightness. +	 * +	 * The driver may implement this as a readback from the HW. +	 * This operation is optional and if not present then the current +	 * brightness property value is used. +	 * +	 * RETURNS: +	 * +	 * A brightness value which is 0 or a positive number. +	 * On failure a negative error code is returned. +	 */  	int (*get_brightness)(struct backlight_device *); -	/* Check if given framebuffer device is the one bound to this backlight; -	   return 0 if not, !=0 if it is. If NULL, backlight always matches the fb. */ -	int (*check_fb)(struct backlight_device *, struct fb_info *); + +	/** +	 * @check_fb: Check the framebuffer device. +	 * +	 * Check if given framebuffer device is the one bound to this backlight. +	 * This operation is optional and if not implemented it is assumed that the +	 * fbdev is always the one bound to the backlight. +	 * +	 * RETURNS: +	 * +	 * If info is NULL or the info matches the fbdev bound to the backlight return true. +	 * If info does not match the fbdev bound to the backlight return false. +	 */ +	int (*check_fb)(struct backlight_device *bd, struct fb_info *info);  }; -/* This structure defines all the properties of a backlight */ +/** + * struct backlight_properties - backlight properties + * + * This structure defines all the properties of a backlight. + */  struct backlight_properties { -	/* Current User requested brightness (0 - max_brightness) */ +	/** +	 * @brightness: The current brightness requested by the user. +	 * +	 * The backlight core makes sure the range is (0 to max_brightness) +	 * when the brightness is set via the sysfs attribute: +	 * /sys/class/backlight/<backlight>/brightness. +	 * +	 * This value can be set in the backlight_properties passed +	 * to devm_backlight_device_register() to set a default brightness +	 * value. +	 */  	int brightness; -	/* Maximal value for brightness (read-only) */ + +	/** +	 * @max_brightness: The maximum brightness value. +	 * +	 * This value must be set in the backlight_properties passed to +	 * devm_backlight_device_register() and shall not be modified by the +	 * driver after registration. +	 */  	int max_brightness; -	/* Current FB Power mode (0: full on, 1..3: power saving -	   modes; 4: full off), see FB_BLANK_XXX */ + +	/** +	 * @power: The current power mode. +	 * +	 * User space can configure the power mode using the sysfs +	 * attribute: /sys/class/backlight/<backlight>/bl_power +	 * When the power property is updated update_status() is called. +	 * +	 * The possible values are: (0: full on, 1 to 3: power saving +	 * modes; 4: full off), see FB_BLANK_XXX. +	 * +	 * When the backlight device is enabled @power is set +	 * to FB_BLANK_UNBLANK. When the backlight device is disabled +	 * @power is set to FB_BLANK_POWERDOWN. +	 */  	int power; -	/* FB Blanking active? (values as for power) */ -	/* Due to be removed, please use (state & BL_CORE_FBBLANK) */ + +	/** +	 * @fb_blank: The power state from the FBIOBLANK ioctl. +	 * +	 * When the FBIOBLANK ioctl is called @fb_blank is set to the +	 * blank parameter and the update_status() operation is called. +	 * +	 * When the backlight device is enabled @fb_blank is set +	 * to FB_BLANK_UNBLANK. When the backlight device is disabled +	 * @fb_blank is set to FB_BLANK_POWERDOWN. +	 * +	 * Backlight drivers should avoid using this property. It has been +	 * replaced by state & BL_CORE_FBLANK (although most drivers should +	 * use backlight_is_blank() as the preferred means to get the blank +	 * state). +	 * +	 * fb_blank is deprecated and will be removed. +	 */  	int fb_blank; -	/* Backlight type */ + +	/** +	 * @type: The type of backlight supported. +	 * +	 * The backlight type allows userspace to make appropriate +	 * policy decisions based on the backlight type. +	 * +	 * This value must be set in the backlight_properties +	 * passed to devm_backlight_device_register(). +	 */  	enum backlight_type type; -	/* Flags used to signal drivers of state changes */ + +	/** +	 * @state: The state of the backlight core. +	 * +	 * The state is a bitmask. BL_CORE_FBBLANK is set when the display +	 * is expected to be blank. BL_CORE_SUSPENDED is set when the +	 * driver is suspended. +	 * +	 * backlight drivers are expected to use backlight_is_blank() +	 * in their update_status() operation rather than reading the +	 * state property. +	 * +	 * The state is maintained by the core and drivers may not modify it. +	 */  	unsigned int state; -	/* Type of the brightness scale (linear, non-linear, ...) */ -	enum backlight_scale scale;  #define BL_CORE_SUSPENDED	(1 << 0)	/* backlight is suspended */  #define BL_CORE_FBBLANK		(1 << 1)	/* backlight is under an fb blank event */ +	/** +	 * @scale: The type of the brightness scale. +	 */ +	enum backlight_scale scale;  }; +/** + * struct backlight_device - backlight device data + * + * This structure holds all data required by a backlight device. + */  struct backlight_device { -	/* Backlight properties */ +	/** +	 * @props: Backlight properties +	 */  	struct backlight_properties props; -	/* Serialise access to update_status method */ +	/** +	 * @update_lock: The lock used when calling the update_status() operation. +	 * +	 * update_lock is an internal backlight lock that serialise access +	 * to the update_status() operation. The backlight core holds the update_lock +	 * when calling the update_status() operation. The update_lock shall not +	 * be used by backlight drivers. +	 */  	struct mutex update_lock; -	/* This protects the 'ops' field. If 'ops' is NULL, the driver that -	   registered this device has been unloaded, and if class_get_devdata() -	   points to something in the body of that driver, it is also invalid. */ +	/** +	 * @ops_lock: The lock used around everything related to backlight_ops. +	 * +	 * ops_lock is an internal backlight lock that protects the ops pointer +	 * and is used around all accesses to ops and when the operations are +	 * invoked. The ops_lock shall not be used by backlight drivers. +	 */  	struct mutex ops_lock; + +	/** +	 * @ops: Pointer to the backlight operations. +	 * +	 * If ops is NULL, the driver that registered this device has been unloaded, +	 * and if class_get_devdata() points to something in the body of that driver, +	 * it is also invalid. +	 */  	const struct backlight_ops *ops; -	/* The framebuffer notifier block */ +	/** +	 * @fb_notif: The framebuffer notifier block +	 */  	struct notifier_block fb_notif; -	/* list entry of all registered backlight devices */ +	/** +	 * @entry: List entry of all registered backlight devices +	 */  	struct list_head entry; +	/** +	 * @dev: Parent device. +	 */  	struct device dev; -	/* Multiple framebuffers may share one backlight device */ +	/** +	 * @fb_bl_on: The state of individual fbdev's. +	 * +	 * Multiple fbdev's may share one backlight device. The fb_bl_on +	 * records the state of the individual fbdev. +	 */  	bool fb_bl_on[FB_MAX]; +	/** +	 * @use_count: The number of uses of fb_bl_on. +	 */  	int use_count;  }; +/** + * backlight_update_status - force an update of the backlight device status + * @bd: the backlight device + */  static inline int backlight_update_status(struct backlight_device *bd)  {  	int ret = -ENOENT; @@ -166,49 +389,83 @@ static inline int backlight_disable(struct backlight_device *bd)  }  /** - * backlight_put - Drop backlight reference - * @bd: the backlight device to put + * backlight_is_blank - Return true if display is expected to be blank + * @bd: the backlight device + * + * Display is expected to be blank if any of these is true:: + * + *   1) if power in not UNBLANK + *   2) if fb_blank is not UNBLANK + *   3) if state indicate BLANK or SUSPENDED + * + * Returns true if display is expected to be blank, false otherwise.   */ -static inline void backlight_put(struct backlight_device *bd) +static inline bool backlight_is_blank(const struct backlight_device *bd)  { -	if (bd) -		put_device(&bd->dev); +	return bd->props.power != FB_BLANK_UNBLANK || +	       bd->props.fb_blank != FB_BLANK_UNBLANK || +	       bd->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK);  } -extern struct backlight_device *backlight_device_register(const char *name, -	struct device *dev, void *devdata, const struct backlight_ops *ops, -	const struct backlight_properties *props); -extern struct backlight_device *devm_backlight_device_register( -	struct device *dev, const char *name, struct device *parent, -	void *devdata, const struct backlight_ops *ops, -	const struct backlight_properties *props); -extern void backlight_device_unregister(struct backlight_device *bd); -extern void devm_backlight_device_unregister(struct device *dev, -					struct backlight_device *bd); -extern void backlight_force_update(struct backlight_device *bd, -				   enum backlight_update_reason reason); -extern int backlight_register_notifier(struct notifier_block *nb); -extern int backlight_unregister_notifier(struct notifier_block *nb); -extern struct backlight_device *backlight_device_get_by_type(enum backlight_type type); +/** + * backlight_get_brightness - Returns the current brightness value + * @bd: the backlight device + * + * Returns the current brightness value, taking in consideration the current + * state. If backlight_is_blank() returns true then return 0 as brightness + * otherwise return the current brightness property value. + * + * Backlight drivers are expected to use this function in their update_status() + * operation to get the brightness value. + */ +static inline int backlight_get_brightness(const struct backlight_device *bd) +{ +	if (backlight_is_blank(bd)) +		return 0; +	else +		return bd->props.brightness; +} + +struct backlight_device * +backlight_device_register(const char *name, struct device *dev, void *devdata, +			  const struct backlight_ops *ops, +			  const struct backlight_properties *props); +struct backlight_device * +devm_backlight_device_register(struct device *dev, const char *name, +			       struct device *parent, void *devdata, +			       const struct backlight_ops *ops, +			       const struct backlight_properties *props); +void backlight_device_unregister(struct backlight_device *bd); +void devm_backlight_device_unregister(struct device *dev, +				      struct backlight_device *bd); +void backlight_force_update(struct backlight_device *bd, +			    enum backlight_update_reason reason); +int backlight_register_notifier(struct notifier_block *nb); +int backlight_unregister_notifier(struct notifier_block *nb);  struct backlight_device *backlight_device_get_by_name(const char *name); -extern int backlight_device_set_brightness(struct backlight_device *bd, unsigned long brightness); +struct backlight_device *backlight_device_get_by_type(enum backlight_type type); +int backlight_device_set_brightness(struct backlight_device *bd, +				    unsigned long brightness);  #define to_backlight_device(obj) container_of(obj, struct backlight_device, dev) +/** + * bl_get_data - access devdata + * @bl_dev: pointer to backlight device + * + * When a backlight device is registered the driver has the possibility + * to supply a void * devdata. bl_get_data() return a pointer to the + * devdata. + * + * RETURNS: + * + * pointer to devdata stored while registering the backlight device. + */  static inline void * bl_get_data(struct backlight_device *bl_dev)  {  	return dev_get_drvdata(&bl_dev->dev);  } -struct generic_bl_info { -	const char *name; -	int max_intensity; -	int default_intensity; -	int limit_mask; -	void (*set_bl_intensity)(int intensity); -	void (*kick_battery)(void); -}; -  #ifdef CONFIG_OF  struct backlight_device *of_find_backlight_by_node(struct device_node *node);  #else @@ -220,14 +477,8 @@ of_find_backlight_by_node(struct device_node *node)  #endif  #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE) -struct backlight_device *of_find_backlight(struct device *dev);  struct backlight_device *devm_of_find_backlight(struct device *dev);  #else -static inline struct backlight_device *of_find_backlight(struct device *dev) -{ -	return NULL; -} -  static inline struct backlight_device *  devm_of_find_backlight(struct device *dev)  {  |