diff options
Diffstat (limited to 'drivers/video/backlight/backlight.c')
-rw-r--r-- | drivers/video/backlight/backlight.c | 73 |
1 files changed, 51 insertions, 22 deletions
diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c index 0664fc032235..157057c79ca3 100644 --- a/drivers/video/backlight/backlight.c +++ b/drivers/video/backlight/backlight.c | |||
@@ -40,6 +40,10 @@ static int fb_notifier_callback(struct notifier_block *self, | |||
40 | if (!bd->ops->check_fb || | 40 | if (!bd->ops->check_fb || |
41 | bd->ops->check_fb(evdata->info)) { | 41 | bd->ops->check_fb(evdata->info)) { |
42 | bd->props.fb_blank = *(int *)evdata->data; | 42 | bd->props.fb_blank = *(int *)evdata->data; |
43 | if (bd->props.fb_blank == FB_BLANK_UNBLANK) | ||
44 | bd->props.state &= ~BL_CORE_FBBLANK; | ||
45 | else | ||
46 | bd->props.state |= BL_CORE_FBBLANK; | ||
43 | backlight_update_status(bd); | 47 | backlight_update_status(bd); |
44 | } | 48 | } |
45 | mutex_unlock(&bd->ops_lock); | 49 | mutex_unlock(&bd->ops_lock); |
@@ -80,20 +84,18 @@ static ssize_t backlight_show_power(struct device *dev, | |||
80 | static ssize_t backlight_store_power(struct device *dev, | 84 | static ssize_t backlight_store_power(struct device *dev, |
81 | struct device_attribute *attr, const char *buf, size_t count) | 85 | struct device_attribute *attr, const char *buf, size_t count) |
82 | { | 86 | { |
83 | int rc = -ENXIO; | 87 | int rc; |
84 | char *endp; | ||
85 | struct backlight_device *bd = to_backlight_device(dev); | 88 | struct backlight_device *bd = to_backlight_device(dev); |
86 | int power = simple_strtoul(buf, &endp, 0); | 89 | unsigned long power; |
87 | size_t size = endp - buf; | ||
88 | 90 | ||
89 | if (*endp && isspace(*endp)) | 91 | rc = strict_strtoul(buf, 0, &power); |
90 | size++; | 92 | if (rc) |
91 | if (size != count) | 93 | return rc; |
92 | return -EINVAL; | ||
93 | 94 | ||
95 | rc = -ENXIO; | ||
94 | mutex_lock(&bd->ops_lock); | 96 | mutex_lock(&bd->ops_lock); |
95 | if (bd->ops) { | 97 | if (bd->ops) { |
96 | pr_debug("backlight: set power to %d\n", power); | 98 | pr_debug("backlight: set power to %lu\n", power); |
97 | if (bd->props.power != power) { | 99 | if (bd->props.power != power) { |
98 | bd->props.power = power; | 100 | bd->props.power = power; |
99 | backlight_update_status(bd); | 101 | backlight_update_status(bd); |
@@ -116,28 +118,25 @@ static ssize_t backlight_show_brightness(struct device *dev, | |||
116 | static ssize_t backlight_store_brightness(struct device *dev, | 118 | static ssize_t backlight_store_brightness(struct device *dev, |
117 | struct device_attribute *attr, const char *buf, size_t count) | 119 | struct device_attribute *attr, const char *buf, size_t count) |
118 | { | 120 | { |
119 | int rc = -ENXIO; | 121 | int rc; |
120 | char *endp; | ||
121 | struct backlight_device *bd = to_backlight_device(dev); | 122 | struct backlight_device *bd = to_backlight_device(dev); |
122 | int brightness = simple_strtoul(buf, &endp, 0); | 123 | unsigned long brightness; |
123 | size_t size = endp - buf; | 124 | |
125 | rc = strict_strtoul(buf, 0, &brightness); | ||
126 | if (rc) | ||
127 | return rc; | ||
124 | 128 | ||
125 | if (*endp && isspace(*endp)) | 129 | rc = -ENXIO; |
126 | size++; | ||
127 | if (size != count) | ||
128 | return -EINVAL; | ||
129 | 130 | ||
130 | mutex_lock(&bd->ops_lock); | 131 | mutex_lock(&bd->ops_lock); |
131 | if (bd->ops) { | 132 | if (bd->ops) { |
132 | if (brightness > bd->props.max_brightness) | 133 | if (brightness > bd->props.max_brightness) |
133 | rc = -EINVAL; | 134 | rc = -EINVAL; |
134 | else { | 135 | else { |
135 | pr_debug("backlight: set brightness to %d\n", | 136 | pr_debug("backlight: set brightness to %lu\n", |
136 | brightness); | 137 | brightness); |
137 | if (bd->props.brightness != brightness) { | 138 | bd->props.brightness = brightness; |
138 | bd->props.brightness = brightness; | 139 | backlight_update_status(bd); |
139 | backlight_update_status(bd); | ||
140 | } | ||
141 | rc = count; | 140 | rc = count; |
142 | } | 141 | } |
143 | } | 142 | } |
@@ -170,6 +169,34 @@ static ssize_t backlight_show_actual_brightness(struct device *dev, | |||
170 | 169 | ||
171 | static struct class *backlight_class; | 170 | static struct class *backlight_class; |
172 | 171 | ||
172 | static int backlight_suspend(struct device *dev, pm_message_t state) | ||
173 | { | ||
174 | struct backlight_device *bd = to_backlight_device(dev); | ||
175 | |||
176 | if (bd->ops->options & BL_CORE_SUSPENDRESUME) { | ||
177 | mutex_lock(&bd->ops_lock); | ||
178 | bd->props.state |= BL_CORE_SUSPENDED; | ||
179 | backlight_update_status(bd); | ||
180 | mutex_unlock(&bd->ops_lock); | ||
181 | } | ||
182 | |||
183 | return 0; | ||
184 | } | ||
185 | |||
186 | static int backlight_resume(struct device *dev) | ||
187 | { | ||
188 | struct backlight_device *bd = to_backlight_device(dev); | ||
189 | |||
190 | if (bd->ops->options & BL_CORE_SUSPENDRESUME) { | ||
191 | mutex_lock(&bd->ops_lock); | ||
192 | bd->props.state &= ~BL_CORE_SUSPENDED; | ||
193 | backlight_update_status(bd); | ||
194 | mutex_unlock(&bd->ops_lock); | ||
195 | } | ||
196 | |||
197 | return 0; | ||
198 | } | ||
199 | |||
173 | static void bl_device_release(struct device *dev) | 200 | static void bl_device_release(struct device *dev) |
174 | { | 201 | { |
175 | struct backlight_device *bd = to_backlight_device(dev); | 202 | struct backlight_device *bd = to_backlight_device(dev); |
@@ -286,6 +313,8 @@ static int __init backlight_class_init(void) | |||
286 | } | 313 | } |
287 | 314 | ||
288 | backlight_class->dev_attrs = bl_device_attributes; | 315 | backlight_class->dev_attrs = bl_device_attributes; |
316 | backlight_class->suspend = backlight_suspend; | ||
317 | backlight_class->resume = backlight_resume; | ||
289 | return 0; | 318 | return 0; |
290 | } | 319 | } |
291 | 320 | ||