home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / lcd.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  2.8 KB  |  93 lines

  1. /*
  2.  * LCD Lowlevel Control Abstraction
  3.  *
  4.  * Copyright (C) 2003,2004 Hewlett-Packard Company
  5.  *
  6.  */
  7.  
  8. #ifndef _LINUX_LCD_H
  9. #define _LINUX_LCD_H
  10.  
  11. #include <linux/device.h>
  12. #include <linux/mutex.h>
  13. #include <linux/notifier.h>
  14. #include <linux/fb.h>
  15.  
  16. /* Notes on locking:
  17.  *
  18.  * lcd_device->ops_lock is an internal backlight lock protecting the ops
  19.  * field and no code outside the core should need to touch it.
  20.  *
  21.  * Access to set_power() 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_power() 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.  
  31. struct lcd_device;
  32. struct fb_info;
  33.  
  34. struct lcd_properties {
  35.     /* The maximum value for contrast (read-only) */
  36.     int max_contrast;
  37. };
  38.  
  39. struct lcd_ops {
  40.     /* Get the LCD panel power status (0: full on, 1..3: controller
  41.        power on, flat panel power off, 4: full off), see FB_BLANK_XXX */
  42.     int (*get_power)(struct lcd_device *);
  43.     /* Enable or disable power to the LCD (0: on; 4: off, see FB_BLANK_XXX) */
  44.     int (*set_power)(struct lcd_device *, int power);
  45.     /* Get the current contrast setting (0-max_contrast) */
  46.     int (*get_contrast)(struct lcd_device *);
  47.     /* Set LCD panel contrast */
  48.         int (*set_contrast)(struct lcd_device *, int contrast);
  49.     /* Set LCD panel mode (resolutions ...) */
  50.     int (*set_mode)(struct lcd_device *, struct fb_videomode *);
  51.     /* Check if given framebuffer device is the one LCD is bound to;
  52.        return 0 if not, !=0 if it is. If NULL, lcd always matches the fb. */
  53.     int (*check_fb)(struct lcd_device *, struct fb_info *);
  54. };
  55.  
  56. struct lcd_device {
  57.     struct lcd_properties props;
  58.     /* This protects the 'ops' field. If 'ops' is NULL, the driver that
  59.        registered this device has been unloaded, and if class_get_devdata()
  60.        points to something in the body of that driver, it is also invalid. */
  61.     struct mutex ops_lock;
  62.     /* If this is NULL, the backing module is unloaded */
  63.     struct lcd_ops *ops;
  64.     /* Serialise access to set_power method */
  65.     struct mutex update_lock;
  66.     /* The framebuffer notifier block */
  67.     struct notifier_block fb_notif;
  68.  
  69.     struct device dev;
  70. };
  71.  
  72. static inline void lcd_set_power(struct lcd_device *ld, int power)
  73. {
  74.     mutex_lock(&ld->update_lock);
  75.     if (ld->ops && ld->ops->set_power)
  76.         ld->ops->set_power(ld, power);
  77.     mutex_unlock(&ld->update_lock);
  78. }
  79.  
  80. extern struct lcd_device *lcd_device_register(const char *name,
  81.     struct device *parent, void *devdata, struct lcd_ops *ops);
  82. extern void lcd_device_unregister(struct lcd_device *ld);
  83.  
  84. #define to_lcd_device(obj) container_of(obj, struct lcd_device, dev)
  85.  
  86. static inline void * lcd_get_data(struct lcd_device *ld_dev)
  87. {
  88.     return dev_get_drvdata(&ld_dev->dev);
  89. }
  90.  
  91.  
  92. #endif
  93.