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 301da177e4SLinus Torvalds struct backlight_device; 311da177e4SLinus Torvalds struct fb_info; 321da177e4SLinus Torvalds 33599a52d1SRichard Purdie struct backlight_ops { 346ca01765SRichard Purdie /* Notify the backlight driver some property has changed */ 356ca01765SRichard Purdie int (*update_status)(struct backlight_device *); 366ca01765SRichard Purdie /* Return the current backlight brightness (accounting for power, 376ca01765SRichard Purdie fb_blank etc.) */ 381da177e4SLinus Torvalds int (*get_brightness)(struct backlight_device *); 391da177e4SLinus Torvalds /* Check if given framebuffer device is the one bound to this backlight; 401da177e4SLinus Torvalds return 0 if not, !=0 if it is. If NULL, backlight always matches the fb. */ 411da177e4SLinus Torvalds int (*check_fb)(struct fb_info *); 42599a52d1SRichard Purdie }; 436ca01765SRichard Purdie 44599a52d1SRichard Purdie /* This structure defines all the properties of a backlight */ 45599a52d1SRichard Purdie struct backlight_properties { 466ca01765SRichard Purdie /* Current User requested brightness (0 - max_brightness) */ 476ca01765SRichard Purdie int brightness; 486ca01765SRichard Purdie /* Maximal value for brightness (read-only) */ 496ca01765SRichard Purdie int max_brightness; 506ca01765SRichard Purdie /* Current FB Power mode (0: full on, 1..3: power saving 516ca01765SRichard Purdie modes; 4: full off), see FB_BLANK_XXX */ 526ca01765SRichard Purdie int power; 536ca01765SRichard Purdie /* FB Blanking active? (values as for power) */ 546ca01765SRichard Purdie int fb_blank; 551da177e4SLinus Torvalds }; 561da177e4SLinus Torvalds 571da177e4SLinus Torvalds struct backlight_device { 58599a52d1SRichard Purdie /* Backlight properties */ 59599a52d1SRichard Purdie struct backlight_properties props; 60599a52d1SRichard Purdie 6128ee086dSRichard Purdie /* Serialise access to update_status method */ 6228ee086dSRichard Purdie struct mutex update_lock; 63599a52d1SRichard Purdie 64599a52d1SRichard Purdie /* This protects the 'ops' field. If 'ops' is NULL, the driver that 65599a52d1SRichard Purdie registered this device has been unloaded, and if class_get_devdata() 66599a52d1SRichard Purdie points to something in the body of that driver, it is also invalid. */ 67599a52d1SRichard Purdie struct mutex ops_lock; 68599a52d1SRichard Purdie struct backlight_ops *ops; 69599a52d1SRichard Purdie 701da177e4SLinus Torvalds /* The framebuffer notifier block */ 711da177e4SLinus Torvalds struct notifier_block fb_notif; 72655bfd7aSRichard Purdie 73655bfd7aSRichard Purdie struct device dev; 741da177e4SLinus Torvalds }; 751da177e4SLinus Torvalds 7628ee086dSRichard Purdie static inline void backlight_update_status(struct backlight_device *bd) 7728ee086dSRichard Purdie { 7828ee086dSRichard Purdie mutex_lock(&bd->update_lock); 79599a52d1SRichard Purdie if (bd->ops && bd->ops->update_status) 80599a52d1SRichard Purdie bd->ops->update_status(bd); 8128ee086dSRichard Purdie mutex_unlock(&bd->update_lock); 8228ee086dSRichard Purdie } 8328ee086dSRichard Purdie 841da177e4SLinus Torvalds extern struct backlight_device *backlight_device_register(const char *name, 85599a52d1SRichard Purdie struct device *dev, void *devdata, struct backlight_ops *ops); 861da177e4SLinus Torvalds extern void backlight_device_unregister(struct backlight_device *bd); 871da177e4SLinus Torvalds 88655bfd7aSRichard Purdie #define to_backlight_device(obj) container_of(obj, struct backlight_device, dev) 89655bfd7aSRichard Purdie 90655bfd7aSRichard Purdie static inline void * bl_get_data(struct backlight_device *bl_dev) 91655bfd7aSRichard Purdie { 92655bfd7aSRichard Purdie return dev_get_drvdata(&bl_dev->dev); 93655bfd7aSRichard Purdie } 941da177e4SLinus Torvalds 95*c3f8f650SRichard Purdie struct generic_bl_info { 96*c3f8f650SRichard Purdie const char *name; 97*c3f8f650SRichard Purdie int max_intensity; 98*c3f8f650SRichard Purdie int default_intensity; 99*c3f8f650SRichard Purdie int limit_mask; 100*c3f8f650SRichard Purdie void (*set_bl_intensity)(int intensity); 101*c3f8f650SRichard Purdie void (*kick_battery)(void); 102*c3f8f650SRichard Purdie }; 103*c3f8f650SRichard Purdie 1041da177e4SLinus Torvalds #endif 105