Commit 4ee9f611 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'platform-drivers-x86-v3.18-1' of...

Merge tag 'platform-drivers-x86-v3.18-1' of git://git.infradead.org/users/dvhart/linux-platform-drivers-x86

Pull x86 platform driver updates from Darren Hart:
 "The following have all spent at least a few days in linux-next, most
  for more than a week.  These are mostly cleanups and error handling
  improvements with a few updates to extend existing support to newer
  hardware.

  Details:
   - dell-wmi: fix access out of memory
   - eeepc-laptop: cleanups, refactoring, sysfs perms, and improved
     error handling
   - intel-rst: ACPI and error handling cleanups
   - thinkpad-acpi: whitespace cleanup
   - toshiba_acpi: HCI/SCI interface update, keyboard backlight type 2
     support, new scancodes, cleanups"

* tag 'platform-drivers-x86-v3.18-1' of git://git.infradead.org/users/dvhart/linux-platform-drivers-x86: (23 commits)
  toshiba_acpi: Adapt kbd_bl_timeout_store to the new kbd type
  toshiba_acpi: Change HCI/SCI functions return code type
  toshiba_acpi: Unify return codes prefix from HCI/SCI to TOS
  toshiba_acpi: Rename hci_raw to tci_raw
  dell-wmi: Fix access out of memory
  eeepc-laptop: clean up control flow in *_rfkill_notifier
  eeepc-laptop: store_cpufv: return error if set_acpi fails
  eeepc-laptop: check proper return values in get_cpufv
  eeepc-laptop: make fan1_input really read-only
  eeepc-laptop: pull out SENSOR_STORE_FUNC and SENSOR_SHOW_FUNC macros
  eeepc-laptop: tell sysfs that the disp attribute is write-only
  eeepc-laptop: pull out ACPI_STORE_FUNC and ACPI_SHOW_FUNC macros
  eeepc-laptop: use DEVICE_ATTR* to instantiate device_attributes
  eeepc-laptop: change sysfs function names to API expectations
  eeepc-laptop: clean up coding style
  eeepc-laptop: simplify parse_arg()
  intel-rst: Clean up ACPI add function
  intel-rst: Use ACPI_FAILURE() macro instead !ACPI_SUCCESS() for error checking
  x86: thinkpad_acpi.c: fixed spacing coding style issue
  toshiba_acpi: Support new keyboard backlight type
  ...
