Commit 1d885f42 authored by Mattia Dongili's avatar Mattia Dongili Committed by Matthew Garrett

sony-laptop: warn on multiple KBD backlight handles

Some BIOS versions/Vaio models apparently ship with two nearly identical
functions to handle backlight related controls.
The only difference seems to be:
        If (LEqual (BUF1, 0x40))
        {
            Store (0x40, P80H)
            Store (BUF2, Local0)
-           And (Local0, One, Local0)
+           And (Local0, 0x03, Local0)
            Store (Local0, ^^H_EC.KLPC)
        }

Avoid erroring out on initialization and messing things up on cleanup
for now since we never call into these methods with anything different
than 1 or 0.
This issue was found on a Sony VPCSE1V9E/BIOS R2087H4.

Cc: Marco Krüger <krgsch@gmail.com>
Signed-off-by: default avatarMattia Dongili <malattia@linux.it>
Signed-off-by: default avatarMatthew Garrett <matthew.garrett@nebula.com>
parent 2bd4ac13
...@@ -145,7 +145,8 @@ static void sony_nc_thermal_resume(void); ...@@ -145,7 +145,8 @@ static void sony_nc_thermal_resume(void);
#endif #endif
static int sony_nc_kbd_backlight_setup(struct platform_device *pd, static int sony_nc_kbd_backlight_setup(struct platform_device *pd,
unsigned int handle); unsigned int handle);
static void sony_nc_kbd_backlight_cleanup(struct platform_device *pd); static void sony_nc_kbd_backlight_cleanup(struct platform_device *pd,
unsigned int handle);
static int sony_nc_battery_care_setup(struct platform_device *pd, static int sony_nc_battery_care_setup(struct platform_device *pd,
unsigned int handle); unsigned int handle);
...@@ -1444,7 +1445,7 @@ static void sony_nc_function_cleanup(struct platform_device *pd) ...@@ -1444,7 +1445,7 @@ static void sony_nc_function_cleanup(struct platform_device *pd)
case 0x014b: case 0x014b:
case 0x014c: case 0x014c:
case 0x0163: case 0x0163:
sony_nc_kbd_backlight_cleanup(pd); sony_nc_kbd_backlight_cleanup(pd, handle);
break; break;
default: default:
continue; continue;
...@@ -1822,6 +1823,12 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd, ...@@ -1822,6 +1823,12 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd,
int result; int result;
int ret = 0; int ret = 0;
if (kbdbl_ctl) {
pr_warn("handle 0x%.4x: keyboard backlight setup already done for 0x%.4x\n",
handle, kbdbl_ctl->handle);
return -EBUSY;
}
/* verify the kbd backlight presence, these handles are not used for /* verify the kbd backlight presence, these handles are not used for
* keyboard backlight only * keyboard backlight only
*/ */
...@@ -1881,9 +1888,10 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd, ...@@ -1881,9 +1888,10 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd,
return ret; return ret;
} }
static void sony_nc_kbd_backlight_cleanup(struct platform_device *pd) static void sony_nc_kbd_backlight_cleanup(struct platform_device *pd,
unsigned int handle)
{ {
if (kbdbl_ctl) { if (kbdbl_ctl && handle == kbdbl_ctl->handle) {
device_remove_file(&pd->dev, &kbdbl_ctl->mode_attr); device_remove_file(&pd->dev, &kbdbl_ctl->mode_attr);
device_remove_file(&pd->dev, &kbdbl_ctl->timeout_attr); device_remove_file(&pd->dev, &kbdbl_ctl->timeout_attr);
kfree(kbdbl_ctl); kfree(kbdbl_ctl);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment