Blame view

include/linux/lcd.h 3.51 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
  /*
   * LCD Lowlevel Control Abstraction
   *
   * Copyright (C) 2003,2004 Hewlett-Packard Company
   *
   */
  
  #ifndef _LINUX_LCD_H
  #define _LINUX_LCD_H
  
  #include <linux/device.h>
28ee086d5   Richard Purdie   backlight: Fix ex...
12
  #include <linux/mutex.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
  #include <linux/notifier.h>
faa312da9   Eric Miao   lcd: allow lcd de...
14
  #include <linux/fb.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15

28ee086d5   Richard Purdie   backlight: Fix ex...
16
17
  /* Notes on locking:
   *
599a52d12   Richard Purdie   backlight: Separa...
18
   * lcd_device->ops_lock is an internal backlight lock protecting the ops
28ee086d5   Richard Purdie   backlight: Fix ex...
19
20
21
22
23
24
25
26
27
28
29
   * field and no code outside the core should need to touch it.
   *
   * Access to set_power() is serialised by the update_lock mutex since
   * most drivers seem to need this and historically get it wrong.
   *
   * Most drivers don't need locking on their get_power() method.
   * If yours does, you need to implement it in the driver. You can use the
   * update_lock mutex if appropriate.
   *
   * Any other use of the locks below is probably wrong.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
  struct lcd_device;
  struct fb_info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
  struct lcd_properties {
599a52d12   Richard Purdie   backlight: Separa...
33
34
35
36
37
  	/* The maximum value for contrast (read-only) */
  	int max_contrast;
  };
  
  struct lcd_ops {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
39
40
41
42
  	/* Get the LCD panel power status (0: full on, 1..3: controller
  	   power on, flat panel power off, 4: full off), see FB_BLANK_XXX */
  	int (*get_power)(struct lcd_device *);
  	/* Enable or disable power to the LCD (0: on; 4: off, see FB_BLANK_XXX) */
  	int (*set_power)(struct lcd_device *, int power);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
44
45
46
  	/* Get the current contrast setting (0-max_contrast) */
  	int (*get_contrast)(struct lcd_device *);
  	/* Set LCD panel contrast */
          int (*set_contrast)(struct lcd_device *, int contrast);
faa312da9   Eric Miao   lcd: allow lcd de...
47
48
  	/* Set LCD panel mode (resolutions ...) */
  	int (*set_mode)(struct lcd_device *, struct fb_videomode *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
  	/* Check if given framebuffer device is the one LCD is bound to;
  	   return 0 if not, !=0 if it is. If NULL, lcd always matches the fb. */
0c531360e   Ben Dooks   lcd: add lcd_devi...
51
  	int (*check_fb)(struct lcd_device *, struct fb_info *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
54
  };
  
  struct lcd_device {
599a52d12   Richard Purdie   backlight: Separa...
55
56
  	struct lcd_properties props;
  	/* This protects the 'ops' field. If 'ops' is NULL, the driver that
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
58
  	   registered this device has been unloaded, and if class_get_devdata()
  	   points to something in the body of that driver, it is also invalid. */
599a52d12   Richard Purdie   backlight: Separa...
59
  	struct mutex ops_lock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
  	/* If this is NULL, the backing module is unloaded */
599a52d12   Richard Purdie   backlight: Separa...
61
  	struct lcd_ops *ops;
28ee086d5   Richard Purdie   backlight: Fix ex...
62
63
  	/* Serialise access to set_power method */
  	struct mutex update_lock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
64
65
  	/* The framebuffer notifier block */
  	struct notifier_block fb_notif;
655bfd7ae   Richard Purdie   backlight: Conver...
66
67
  
  	struct device dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
  };
ee378a5c6   InKi Dae   backlight: add S6...
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
  struct lcd_platform_data {
  	/* reset lcd panel device. */
  	int (*reset)(struct lcd_device *ld);
  	/* on or off to lcd panel. if 'enable' is 0 then
  	   lcd power off and 1, lcd power on. */
  	int (*power_on)(struct lcd_device *ld, int enable);
  
  	/* it indicates whether lcd panel was enabled
  	   from bootloader or not. */
  	int lcd_enabled;
  	/* it means delay for stable time when it becomes low to high
  	   or high to low that is dependent on whether reset gpio is
  	   low active or high active. */
  	unsigned int reset_delay;
  	/* stable time needing to become lcd power on. */
  	unsigned int power_on_delay;
  	/* stable time needing to become lcd power off. */
  	unsigned int power_off_delay;
  
  	/* it could be used for any purpose. */
  	void *pdata;
  };
28ee086d5   Richard Purdie   backlight: Fix ex...
91
92
93
  static inline void lcd_set_power(struct lcd_device *ld, int power)
  {
  	mutex_lock(&ld->update_lock);
599a52d12   Richard Purdie   backlight: Separa...
94
95
  	if (ld->ops && ld->ops->set_power)
  		ld->ops->set_power(ld, power);
28ee086d5   Richard Purdie   backlight: Fix ex...
96
97
  	mutex_unlock(&ld->update_lock);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
  extern struct lcd_device *lcd_device_register(const char *name,
655bfd7ae   Richard Purdie   backlight: Conver...
99
  	struct device *parent, void *devdata, struct lcd_ops *ops);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
  extern void lcd_device_unregister(struct lcd_device *ld);
655bfd7ae   Richard Purdie   backlight: Conver...
101
102
103
104
105
106
  #define to_lcd_device(obj) container_of(obj, struct lcd_device, dev)
  
  static inline void * lcd_get_data(struct lcd_device *ld_dev)
  {
  	return dev_get_drvdata(&ld_dev->dev);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
108
  
  #endif