11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * Backlight Lowlevel Control Abstraction 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Copyright (C) 2003,2004 Hewlett-Packard Company 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds */ 71da177e4SLinus Torvalds 81da177e4SLinus Torvalds #ifndef _LINUX_BACKLIGHT_H 91da177e4SLinus Torvalds #define _LINUX_BACKLIGHT_H 101da177e4SLinus Torvalds 111da177e4SLinus Torvalds #include <linux/device.h> 1228ee086dSRichard Purdie #include <linux/mutex.h> 131da177e4SLinus Torvalds #include <linux/notifier.h> 141da177e4SLinus Torvalds 1528ee086dSRichard Purdie /* Notes on locking: 1628ee086dSRichard Purdie * 17599a52d1SRichard Purdie * backlight_device->ops_lock is an internal backlight lock protecting the 18599a52d1SRichard Purdie * ops pointer and no code outside the core should need to touch it. 1928ee086dSRichard Purdie * 2028ee086dSRichard Purdie * Access to update_status() is serialised by the update_lock mutex since 2128ee086dSRichard Purdie * most drivers seem to need this and historically get it wrong. 2228ee086dSRichard Purdie * 2328ee086dSRichard Purdie * Most drivers don't need locking on their get_brightness() method. 2428ee086dSRichard Purdie * If yours does, you need to implement it in the driver. You can use the 2528ee086dSRichard Purdie * update_lock mutex if appropriate. 2628ee086dSRichard Purdie * 2728ee086dSRichard Purdie * Any other use of the locks below is probably wrong. 2828ee086dSRichard Purdie */ 2928ee086dSRichard Purdie 30325253a6SMatthew Garrett enum backlight_update_reason { 31325253a6SMatthew Garrett BACKLIGHT_UPDATE_HOTKEY, 32325253a6SMatthew Garrett BACKLIGHT_UPDATE_SYSFS, 33325253a6SMatthew Garrett }; 34325253a6SMatthew Garrett 35*bb7ca747SMatthew Garrett enum backlight_type { 36*bb7ca747SMatthew Garrett BACKLIGHT_RAW = 1, 37*bb7ca747SMatthew Garrett BACKLIGHT_PLATFORM, 38*bb7ca747SMatthew Garrett BACKLIGHT_FIRMWARE, 39*bb7ca747SMatthew Garrett BACKLIGHT_TYPE_MAX, 40*bb7ca747SMatthew Garrett }; 41*bb7ca747SMatthew Garrett 421da177e4SLinus Torvalds struct backlight_device; 431da177e4SLinus Torvalds struct fb_info; 441da177e4SLinus Torvalds 45599a52d1SRichard Purdie struct backlight_ops { 46b4144e4fSRichard Purdie unsigned int options; 47c835ee7fSRichard Purdie 48c835ee7fSRichard Purdie #define BL_CORE_SUSPENDRESUME (1 << 0) 49c835ee7fSRichard Purdie 506ca01765SRichard Purdie /* Notify the backlight driver some property has changed */ 51b4144e4fSRichard Purdie int (*update_status)(struct backlight_device *); 526ca01765SRichard Purdie /* Return the current backlight brightness (accounting for power, 536ca01765SRichard Purdie fb_blank etc.) */ 54b4144e4fSRichard Purdie int (*get_brightness)(struct backlight_device *); 551da177e4SLinus Torvalds /* Check if given framebuffer device is the one bound to this backlight; 561da177e4SLinus Torvalds return 0 if not, !=0 if it is. If NULL, backlight always matches the fb. */ 5757e148b6SBruno Prémont int (*check_fb)(struct backlight_device *, struct fb_info *); 58599a52d1SRichard Purdie }; 596ca01765SRichard Purdie 60599a52d1SRichard Purdie /* This structure defines all the properties of a backlight */ 61599a52d1SRichard Purdie struct backlight_properties { 626ca01765SRichard Purdie /* Current User requested brightness (0 - max_brightness) */ 636ca01765SRichard Purdie int brightness; 646ca01765SRichard Purdie /* Maximal value for brightness (read-only) */ 656ca01765SRichard Purdie int max_brightness; 666ca01765SRichard Purdie /* Current FB Power mode (0: full on, 1..3: power saving 676ca01765SRichard Purdie modes; 4: full off), see FB_BLANK_XXX */ 686ca01765SRichard Purdie int power; 696ca01765SRichard Purdie /* FB Blanking active? (values as for power) */ 70c835ee7fSRichard Purdie /* Due to be removed, please use (state & BL_CORE_FBBLANK) */ 716ca01765SRichard Purdie int fb_blank; 72*bb7ca747SMatthew Garrett /* Backlight type */ 73*bb7ca747SMatthew Garrett enum backlight_type type; 74c835ee7fSRichard Purdie /* Flags used to signal drivers of state changes */ 75c835ee7fSRichard Purdie /* Upper 4 bits are reserved for driver internal use */ 76c835ee7fSRichard Purdie unsigned int state; 77c835ee7fSRichard Purdie 78c835ee7fSRichard Purdie #define BL_CORE_SUSPENDED (1 << 0) /* backlight is suspended */ 79c835ee7fSRichard Purdie #define BL_CORE_FBBLANK (1 << 1) /* backlight is under an fb blank event */ 80c835ee7fSRichard Purdie #define BL_CORE_DRIVER4 (1 << 28) /* reserved for driver specific use */ 81c835ee7fSRichard Purdie #define BL_CORE_DRIVER3 (1 << 29) /* reserved for driver specific use */ 82c835ee7fSRichard Purdie #define BL_CORE_DRIVER2 (1 << 30) /* reserved for driver specific use */ 83c835ee7fSRichard Purdie #define BL_CORE_DRIVER1 (1 << 31) /* reserved for driver specific use */ 84c835ee7fSRichard Purdie 851da177e4SLinus Torvalds }; 861da177e4SLinus Torvalds 871da177e4SLinus Torvalds struct backlight_device { 88599a52d1SRichard Purdie /* Backlight properties */ 89599a52d1SRichard Purdie struct backlight_properties props; 90599a52d1SRichard Purdie 9128ee086dSRichard Purdie /* Serialise access to update_status method */ 9228ee086dSRichard Purdie struct mutex update_lock; 93599a52d1SRichard Purdie 94599a52d1SRichard Purdie /* This protects the 'ops' field. If 'ops' is NULL, the driver that 95599a52d1SRichard Purdie registered this device has been unloaded, and if class_get_devdata() 96599a52d1SRichard Purdie points to something in the body of that driver, it is also invalid. */ 97599a52d1SRichard Purdie struct mutex ops_lock; 989905a43bSEmese Revfy const struct backlight_ops *ops; 99599a52d1SRichard Purdie 1001da177e4SLinus Torvalds /* The framebuffer notifier block */ 1011da177e4SLinus Torvalds struct notifier_block fb_notif; 102655bfd7aSRichard Purdie 103655bfd7aSRichard Purdie struct device dev; 1041da177e4SLinus Torvalds }; 1051da177e4SLinus Torvalds 10628ee086dSRichard Purdie static inline void backlight_update_status(struct backlight_device *bd) 10728ee086dSRichard Purdie { 10828ee086dSRichard Purdie mutex_lock(&bd->update_lock); 109599a52d1SRichard Purdie if (bd->ops && bd->ops->update_status) 110599a52d1SRichard Purdie bd->ops->update_status(bd); 11128ee086dSRichard Purdie mutex_unlock(&bd->update_lock); 11228ee086dSRichard Purdie } 11328ee086dSRichard Purdie 1141da177e4SLinus Torvalds extern struct backlight_device *backlight_device_register(const char *name, 115a19a6ee6SMatthew Garrett struct device *dev, void *devdata, const struct backlight_ops *ops, 116a19a6ee6SMatthew Garrett const struct backlight_properties *props); 1171da177e4SLinus Torvalds extern void backlight_device_unregister(struct backlight_device *bd); 118325253a6SMatthew Garrett extern void backlight_force_update(struct backlight_device *bd, 119325253a6SMatthew Garrett enum backlight_update_reason reason); 1201da177e4SLinus Torvalds 121655bfd7aSRichard Purdie #define to_backlight_device(obj) container_of(obj, struct backlight_device, dev) 122655bfd7aSRichard Purdie 123655bfd7aSRichard Purdie static inline void * bl_get_data(struct backlight_device *bl_dev) 124655bfd7aSRichard Purdie { 125655bfd7aSRichard Purdie return dev_get_drvdata(&bl_dev->dev); 126655bfd7aSRichard Purdie } 1271da177e4SLinus Torvalds 128c3f8f650SRichard Purdie struct generic_bl_info { 129c3f8f650SRichard Purdie const char *name; 130c3f8f650SRichard Purdie int max_intensity; 131c3f8f650SRichard Purdie int default_intensity; 132c3f8f650SRichard Purdie int limit_mask; 133c3f8f650SRichard Purdie void (*set_bl_intensity)(int intensity); 134c3f8f650SRichard Purdie void (*kick_battery)(void); 135c3f8f650SRichard Purdie }; 136c3f8f650SRichard Purdie 1371da177e4SLinus Torvalds #endif 138