diff options
Diffstat (limited to 'drivers/video/backlight/backlight.c')
-rw-r--r-- | drivers/video/backlight/backlight.c | 84 |
1 files changed, 56 insertions, 28 deletions
diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c index 151fda8dded0..334b1db1bd7c 100644 --- a/drivers/video/backlight/backlight.c +++ b/drivers/video/backlight/backlight.c | |||
@@ -16,14 +16,12 @@ | |||
16 | 16 | ||
17 | static ssize_t backlight_show_power(struct class_device *cdev, char *buf) | 17 | static ssize_t backlight_show_power(struct class_device *cdev, char *buf) |
18 | { | 18 | { |
19 | int rc; | 19 | int rc = -ENXIO; |
20 | struct backlight_device *bd = to_backlight_device(cdev); | 20 | struct backlight_device *bd = to_backlight_device(cdev); |
21 | 21 | ||
22 | down(&bd->sem); | 22 | down(&bd->sem); |
23 | if (likely(bd->props && bd->props->get_power)) | 23 | if (likely(bd->props)) |
24 | rc = sprintf(buf, "%d\n", bd->props->get_power(bd)); | 24 | rc = sprintf(buf, "%d\n", bd->props->power); |
25 | else | ||
26 | rc = -ENXIO; | ||
27 | up(&bd->sem); | 25 | up(&bd->sem); |
28 | 26 | ||
29 | return rc; | 27 | return rc; |
@@ -31,7 +29,7 @@ static ssize_t backlight_show_power(struct class_device *cdev, char *buf) | |||
31 | 29 | ||
32 | static ssize_t backlight_store_power(struct class_device *cdev, const char *buf, size_t count) | 30 | static ssize_t backlight_store_power(struct class_device *cdev, const char *buf, size_t count) |
33 | { | 31 | { |
34 | int rc, power; | 32 | int rc = -ENXIO, power; |
35 | char *endp; | 33 | char *endp; |
36 | struct backlight_device *bd = to_backlight_device(cdev); | 34 | struct backlight_device *bd = to_backlight_device(cdev); |
37 | 35 | ||
@@ -40,12 +38,13 @@ static ssize_t backlight_store_power(struct class_device *cdev, const char *buf, | |||
40 | return -EINVAL; | 38 | return -EINVAL; |
41 | 39 | ||
42 | down(&bd->sem); | 40 | down(&bd->sem); |
43 | if (likely(bd->props && bd->props->set_power)) { | 41 | if (likely(bd->props)) { |
44 | pr_debug("backlight: set power to %d\n", power); | 42 | pr_debug("backlight: set power to %d\n", power); |
45 | bd->props->set_power(bd, power); | 43 | bd->props->power = power; |
44 | if (likely(bd->props->update_status)) | ||
45 | bd->props->update_status(bd); | ||
46 | rc = count; | 46 | rc = count; |
47 | } else | 47 | } |
48 | rc = -ENXIO; | ||
49 | up(&bd->sem); | 48 | up(&bd->sem); |
50 | 49 | ||
51 | return rc; | 50 | return rc; |
@@ -53,14 +52,12 @@ static ssize_t backlight_store_power(struct class_device *cdev, const char *buf, | |||
53 | 52 | ||
54 | static ssize_t backlight_show_brightness(struct class_device *cdev, char *buf) | 53 | static ssize_t backlight_show_brightness(struct class_device *cdev, char *buf) |
55 | { | 54 | { |
56 | int rc; | 55 | int rc = -ENXIO; |
57 | struct backlight_device *bd = to_backlight_device(cdev); | 56 | struct backlight_device *bd = to_backlight_device(cdev); |
58 | 57 | ||
59 | down(&bd->sem); | 58 | down(&bd->sem); |
60 | if (likely(bd->props && bd->props->get_brightness)) | 59 | if (likely(bd->props)) |
61 | rc = sprintf(buf, "%d\n", bd->props->get_brightness(bd)); | 60 | rc = sprintf(buf, "%d\n", bd->props->brightness); |
62 | else | ||
63 | rc = -ENXIO; | ||
64 | up(&bd->sem); | 61 | up(&bd->sem); |
65 | 62 | ||
66 | return rc; | 63 | return rc; |
@@ -68,7 +65,7 @@ static ssize_t backlight_show_brightness(struct class_device *cdev, char *buf) | |||
68 | 65 | ||
69 | static ssize_t backlight_store_brightness(struct class_device *cdev, const char *buf, size_t count) | 66 | static ssize_t backlight_store_brightness(struct class_device *cdev, const char *buf, size_t count) |
70 | { | 67 | { |
71 | int rc, brightness; | 68 | int rc = -ENXIO, brightness; |
72 | char *endp; | 69 | char *endp; |
73 | struct backlight_device *bd = to_backlight_device(cdev); | 70 | struct backlight_device *bd = to_backlight_device(cdev); |
74 | 71 | ||
@@ -77,12 +74,18 @@ static ssize_t backlight_store_brightness(struct class_device *cdev, const char | |||
77 | return -EINVAL; | 74 | return -EINVAL; |
78 | 75 | ||
79 | down(&bd->sem); | 76 | down(&bd->sem); |
80 | if (likely(bd->props && bd->props->set_brightness)) { | 77 | if (likely(bd->props)) { |
81 | pr_debug("backlight: set brightness to %d\n", brightness); | 78 | if (brightness > bd->props->max_brightness) |
82 | bd->props->set_brightness(bd, brightness); | 79 | rc = -EINVAL; |
83 | rc = count; | 80 | else { |
84 | } else | 81 | pr_debug("backlight: set brightness to %d\n", |
85 | rc = -ENXIO; | 82 | brightness); |
83 | bd->props->brightness = brightness; | ||
84 | if (likely(bd->props->update_status)) | ||
85 | bd->props->update_status(bd); | ||
86 | rc = count; | ||
87 | } | ||
88 | } | ||
86 | up(&bd->sem); | 89 | up(&bd->sem); |
87 | 90 | ||
88 | return rc; | 91 | return rc; |
@@ -90,14 +93,26 @@ static ssize_t backlight_store_brightness(struct class_device *cdev, const char | |||
90 | 93 | ||
91 | static ssize_t backlight_show_max_brightness(struct class_device *cdev, char *buf) | 94 | static ssize_t backlight_show_max_brightness(struct class_device *cdev, char *buf) |
92 | { | 95 | { |
93 | int rc; | 96 | int rc = -ENXIO; |
94 | struct backlight_device *bd = to_backlight_device(cdev); | 97 | struct backlight_device *bd = to_backlight_device(cdev); |
95 | 98 | ||
96 | down(&bd->sem); | 99 | down(&bd->sem); |
97 | if (likely(bd->props)) | 100 | if (likely(bd->props)) |
98 | rc = sprintf(buf, "%d\n", bd->props->max_brightness); | 101 | rc = sprintf(buf, "%d\n", bd->props->max_brightness); |
99 | else | 102 | up(&bd->sem); |
100 | rc = -ENXIO; | 103 | |
104 | return rc; | ||
105 | } | ||
106 | |||
107 | static ssize_t backlight_show_actual_brightness(struct class_device *cdev, | ||
108 | char *buf) | ||
109 | { | ||
110 | int rc = -ENXIO; | ||
111 | struct backlight_device *bd = to_backlight_device(cdev); | ||
112 | |||
113 | down(&bd->sem); | ||
114 | if (likely(bd->props && bd->props->get_brightness)) | ||
115 | rc = sprintf(buf, "%d\n", bd->props->get_brightness(bd)); | ||
101 | up(&bd->sem); | 116 | up(&bd->sem); |
102 | 117 | ||
103 | return rc; | 118 | return rc; |
@@ -123,7 +138,10 @@ static struct class backlight_class = { | |||
123 | 138 | ||
124 | static struct class_device_attribute bl_class_device_attributes[] = { | 139 | static struct class_device_attribute bl_class_device_attributes[] = { |
125 | DECLARE_ATTR(power, 0644, backlight_show_power, backlight_store_power), | 140 | DECLARE_ATTR(power, 0644, backlight_show_power, backlight_store_power), |
126 | DECLARE_ATTR(brightness, 0644, backlight_show_brightness, backlight_store_brightness), | 141 | DECLARE_ATTR(brightness, 0644, backlight_show_brightness, |
142 | backlight_store_brightness), | ||
143 | DECLARE_ATTR(actual_brightness, 0444, backlight_show_actual_brightness, | ||
144 | NULL), | ||
127 | DECLARE_ATTR(max_brightness, 0444, backlight_show_max_brightness, NULL), | 145 | DECLARE_ATTR(max_brightness, 0444, backlight_show_max_brightness, NULL), |
128 | }; | 146 | }; |
129 | 147 | ||
@@ -144,8 +162,12 @@ static int fb_notifier_callback(struct notifier_block *self, | |||
144 | bd = container_of(self, struct backlight_device, fb_notif); | 162 | bd = container_of(self, struct backlight_device, fb_notif); |
145 | down(&bd->sem); | 163 | down(&bd->sem); |
146 | if (bd->props) | 164 | if (bd->props) |
147 | if (!bd->props->check_fb || bd->props->check_fb(evdata->info)) | 165 | if (!bd->props->check_fb || |
148 | bd->props->set_power(bd, *(int *)evdata->data); | 166 | bd->props->check_fb(evdata->info)) { |
167 | bd->props->fb_blank = *(int *)evdata->data; | ||
168 | if (likely(bd->props && bd->props->update_status)) | ||
169 | bd->props->update_status(bd); | ||
170 | } | ||
149 | up(&bd->sem); | 171 | up(&bd->sem); |
150 | return 0; | 172 | return 0; |
151 | } | 173 | } |
@@ -231,6 +253,12 @@ void backlight_device_unregister(struct backlight_device *bd) | |||
231 | &bl_class_device_attributes[i]); | 253 | &bl_class_device_attributes[i]); |
232 | 254 | ||
233 | down(&bd->sem); | 255 | down(&bd->sem); |
256 | if (likely(bd->props && bd->props->update_status)) { | ||
257 | bd->props->brightness = 0; | ||
258 | bd->props->power = 0; | ||
259 | bd->props->update_status(bd); | ||
260 | } | ||
261 | |||
234 | bd->props = NULL; | 262 | bd->props = NULL; |
235 | up(&bd->sem); | 263 | up(&bd->sem); |
236 | 264 | ||