Commit 800f2017 authored by Mattia Dongili's avatar Mattia Dongili Committed by Darren Hart

Keyboard backlight control for some Vaio Fit models

SVF1521P6EW, SVF1521DCXW, SVF13N1L2ES and likely most SVF*.
do not expose separate timeout controls in auto mode.
Signed-off-by: default avatarDominik Matta <dominik@matta.sk>
Signed-off-by: default avatarMattia Dongili <malattia@linux.it>
Signed-off-by: default avatarDarren Hart <dvhart@linux.intel.com>
parent dc4522be
...@@ -1393,6 +1393,7 @@ static void sony_nc_function_setup(struct acpi_device *device, ...@@ -1393,6 +1393,7 @@ static void sony_nc_function_setup(struct acpi_device *device,
case 0x0143: case 0x0143:
case 0x014b: case 0x014b:
case 0x014c: case 0x014c:
case 0x0153:
case 0x0163: case 0x0163:
result = sony_nc_kbd_backlight_setup(pf_device, handle); result = sony_nc_kbd_backlight_setup(pf_device, handle);
if (result) if (result)
...@@ -1490,6 +1491,7 @@ static void sony_nc_function_cleanup(struct platform_device *pd) ...@@ -1490,6 +1491,7 @@ static void sony_nc_function_cleanup(struct platform_device *pd)
case 0x0143: case 0x0143:
case 0x014b: case 0x014b:
case 0x014c: case 0x014c:
case 0x0153:
case 0x0163: case 0x0163:
sony_nc_kbd_backlight_cleanup(pd, handle); sony_nc_kbd_backlight_cleanup(pd, handle);
break; break;
...@@ -1773,6 +1775,7 @@ struct kbd_backlight { ...@@ -1773,6 +1775,7 @@ struct kbd_backlight {
unsigned int base; unsigned int base;
unsigned int mode; unsigned int mode;
unsigned int timeout; unsigned int timeout;
unsigned int has_timeout;
struct device_attribute mode_attr; struct device_attribute mode_attr;
struct device_attribute timeout_attr; struct device_attribute timeout_attr;
}; };
...@@ -1877,6 +1880,8 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd, ...@@ -1877,6 +1880,8 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd,
unsigned int handle) unsigned int handle)
{ {
int result; int result;
int probe_base = 0;
int ctl_base = 0;
int ret = 0; int ret = 0;
if (kbdbl_ctl) { if (kbdbl_ctl) {
...@@ -1885,11 +1890,25 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd, ...@@ -1885,11 +1890,25 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd,
return -EBUSY; return -EBUSY;
} }
/* verify the kbd backlight presence, these handles are not used for /* verify the kbd backlight presence, some of these handles are not used
* keyboard backlight only * for keyboard backlight only
*/ */
ret = sony_call_snc_handle(handle, handle == 0x0137 ? 0x0B00 : 0x0100, switch (handle) {
&result); case 0x0153:
probe_base = 0x0;
ctl_base = 0x0;
break;
case 0x0137:
probe_base = 0x0B00;
ctl_base = 0x0C00;
break;
default:
probe_base = 0x0100;
ctl_base = 0x4000;
break;
}
ret = sony_call_snc_handle(handle, probe_base, &result);
if (ret) if (ret)
return ret; return ret;
...@@ -1906,10 +1925,9 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd, ...@@ -1906,10 +1925,9 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd,
kbdbl_ctl->mode = kbd_backlight; kbdbl_ctl->mode = kbd_backlight;
kbdbl_ctl->timeout = kbd_backlight_timeout; kbdbl_ctl->timeout = kbd_backlight_timeout;
kbdbl_ctl->handle = handle; kbdbl_ctl->handle = handle;
if (handle == 0x0137) kbdbl_ctl->base = ctl_base;
kbdbl_ctl->base = 0x0C00; /* Some models do not allow timeout control */
else kbdbl_ctl->has_timeout = handle != 0x0153;
kbdbl_ctl->base = 0x4000;
sysfs_attr_init(&kbdbl_ctl->mode_attr.attr); sysfs_attr_init(&kbdbl_ctl->mode_attr.attr);
kbdbl_ctl->mode_attr.attr.name = "kbd_backlight"; kbdbl_ctl->mode_attr.attr.name = "kbd_backlight";
...@@ -1917,22 +1935,28 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd, ...@@ -1917,22 +1935,28 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd,
kbdbl_ctl->mode_attr.show = sony_nc_kbd_backlight_mode_show; kbdbl_ctl->mode_attr.show = sony_nc_kbd_backlight_mode_show;
kbdbl_ctl->mode_attr.store = sony_nc_kbd_backlight_mode_store; kbdbl_ctl->mode_attr.store = sony_nc_kbd_backlight_mode_store;
sysfs_attr_init(&kbdbl_ctl->timeout_attr.attr);
kbdbl_ctl->timeout_attr.attr.name = "kbd_backlight_timeout";
kbdbl_ctl->timeout_attr.attr.mode = S_IRUGO | S_IWUSR;
kbdbl_ctl->timeout_attr.show = sony_nc_kbd_backlight_timeout_show;
kbdbl_ctl->timeout_attr.store = sony_nc_kbd_backlight_timeout_store;
ret = device_create_file(&pd->dev, &kbdbl_ctl->mode_attr); ret = device_create_file(&pd->dev, &kbdbl_ctl->mode_attr);
if (ret) if (ret)
goto outkzalloc; goto outkzalloc;
__sony_nc_kbd_backlight_mode_set(kbdbl_ctl->mode);
if (kbdbl_ctl->has_timeout) {
sysfs_attr_init(&kbdbl_ctl->timeout_attr.attr);
kbdbl_ctl->timeout_attr.attr.name = "kbd_backlight_timeout";
kbdbl_ctl->timeout_attr.attr.mode = S_IRUGO | S_IWUSR;
kbdbl_ctl->timeout_attr.show =
sony_nc_kbd_backlight_timeout_show;
kbdbl_ctl->timeout_attr.store =
sony_nc_kbd_backlight_timeout_store;
ret = device_create_file(&pd->dev, &kbdbl_ctl->timeout_attr); ret = device_create_file(&pd->dev, &kbdbl_ctl->timeout_attr);
if (ret) if (ret)
goto outmode; goto outmode;
__sony_nc_kbd_backlight_mode_set(kbdbl_ctl->mode);
__sony_nc_kbd_backlight_timeout_set(kbdbl_ctl->timeout); __sony_nc_kbd_backlight_timeout_set(kbdbl_ctl->timeout);
}
return 0; return 0;
...@@ -1949,6 +1973,7 @@ static void sony_nc_kbd_backlight_cleanup(struct platform_device *pd, ...@@ -1949,6 +1973,7 @@ static void sony_nc_kbd_backlight_cleanup(struct platform_device *pd,
{ {
if (kbdbl_ctl && handle == kbdbl_ctl->handle) { 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);
if (kbdbl_ctl->has_timeout)
device_remove_file(&pd->dev, &kbdbl_ctl->timeout_attr); device_remove_file(&pd->dev, &kbdbl_ctl->timeout_attr);
kfree(kbdbl_ctl); kfree(kbdbl_ctl);
kbdbl_ctl = NULL; kbdbl_ctl = NULL;
......
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