linux/include/linux/backlight.h
<<
>>
Prefs
   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/* Notes on locking:
  18 *
  19 * backlight_device->ops_lock is an internal backlight lock protecting the
  20 * ops pointer and no code outside the core should need to touch it.
  21 *
  22 * Access to update_status() is serialised by the update_lock mutex since
  23 * most drivers seem to need this and historically get it wrong.
  24 *
  25 * Most drivers don't need locking on their get_brightness() method.
  26 * If yours does, you need to implement it in the driver. You can use the
  27 * update_lock mutex if appropriate.
  28 *
  29 * Any other use of the locks below is probably wrong.
  30 */
  31
  32enum backlight_update_reason {
  33        BACKLIGHT_UPDATE_HOTKEY,
  34        BACKLIGHT_UPDATE_SYSFS,
  35};
  36
  37enum backlight_type {
  38        BACKLIGHT_RAW = 1,
  39        BACKLIGHT_PLATFORM,
  40        BACKLIGHT_FIRMWARE,
  41        BACKLIGHT_TYPE_MAX,
  42};
  43
  44enum backlight_notification {
  45        BACKLIGHT_REGISTERED,
  46        BACKLIGHT_UNREGISTERED,
  47};
  48
  49struct backlight_device;
  50struct fb_info;
  51
  52struct backlight_ops {
  53        unsigned int options;
  54
  55#define BL_CORE_SUSPENDRESUME   (1 << 0)
  56
  57        /* Notify the backlight driver some property has changed */
  58        int (*update_status)(struct backlight_device *);
  59        /* Return the current backlight brightness (accounting for power,
  60           fb_blank etc.) */
  61        int (*get_brightness)(struct backlight_device *);
  62        /* Check if given framebuffer device is the one bound to this backlight;
  63           return 0 if not, !=0 if it is. If NULL, backlight always matches the fb. */
  64        int (*check_fb)(struct backlight_device *, struct fb_info *);
  65};
  66
  67/* This structure defines all the properties of a backlight */
  68struct backlight_properties {
  69        /* Current User requested brightness (0 - max_brightness) */
  70        int brightness;
  71        /* Maximal value for brightness (read-only) */
  72        int max_brightness;
  73        /* Current FB Power mode (0: full on, 1..3: power saving
  74           modes; 4: full off), see FB_BLANK_XXX */
  75        int power;
  76        /* FB Blanking active? (values as for power) */
  77        /* Due to be removed, please use (state & BL_CORE_FBBLANK) */
  78        int fb_blank;
  79        /* Backlight type */
  80        enum backlight_type type;
  81        /* Flags used to signal drivers of state changes */
  82        /* Upper 4 bits are reserved for driver internal use */
  83        unsigned int state;
  84
  85#define BL_CORE_SUSPENDED       (1 << 0)        /* backlight is suspended */
  86#define BL_CORE_FBBLANK         (1 << 1)        /* backlight is under an fb blank event */
  87#define BL_CORE_DRIVER4         (1 << 28)       /* reserved for driver specific use */
  88#define BL_CORE_DRIVER3         (1 << 29)       /* reserved for driver specific use */
  89#define BL_CORE_DRIVER2         (1 << 30)       /* reserved for driver specific use */
  90#define BL_CORE_DRIVER1         (1 << 31)       /* reserved for driver specific use */
  91
  92};
  93
  94struct backlight_device {
  95        /* Backlight properties */
  96        struct backlight_properties props;
  97
  98        /* Serialise access to update_status method */
  99        struct mutex update_lock;
 100
 101        /* This protects the 'ops' field. If 'ops' is NULL, the driver that
 102           registered this device has been unloaded, and if class_get_devdata()
 103           points to something in the body of that driver, it is also invalid. */
 104        struct mutex ops_lock;
 105        const struct backlight_ops *ops;
 106
 107        /* The framebuffer notifier block */
 108        struct notifier_block fb_notif;
 109
 110        /* list entry of all registered backlight devices */
 111        struct list_head entry;
 112
 113        struct device dev;
 114
 115        /* Multiple framebuffers may share one backlight device */
 116        bool fb_bl_on[FB_MAX];
 117
 118        int use_count;
 119};
 120
 121static inline int backlight_update_status(struct backlight_device *bd)
 122{
 123        int ret = -ENOENT;
 124
 125        mutex_lock(&bd->update_lock);
 126        if (bd->ops && bd->ops->update_status)
 127                ret = bd->ops->update_status(bd);
 128        mutex_unlock(&bd->update_lock);
 129
 130        return ret;
 131}
 132
 133extern struct backlight_device *backlight_device_register(const char *name,
 134        struct device *dev, void *devdata, const struct backlight_ops *ops,
 135        const struct backlight_properties *props);
 136extern struct backlight_device *devm_backlight_device_register(
 137        struct device *dev, const char *name, struct device *parent,
 138        void *devdata, const struct backlight_ops *ops,
 139        const struct backlight_properties *props);
 140extern void backlight_device_unregister(struct backlight_device *bd);
 141extern void devm_backlight_device_unregister(struct device *dev,
 142                                        struct backlight_device *bd);
 143extern void backlight_force_update(struct backlight_device *bd,
 144                                   enum backlight_update_reason reason);
 145extern int backlight_register_notifier(struct notifier_block *nb);
 146extern int backlight_unregister_notifier(struct notifier_block *nb);
 147extern struct backlight_device *backlight_device_get_by_type(enum backlight_type type);
 148extern int backlight_device_set_brightness(struct backlight_device *bd, unsigned long brightness);
 149
 150#define to_backlight_device(obj) container_of(obj, struct backlight_device, dev)
 151
 152static inline void * bl_get_data(struct backlight_device *bl_dev)
 153{
 154        return dev_get_drvdata(&bl_dev->dev);
 155}
 156
 157struct generic_bl_info {
 158        const char *name;
 159        int max_intensity;
 160        int default_intensity;
 161        int limit_mask;
 162        void (*set_bl_intensity)(int intensity);
 163        void (*kick_battery)(void);
 164};
 165
 166#ifdef CONFIG_OF
 167struct backlight_device *of_find_backlight_by_node(struct device_node *node);
 168#else
 169static inline struct backlight_device *
 170of_find_backlight_by_node(struct device_node *node)
 171{
 172        return NULL;
 173}
 174#endif
 175
 176#endif
 177