| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Sudip Mukherjee <sudipm.mukherjee@gmail.com> |
| Date: Wed, 17 May 2017 21:55:07 +0100 |
| Subject: backlight: Report error on failure |
| |
| From: Sudip Mukherjee <sudipm.mukherjee@gmail.com> |
| |
| |
| [ Upstream commit 7e715c2d9c27c23f3187454157c58cf292ed103e ] |
| |
| It is possible to update the backlight power and the brightness using |
| the sysfs and on writing it either returns the count or if the callback |
| function does not exist then returns the error code 'ENXIO'. |
| |
| We have a situation where the userspace client is writing to the sysfs |
| to update the power and since the callback function exists the client |
| receives the return value as count and considers the operation to be |
| successful. That is correct as the write to the sysfs was successful. |
| But there is no way to know if the actual operation was done or not. |
| |
| backlight_update_status() returns the error code if it fails. Pass that |
| to the userspace client who is trying to update the power so that the |
| client knows that the operation failed. |
| |
| Signed-off-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk> |
| Acked-by: Daniel Thompson <daniel.thompson@linaro.org> |
| Signed-off-by: Lee Jones <lee.jones@linaro.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/video/backlight/backlight.c | 15 ++++++++++----- |
| 1 file changed, 10 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/video/backlight/backlight.c |
| +++ b/drivers/video/backlight/backlight.c |
| @@ -134,7 +134,7 @@ static ssize_t bl_power_store(struct dev |
| { |
| int rc; |
| struct backlight_device *bd = to_backlight_device(dev); |
| - unsigned long power; |
| + unsigned long power, old_power; |
| |
| rc = kstrtoul(buf, 0, &power); |
| if (rc) |
| @@ -145,10 +145,16 @@ static ssize_t bl_power_store(struct dev |
| if (bd->ops) { |
| pr_debug("set power to %lu\n", power); |
| if (bd->props.power != power) { |
| + old_power = bd->props.power; |
| bd->props.power = power; |
| - backlight_update_status(bd); |
| + rc = backlight_update_status(bd); |
| + if (rc) |
| + bd->props.power = old_power; |
| + else |
| + rc = count; |
| + } else { |
| + rc = count; |
| } |
| - rc = count; |
| } |
| mutex_unlock(&bd->ops_lock); |
| |
| @@ -176,8 +182,7 @@ int backlight_device_set_brightness(stru |
| else { |
| pr_debug("set brightness to %lu\n", brightness); |
| bd->props.brightness = brightness; |
| - backlight_update_status(bd); |
| - rc = 0; |
| + rc = backlight_update_status(bd); |
| } |
| } |
| mutex_unlock(&bd->ops_lock); |