LCOV - code coverage report
Current view: top level - include/linux - backlight.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 17 0.0 %
Date: 2023-03-27 20:00:47 Functions: 0 1 0.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : /*
       3             :  * Backlight Lowlevel Control Abstraction
       4             :  *
       5             :  * Copyright (C) 2003,2004 Hewlett-Packard Company
       6             :  *
       7             :  */
       8             : 
       9             : #ifndef _LINUX_BACKLIGHT_H
      10             : #define _LINUX_BACKLIGHT_H
      11             : 
      12             : #include <linux/device.h>
      13             : #include <linux/fb.h>
      14             : #include <linux/mutex.h>
      15             : #include <linux/notifier.h>
      16             : 
      17             : /**
      18             :  * enum backlight_update_reason - what method was used to update backlight
      19             :  *
      20             :  * A driver indicates the method (reason) used for updating the backlight
      21             :  * when calling backlight_force_update().
      22             :  */
      23             : enum backlight_update_reason {
      24             :         /**
      25             :          * @BACKLIGHT_UPDATE_HOTKEY: The backlight was updated using a hot-key.
      26             :          */
      27             :         BACKLIGHT_UPDATE_HOTKEY,
      28             : 
      29             :         /**
      30             :          * @BACKLIGHT_UPDATE_SYSFS: The backlight was updated using sysfs.
      31             :          */
      32             :         BACKLIGHT_UPDATE_SYSFS,
      33             : };
      34             : 
      35             : /**
      36             :  * enum backlight_type - the type of backlight control
      37             :  *
      38             :  * The type of interface used to control the backlight.
      39             :  */
      40             : enum backlight_type {
      41             :         /**
      42             :          * @BACKLIGHT_RAW:
      43             :          *
      44             :          * The backlight is controlled using hardware registers.
      45             :          */
      46             :         BACKLIGHT_RAW = 1,
      47             : 
      48             :         /**
      49             :          * @BACKLIGHT_PLATFORM:
      50             :          *
      51             :          * The backlight is controlled using a platform-specific interface.
      52             :          */
      53             :         BACKLIGHT_PLATFORM,
      54             : 
      55             :         /**
      56             :          * @BACKLIGHT_FIRMWARE:
      57             :          *
      58             :          * The backlight is controlled using a standard firmware interface.
      59             :          */
      60             :         BACKLIGHT_FIRMWARE,
      61             : 
      62             :         /**
      63             :          * @BACKLIGHT_TYPE_MAX: Number of entries.
      64             :          */
      65             :         BACKLIGHT_TYPE_MAX,
      66             : };
      67             : 
      68             : /**
      69             :  * enum backlight_notification - the type of notification
      70             :  *
      71             :  * The notifications that is used for notification sent to the receiver
      72             :  * that registered notifications using backlight_register_notifier().
      73             :  */
      74             : enum backlight_notification {
      75             :         /**
      76             :          * @BACKLIGHT_REGISTERED: The backlight device is registered.
      77             :          */
      78             :         BACKLIGHT_REGISTERED,
      79             : 
      80             :         /**
      81             :          * @BACKLIGHT_UNREGISTERED: The backlight revice is unregistered.
      82             :          */
      83             :         BACKLIGHT_UNREGISTERED,
      84             : };
      85             : 
      86             : /** enum backlight_scale - the type of scale used for brightness values
      87             :  *
      88             :  * The type of scale used for brightness values.
      89             :  */
      90             : enum backlight_scale {
      91             :         /**
      92             :          * @BACKLIGHT_SCALE_UNKNOWN: The scale is unknown.
      93             :          */
      94             :         BACKLIGHT_SCALE_UNKNOWN = 0,
      95             : 
      96             :         /**
      97             :          * @BACKLIGHT_SCALE_LINEAR: The scale is linear.
      98             :          *
      99             :          * The linear scale will increase brightness the same for each step.
     100             :          */
     101             :         BACKLIGHT_SCALE_LINEAR,
     102             : 
     103             :         /**
     104             :          * @BACKLIGHT_SCALE_NON_LINEAR: The scale is not linear.
     105             :          *
     106             :          * This is often used when the brightness values tries to adjust to
     107             :          * the relative perception of the eye demanding a non-linear scale.
     108             :          */
     109             :         BACKLIGHT_SCALE_NON_LINEAR,
     110             : };
     111             : 
     112             : struct backlight_device;
     113             : struct fb_info;
     114             : 
     115             : /**
     116             :  * struct backlight_ops - backlight operations
     117             :  *
     118             :  * The backlight operations are specified when the backlight device is registered.
     119             :  */
     120             : struct backlight_ops {
     121             :         /**
     122             :          * @options: Configure how operations are called from the core.
     123             :          *
     124             :          * The options parameter is used to adjust the behaviour of the core.
     125             :          * Set BL_CORE_SUSPENDRESUME to get the update_status() operation called
     126             :          * upon suspend and resume.
     127             :          */
     128             :         unsigned int options;
     129             : 
     130             : #define BL_CORE_SUSPENDRESUME   (1 << 0)
     131             : 
     132             :         /**
     133             :          * @update_status: Operation called when properties have changed.
     134             :          *
     135             :          * Notify the backlight driver some property has changed.
     136             :          * The update_status operation is protected by the update_lock.
     137             :          *
     138             :          * The backlight driver is expected to use backlight_is_blank()
     139             :          * to check if the display is blanked and set brightness accordingly.
     140             :          * update_status() is called when any of the properties has changed.
     141             :          *
     142             :          * RETURNS:
     143             :          *
     144             :          * 0 on success, negative error code if any failure occurred.
     145             :          */
     146             :         int (*update_status)(struct backlight_device *);
     147             : 
     148             :         /**
     149             :          * @get_brightness: Return the current backlight brightness.
     150             :          *
     151             :          * The driver may implement this as a readback from the HW.
     152             :          * This operation is optional and if not present then the current
     153             :          * brightness property value is used.
     154             :          *
     155             :          * RETURNS:
     156             :          *
     157             :          * A brightness value which is 0 or a positive number.
     158             :          * On failure a negative error code is returned.
     159             :          */
     160             :         int (*get_brightness)(struct backlight_device *);
     161             : 
     162             :         /**
     163             :          * @check_fb: Check the framebuffer device.
     164             :          *
     165             :          * Check if given framebuffer device is the one bound to this backlight.
     166             :          * This operation is optional and if not implemented it is assumed that the
     167             :          * fbdev is always the one bound to the backlight.
     168             :          *
     169             :          * RETURNS:
     170             :          *
     171             :          * If info is NULL or the info matches the fbdev bound to the backlight return true.
     172             :          * If info does not match the fbdev bound to the backlight return false.
     173             :          */
     174             :         int (*check_fb)(struct backlight_device *bd, struct fb_info *info);
     175             : };
     176             : 
     177             : /**
     178             :  * struct backlight_properties - backlight properties
     179             :  *
     180             :  * This structure defines all the properties of a backlight.
     181             :  */
     182             : struct backlight_properties {
     183             :         /**
     184             :          * @brightness: The current brightness requested by the user.
     185             :          *
     186             :          * The backlight core makes sure the range is (0 to max_brightness)
     187             :          * when the brightness is set via the sysfs attribute:
     188             :          * /sys/class/backlight/<backlight>/brightness.
     189             :          *
     190             :          * This value can be set in the backlight_properties passed
     191             :          * to devm_backlight_device_register() to set a default brightness
     192             :          * value.
     193             :          */
     194             :         int brightness;
     195             : 
     196             :         /**
     197             :          * @max_brightness: The maximum brightness value.
     198             :          *
     199             :          * This value must be set in the backlight_properties passed to
     200             :          * devm_backlight_device_register() and shall not be modified by the
     201             :          * driver after registration.
     202             :          */
     203             :         int max_brightness;
     204             : 
     205             :         /**
     206             :          * @power: The current power mode.
     207             :          *
     208             :          * User space can configure the power mode using the sysfs
     209             :          * attribute: /sys/class/backlight/<backlight>/bl_power
     210             :          * When the power property is updated update_status() is called.
     211             :          *
     212             :          * The possible values are: (0: full on, 1 to 3: power saving
     213             :          * modes; 4: full off), see FB_BLANK_XXX.
     214             :          *
     215             :          * When the backlight device is enabled @power is set
     216             :          * to FB_BLANK_UNBLANK. When the backlight device is disabled
     217             :          * @power is set to FB_BLANK_POWERDOWN.
     218             :          */
     219             :         int power;
     220             : 
     221             :         /**
     222             :          * @fb_blank: The power state from the FBIOBLANK ioctl.
     223             :          *
     224             :          * When the FBIOBLANK ioctl is called @fb_blank is set to the
     225             :          * blank parameter and the update_status() operation is called.
     226             :          *
     227             :          * When the backlight device is enabled @fb_blank is set
     228             :          * to FB_BLANK_UNBLANK. When the backlight device is disabled
     229             :          * @fb_blank is set to FB_BLANK_POWERDOWN.
     230             :          *
     231             :          * Backlight drivers should avoid using this property. It has been
     232             :          * replaced by state & BL_CORE_FBLANK (although most drivers should
     233             :          * use backlight_is_blank() as the preferred means to get the blank
     234             :          * state).
     235             :          *
     236             :          * fb_blank is deprecated and will be removed.
     237             :          */
     238             :         int fb_blank;
     239             : 
     240             :         /**
     241             :          * @type: The type of backlight supported.
     242             :          *
     243             :          * The backlight type allows userspace to make appropriate
     244             :          * policy decisions based on the backlight type.
     245             :          *
     246             :          * This value must be set in the backlight_properties
     247             :          * passed to devm_backlight_device_register().
     248             :          */
     249             :         enum backlight_type type;
     250             : 
     251             :         /**
     252             :          * @state: The state of the backlight core.
     253             :          *
     254             :          * The state is a bitmask. BL_CORE_FBBLANK is set when the display
     255             :          * is expected to be blank. BL_CORE_SUSPENDED is set when the
     256             :          * driver is suspended.
     257             :          *
     258             :          * backlight drivers are expected to use backlight_is_blank()
     259             :          * in their update_status() operation rather than reading the
     260             :          * state property.
     261             :          *
     262             :          * The state is maintained by the core and drivers may not modify it.
     263             :          */
     264             :         unsigned int state;
     265             : 
     266             : #define BL_CORE_SUSPENDED       (1 << 0)  /* backlight is suspended */
     267             : #define BL_CORE_FBBLANK         (1 << 1)  /* backlight is under an fb blank event */
     268             : 
     269             :         /**
     270             :          * @scale: The type of the brightness scale.
     271             :          */
     272             :         enum backlight_scale scale;
     273             : };
     274             : 
     275             : /**
     276             :  * struct backlight_device - backlight device data
     277             :  *
     278             :  * This structure holds all data required by a backlight device.
     279             :  */
     280             : struct backlight_device {
     281             :         /**
     282             :          * @props: Backlight properties
     283             :          */
     284             :         struct backlight_properties props;
     285             : 
     286             :         /**
     287             :          * @update_lock: The lock used when calling the update_status() operation.
     288             :          *
     289             :          * update_lock is an internal backlight lock that serialise access
     290             :          * to the update_status() operation. The backlight core holds the update_lock
     291             :          * when calling the update_status() operation. The update_lock shall not
     292             :          * be used by backlight drivers.
     293             :          */
     294             :         struct mutex update_lock;
     295             : 
     296             :         /**
     297             :          * @ops_lock: The lock used around everything related to backlight_ops.
     298             :          *
     299             :          * ops_lock is an internal backlight lock that protects the ops pointer
     300             :          * and is used around all accesses to ops and when the operations are
     301             :          * invoked. The ops_lock shall not be used by backlight drivers.
     302             :          */
     303             :         struct mutex ops_lock;
     304             : 
     305             :         /**
     306             :          * @ops: Pointer to the backlight operations.
     307             :          *
     308             :          * If ops is NULL, the driver that registered this device has been unloaded,
     309             :          * and if class_get_devdata() points to something in the body of that driver,
     310             :          * it is also invalid.
     311             :          */
     312             :         const struct backlight_ops *ops;
     313             : 
     314             :         /**
     315             :          * @fb_notif: The framebuffer notifier block
     316             :          */
     317             :         struct notifier_block fb_notif;
     318             : 
     319             :         /**
     320             :          * @entry: List entry of all registered backlight devices
     321             :          */
     322             :         struct list_head entry;
     323             : 
     324             :         /**
     325             :          * @dev: Parent device.
     326             :          */
     327             :         struct device dev;
     328             : 
     329             :         /**
     330             :          * @fb_bl_on: The state of individual fbdev's.
     331             :          *
     332             :          * Multiple fbdev's may share one backlight device. The fb_bl_on
     333             :          * records the state of the individual fbdev.
     334             :          */
     335             :         bool fb_bl_on[FB_MAX];
     336             : 
     337             :         /**
     338             :          * @use_count: The number of uses of fb_bl_on.
     339             :          */
     340             :         int use_count;
     341             : };
     342             : 
     343             : /**
     344             :  * backlight_update_status - force an update of the backlight device status
     345             :  * @bd: the backlight device
     346             :  */
     347           0 : static inline int backlight_update_status(struct backlight_device *bd)
     348             : {
     349           0 :         int ret = -ENOENT;
     350             : 
     351           0 :         mutex_lock(&bd->update_lock);
     352           0 :         if (bd->ops && bd->ops->update_status)
     353           0 :                 ret = bd->ops->update_status(bd);
     354           0 :         mutex_unlock(&bd->update_lock);
     355             : 
     356           0 :         return ret;
     357             : }
     358             : 
     359             : /**
     360             :  * backlight_enable - Enable backlight
     361             :  * @bd: the backlight device to enable
     362             :  */
     363             : static inline int backlight_enable(struct backlight_device *bd)
     364             : {
     365           0 :         if (!bd)
     366             :                 return 0;
     367             : 
     368           0 :         bd->props.power = FB_BLANK_UNBLANK;
     369           0 :         bd->props.fb_blank = FB_BLANK_UNBLANK;
     370           0 :         bd->props.state &= ~BL_CORE_FBBLANK;
     371             : 
     372           0 :         return backlight_update_status(bd);
     373             : }
     374             : 
     375             : /**
     376             :  * backlight_disable - Disable backlight
     377             :  * @bd: the backlight device to disable
     378             :  */
     379             : static inline int backlight_disable(struct backlight_device *bd)
     380             : {
     381           0 :         if (!bd)
     382             :                 return 0;
     383             : 
     384           0 :         bd->props.power = FB_BLANK_POWERDOWN;
     385           0 :         bd->props.fb_blank = FB_BLANK_POWERDOWN;
     386           0 :         bd->props.state |= BL_CORE_FBBLANK;
     387             : 
     388           0 :         return backlight_update_status(bd);
     389             : }
     390             : 
     391             : /**
     392             :  * backlight_is_blank - Return true if display is expected to be blank
     393             :  * @bd: the backlight device
     394             :  *
     395             :  * Display is expected to be blank if any of these is true::
     396             :  *
     397             :  *   1) if power in not UNBLANK
     398             :  *   2) if fb_blank is not UNBLANK
     399             :  *   3) if state indicate BLANK or SUSPENDED
     400             :  *
     401             :  * Returns true if display is expected to be blank, false otherwise.
     402             :  */
     403             : static inline bool backlight_is_blank(const struct backlight_device *bd)
     404             : {
     405             :         return bd->props.power != FB_BLANK_UNBLANK ||
     406             :                bd->props.fb_blank != FB_BLANK_UNBLANK ||
     407             :                bd->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK);
     408             : }
     409             : 
     410             : /**
     411             :  * backlight_get_brightness - Returns the current brightness value
     412             :  * @bd: the backlight device
     413             :  *
     414             :  * Returns the current brightness value, taking in consideration the current
     415             :  * state. If backlight_is_blank() returns true then return 0 as brightness
     416             :  * otherwise return the current brightness property value.
     417             :  *
     418             :  * Backlight drivers are expected to use this function in their update_status()
     419             :  * operation to get the brightness value.
     420             :  */
     421             : static inline int backlight_get_brightness(const struct backlight_device *bd)
     422             : {
     423             :         if (backlight_is_blank(bd))
     424             :                 return 0;
     425             :         else
     426             :                 return bd->props.brightness;
     427             : }
     428             : 
     429             : struct backlight_device *
     430             : backlight_device_register(const char *name, struct device *dev, void *devdata,
     431             :                           const struct backlight_ops *ops,
     432             :                           const struct backlight_properties *props);
     433             : struct backlight_device *
     434             : devm_backlight_device_register(struct device *dev, const char *name,
     435             :                                struct device *parent, void *devdata,
     436             :                                const struct backlight_ops *ops,
     437             :                                const struct backlight_properties *props);
     438             : void backlight_device_unregister(struct backlight_device *bd);
     439             : void devm_backlight_device_unregister(struct device *dev,
     440             :                                       struct backlight_device *bd);
     441             : void backlight_force_update(struct backlight_device *bd,
     442             :                             enum backlight_update_reason reason);
     443             : int backlight_register_notifier(struct notifier_block *nb);
     444             : int backlight_unregister_notifier(struct notifier_block *nb);
     445             : struct backlight_device *backlight_device_get_by_name(const char *name);
     446             : struct backlight_device *backlight_device_get_by_type(enum backlight_type type);
     447             : int backlight_device_set_brightness(struct backlight_device *bd,
     448             :                                     unsigned long brightness);
     449             : 
     450             : #define to_backlight_device(obj) container_of(obj, struct backlight_device, dev)
     451             : 
     452             : /**
     453             :  * bl_get_data - access devdata
     454             :  * @bl_dev: pointer to backlight device
     455             :  *
     456             :  * When a backlight device is registered the driver has the possibility
     457             :  * to supply a void * devdata. bl_get_data() return a pointer to the
     458             :  * devdata.
     459             :  *
     460             :  * RETURNS:
     461             :  *
     462             :  * pointer to devdata stored while registering the backlight device.
     463             :  */
     464             : static inline void * bl_get_data(struct backlight_device *bl_dev)
     465             : {
     466             :         return dev_get_drvdata(&bl_dev->dev);
     467             : }
     468             : 
     469             : #ifdef CONFIG_OF
     470             : struct backlight_device *of_find_backlight_by_node(struct device_node *node);
     471             : #else
     472             : static inline struct backlight_device *
     473             : of_find_backlight_by_node(struct device_node *node)
     474             : {
     475             :         return NULL;
     476             : }
     477             : #endif
     478             : 
     479             : #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
     480             : struct backlight_device *devm_of_find_backlight(struct device *dev);
     481             : #else
     482             : static inline struct backlight_device *
     483             : devm_of_find_backlight(struct device *dev)
     484             : {
     485             :         return NULL;
     486             : }
     487             : #endif
     488             : 
     489             : #endif

Generated by: LCOV version 1.14