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