parents ce254b34 eabde0fa
...@@ -163,18 +163,24 @@ static void dell_wmi_notify(u32 value, void *context) ...@@ -163,18 +163,24 @@ static void dell_wmi_notify(u32 value, void *context)
const struct key_entry *key; const struct key_entry *key;
int reported_key; int reported_key;
u16 *buffer_entry = (u16 *)obj->buffer.pointer; u16 *buffer_entry = (u16 *)obj->buffer.pointer;
int buffer_size = obj->buffer.length/2;
if (dell_new_hk_type && (buffer_entry[1] != 0x10)) { if (buffer_size >= 2 && dell_new_hk_type && buffer_entry[1] != 0x10) {
pr_info("Received unknown WMI event (0x%x)\n", pr_info("Received unknown WMI event (0x%x)\n",
buffer_entry[1]); buffer_entry[1]);
kfree(obj); kfree(obj);
return; return;
} }
if (dell_new_hk_type || buffer_entry[1] == 0x0) if (buffer_size >= 3 && (dell_new_hk_type || buffer_entry[1] == 0x0))
reported_key = (int)buffer_entry[2]; reported_key = (int)buffer_entry[2];
else else if (buffer_size >= 2)
reported_key = (int)buffer_entry[1] & 0xffff; reported_key = (int)buffer_entry[1] & 0xffff;
else {
pr_info("Received unknown WMI event\n");
kfree(obj);
return;
}
key = sparse_keymap_entry_from_scancode(dell_wmi_input_dev, key = sparse_keymap_entry_from_scancode(dell_wmi_input_dev,
reported_key); reported_key);
......
...@@ -263,13 +263,11 @@ static int acpi_setter_handle(struct eeepc_laptop *eeepc, int cm, ...@@ -263,13 +263,11 @@ static int acpi_setter_handle(struct eeepc_laptop *eeepc, int cm,
/* /*
* Sys helpers * Sys helpers
*/ */
static int parse_arg(const char *buf, unsigned long count, int *val) static int parse_arg(const char *buf, int *val)
{ {
if (!count)
return 0;
if (sscanf(buf, "%i", val) != 1) if (sscanf(buf, "%i", val) != 1)
return -EINVAL; return -EINVAL;
return count; return 0;
} }
static ssize_t store_sys_acpi(struct device *dev, int cm, static ssize_t store_sys_acpi(struct device *dev, int cm,
...@@ -278,12 +276,13 @@ static ssize_t store_sys_acpi(struct device *dev, int cm, ...@@ -278,12 +276,13 @@ static ssize_t store_sys_acpi(struct device *dev, int cm,
struct eeepc_laptop *eeepc = dev_get_drvdata(dev); struct eeepc_laptop *eeepc = dev_get_drvdata(dev);
int rv, value; int rv, value;
rv = parse_arg(buf, count, &value); rv = parse_arg(buf, &value);
if (rv > 0) if (rv < 0)
value = set_acpi(eeepc, cm, value); return rv;
if (value < 0) rv = set_acpi(eeepc, cm, value);
if (rv < 0)
return -EIO; return -EIO;
return rv; return count;
} }
static ssize_t show_sys_acpi(struct device *dev, int cm, char *buf) static ssize_t show_sys_acpi(struct device *dev, int cm, char *buf)
...@@ -296,30 +295,34 @@ static ssize_t show_sys_acpi(struct device *dev, int cm, char *buf) ...@@ -296,30 +295,34 @@ static ssize_t show_sys_acpi(struct device *dev, int cm, char *buf)
return sprintf(buf, "%d\n", value); return sprintf(buf, "%d\n", value);
} }
#define EEEPC_CREATE_DEVICE_ATTR(_name, _mode, _cm) \ #define EEEPC_ACPI_SHOW_FUNC(_name, _cm) \
static ssize_t show_##_name(struct device *dev, \ static ssize_t _name##_show(struct device *dev, \
struct device_attribute *attr, \ struct device_attribute *attr, \
char *buf) \ char *buf) \
{ \ { \
return show_sys_acpi(dev, _cm, buf); \ return show_sys_acpi(dev, _cm, buf); \
} \ }
static ssize_t store_##_name(struct device *dev, \
#define EEEPC_ACPI_STORE_FUNC(_name, _cm) \
static ssize_t _name##_store(struct device *dev, \
struct device_attribute *attr, \ struct device_attribute *attr, \
const char *buf, size_t count) \ const char *buf, size_t count) \
{ \ { \
return store_sys_acpi(dev, _cm, buf, count); \ return store_sys_acpi(dev, _cm, buf, count); \
} \
static struct device_attribute dev_attr_##_name = { \
.attr = { \
.name = __stringify(_name), \
.mode = _mode }, \
.show = show_##_name, \
.store = store_##_name, \
} }
EEEPC_CREATE_DEVICE_ATTR(camera, 0644, CM_ASL_CAMERA); #define EEEPC_CREATE_DEVICE_ATTR_RW(_name, _cm) \
EEEPC_CREATE_DEVICE_ATTR(cardr, 0644, CM_ASL_CARDREADER); EEEPC_ACPI_SHOW_FUNC(_name, _cm) \
EEEPC_CREATE_DEVICE_ATTR(disp, 0200, CM_ASL_DISPLAYSWITCH); EEEPC_ACPI_STORE_FUNC(_name, _cm) \
static DEVICE_ATTR_RW(_name)
#define EEEPC_CREATE_DEVICE_ATTR_WO(_name, _cm) \
EEEPC_ACPI_STORE_FUNC(_name, _cm) \
static DEVICE_ATTR_WO(_name)
EEEPC_CREATE_DEVICE_ATTR_RW(camera, CM_ASL_CAMERA);
EEEPC_CREATE_DEVICE_ATTR_RW(cardr, CM_ASL_CARDREADER);
EEEPC_CREATE_DEVICE_ATTR_WO(disp, CM_ASL_DISPLAYSWITCH);
struct eeepc_cpufv { struct eeepc_cpufv {
int num; int num;
...@@ -329,14 +332,17 @@ struct eeepc_cpufv { ...@@ -329,14 +332,17 @@ struct eeepc_cpufv {
static int get_cpufv(struct eeepc_laptop *eeepc, struct eeepc_cpufv *c) static int get_cpufv(struct eeepc_laptop *eeepc, struct eeepc_cpufv *c)
{ {
c->cur = get_acpi(eeepc, CM_ASL_CPUFV); c->cur = get_acpi(eeepc, CM_ASL_CPUFV);
if (c->cur < 0)
return -ENODEV;
c->num = (c->cur >> 8) & 0xff; c->num = (c->cur >> 8) & 0xff;
c->cur &= 0xff; c->cur &= 0xff;
if (c->cur < 0 || c->num <= 0 || c->num > 12) if (c->num == 0 || c->num > 12)
return -ENODEV; return -ENODEV;
return 0; return 0;
} }
static ssize_t show_available_cpufv(struct device *dev, static ssize_t available_cpufv_show(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
{ {
...@@ -353,7 +359,7 @@ static ssize_t show_available_cpufv(struct device *dev, ...@@ -353,7 +359,7 @@ static ssize_t show_available_cpufv(struct device *dev,
return len; return len;
} }
static ssize_t show_cpufv(struct device *dev, static ssize_t cpufv_show(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
{ {
...@@ -365,7 +371,7 @@ static ssize_t show_cpufv(struct device *dev, ...@@ -365,7 +371,7 @@ static ssize_t show_cpufv(struct device *dev,
return sprintf(buf, "%#x\n", (c.num << 8) | c.cur); return sprintf(buf, "%#x\n", (c.num << 8) | c.cur);
} }
static ssize_t store_cpufv(struct device *dev, static ssize_t cpufv_store(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
...@@ -377,16 +383,18 @@ static ssize_t store_cpufv(struct device *dev, ...@@ -377,16 +383,18 @@ static ssize_t store_cpufv(struct device *dev,
return -EPERM; return -EPERM;
if (get_cpufv(eeepc, &c)) if (get_cpufv(eeepc, &c))
return -ENODEV; return -ENODEV;
rv = parse_arg(buf, count, &value); rv = parse_arg(buf, &value);
if (rv < 0) if (rv < 0)
return rv; return rv;
if (!rv || value < 0 || value >= c.num) if (value < 0 || value >= c.num)
return -EINVAL; return -EINVAL;
set_acpi(eeepc, CM_ASL_CPUFV, value); rv = set_acpi(eeepc, CM_ASL_CPUFV, value);
return rv; if (rv)
return rv;
return count;
} }
static ssize_t show_cpufv_disabled(struct device *dev, static ssize_t cpufv_disabled_show(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
{ {
...@@ -395,14 +403,14 @@ static ssize_t show_cpufv_disabled(struct device *dev, ...@@ -395,14 +403,14 @@ static ssize_t show_cpufv_disabled(struct device *dev,
return sprintf(buf, "%d\n", eeepc->cpufv_disabled); return sprintf(buf, "%d\n", eeepc->cpufv_disabled);
} }
static ssize_t store_cpufv_disabled(struct device *dev, static ssize_t cpufv_disabled_store(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct eeepc_laptop *eeepc = dev_get_drvdata(dev); struct eeepc_laptop *eeepc = dev_get_drvdata(dev);
int rv, value; int rv, value;
rv = parse_arg(buf, count, &value); rv = parse_arg(buf, &value);
if (rv < 0) if (rv < 0)
return rv; return rv;
...@@ -412,7 +420,7 @@ static ssize_t store_cpufv_disabled(struct device *dev, ...@@ -412,7 +420,7 @@ static ssize_t store_cpufv_disabled(struct device *dev,
pr_warn("cpufv enabled (not officially supported " pr_warn("cpufv enabled (not officially supported "
"on this model)\n"); "on this model)\n");
eeepc->cpufv_disabled = false; eeepc->cpufv_disabled = false;
return rv; return count;
case 1: case 1:
return -EPERM; return -EPERM;
default: default:
...@@ -421,29 +429,9 @@ static ssize_t store_cpufv_disabled(struct device *dev, ...@@ -421,29 +429,9 @@ static ssize_t store_cpufv_disabled(struct device *dev,
} }
static struct device_attribute dev_attr_cpufv = { static DEVICE_ATTR_RW(cpufv);
.attr = { static DEVICE_ATTR_RO(available_cpufv);
.name = "cpufv", static DEVICE_ATTR_RW(cpufv_disabled);
.mode = 0644 },
.show = show_cpufv,
.store = store_cpufv
};
static struct device_attribute dev_attr_available_cpufv = {
.attr = {
.name = "available_cpufv",
.mode = 0444 },
.show = show_available_cpufv
};
static struct device_attribute dev_attr_cpufv_disabled = {
.attr = {
.name = "cpufv_disabled",
.mode = 0644 },
.show = show_cpufv_disabled,
.store = store_cpufv_disabled
};
static struct attribute *platform_attributes[] = { static struct attribute *platform_attributes[] = {
&dev_attr_camera.attr, &dev_attr_camera.attr,
...@@ -545,7 +533,7 @@ static int eeepc_led_init(struct eeepc_laptop *eeepc) ...@@ -545,7 +533,7 @@ static int eeepc_led_init(struct eeepc_laptop *eeepc)
eeepc->tpd_led.name = "eeepc::touchpad"; eeepc->tpd_led.name = "eeepc::touchpad";
eeepc->tpd_led.brightness_set = tpd_led_set; eeepc->tpd_led.brightness_set = tpd_led_set;
if (get_acpi(eeepc, CM_ASL_TPD) >= 0) /* if method is available */ if (get_acpi(eeepc, CM_ASL_TPD) >= 0) /* if method is available */
eeepc->tpd_led.brightness_get = tpd_led_get; eeepc->tpd_led.brightness_get = tpd_led_get;
eeepc->tpd_led.max_brightness = 1; eeepc->tpd_led.max_brightness = 1;
rv = led_classdev_register(&eeepc->platform_device->dev, rv = led_classdev_register(&eeepc->platform_device->dev,
...@@ -680,22 +668,21 @@ static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc, ...@@ -680,22 +668,21 @@ static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc,
status = acpi_get_handle(NULL, node, &handle); status = acpi_get_handle(NULL, node, &handle);
if (ACPI_SUCCESS(status)) { if (ACPI_FAILURE(status))
status = acpi_install_notify_handler(handle,
ACPI_SYSTEM_NOTIFY,
eeepc_rfkill_notify,
eeepc);
if (ACPI_FAILURE(status))
pr_warn("Failed to register notify on %s\n", node);
/*
* Refresh pci hotplug in case the rfkill state was
* changed during setup.
*/
eeepc_rfkill_hotplug(eeepc, handle);
} else
return -ENODEV; return -ENODEV;
status = acpi_install_notify_handler(handle,
ACPI_SYSTEM_NOTIFY,
eeepc_rfkill_notify,
eeepc);
if (ACPI_FAILURE(status))
pr_warn("Failed to register notify on %s\n", node);
/*
* Refresh pci hotplug in case the rfkill state was
* changed during setup.
*/
eeepc_rfkill_hotplug(eeepc, handle);
return 0; return 0;
} }
...@@ -707,20 +694,21 @@ static void eeepc_unregister_rfkill_notifier(struct eeepc_laptop *eeepc, ...@@ -707,20 +694,21 @@ static void eeepc_unregister_rfkill_notifier(struct eeepc_laptop *eeepc,
status = acpi_get_handle(NULL, node, &handle); status = acpi_get_handle(NULL, node, &handle);
if (ACPI_SUCCESS(status)) { if (ACPI_FAILURE(status))
status = acpi_remove_notify_handler(handle, return;
ACPI_SYSTEM_NOTIFY,
eeepc_rfkill_notify); status = acpi_remove_notify_handler(handle,
if (ACPI_FAILURE(status)) ACPI_SYSTEM_NOTIFY,
pr_err("Error removing rfkill notify handler %s\n", eeepc_rfkill_notify);
node); if (ACPI_FAILURE(status))
/* pr_err("Error removing rfkill notify handler %s\n",
* Refresh pci hotplug in case the rfkill node);
* state was changed after /*
* eeepc_unregister_rfkill_notifier() * Refresh pci hotplug in case the rfkill
*/ * state was changed after
eeepc_rfkill_hotplug(eeepc, handle); * eeepc_unregister_rfkill_notifier()
} */
eeepc_rfkill_hotplug(eeepc, handle);
} }
static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot, static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot,
...@@ -1042,10 +1030,11 @@ static ssize_t store_sys_hwmon(void (*set)(int), const char *buf, size_t count) ...@@ -1042,10 +1030,11 @@ static ssize_t store_sys_hwmon(void (*set)(int), const char *buf, size_t count)
{ {
int rv, value; int rv, value;
rv = parse_arg(buf, count, &value); rv = parse_arg(buf, &value);
if (rv > 0) if (rv < 0)
set(value); return rv;
return rv; set(value);
return count;
} }
static ssize_t show_sys_hwmon(int (*get)(void), char *buf) static ssize_t show_sys_hwmon(int (*get)(void), char *buf)
...@@ -1053,26 +1042,36 @@ static ssize_t show_sys_hwmon(int (*get)(void), char *buf) ...@@ -1053,26 +1042,36 @@ static ssize_t show_sys_hwmon(int (*get)(void), char *buf)
return sprintf(buf, "%d\n", get()); return sprintf(buf, "%d\n", get());
} }
#define EEEPC_CREATE_SENSOR_ATTR(_name, _mode, _get, _set) \ #define EEEPC_SENSOR_SHOW_FUNC(_name, _get) \
static ssize_t show_##_name(struct device *dev, \ static ssize_t _name##_show(struct device *dev, \
struct device_attribute *attr, \ struct device_attribute *attr, \
char *buf) \ char *buf) \
{ \ { \
return show_sys_hwmon(_get, buf); \ return show_sys_hwmon(_get, buf); \
} \ }
static ssize_t store_##_name(struct device *dev, \
#define EEEPC_SENSOR_STORE_FUNC(_name, _set) \
static ssize_t _name##_store(struct device *dev, \
struct device_attribute *attr, \ struct device_attribute *attr, \
const char *buf, size_t count) \ const char *buf, size_t count) \
{ \ { \
return store_sys_hwmon(_set, buf, count); \ return store_sys_hwmon(_set, buf, count); \
} \ }
static DEVICE_ATTR(_name, _mode, show_##_name, store_##_name)
#define EEEPC_CREATE_SENSOR_ATTR_RW(_name, _get, _set) \
EEEPC_SENSOR_SHOW_FUNC(_name, _get) \
EEEPC_SENSOR_STORE_FUNC(_name, _set) \
static DEVICE_ATTR_RW(_name)
EEEPC_CREATE_SENSOR_ATTR(fan1_input, S_IRUGO, eeepc_get_fan_rpm, NULL); #define EEEPC_CREATE_SENSOR_ATTR_RO(_name, _get) \
EEEPC_CREATE_SENSOR_ATTR(pwm1, S_IRUGO | S_IWUSR, EEEPC_SENSOR_SHOW_FUNC(_name, _get) \
eeepc_get_fan_pwm, eeepc_set_fan_pwm); static DEVICE_ATTR_RO(_name)
EEEPC_CREATE_SENSOR_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
eeepc_get_fan_ctrl, eeepc_set_fan_ctrl); EEEPC_CREATE_SENSOR_ATTR_RO(fan1_input, eeepc_get_fan_rpm);
EEEPC_CREATE_SENSOR_ATTR_RW(pwm1, eeepc_get_fan_pwm,
eeepc_set_fan_pwm);
EEEPC_CREATE_SENSOR_ATTR_RW(pwm1_enable, eeepc_get_fan_ctrl,
eeepc_set_fan_ctrl);
static struct attribute *hwmon_attrs[] = { static struct attribute *hwmon_attrs[] = {
&dev_attr_pwm1.attr, &dev_attr_pwm1.attr,
...@@ -1424,8 +1423,9 @@ static int eeepc_acpi_add(struct acpi_device *device) ...@@ -1424,8 +1423,9 @@ static int eeepc_acpi_add(struct acpi_device *device)
result = eeepc_backlight_init(eeepc); result = eeepc_backlight_init(eeepc);
if (result) if (result)
goto fail_backlight; goto fail_backlight;
} else } else {
pr_info("Backlight controlled by ACPI video driver\n"); pr_info("Backlight controlled by ACPI video driver\n");
}
result = eeepc_input_init(eeepc); result = eeepc_input_init(eeepc);
if (result) if (result)
......
...@@ -35,7 +35,7 @@ static ssize_t irst_show_wakeup_events(struct device *dev, ...@@ -35,7 +35,7 @@ static ssize_t irst_show_wakeup_events(struct device *dev,
acpi = to_acpi_device(dev); acpi = to_acpi_device(dev);
status = acpi_evaluate_integer(acpi->handle, "GFFS", NULL, &value); status = acpi_evaluate_integer(acpi->handle, "GFFS", NULL, &value);
if (!ACPI_SUCCESS(status)) if (ACPI_FAILURE(status))
return -EINVAL; return -EINVAL;
return sprintf(buf, "%lld\n", value); return sprintf(buf, "%lld\n", value);
...@@ -59,7 +59,7 @@ static ssize_t irst_store_wakeup_events(struct device *dev, ...@@ -59,7 +59,7 @@ static ssize_t irst_store_wakeup_events(struct device *dev,
status = acpi_execute_simple_method(acpi->handle, "SFFS", value); status = acpi_execute_simple_method(acpi->handle, "SFFS", value);
if (!ACPI_SUCCESS(status)) if (ACPI_FAILURE(status))
return -EINVAL; return -EINVAL;
return count; return count;
...@@ -81,7 +81,7 @@ static ssize_t irst_show_wakeup_time(struct device *dev, ...@@ -81,7 +81,7 @@ static ssize_t irst_show_wakeup_time(struct device *dev,
acpi = to_acpi_device(dev); acpi = to_acpi_device(dev);
status = acpi_evaluate_integer(acpi->handle, "GFTV", NULL, &value); status = acpi_evaluate_integer(acpi->handle, "GFTV", NULL, &value);
if (!ACPI_SUCCESS(status)) if (ACPI_FAILURE(status))
return -EINVAL; return -EINVAL;
return sprintf(buf, "%lld\n", value); return sprintf(buf, "%lld\n", value);
...@@ -105,7 +105,7 @@ static ssize_t irst_store_wakeup_time(struct device *dev, ...@@ -105,7 +105,7 @@ static ssize_t irst_store_wakeup_time(struct device *dev,
status = acpi_execute_simple_method(acpi->handle, "SFTV", value); status = acpi_execute_simple_method(acpi->handle, "SFTV", value);
if (!ACPI_SUCCESS(status)) if (ACPI_FAILURE(status))
return -EINVAL; return -EINVAL;
return count; return count;
...@@ -119,21 +119,16 @@ static struct device_attribute irst_timeout_attr = { ...@@ -119,21 +119,16 @@ static struct device_attribute irst_timeout_attr = {
static int irst_add(struct acpi_device *acpi) static int irst_add(struct acpi_device *acpi)
{ {
int error = 0; int error;
error = device_create_file(&acpi->dev, &irst_timeout_attr); error = device_create_file(&acpi->dev, &irst_timeout_attr);
if (error) if (unlikely(error))
goto out; return error;
error = device_create_file(&acpi->dev, &irst_wakeup_attr); error = device_create_file(&acpi->dev, &irst_wakeup_attr);
if (error) if (unlikely(error))
goto out_timeout; device_remove_file(&acpi->dev, &irst_timeout_attr);
return 0;
out_timeout:
device_remove_file(&acpi->dev, &irst_timeout_attr);
out:
return error; return error;
} }
......
...@@ -3440,7 +3440,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm) ...@@ -3440,7 +3440,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
delete_attr_set(hotkey_dev_attributes, &tpacpi_pdev->dev.kobj); delete_attr_set(hotkey_dev_attributes, &tpacpi_pdev->dev.kobj);
hotkey_dev_attributes = NULL; hotkey_dev_attributes = NULL;
return (res < 0)? res : 1; return (res < 0) ? res : 1;
} }
/* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser /* Thinkpad X1 Carbon support 5 modes including Home mode, Web browser
...@@ -4576,7 +4576,7 @@ static int __init video_init(struct ibm_init_struct *iibm) ...@@ -4576,7 +4576,7 @@ static int __init video_init(struct ibm_init_struct *iibm)
str_supported(video_supported != TPACPI_VIDEO_NONE), str_supported(video_supported != TPACPI_VIDEO_NONE),
video_supported); video_supported);
return (video_supported != TPACPI_VIDEO_NONE)? 0 : 1; return (video_supported != TPACPI_VIDEO_NONE) ? 0 : 1;
} }
static void video_exit(void) static void video_exit(void)
...@@ -4669,7 +4669,7 @@ static int video_outputsw_set(int status) ...@@ -4669,7 +4669,7 @@ static int video_outputsw_set(int status)
return -ENOSYS; return -ENOSYS;
} }
return (res)? 0 : -EIO; return (res) ? 0 : -EIO;
} }
static int video_autosw_get(void) static int video_autosw_get(void)
...@@ -4695,7 +4695,7 @@ static int video_autosw_get(void) ...@@ -4695,7 +4695,7 @@ static int video_autosw_get(void)
static int video_autosw_set(int enable) static int video_autosw_set(int enable)
{ {
if (!acpi_evalf(vid_handle, NULL, "_DOS", "vd", (enable)? 1 : 0)) if (!acpi_evalf(vid_handle, NULL, "_DOS", "vd", (enable) ? 1 : 0))
return -EIO; return -EIO;
return 0; return 0;
} }
...@@ -4730,20 +4730,20 @@ static int video_outputsw_cycle(void) ...@@ -4730,20 +4730,20 @@ static int video_outputsw_cycle(void)
return -EIO; return -EIO;
} }
return (res)? 0 : -EIO; return (res) ? 0 : -EIO;
} }
static int video_expand_toggle(void) static int video_expand_toggle(void)
{ {
switch (video_supported) { switch (video_supported) {
case TPACPI_VIDEO_570: case TPACPI_VIDEO_570:
return acpi_evalf(ec_handle, NULL, "_Q17", "v")? return acpi_evalf(ec_handle, NULL, "_Q17", "v") ?
0 : -EIO; 0 : -EIO;
case TPACPI_VIDEO_770: case TPACPI_VIDEO_770:
return acpi_evalf(vid_handle, NULL, "VEXP", "v")? return acpi_evalf(vid_handle, NULL, "VEXP", "v") ?
0 : -EIO; 0 : -EIO;
case TPACPI_VIDEO_NEW: case TPACPI_VIDEO_NEW:
return acpi_evalf(NULL, NULL, "\\VEXP", "v")? return acpi_evalf(NULL, NULL, "\\VEXP", "v") ?
0 : -EIO; 0 : -EIO;
default: default:
return -ENOSYS; return -ENOSYS;
...@@ -4887,14 +4887,14 @@ static int light_set_status(int status) ...@@ -4887,14 +4887,14 @@ static int light_set_status(int status)
if (tp_features.light) { if (tp_features.light) {
if (cmos_handle) { if (cmos_handle) {
rc = acpi_evalf(cmos_handle, NULL, NULL, "vd", rc = acpi_evalf(cmos_handle, NULL, NULL, "vd",
(status)? (status) ?
TP_CMOS_THINKLIGHT_ON : TP_CMOS_THINKLIGHT_ON :
TP_CMOS_THINKLIGHT_OFF); TP_CMOS_THINKLIGHT_OFF);
} else { } else {
rc = acpi_evalf(lght_handle, NULL, NULL, "vd", rc = acpi_evalf(lght_handle, NULL, NULL, "vd",
(status)? 1 : 0); (status) ? 1 : 0);
} }
return (rc)? 0 : -EIO; return (rc) ? 0 : -EIO;
} }
return -ENXIO; return -ENXIO;
...@@ -4923,7 +4923,7 @@ static void light_sysfs_set(struct led_classdev *led_cdev, ...@@ -4923,7 +4923,7 @@ static void light_sysfs_set(struct led_classdev *led_cdev,
static enum led_brightness light_sysfs_get(struct led_classdev *led_cdev) static enum led_brightness light_sysfs_get(struct led_classdev *led_cdev)
{ {
return (light_get_status() == 1)? LED_FULL : LED_OFF; return (light_get_status() == 1) ? LED_FULL : LED_OFF;
} }
static struct tpacpi_led_classdev tpacpi_led_thinklight = { static struct tpacpi_led_classdev tpacpi_led_thinklight = {
...@@ -5045,7 +5045,7 @@ static ssize_t cmos_command_store(struct device *dev, ...@@ -5045,7 +5045,7 @@ static ssize_t cmos_command_store(struct device *dev,
return -EINVAL; return -EINVAL;
res = issue_thinkpad_cmos_command(cmos_cmd); res = issue_thinkpad_cmos_command(cmos_cmd);
return (res)? res : count; return (res) ? res : count;
} }
static struct device_attribute dev_attr_cmos_command = static struct device_attribute dev_attr_cmos_command =
...@@ -5069,7 +5069,7 @@ static int __init cmos_init(struct ibm_init_struct *iibm) ...@@ -5069,7 +5069,7 @@ static int __init cmos_init(struct ibm_init_struct *iibm)
if (res) if (res)
return res; return res;
return (cmos_handle)? 0 : 1; return (cmos_handle) ? 0 : 1;
} }
static void cmos_exit(void) static void cmos_exit(void)
...@@ -5179,9 +5179,9 @@ static int led_get_status(const unsigned int led) ...@@ -5179,9 +5179,9 @@ static int led_get_status(const unsigned int led)
if (!acpi_evalf(ec_handle, if (!acpi_evalf(ec_handle,
&status, "GLED", "dd", 1 << led)) &status, "GLED", "dd", 1 << led))
return -EIO; return -EIO;
led_s = (status == 0)? led_s = (status == 0) ?
TPACPI_LED_OFF : TPACPI_LED_OFF :
((status == 1)? ((status == 1) ?
TPACPI_LED_ON : TPACPI_LED_ON :
TPACPI_LED_BLINK); TPACPI_LED_BLINK);
tpacpi_led_state_cache[led] = led_s; tpacpi_led_state_cache[led] = led_s;
...@@ -5578,7 +5578,7 @@ static int __init beep_init(struct ibm_init_struct *iibm) ...@@ -5578,7 +5578,7 @@ static int __init beep_init(struct ibm_init_struct *iibm)
tp_features.beep_needs_two_args = !!(quirks & TPACPI_BEEP_Q1); tp_features.beep_needs_two_args = !!(quirks & TPACPI_BEEP_Q1);
return (beep_handle)? 0 : 1; return (beep_handle) ? 0 : 1;
} }
static int beep_read(struct seq_file *m) static int beep_read(struct seq_file *m)
...@@ -6527,7 +6527,7 @@ static int brightness_write(char *buf) ...@@ -6527,7 +6527,7 @@ static int brightness_write(char *buf)
if (!rc && ibm_backlight_device) if (!rc && ibm_backlight_device)
backlight_force_update(ibm_backlight_device, backlight_force_update(ibm_backlight_device,
BACKLIGHT_UPDATE_SYSFS); BACKLIGHT_UPDATE_SYSFS);
return (rc == -EINTR)? -ERESTARTSYS : rc; return (rc == -EINTR) ? -ERESTARTSYS : rc;
} }
static struct ibm_struct brightness_driver_data = { static struct ibm_struct brightness_driver_data = {
...@@ -7984,7 +7984,7 @@ static ssize_t fan_pwm1_store(struct device *dev, ...@@ -7984,7 +7984,7 @@ static ssize_t fan_pwm1_store(struct device *dev,
} }
mutex_unlock(&fan_mutex); mutex_unlock(&fan_mutex);
return (rc)? rc : count; return (rc) ? rc : count;
} }
static struct device_attribute dev_attr_fan_pwm1 = static struct device_attribute dev_attr_fan_pwm1 =
...@@ -8662,7 +8662,7 @@ static const char * __init str_supported(int is_supported) ...@@ -8662,7 +8662,7 @@ static const char * __init str_supported(int is_supported)
{ {
static char text_unsupported[] __initdata = "not supported"; static char text_unsupported[] __initdata = "not supported";
return (is_supported)? &text_unsupported[4] : &text_unsupported[0]; return (is_supported) ? &text_unsupported[4] : &text_unsupported[0];
} }
#endif /* CONFIG_THINKPAD_ACPI_DEBUG */ #endif /* CONFIG_THINKPAD_ACPI_DEBUG */
...@@ -8783,7 +8783,7 @@ static int __init ibm_init(struct ibm_init_struct *iibm) ...@@ -8783,7 +8783,7 @@ static int __init ibm_init(struct ibm_init_struct *iibm)
ibm->name, ret); ibm->name, ret);
ibm_exit(ibm); ibm_exit(ibm);
return (ret < 0)? ret : 0; return (ret < 0) ? ret : 0;
} }
/* Probing */ /* Probing */
...@@ -8794,7 +8794,7 @@ static bool __pure __init tpacpi_is_fw_digit(const char c) ...@@ -8794,7 +8794,7 @@ static bool __pure __init tpacpi_is_fw_digit(const char c)
} }
/* Most models: xxyTkkWW (#.##c); Ancient 570/600 and -SL lacks (#.##c) */ /* Most models: xxyTkkWW (#.##c); Ancient 570/600 and -SL lacks (#.##c) */
static bool __pure __init tpacpi_is_valid_fw_id(const char* const s, static bool __pure __init tpacpi_is_valid_fw_id(const char * const s,
const char t) const char t)
{ {
return s && strlen(s) >= 8 && return s && strlen(s) >= 8 &&
......
...@@ -71,7 +71,8 @@ MODULE_LICENSE("GPL"); ...@@ -71,7 +71,8 @@ MODULE_LICENSE("GPL");
/* Toshiba ACPI method paths */ /* Toshiba ACPI method paths */
#define METHOD_VIDEO_OUT "\\_SB_.VALX.DSSX" #define METHOD_VIDEO_OUT "\\_SB_.VALX.DSSX"
/* Toshiba HCI interface definitions /* The Toshiba configuration interface is composed of the HCI and the SCI,
* which are defined as follows:
* *
* HCI is Toshiba's "Hardware Control Interface" which is supposed to * HCI is Toshiba's "Hardware Control Interface" which is supposed to
* be uniform across all their models. Ideally we would just call * be uniform across all their models. Ideally we would just call
...@@ -84,7 +85,7 @@ MODULE_LICENSE("GPL"); ...@@ -84,7 +85,7 @@ MODULE_LICENSE("GPL");
* conceal differences in hardware between different models. * conceal differences in hardware between different models.
*/ */
#define HCI_WORDS 6 #define TCI_WORDS 6
/* operations */ /* operations */
#define HCI_SET 0xff00 #define HCI_SET 0xff00
...@@ -95,17 +96,18 @@ MODULE_LICENSE("GPL"); ...@@ -95,17 +96,18 @@ MODULE_LICENSE("GPL");
#define SCI_SET 0xf400 #define SCI_SET 0xf400
/* return codes */ /* return codes */
#define HCI_SUCCESS 0x0000 #define TOS_SUCCESS 0x0000
#define HCI_FAILURE 0x1000 #define TOS_OPEN_CLOSE_OK 0x0044
#define HCI_NOT_SUPPORTED 0x8000 #define TOS_FAILURE 0x1000
#define HCI_EMPTY 0x8c00 #define TOS_NOT_SUPPORTED 0x8000
#define HCI_DATA_NOT_AVAILABLE 0x8d20 #define TOS_ALREADY_OPEN 0x8100
#define HCI_NOT_INITIALIZED 0x8d50 #define TOS_NOT_OPENED 0x8200
#define SCI_OPEN_CLOSE_OK 0x0044 #define TOS_INPUT_DATA_ERROR 0x8300
#define SCI_ALREADY_OPEN 0x8100 #define TOS_WRITE_PROTECTED 0x8400
#define SCI_NOT_OPENED 0x8200 #define TOS_NOT_PRESENT 0x8600
#define SCI_INPUT_DATA_ERROR 0x8300 #define TOS_FIFO_EMPTY 0x8c00
#define SCI_NOT_PRESENT 0x8600 #define TOS_DATA_NOT_AVAILABLE 0x8d20
#define TOS_NOT_INITIALIZED 0x8d50
/* registers */ /* registers */
#define HCI_FAN 0x0004 #define HCI_FAN 0x0004
...@@ -138,8 +140,12 @@ MODULE_LICENSE("GPL"); ...@@ -138,8 +140,12 @@ MODULE_LICENSE("GPL");
#define HCI_WIRELESS_BT_PRESENT 0x0f #define HCI_WIRELESS_BT_PRESENT 0x0f
#define HCI_WIRELESS_BT_ATTACH 0x40 #define HCI_WIRELESS_BT_ATTACH 0x40
#define HCI_WIRELESS_BT_POWER 0x80 #define HCI_WIRELESS_BT_POWER 0x80
#define SCI_KBD_MODE_MASK 0x1f
#define SCI_KBD_MODE_FNZ 0x1 #define SCI_KBD_MODE_FNZ 0x1
#define SCI_KBD_MODE_AUTO 0x2 #define SCI_KBD_MODE_AUTO 0x2
#define SCI_KBD_MODE_ON 0x8
#define SCI_KBD_MODE_OFF 0x10
#define SCI_KBD_TIME_MAX 0x3c001a
struct toshiba_acpi_dev { struct toshiba_acpi_dev {
struct acpi_device *acpi_dev; struct acpi_device *acpi_dev;
...@@ -155,6 +161,7 @@ struct toshiba_acpi_dev { ...@@ -155,6 +161,7 @@ struct toshiba_acpi_dev {
int force_fan; int force_fan;
int last_key_event; int last_key_event;
int key_event_valid; int key_event_valid;
int kbd_type;
int kbd_mode; int kbd_mode;
int kbd_time; int kbd_time;
...@@ -190,6 +197,7 @@ static const struct key_entry toshiba_acpi_keymap[] = { ...@@ -190,6 +197,7 @@ static const struct key_entry toshiba_acpi_keymap[] = {
{ KE_KEY, 0x101, { KEY_MUTE } }, { KE_KEY, 0x101, { KEY_MUTE } },
{ KE_KEY, 0x102, { KEY_ZOOMOUT } }, { KE_KEY, 0x102, { KEY_ZOOMOUT } },
{ KE_KEY, 0x103, { KEY_ZOOMIN } }, { KE_KEY, 0x103, { KEY_ZOOMIN } },
{ KE_KEY, 0x10f, { KEY_TAB } },
{ KE_KEY, 0x12c, { KEY_KBDILLUMTOGGLE } }, { KE_KEY, 0x12c, { KEY_KBDILLUMTOGGLE } },
{ KE_KEY, 0x139, { KEY_ZOOMRESET } }, { KE_KEY, 0x139, { KEY_ZOOMRESET } },
{ KE_KEY, 0x13b, { KEY_COFFEE } }, { KE_KEY, 0x13b, { KEY_COFFEE } },
...@@ -210,7 +218,11 @@ static const struct key_entry toshiba_acpi_keymap[] = { ...@@ -210,7 +218,11 @@ static const struct key_entry toshiba_acpi_keymap[] = {
{ KE_KEY, 0xb32, { KEY_NEXTSONG } }, { KE_KEY, 0xb32, { KEY_NEXTSONG } },
{ KE_KEY, 0xb33, { KEY_PLAYPAUSE } }, { KE_KEY, 0xb33, { KEY_PLAYPAUSE } },
{ KE_KEY, 0xb5a, { KEY_MEDIA } }, { KE_KEY, 0xb5a, { KEY_MEDIA } },
{ KE_IGNORE, 0x1430, { KEY_RESERVED } }, { KE_IGNORE, 0x1430, { KEY_RESERVED } }, /* Wake from sleep */
{ KE_IGNORE, 0x1501, { KEY_RESERVED } }, /* Output changed */
{ KE_IGNORE, 0x1502, { KEY_RESERVED } }, /* HDMI plugged/unplugged */
{ KE_IGNORE, 0x1ABE, { KEY_RESERVED } }, /* Protection level set */
{ KE_IGNORE, 0x1ABF, { KEY_RESERVED } }, /* Protection level off */
{ KE_END, 0 }, { KE_END, 0 },
}; };
...@@ -264,22 +276,22 @@ static int write_acpi_int(const char *methodName, int val) ...@@ -264,22 +276,22 @@ static int write_acpi_int(const char *methodName, int val)
return (status == AE_OK) ? 0 : -EIO; return (status == AE_OK) ? 0 : -EIO;
} }
/* Perform a raw HCI call. Here we don't care about input or output buffer /* Perform a raw configuration call. Here we don't care about input or output
* format. * buffer format.
*/ */
static acpi_status hci_raw(struct toshiba_acpi_dev *dev, static acpi_status tci_raw(struct toshiba_acpi_dev *dev,
const u32 in[HCI_WORDS], u32 out[HCI_WORDS]) const u32 in[TCI_WORDS], u32 out[TCI_WORDS])
{ {
struct acpi_object_list params; struct acpi_object_list params;
union acpi_object in_objs[HCI_WORDS]; union acpi_object in_objs[TCI_WORDS];
struct acpi_buffer results; struct acpi_buffer results;
union acpi_object out_objs[HCI_WORDS + 1]; union acpi_object out_objs[TCI_WORDS + 1];
acpi_status status; acpi_status status;
int i; int i;
params.count = HCI_WORDS; params.count = TCI_WORDS;
params.pointer = in_objs; params.pointer = in_objs;
for (i = 0; i < HCI_WORDS; ++i) { for (i = 0; i < TCI_WORDS; ++i) {
in_objs[i].type = ACPI_TYPE_INTEGER; in_objs[i].type = ACPI_TYPE_INTEGER;
in_objs[i].integer.value = in[i]; in_objs[i].integer.value = in[i];
} }
...@@ -290,7 +302,7 @@ static acpi_status hci_raw(struct toshiba_acpi_dev *dev, ...@@ -290,7 +302,7 @@ static acpi_status hci_raw(struct toshiba_acpi_dev *dev,
status = acpi_evaluate_object(dev->acpi_dev->handle, status = acpi_evaluate_object(dev->acpi_dev->handle,
(char *)dev->method_hci, &params, (char *)dev->method_hci, &params,
&results); &results);
if ((status == AE_OK) && (out_objs->package.count <= HCI_WORDS)) { if ((status == AE_OK) && (out_objs->package.count <= TCI_WORDS)) {
for (i = 0; i < out_objs->package.count; ++i) { for (i = 0; i < out_objs->package.count; ++i) {
out[i] = out_objs->package.elements[i].integer.value; out[i] = out_objs->package.elements[i].integer.value;
} }
...@@ -305,47 +317,49 @@ static acpi_status hci_raw(struct toshiba_acpi_dev *dev, ...@@ -305,47 +317,49 @@ static acpi_status hci_raw(struct toshiba_acpi_dev *dev,
* may be useful (such as "not supported"). * may be useful (such as "not supported").
*/ */
static acpi_status hci_write1(struct toshiba_acpi_dev *dev, u32 reg, static u32 hci_write1(struct toshiba_acpi_dev *dev, u32 reg, u32 in1)
u32 in1, u32 *result)
{ {
u32 in[HCI_WORDS] = { HCI_SET, reg, in1, 0, 0, 0 }; u32 in[TCI_WORDS] = { HCI_SET, reg, in1, 0, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status = hci_raw(dev, in, out); acpi_status status = tci_raw(dev, in, out);
*result = (status == AE_OK) ? out[0] : HCI_FAILURE;
return status; return ACPI_SUCCESS(status) ? out[0] : TOS_FAILURE;
} }
static acpi_status hci_read1(struct toshiba_acpi_dev *dev, u32 reg, static u32 hci_read1(struct toshiba_acpi_dev *dev, u32 reg, u32 *out1)
u32 *out1, u32 *result)
{ {
u32 in[HCI_WORDS] = { HCI_GET, reg, 0, 0, 0, 0 }; u32 in[TCI_WORDS] = { HCI_GET, reg, 0, 0, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status = hci_raw(dev, in, out); acpi_status status = tci_raw(dev, in, out);
if (ACPI_FAILURE(status))
return TOS_FAILURE;
*out1 = out[2]; *out1 = out[2];
*result = (status == AE_OK) ? out[0] : HCI_FAILURE;
return status; return out[0];
} }
static acpi_status hci_write2(struct toshiba_acpi_dev *dev, u32 reg, static u32 hci_write2(struct toshiba_acpi_dev *dev, u32 reg, u32 in1, u32 in2)
u32 in1, u32 in2, u32 *result)
{ {
u32 in[HCI_WORDS] = { HCI_SET, reg, in1, in2, 0, 0 }; u32 in[TCI_WORDS] = { HCI_SET, reg, in1, in2, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status = hci_raw(dev, in, out); acpi_status status = tci_raw(dev, in, out);
*result = (status == AE_OK) ? out[0] : HCI_FAILURE;
return status; return ACPI_SUCCESS(status) ? out[0] : TOS_FAILURE;
} }
static acpi_status hci_read2(struct toshiba_acpi_dev *dev, u32 reg, static u32 hci_read2(struct toshiba_acpi_dev *dev, u32 reg, u32 *out1, u32 *out2)
u32 *out1, u32 *out2, u32 *result)
{ {
u32 in[HCI_WORDS] = { HCI_GET, reg, *out1, *out2, 0, 0 }; u32 in[TCI_WORDS] = { HCI_GET, reg, *out1, *out2, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status = hci_raw(dev, in, out); acpi_status status = tci_raw(dev, in, out);
if (ACPI_FAILURE(status))
return TOS_FAILURE;
*out1 = out[2]; *out1 = out[2];
*out2 = out[3]; *out2 = out[3];
*result = (status == AE_OK) ? out[0] : HCI_FAILURE;
return status; return out[0];
} }
/* common sci tasks /* common sci tasks
...@@ -353,22 +367,22 @@ static acpi_status hci_read2(struct toshiba_acpi_dev *dev, u32 reg, ...@@ -353,22 +367,22 @@ static acpi_status hci_read2(struct toshiba_acpi_dev *dev, u32 reg,
static int sci_open(struct toshiba_acpi_dev *dev) static int sci_open(struct toshiba_acpi_dev *dev)
{ {
u32 in[HCI_WORDS] = { SCI_OPEN, 0, 0, 0, 0, 0 }; u32 in[TCI_WORDS] = { SCI_OPEN, 0, 0, 0, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status; acpi_status status;
status = hci_raw(dev, in, out); status = tci_raw(dev, in, out);
if (ACPI_FAILURE(status) || out[0] == HCI_FAILURE) { if (ACPI_FAILURE(status) || out[0] == TOS_FAILURE) {
pr_err("ACPI call to open SCI failed\n"); pr_err("ACPI call to open SCI failed\n");
return 0; return 0;
} }
if (out[0] == SCI_OPEN_CLOSE_OK) { if (out[0] == TOS_OPEN_CLOSE_OK) {
return 1; return 1;
} else if (out[0] == SCI_ALREADY_OPEN) { } else if (out[0] == TOS_ALREADY_OPEN) {
pr_info("Toshiba SCI already opened\n"); pr_info("Toshiba SCI already opened\n");
return 1; return 1;
} else if (out[0] == SCI_NOT_PRESENT) { } else if (out[0] == TOS_NOT_PRESENT) {
pr_info("Toshiba SCI is not present\n"); pr_info("Toshiba SCI is not present\n");
} }
...@@ -377,61 +391,62 @@ static int sci_open(struct toshiba_acpi_dev *dev) ...@@ -377,61 +391,62 @@ static int sci_open(struct toshiba_acpi_dev *dev)
static void sci_close(struct toshiba_acpi_dev *dev) static void sci_close(struct toshiba_acpi_dev *dev)
{ {
u32 in[HCI_WORDS] = { SCI_CLOSE, 0, 0, 0, 0, 0 }; u32 in[TCI_WORDS] = { SCI_CLOSE, 0, 0, 0, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status; acpi_status status;
status = hci_raw(dev, in, out); status = tci_raw(dev, in, out);
if (ACPI_FAILURE(status) || out[0] == HCI_FAILURE) { if (ACPI_FAILURE(status) || out[0] == TOS_FAILURE) {
pr_err("ACPI call to close SCI failed\n"); pr_err("ACPI call to close SCI failed\n");
return; return;
} }
if (out[0] == SCI_OPEN_CLOSE_OK) if (out[0] == TOS_OPEN_CLOSE_OK)
return; return;
else if (out[0] == SCI_NOT_OPENED) else if (out[0] == TOS_NOT_OPENED)
pr_info("Toshiba SCI not opened\n"); pr_info("Toshiba SCI not opened\n");
else if (out[0] == SCI_NOT_PRESENT) else if (out[0] == TOS_NOT_PRESENT)
pr_info("Toshiba SCI is not present\n"); pr_info("Toshiba SCI is not present\n");
} }
static acpi_status sci_read(struct toshiba_acpi_dev *dev, u32 reg, static u32 sci_read(struct toshiba_acpi_dev *dev, u32 reg, u32 *out1)
u32 *out1, u32 *result)
{ {
u32 in[HCI_WORDS] = { SCI_GET, reg, 0, 0, 0, 0 }; u32 in[TCI_WORDS] = { SCI_GET, reg, 0, 0, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status = hci_raw(dev, in, out); acpi_status status = tci_raw(dev, in, out);
if (ACPI_FAILURE(status))
return TOS_FAILURE;
*out1 = out[2]; *out1 = out[2];
*result = (ACPI_SUCCESS(status)) ? out[0] : HCI_FAILURE;
return status; return out[0];
} }
static acpi_status sci_write(struct toshiba_acpi_dev *dev, u32 reg, static u32 sci_write(struct toshiba_acpi_dev *dev, u32 reg, u32 in1)
u32 in1, u32 *result)
{ {
u32 in[HCI_WORDS] = { SCI_SET, reg, in1, 0, 0, 0 }; u32 in[TCI_WORDS] = { SCI_SET, reg, in1, 0, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status = hci_raw(dev, in, out); acpi_status status = tci_raw(dev, in, out);
*result = (ACPI_SUCCESS(status)) ? out[0] : HCI_FAILURE;
return status; return ACPI_SUCCESS(status) ? out[0] : TOS_FAILURE;
} }
/* Illumination support */ /* Illumination support */
static int toshiba_illumination_available(struct toshiba_acpi_dev *dev) static int toshiba_illumination_available(struct toshiba_acpi_dev *dev)
{ {
u32 in[HCI_WORDS] = { SCI_GET, SCI_ILLUMINATION, 0, 0, 0, 0 }; u32 in[TCI_WORDS] = { SCI_GET, SCI_ILLUMINATION, 0, 0, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status; acpi_status status;
if (!sci_open(dev)) if (!sci_open(dev))
return 0; return 0;
status = hci_raw(dev, in, out); status = tci_raw(dev, in, out);
sci_close(dev); sci_close(dev);
if (ACPI_FAILURE(status) || out[0] == HCI_FAILURE) { if (ACPI_FAILURE(status) || out[0] == TOS_FAILURE) {
pr_err("ACPI call to query Illumination support failed\n"); pr_err("ACPI call to query Illumination support failed\n");
return 0; return 0;
} else if (out[0] == HCI_NOT_SUPPORTED || out[1] != 1) { } else if (out[0] == TOS_NOT_SUPPORTED) {
pr_info("Illumination device not available\n"); pr_info("Illumination device not available\n");
return 0; return 0;
} }
...@@ -445,7 +460,6 @@ static void toshiba_illumination_set(struct led_classdev *cdev, ...@@ -445,7 +460,6 @@ static void toshiba_illumination_set(struct led_classdev *cdev,
struct toshiba_acpi_dev *dev = container_of(cdev, struct toshiba_acpi_dev *dev = container_of(cdev,
struct toshiba_acpi_dev, led_dev); struct toshiba_acpi_dev, led_dev);
u32 state, result; u32 state, result;
acpi_status status;
/* First request : initialize communication. */ /* First request : initialize communication. */
if (!sci_open(dev)) if (!sci_open(dev))
...@@ -453,12 +467,12 @@ static void toshiba_illumination_set(struct led_classdev *cdev, ...@@ -453,12 +467,12 @@ static void toshiba_illumination_set(struct led_classdev *cdev,
/* Switch the illumination on/off */ /* Switch the illumination on/off */
state = brightness ? 1 : 0; state = brightness ? 1 : 0;
status = sci_write(dev, SCI_ILLUMINATION, state, &result); result = sci_write(dev, SCI_ILLUMINATION, state);
sci_close(dev); sci_close(dev);
if (ACPI_FAILURE(status)) { if (result == TOS_FAILURE) {
pr_err("ACPI call for illumination failed\n"); pr_err("ACPI call for illumination failed\n");
return; return;
} else if (result == HCI_NOT_SUPPORTED) { } else if (result == TOS_NOT_SUPPORTED) {
pr_info("Illumination not supported\n"); pr_info("Illumination not supported\n");
return; return;
} }
...@@ -469,19 +483,18 @@ static enum led_brightness toshiba_illumination_get(struct led_classdev *cdev) ...@@ -469,19 +483,18 @@ static enum led_brightness toshiba_illumination_get(struct led_classdev *cdev)
struct toshiba_acpi_dev *dev = container_of(cdev, struct toshiba_acpi_dev *dev = container_of(cdev,
struct toshiba_acpi_dev, led_dev); struct toshiba_acpi_dev, led_dev);
u32 state, result; u32 state, result;
acpi_status status;
/* First request : initialize communication. */ /* First request : initialize communication. */
if (!sci_open(dev)) if (!sci_open(dev))
return LED_OFF; return LED_OFF;
/* Check the illumination */ /* Check the illumination */
status = sci_read(dev, SCI_ILLUMINATION, &state, &result); result = sci_read(dev, SCI_ILLUMINATION, &state);
sci_close(dev); sci_close(dev);
if (ACPI_FAILURE(status) || result == SCI_INPUT_DATA_ERROR) { if (result == TOS_FAILURE || result == TOS_INPUT_DATA_ERROR) {
pr_err("ACPI call for illumination failed\n"); pr_err("ACPI call for illumination failed\n");
return LED_OFF; return LED_OFF;
} else if (result == HCI_NOT_SUPPORTED) { } else if (result == TOS_NOT_SUPPORTED) {
pr_info("Illumination not supported\n"); pr_info("Illumination not supported\n");
return LED_OFF; return LED_OFF;
} }
...@@ -490,20 +503,55 @@ static enum led_brightness toshiba_illumination_get(struct led_classdev *cdev) ...@@ -490,20 +503,55 @@ static enum led_brightness toshiba_illumination_get(struct led_classdev *cdev)
} }
/* KBD Illumination */ /* KBD Illumination */
static int toshiba_kbd_illum_available(struct toshiba_acpi_dev *dev)
{
u32 in[TCI_WORDS] = { SCI_GET, SCI_KBD_ILLUM_STATUS, 0, 0, 0, 0 };
u32 out[TCI_WORDS];
acpi_status status;
if (!sci_open(dev))
return 0;
status = tci_raw(dev, in, out);
sci_close(dev);
if (ACPI_FAILURE(status) || out[0] == TOS_INPUT_DATA_ERROR) {
pr_err("ACPI call to query kbd illumination support failed\n");
return 0;
} else if (out[0] == TOS_NOT_SUPPORTED) {
pr_info("Keyboard illumination not available\n");
return 0;
}
/* Check for keyboard backlight timeout max value,
* previous kbd backlight implementation set this to
* 0x3c0003, and now the new implementation set this
* to 0x3c001a, use this to distinguish between them
*/
if (out[3] == SCI_KBD_TIME_MAX)
dev->kbd_type = 2;
else
dev->kbd_type = 1;
/* Get the current keyboard backlight mode */
dev->kbd_mode = out[2] & SCI_KBD_MODE_MASK;
/* Get the current time (1-60 seconds) */
dev->kbd_time = out[2] >> HCI_MISC_SHIFT;
return 1;
}
static int toshiba_kbd_illum_status_set(struct toshiba_acpi_dev *dev, u32 time) static int toshiba_kbd_illum_status_set(struct toshiba_acpi_dev *dev, u32 time)
{ {
u32 result; u32 result;
acpi_status status;
if (!sci_open(dev)) if (!sci_open(dev))
return -EIO; return -EIO;
status = sci_write(dev, SCI_KBD_ILLUM_STATUS, time, &result); result = sci_write(dev, SCI_KBD_ILLUM_STATUS, time);
sci_close(dev); sci_close(dev);
if (ACPI_FAILURE(status) || result == SCI_INPUT_DATA_ERROR) { if (result == TOS_FAILURE || result == TOS_INPUT_DATA_ERROR) {
pr_err("ACPI call to set KBD backlight status failed\n"); pr_err("ACPI call to set KBD backlight status failed\n");
return -EIO; return -EIO;
} else if (result == HCI_NOT_SUPPORTED) { } else if (result == TOS_NOT_SUPPORTED) {
pr_info("Keyboard backlight status not supported\n"); pr_info("Keyboard backlight status not supported\n");
return -ENODEV; return -ENODEV;
} }
...@@ -514,17 +562,16 @@ static int toshiba_kbd_illum_status_set(struct toshiba_acpi_dev *dev, u32 time) ...@@ -514,17 +562,16 @@ static int toshiba_kbd_illum_status_set(struct toshiba_acpi_dev *dev, u32 time)
static int toshiba_kbd_illum_status_get(struct toshiba_acpi_dev *dev, u32 *time) static int toshiba_kbd_illum_status_get(struct toshiba_acpi_dev *dev, u32 *time)
{ {
u32 result; u32 result;
acpi_status status;
if (!sci_open(dev)) if (!sci_open(dev))
return -EIO; return -EIO;
status = sci_read(dev, SCI_KBD_ILLUM_STATUS, time, &result); result = sci_read(dev, SCI_KBD_ILLUM_STATUS, time);
sci_close(dev); sci_close(dev);
if (ACPI_FAILURE(status) || result == SCI_INPUT_DATA_ERROR) { if (result == TOS_FAILURE || result == TOS_INPUT_DATA_ERROR) {
pr_err("ACPI call to get KBD backlight status failed\n"); pr_err("ACPI call to get KBD backlight status failed\n");
return -EIO; return -EIO;
} else if (result == HCI_NOT_SUPPORTED) { } else if (result == TOS_NOT_SUPPORTED) {
pr_info("Keyboard backlight status not supported\n"); pr_info("Keyboard backlight status not supported\n");
return -ENODEV; return -ENODEV;
} }
...@@ -537,14 +584,13 @@ static enum led_brightness toshiba_kbd_backlight_get(struct led_classdev *cdev) ...@@ -537,14 +584,13 @@ static enum led_brightness toshiba_kbd_backlight_get(struct led_classdev *cdev)
struct toshiba_acpi_dev *dev = container_of(cdev, struct toshiba_acpi_dev *dev = container_of(cdev,
struct toshiba_acpi_dev, kbd_led); struct toshiba_acpi_dev, kbd_led);
u32 state, result; u32 state, result;
acpi_status status;
/* Check the keyboard backlight state */ /* Check the keyboard backlight state */
status = hci_read1(dev, HCI_KBD_ILLUMINATION, &state, &result); result = hci_read1(dev, HCI_KBD_ILLUMINATION, &state);
if (ACPI_FAILURE(status) || result == SCI_INPUT_DATA_ERROR) { if (result == TOS_FAILURE || result == TOS_INPUT_DATA_ERROR) {
pr_err("ACPI call to get the keyboard backlight failed\n"); pr_err("ACPI call to get the keyboard backlight failed\n");
return LED_OFF; return LED_OFF;
} else if (result == HCI_NOT_SUPPORTED) { } else if (result == TOS_NOT_SUPPORTED) {
pr_info("Keyboard backlight not supported\n"); pr_info("Keyboard backlight not supported\n");
return LED_OFF; return LED_OFF;
} }
...@@ -558,15 +604,14 @@ static void toshiba_kbd_backlight_set(struct led_classdev *cdev, ...@@ -558,15 +604,14 @@ static void toshiba_kbd_backlight_set(struct led_classdev *cdev,
struct toshiba_acpi_dev *dev = container_of(cdev, struct toshiba_acpi_dev *dev = container_of(cdev,
struct toshiba_acpi_dev, kbd_led); struct toshiba_acpi_dev, kbd_led);
u32 state, result; u32 state, result;
acpi_status status;
/* Set the keyboard backlight state */ /* Set the keyboard backlight state */
state = brightness ? 1 : 0; state = brightness ? 1 : 0;
status = hci_write1(dev, HCI_KBD_ILLUMINATION, state, &result); result = hci_write1(dev, HCI_KBD_ILLUMINATION, state);
if (ACPI_FAILURE(status) || result == SCI_INPUT_DATA_ERROR) { if (result == TOS_FAILURE || result == TOS_INPUT_DATA_ERROR) {
pr_err("ACPI call to set KBD Illumination mode failed\n"); pr_err("ACPI call to set KBD Illumination mode failed\n");
return; return;
} else if (result == HCI_NOT_SUPPORTED) { } else if (result == TOS_NOT_SUPPORTED) {
pr_info("Keyboard backlight not supported\n"); pr_info("Keyboard backlight not supported\n");
return; return;
} }
...@@ -576,17 +621,16 @@ static void toshiba_kbd_backlight_set(struct led_classdev *cdev, ...@@ -576,17 +621,16 @@ static void toshiba_kbd_backlight_set(struct led_classdev *cdev,
static int toshiba_touchpad_set(struct toshiba_acpi_dev *dev, u32 state) static int toshiba_touchpad_set(struct toshiba_acpi_dev *dev, u32 state)
{ {
u32 result; u32 result;
acpi_status status;
if (!sci_open(dev)) if (!sci_open(dev))
return -EIO; return -EIO;
status = sci_write(dev, SCI_TOUCHPAD, state, &result); result = sci_write(dev, SCI_TOUCHPAD, state);
sci_close(dev); sci_close(dev);
if (ACPI_FAILURE(status)) { if (result == TOS_FAILURE) {
pr_err("ACPI call to set the touchpad failed\n"); pr_err("ACPI call to set the touchpad failed\n");
return -EIO; return -EIO;
} else if (result == HCI_NOT_SUPPORTED) { } else if (result == TOS_NOT_SUPPORTED) {
return -ENODEV; return -ENODEV;
} }
...@@ -596,17 +640,16 @@ static int toshiba_touchpad_set(struct toshiba_acpi_dev *dev, u32 state) ...@@ -596,17 +640,16 @@ static int toshiba_touchpad_set(struct toshiba_acpi_dev *dev, u32 state)
static int toshiba_touchpad_get(struct toshiba_acpi_dev *dev, u32 *state) static int toshiba_touchpad_get(struct toshiba_acpi_dev *dev, u32 *state)
{ {
u32 result; u32 result;
acpi_status status;
if (!sci_open(dev)) if (!sci_open(dev))
return -EIO; return -EIO;
status = sci_read(dev, SCI_TOUCHPAD, state, &result); result = sci_read(dev, SCI_TOUCHPAD, state);
sci_close(dev); sci_close(dev);
if (ACPI_FAILURE(status)) { if (result == TOS_FAILURE) {
pr_err("ACPI call to query the touchpad failed\n"); pr_err("ACPI call to query the touchpad failed\n");
return -EIO; return -EIO;
} else if (result == HCI_NOT_SUPPORTED) { } else if (result == TOS_NOT_SUPPORTED) {
return -ENODEV; return -ENODEV;
} }
...@@ -617,11 +660,11 @@ static int toshiba_touchpad_get(struct toshiba_acpi_dev *dev, u32 *state) ...@@ -617,11 +660,11 @@ static int toshiba_touchpad_get(struct toshiba_acpi_dev *dev, u32 *state)
static int toshiba_eco_mode_available(struct toshiba_acpi_dev *dev) static int toshiba_eco_mode_available(struct toshiba_acpi_dev *dev)
{ {
acpi_status status; acpi_status status;
u32 in[HCI_WORDS] = { HCI_GET, HCI_ECO_MODE, 0, 1, 0, 0 }; u32 in[TCI_WORDS] = { HCI_GET, HCI_ECO_MODE, 0, 1, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
status = hci_raw(dev, in, out); status = tci_raw(dev, in, out);
if (ACPI_FAILURE(status) || out[0] == SCI_INPUT_DATA_ERROR) { if (ACPI_FAILURE(status) || out[0] == TOS_INPUT_DATA_ERROR) {
pr_info("ACPI call to get ECO led failed\n"); pr_info("ACPI call to get ECO led failed\n");
return 0; return 0;
} }
...@@ -633,12 +676,12 @@ static enum led_brightness toshiba_eco_mode_get_status(struct led_classdev *cdev ...@@ -633,12 +676,12 @@ static enum led_brightness toshiba_eco_mode_get_status(struct led_classdev *cdev
{ {
struct toshiba_acpi_dev *dev = container_of(cdev, struct toshiba_acpi_dev *dev = container_of(cdev,
struct toshiba_acpi_dev, eco_led); struct toshiba_acpi_dev, eco_led);
u32 in[HCI_WORDS] = { HCI_GET, HCI_ECO_MODE, 0, 1, 0, 0 }; u32 in[TCI_WORDS] = { HCI_GET, HCI_ECO_MODE, 0, 1, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status; acpi_status status;
status = hci_raw(dev, in, out); status = tci_raw(dev, in, out);
if (ACPI_FAILURE(status) || out[0] == SCI_INPUT_DATA_ERROR) { if (ACPI_FAILURE(status) || out[0] == TOS_INPUT_DATA_ERROR) {
pr_err("ACPI call to get ECO led failed\n"); pr_err("ACPI call to get ECO led failed\n");
return LED_OFF; return LED_OFF;
} }
...@@ -651,14 +694,14 @@ static void toshiba_eco_mode_set_status(struct led_classdev *cdev, ...@@ -651,14 +694,14 @@ static void toshiba_eco_mode_set_status(struct led_classdev *cdev,
{ {
struct toshiba_acpi_dev *dev = container_of(cdev, struct toshiba_acpi_dev *dev = container_of(cdev,
struct toshiba_acpi_dev, eco_led); struct toshiba_acpi_dev, eco_led);
u32 in[HCI_WORDS] = { HCI_SET, HCI_ECO_MODE, 0, 1, 0, 0 }; u32 in[TCI_WORDS] = { HCI_SET, HCI_ECO_MODE, 0, 1, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status; acpi_status status;
/* Switch the Eco Mode led on/off */ /* Switch the Eco Mode led on/off */
in[2] = (brightness) ? 1 : 0; in[2] = (brightness) ? 1 : 0;
status = hci_raw(dev, in, out); status = tci_raw(dev, in, out);
if (ACPI_FAILURE(status) || out[0] == SCI_INPUT_DATA_ERROR) { if (ACPI_FAILURE(status) || out[0] == TOS_INPUT_DATA_ERROR) {
pr_err("ACPI call to set ECO led failed\n"); pr_err("ACPI call to set ECO led failed\n");
return; return;
} }
...@@ -667,22 +710,22 @@ static void toshiba_eco_mode_set_status(struct led_classdev *cdev, ...@@ -667,22 +710,22 @@ static void toshiba_eco_mode_set_status(struct led_classdev *cdev,
/* Accelerometer support */ /* Accelerometer support */
static int toshiba_accelerometer_supported(struct toshiba_acpi_dev *dev) static int toshiba_accelerometer_supported(struct toshiba_acpi_dev *dev)
{ {
u32 in[HCI_WORDS] = { HCI_GET, HCI_ACCELEROMETER2, 0, 0, 0, 0 }; u32 in[TCI_WORDS] = { HCI_GET, HCI_ACCELEROMETER2, 0, 0, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status; acpi_status status;
/* Check if the accelerometer call exists, /* Check if the accelerometer call exists,
* this call also serves as initialization * this call also serves as initialization
*/ */
status = hci_raw(dev, in, out); status = tci_raw(dev, in, out);
if (ACPI_FAILURE(status) || out[0] == SCI_INPUT_DATA_ERROR) { if (ACPI_FAILURE(status) || out[0] == TOS_INPUT_DATA_ERROR) {
pr_err("ACPI call to query the accelerometer failed\n"); pr_err("ACPI call to query the accelerometer failed\n");
return -EIO; return -EIO;
} else if (out[0] == HCI_DATA_NOT_AVAILABLE || } else if (out[0] == TOS_DATA_NOT_AVAILABLE ||
out[0] == HCI_NOT_INITIALIZED) { out[0] == TOS_NOT_INITIALIZED) {
pr_err("Accelerometer not initialized\n"); pr_err("Accelerometer not initialized\n");
return -EIO; return -EIO;
} else if (out[0] == HCI_NOT_SUPPORTED) { } else if (out[0] == TOS_NOT_SUPPORTED) {
pr_info("Accelerometer not supported\n"); pr_info("Accelerometer not supported\n");
return -ENODEV; return -ENODEV;
} }
...@@ -693,13 +736,13 @@ static int toshiba_accelerometer_supported(struct toshiba_acpi_dev *dev) ...@@ -693,13 +736,13 @@ static int toshiba_accelerometer_supported(struct toshiba_acpi_dev *dev)
static int toshiba_accelerometer_get(struct toshiba_acpi_dev *dev, static int toshiba_accelerometer_get(struct toshiba_acpi_dev *dev,
u32 *xy, u32 *z) u32 *xy, u32 *z)
{ {
u32 in[HCI_WORDS] = { HCI_GET, HCI_ACCELEROMETER, 0, 1, 0, 0 }; u32 in[TCI_WORDS] = { HCI_GET, HCI_ACCELEROMETER, 0, 1, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status; acpi_status status;
/* Check the Accelerometer status */ /* Check the Accelerometer status */
status = hci_raw(dev, in, out); status = tci_raw(dev, in, out);
if (ACPI_FAILURE(status) || out[0] == SCI_INPUT_DATA_ERROR) { if (ACPI_FAILURE(status) || out[0] == TOS_INPUT_DATA_ERROR) {
pr_err("ACPI call to query the accelerometer failed\n"); pr_err("ACPI call to query the accelerometer failed\n");
return -EIO; return -EIO;
} }
...@@ -719,8 +762,8 @@ static u32 hci_get_bt_present(struct toshiba_acpi_dev *dev, bool *present) ...@@ -719,8 +762,8 @@ static u32 hci_get_bt_present(struct toshiba_acpi_dev *dev, bool *present)
value = 0; value = 0;
value2 = 0; value2 = 0;
hci_read2(dev, HCI_WIRELESS, &value, &value2, &hci_result); hci_result = hci_read2(dev, HCI_WIRELESS, &value, &value2);
if (hci_result == HCI_SUCCESS) if (hci_result == TOS_SUCCESS)
*present = (value & HCI_WIRELESS_BT_PRESENT) ? true : false; *present = (value & HCI_WIRELESS_BT_PRESENT) ? true : false;
return hci_result; return hci_result;
...@@ -733,7 +776,7 @@ static u32 hci_get_radio_state(struct toshiba_acpi_dev *dev, bool *radio_state) ...@@ -733,7 +776,7 @@ static u32 hci_get_radio_state(struct toshiba_acpi_dev *dev, bool *radio_state)
value = 0; value = 0;
value2 = 0x0001; value2 = 0x0001;
hci_read2(dev, HCI_WIRELESS, &value, &value2, &hci_result); hci_result = hci_read2(dev, HCI_WIRELESS, &value, &value2);
*radio_state = value & HCI_WIRELESS_KILL_SWITCH; *radio_state = value & HCI_WIRELESS_KILL_SWITCH;
return hci_result; return hci_result;
...@@ -750,7 +793,7 @@ static int bt_rfkill_set_block(void *data, bool blocked) ...@@ -750,7 +793,7 @@ static int bt_rfkill_set_block(void *data, bool blocked)
value = (blocked == false); value = (blocked == false);
mutex_lock(&dev->mutex); mutex_lock(&dev->mutex);
if (hci_get_radio_state(dev, &radio_state) != HCI_SUCCESS) { if (hci_get_radio_state(dev, &radio_state) != TOS_SUCCESS) {
err = -EIO; err = -EIO;
goto out; goto out;
} }
...@@ -760,10 +803,10 @@ static int bt_rfkill_set_block(void *data, bool blocked) ...@@ -760,10 +803,10 @@ static int bt_rfkill_set_block(void *data, bool blocked)
goto out; goto out;
} }
hci_write2(dev, HCI_WIRELESS, value, HCI_WIRELESS_BT_POWER, &result1); result1 = hci_write2(dev, HCI_WIRELESS, value, HCI_WIRELESS_BT_POWER);
hci_write2(dev, HCI_WIRELESS, value, HCI_WIRELESS_BT_ATTACH, &result2); result2 = hci_write2(dev, HCI_WIRELESS, value, HCI_WIRELESS_BT_ATTACH);
if (result1 != HCI_SUCCESS || result2 != HCI_SUCCESS) if (result1 != TOS_SUCCESS || result2 != TOS_SUCCESS)
err = -EIO; err = -EIO;
else else
err = 0; err = 0;
...@@ -782,7 +825,7 @@ static void bt_rfkill_poll(struct rfkill *rfkill, void *data) ...@@ -782,7 +825,7 @@ static void bt_rfkill_poll(struct rfkill *rfkill, void *data)
mutex_lock(&dev->mutex); mutex_lock(&dev->mutex);
hci_result = hci_get_radio_state(dev, &value); hci_result = hci_get_radio_state(dev, &value);
if (hci_result != HCI_SUCCESS) { if (hci_result != TOS_SUCCESS) {
/* Can't do anything useful */ /* Can't do anything useful */
mutex_unlock(&dev->mutex); mutex_unlock(&dev->mutex);
return; return;
...@@ -806,9 +849,9 @@ static int get_tr_backlight_status(struct toshiba_acpi_dev *dev, bool *enabled) ...@@ -806,9 +849,9 @@ static int get_tr_backlight_status(struct toshiba_acpi_dev *dev, bool *enabled)
u32 hci_result; u32 hci_result;
u32 status; u32 status;
hci_read1(dev, HCI_TR_BACKLIGHT, &status, &hci_result); hci_result = hci_read1(dev, HCI_TR_BACKLIGHT, &status);
*enabled = !status; *enabled = !status;
return hci_result == HCI_SUCCESS ? 0 : -EIO; return hci_result == TOS_SUCCESS ? 0 : -EIO;
} }
static int set_tr_backlight_status(struct toshiba_acpi_dev *dev, bool enable) static int set_tr_backlight_status(struct toshiba_acpi_dev *dev, bool enable)
...@@ -816,8 +859,8 @@ static int set_tr_backlight_status(struct toshiba_acpi_dev *dev, bool enable) ...@@ -816,8 +859,8 @@ static int set_tr_backlight_status(struct toshiba_acpi_dev *dev, bool enable)
u32 hci_result; u32 hci_result;
u32 value = !enable; u32 value = !enable;
hci_write1(dev, HCI_TR_BACKLIGHT, value, &hci_result); hci_result = hci_write1(dev, HCI_TR_BACKLIGHT, value);
return hci_result == HCI_SUCCESS ? 0 : -EIO; return hci_result == TOS_SUCCESS ? 0 : -EIO;
} }
static struct proc_dir_entry *toshiba_proc_dir /*= 0*/ ; static struct proc_dir_entry *toshiba_proc_dir /*= 0*/ ;
...@@ -838,8 +881,8 @@ static int __get_lcd_brightness(struct toshiba_acpi_dev *dev) ...@@ -838,8 +881,8 @@ static int __get_lcd_brightness(struct toshiba_acpi_dev *dev)
brightness++; brightness++;
} }
hci_read1(dev, HCI_LCD_BRIGHTNESS, &value, &hci_result); hci_result = hci_read1(dev, HCI_LCD_BRIGHTNESS, &value);
if (hci_result == HCI_SUCCESS) if (hci_result == TOS_SUCCESS)
return brightness + (value >> HCI_LCD_BRIGHTNESS_SHIFT); return brightness + (value >> HCI_LCD_BRIGHTNESS_SHIFT);
return -EIO; return -EIO;
...@@ -879,8 +922,8 @@ static int lcd_proc_open(struct inode *inode, struct file *file) ...@@ -879,8 +922,8 @@ static int lcd_proc_open(struct inode *inode, struct file *file)
static int set_lcd_brightness(struct toshiba_acpi_dev *dev, int value) static int set_lcd_brightness(struct toshiba_acpi_dev *dev, int value)
{ {
u32 in[HCI_WORDS] = { HCI_SET, HCI_LCD_BRIGHTNESS, 0, 0, 0, 0 }; u32 in[TCI_WORDS] = { HCI_SET, HCI_LCD_BRIGHTNESS, 0, 0, 0, 0 };
u32 out[HCI_WORDS]; u32 out[TCI_WORDS];
acpi_status status; acpi_status status;
if (dev->tr_backlight_supported) { if (dev->tr_backlight_supported) {
...@@ -893,19 +936,19 @@ static int set_lcd_brightness(struct toshiba_acpi_dev *dev, int value) ...@@ -893,19 +936,19 @@ static int set_lcd_brightness(struct toshiba_acpi_dev *dev, int value)
} }
in[2] = value << HCI_LCD_BRIGHTNESS_SHIFT; in[2] = value << HCI_LCD_BRIGHTNESS_SHIFT;
status = hci_raw(dev, in, out); status = tci_raw(dev, in, out);
if (ACPI_FAILURE(status) || out[0] == HCI_FAILURE) { if (ACPI_FAILURE(status) || out[0] == TOS_FAILURE) {
pr_err("ACPI call to set brightness failed"); pr_err("ACPI call to set brightness failed");
return -EIO; return -EIO;
} }
/* Extra check for "incomplete" backlight method, where the AML code /* Extra check for "incomplete" backlight method, where the AML code
* doesn't check for HCI_SET or HCI_GET and returns HCI_SUCCESS, * doesn't check for HCI_SET or HCI_GET and returns TOS_SUCCESS,
* the actual brightness, and in some cases the max brightness. * the actual brightness, and in some cases the max brightness.
*/ */
if (out[2] > 0 || out[3] == 0xE000) if (out[2] > 0 || out[3] == 0xE000)
return -ENODEV; return -ENODEV;
return out[0] == HCI_SUCCESS ? 0 : -EIO; return out[0] == TOS_SUCCESS ? 0 : -EIO;
} }
static int set_lcd_status(struct backlight_device *bd) static int set_lcd_status(struct backlight_device *bd)
...@@ -953,8 +996,8 @@ static int get_video_status(struct toshiba_acpi_dev *dev, u32 *status) ...@@ -953,8 +996,8 @@ static int get_video_status(struct toshiba_acpi_dev *dev, u32 *status)
{ {
u32 hci_result; u32 hci_result;
hci_read1(dev, HCI_VIDEO_OUT, status, &hci_result); hci_result = hci_read1(dev, HCI_VIDEO_OUT, status);
return hci_result == HCI_SUCCESS ? 0 : -EIO; return hci_result == TOS_SUCCESS ? 0 : -EIO;
} }
static int video_proc_show(struct seq_file *m, void *v) static int video_proc_show(struct seq_file *m, void *v)
...@@ -1057,8 +1100,8 @@ static int get_fan_status(struct toshiba_acpi_dev *dev, u32 *status) ...@@ -1057,8 +1100,8 @@ static int get_fan_status(struct toshiba_acpi_dev *dev, u32 *status)
{ {
u32 hci_result; u32 hci_result;
hci_read1(dev, HCI_FAN, status, &hci_result); hci_result = hci_read1(dev, HCI_FAN, status);
return hci_result == HCI_SUCCESS ? 0 : -EIO; return hci_result == TOS_SUCCESS ? 0 : -EIO;
} }
static int fan_proc_show(struct seq_file *m, void *v) static int fan_proc_show(struct seq_file *m, void *v)
...@@ -1097,8 +1140,8 @@ static ssize_t fan_proc_write(struct file *file, const char __user *buf, ...@@ -1097,8 +1140,8 @@ static ssize_t fan_proc_write(struct file *file, const char __user *buf,
if (sscanf(cmd, " force_on : %i", &value) == 1 && if (sscanf(cmd, " force_on : %i", &value) == 1 &&
value >= 0 && value <= 1) { value >= 0 && value <= 1) {
hci_write1(dev, HCI_FAN, value, &hci_result); hci_result = hci_write1(dev, HCI_FAN, value);
if (hci_result != HCI_SUCCESS) if (hci_result != TOS_SUCCESS)
return -EIO; return -EIO;
else else
dev->force_fan = value; dev->force_fan = value;
...@@ -1125,17 +1168,17 @@ static int keys_proc_show(struct seq_file *m, void *v) ...@@ -1125,17 +1168,17 @@ static int keys_proc_show(struct seq_file *m, void *v)
u32 value; u32 value;
if (!dev->key_event_valid && dev->system_event_supported) { if (!dev->key_event_valid && dev->system_event_supported) {
hci_read1(dev, HCI_SYSTEM_EVENT, &value, &hci_result); hci_result = hci_read1(dev, HCI_SYSTEM_EVENT, &value);
if (hci_result == HCI_SUCCESS) { if (hci_result == TOS_SUCCESS) {
dev->key_event_valid = 1; dev->key_event_valid = 1;
dev->last_key_event = value; dev->last_key_event = value;
} else if (hci_result == HCI_EMPTY) { } else if (hci_result == TOS_FIFO_EMPTY) {
/* better luck next time */ /* better luck next time */
} else if (hci_result == HCI_NOT_SUPPORTED) { } else if (hci_result == TOS_NOT_SUPPORTED) {
/* This is a workaround for an unresolved issue on /* This is a workaround for an unresolved issue on
* some machines where system events sporadically * some machines where system events sporadically
* become disabled. */ * become disabled. */
hci_write1(dev, HCI_SYSTEM_EVENT, 1, &hci_result); hci_result = hci_write1(dev, HCI_SYSTEM_EVENT, 1);
pr_notice("Re-enabled hotkeys\n"); pr_notice("Re-enabled hotkeys\n");
} else { } else {
pr_err("Error reading hotkey status\n"); pr_err("Error reading hotkey status\n");
...@@ -1249,6 +1292,62 @@ static const struct backlight_ops toshiba_backlight_data = { ...@@ -1249,6 +1292,62 @@ static const struct backlight_ops toshiba_backlight_data = {
/* /*
* Sysfs files * Sysfs files
*/ */
static ssize_t toshiba_kbd_bl_mode_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count);
static ssize_t toshiba_kbd_bl_mode_show(struct device *dev,
struct device_attribute *attr,
char *buf);
static ssize_t toshiba_kbd_type_show(struct device *dev,
struct device_attribute *attr,
char *buf);
static ssize_t toshiba_available_kbd_modes_show(struct device *dev,
struct device_attribute *attr,
char *buf);
static ssize_t toshiba_kbd_bl_timeout_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count);
static ssize_t toshiba_kbd_bl_timeout_show(struct device *dev,
struct device_attribute *attr,
char *buf);
static ssize_t toshiba_touchpad_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count);
static ssize_t toshiba_touchpad_show(struct device *dev,
struct device_attribute *attr,
char *buf);
static ssize_t toshiba_position_show(struct device *dev,
struct device_attribute *attr,
char *buf);
static DEVICE_ATTR(kbd_backlight_mode, S_IRUGO | S_IWUSR,
toshiba_kbd_bl_mode_show, toshiba_kbd_bl_mode_store);
static DEVICE_ATTR(kbd_type, S_IRUGO, toshiba_kbd_type_show, NULL);
static DEVICE_ATTR(available_kbd_modes, S_IRUGO,
toshiba_available_kbd_modes_show, NULL);
static DEVICE_ATTR(kbd_backlight_timeout, S_IRUGO | S_IWUSR,
toshiba_kbd_bl_timeout_show, toshiba_kbd_bl_timeout_store);
static DEVICE_ATTR(touchpad, S_IRUGO | S_IWUSR,
toshiba_touchpad_show, toshiba_touchpad_store);
static DEVICE_ATTR(position, S_IRUGO, toshiba_position_show, NULL);
static struct attribute *toshiba_attributes[] = {
&dev_attr_kbd_backlight_mode.attr,
&dev_attr_kbd_type.attr,
&dev_attr_available_kbd_modes.attr,
&dev_attr_kbd_backlight_timeout.attr,
&dev_attr_touchpad.attr,
&dev_attr_position.attr,
NULL,
};
static umode_t toshiba_sysfs_is_visible(struct kobject *,
struct attribute *, int);
static struct attribute_group toshiba_attr_group = {
.is_visible = toshiba_sysfs_is_visible,
.attrs = toshiba_attributes,
};
static ssize_t toshiba_kbd_bl_mode_store(struct device *dev, static ssize_t toshiba_kbd_bl_mode_store(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
...@@ -1263,20 +1362,50 @@ static ssize_t toshiba_kbd_bl_mode_store(struct device *dev, ...@@ -1263,20 +1362,50 @@ static ssize_t toshiba_kbd_bl_mode_store(struct device *dev,
ret = kstrtoint(buf, 0, &mode); ret = kstrtoint(buf, 0, &mode);
if (ret) if (ret)
return ret; return ret;
if (mode != SCI_KBD_MODE_FNZ && mode != SCI_KBD_MODE_AUTO)
return -EINVAL; /* Check for supported modes depending on keyboard backlight type */
if (toshiba->kbd_type == 1) {
/* Type 1 supports SCI_KBD_MODE_FNZ and SCI_KBD_MODE_AUTO */
if (mode != SCI_KBD_MODE_FNZ && mode != SCI_KBD_MODE_AUTO)
return -EINVAL;
} else if (toshiba->kbd_type == 2) {
/* Type 2 doesn't support SCI_KBD_MODE_FNZ */
if (mode != SCI_KBD_MODE_AUTO && mode != SCI_KBD_MODE_ON &&
mode != SCI_KBD_MODE_OFF)
return -EINVAL;
}
/* Set the Keyboard Backlight Mode where: /* Set the Keyboard Backlight Mode where:
* Mode - Auto (2) | FN-Z (1)
* Auto - KBD backlight turns off automatically in given time * Auto - KBD backlight turns off automatically in given time
* FN-Z - KBD backlight "toggles" when hotkey pressed * FN-Z - KBD backlight "toggles" when hotkey pressed
* ON - KBD backlight is always on
* OFF - KBD backlight is always off
*/ */
/* Only make a change if the actual mode has changed */
if (toshiba->kbd_mode != mode) { if (toshiba->kbd_mode != mode) {
/* Shift the time to "base time" (0x3c0000 == 60 seconds) */
time = toshiba->kbd_time << HCI_MISC_SHIFT; time = toshiba->kbd_time << HCI_MISC_SHIFT;
time = time + toshiba->kbd_mode;
/* OR the "base time" to the actual method format */
if (toshiba->kbd_type == 1) {
/* Type 1 requires the current mode */
time |= toshiba->kbd_mode;
} else if (toshiba->kbd_type == 2) {
/* Type 2 requires the desired mode */
time |= mode;
}
ret = toshiba_kbd_illum_status_set(toshiba, time); ret = toshiba_kbd_illum_status_set(toshiba, time);
if (ret) if (ret)
return ret; return ret;
/* Update sysfs entries on successful mode change*/
ret = sysfs_update_group(&toshiba->acpi_dev->dev.kobj,
&toshiba_attr_group);
if (ret)
return ret;
toshiba->kbd_mode = mode; toshiba->kbd_mode = mode;
} }
...@@ -1293,7 +1422,30 @@ static ssize_t toshiba_kbd_bl_mode_show(struct device *dev, ...@@ -1293,7 +1422,30 @@ static ssize_t toshiba_kbd_bl_mode_show(struct device *dev,
if (toshiba_kbd_illum_status_get(toshiba, &time) < 0) if (toshiba_kbd_illum_status_get(toshiba, &time) < 0)
return -EIO; return -EIO;
return sprintf(buf, "%i\n", time & 0x07); return sprintf(buf, "%i\n", time & SCI_KBD_MODE_MASK);
}
static ssize_t toshiba_kbd_type_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
return sprintf(buf, "%d\n", toshiba->kbd_type);
}
static ssize_t toshiba_available_kbd_modes_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
if (toshiba->kbd_type == 1)
return sprintf(buf, "%x %x\n",
SCI_KBD_MODE_FNZ, SCI_KBD_MODE_AUTO);
return sprintf(buf, "%x %x %x\n",
SCI_KBD_MODE_AUTO, SCI_KBD_MODE_ON, SCI_KBD_MODE_OFF);
} }
static ssize_t toshiba_kbd_bl_timeout_store(struct device *dev, static ssize_t toshiba_kbd_bl_timeout_store(struct device *dev,
...@@ -1301,18 +1453,38 @@ static ssize_t toshiba_kbd_bl_timeout_store(struct device *dev, ...@@ -1301,18 +1453,38 @@ static ssize_t toshiba_kbd_bl_timeout_store(struct device *dev,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev); struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
int time = -1; int time;
int ret;
if (sscanf(buf, "%i", &time) != 1 && (time < 0 || time > 60)) ret = kstrtoint(buf, 0, &time);
return -EINVAL; if (ret)
return ret;
/* Set the Keyboard Backlight Timeout: 0-60 seconds */ /* Check for supported values depending on kbd_type */
if (time != -1 && toshiba->kbd_time != time) { if (toshiba->kbd_type == 1) {
if (time < 0 || time > 60)
return -EINVAL;
} else if (toshiba->kbd_type == 2) {
if (time < 1 || time > 60)
return -EINVAL;
}
/* Set the Keyboard Backlight Timeout */
/* Only make a change if the actual timeout has changed */
if (toshiba->kbd_time != time) {
/* Shift the time to "base time" (0x3c0000 == 60 seconds) */
time = time << HCI_MISC_SHIFT; time = time << HCI_MISC_SHIFT;
time = (toshiba->kbd_mode == SCI_KBD_MODE_AUTO) ? /* OR the "base time" to the actual method format */
time + 1 : time + 2; if (toshiba->kbd_type == 1)
if (toshiba_kbd_illum_status_set(toshiba, time) < 0) time |= SCI_KBD_MODE_FNZ;
return -EIO; else if (toshiba->kbd_type == 2)
time |= SCI_KBD_MODE_AUTO;
ret = toshiba_kbd_illum_status_set(toshiba, time);
if (ret)
return ret;
toshiba->kbd_time = time >> HCI_MISC_SHIFT; toshiba->kbd_time = time >> HCI_MISC_SHIFT;
} }
...@@ -1338,12 +1510,18 @@ static ssize_t toshiba_touchpad_store(struct device *dev, ...@@ -1338,12 +1510,18 @@ static ssize_t toshiba_touchpad_store(struct device *dev,
{ {
struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev); struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
int state; int state;
int ret;
/* Set the TouchPad on/off, 0 - Disable | 1 - Enable */ /* Set the TouchPad on/off, 0 - Disable | 1 - Enable */
if (sscanf(buf, "%i", &state) == 1 && (state == 0 || state == 1)) { ret = kstrtoint(buf, 0, &state);
if (toshiba_touchpad_set(toshiba, state) < 0) if (ret)
return -EIO; return ret;
} if (state != 0 && state != 1)
return -EINVAL;
ret = toshiba_touchpad_set(toshiba, state);
if (ret)
return ret;
return count; return count;
} }
...@@ -1383,22 +1561,6 @@ static ssize_t toshiba_position_show(struct device *dev, ...@@ -1383,22 +1561,6 @@ static ssize_t toshiba_position_show(struct device *dev,
return sprintf(buf, "%d %d %d\n", x, y, z); return sprintf(buf, "%d %d %d\n", x, y, z);
} }
static DEVICE_ATTR(kbd_backlight_mode, S_IRUGO | S_IWUSR,
toshiba_kbd_bl_mode_show, toshiba_kbd_bl_mode_store);
static DEVICE_ATTR(kbd_backlight_timeout, S_IRUGO | S_IWUSR,
toshiba_kbd_bl_timeout_show, toshiba_kbd_bl_timeout_store);
static DEVICE_ATTR(touchpad, S_IRUGO | S_IWUSR,
toshiba_touchpad_show, toshiba_touchpad_store);
static DEVICE_ATTR(position, S_IRUGO, toshiba_position_show, NULL);
static struct attribute *toshiba_attributes[] = {
&dev_attr_kbd_backlight_mode.attr,
&dev_attr_kbd_backlight_timeout.attr,
&dev_attr_touchpad.attr,
&dev_attr_position.attr,
NULL,
};
static umode_t toshiba_sysfs_is_visible(struct kobject *kobj, static umode_t toshiba_sysfs_is_visible(struct kobject *kobj,
struct attribute *attr, int idx) struct attribute *attr, int idx)
{ {
...@@ -1418,11 +1580,6 @@ static umode_t toshiba_sysfs_is_visible(struct kobject *kobj, ...@@ -1418,11 +1580,6 @@ static umode_t toshiba_sysfs_is_visible(struct kobject *kobj,
return exists ? attr->mode : 0; return exists ? attr->mode : 0;
} }
static struct attribute_group toshiba_attr_group = {
.is_visible = toshiba_sysfs_is_visible,
.attrs = toshiba_attributes,
};
static bool toshiba_acpi_i8042_filter(unsigned char data, unsigned char str, static bool toshiba_acpi_i8042_filter(unsigned char data, unsigned char str,
struct serio *port) struct serio *port)
{ {
...@@ -1535,8 +1692,8 @@ static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev) ...@@ -1535,8 +1692,8 @@ static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
if (acpi_has_method(dev->acpi_dev->handle, "INFO")) if (acpi_has_method(dev->acpi_dev->handle, "INFO"))
dev->info_supported = 1; dev->info_supported = 1;
else { else {
hci_write1(dev, HCI_SYSTEM_EVENT, 1, &hci_result); hci_result = hci_write1(dev, HCI_SYSTEM_EVENT, 1);
if (hci_result == HCI_SUCCESS) if (hci_result == TOS_SUCCESS)
dev->system_event_supported = 1; dev->system_event_supported = 1;
} }
...@@ -1558,7 +1715,7 @@ static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev) ...@@ -1558,7 +1715,7 @@ static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
goto err_remove_filter; goto err_remove_filter;
} }
hci_write1(dev, HCI_HOTKEY_EVENT, HCI_HOTKEY_ENABLE, &hci_result); hci_result = hci_write1(dev, HCI_HOTKEY_EVENT, HCI_HOTKEY_ENABLE);
return 0; return 0;
err_remove_filter: err_remove_filter:
...@@ -1716,7 +1873,7 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev) ...@@ -1716,7 +1873,7 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev)
goto error; goto error;
/* Register rfkill switch for Bluetooth */ /* Register rfkill switch for Bluetooth */
if (hci_get_bt_present(dev, &bt_present) == HCI_SUCCESS && bt_present) { if (hci_get_bt_present(dev, &bt_present) == TOS_SUCCESS && bt_present) {
dev->bt_rfk = rfkill_alloc("Toshiba Bluetooth", dev->bt_rfk = rfkill_alloc("Toshiba Bluetooth",
&acpi_dev->dev, &acpi_dev->dev,
RFKILL_TYPE_BLUETOOTH, RFKILL_TYPE_BLUETOOTH,
...@@ -1754,12 +1911,7 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev) ...@@ -1754,12 +1911,7 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev)
dev->eco_supported = 1; dev->eco_supported = 1;
} }
ret = toshiba_kbd_illum_status_get(dev, &dummy); dev->kbd_illum_supported = toshiba_kbd_illum_available(dev);
if (!ret) {
dev->kbd_time = dummy >> HCI_MISC_SHIFT;
dev->kbd_mode = dummy & 0x07;
}
dev->kbd_illum_supported = !ret;
/* /*
* Only register the LED if KBD illumination is supported * Only register the LED if KBD illumination is supported
* and the keyboard backlight operation mode is set to FN-Z * and the keyboard backlight operation mode is set to FN-Z
...@@ -1824,26 +1976,26 @@ static void toshiba_acpi_notify(struct acpi_device *acpi_dev, u32 event) ...@@ -1824,26 +1976,26 @@ static void toshiba_acpi_notify(struct acpi_device *acpi_dev, u32 event)
toshiba_acpi_report_hotkey(dev, scancode); toshiba_acpi_report_hotkey(dev, scancode);
} else if (dev->system_event_supported) { } else if (dev->system_event_supported) {
do { do {
hci_read1(dev, HCI_SYSTEM_EVENT, &value, &hci_result); hci_result = hci_read1(dev, HCI_SYSTEM_EVENT, &value);
switch (hci_result) { switch (hci_result) {
case HCI_SUCCESS: case TOS_SUCCESS:
toshiba_acpi_report_hotkey(dev, (int)value); toshiba_acpi_report_hotkey(dev, (int)value);
break; break;
case HCI_NOT_SUPPORTED: case TOS_NOT_SUPPORTED:
/* /*
* This is a workaround for an unresolved * This is a workaround for an unresolved
* issue on some machines where system events * issue on some machines where system events
* sporadically become disabled. * sporadically become disabled.
*/ */
hci_write1(dev, HCI_SYSTEM_EVENT, 1, hci_result =
&hci_result); hci_write1(dev, HCI_SYSTEM_EVENT, 1);
pr_notice("Re-enabled hotkeys\n"); pr_notice("Re-enabled hotkeys\n");
/* fall through */ /* fall through */
default: default:
retries--; retries--;
break; break;
} }
} while (retries && hci_result != HCI_EMPTY); } while (retries && hci_result != TOS_FIFO_EMPTY);
} }
} }
...@@ -1854,7 +2006,7 @@ static int toshiba_acpi_suspend(struct device *device) ...@@ -1854,7 +2006,7 @@ static int toshiba_acpi_suspend(struct device *device)
u32 result; u32 result;
if (dev->hotkey_dev) if (dev->hotkey_dev)
hci_write1(dev, HCI_HOTKEY_EVENT, HCI_HOTKEY_DISABLE, &result); result = hci_write1(dev, HCI_HOTKEY_EVENT, HCI_HOTKEY_DISABLE);
return 0; return 0;
} }
...@@ -1871,7 +2023,7 @@ static int toshiba_acpi_resume(struct device *device) ...@@ -1871,7 +2023,7 @@ static int toshiba_acpi_resume(struct device *device)
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
pr_info("Unable to re-enable hotkeys\n"); pr_info("Unable to re-enable hotkeys\n");
hci_write1(dev, HCI_HOTKEY_EVENT, HCI_HOTKEY_ENABLE, &result); result = hci_write1(dev, HCI_HOTKEY_EVENT, HCI_HOTKEY_ENABLE);
} }
return 0; return 0;
......
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