Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -163,18 +163,24 @@ static void dell_wmi_notify(u32 value, void *context)
		const struct key_entry *key;
		int reported_key;
		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",
				buffer_entry[1]);
			kfree(obj);
			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];
		else
		else if (buffer_size >= 2)
			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,
							reported_key);
+103 −103
Original line number Diff line number Diff line
@@ -263,13 +263,11 @@ static int acpi_setter_handle(struct eeepc_laptop *eeepc, int cm,
/*
 * 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)
		return -EINVAL;
	return count;
	return 0;
}

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);
	int rv, value;

	rv = parse_arg(buf, count, &value);
	if (rv > 0)
		value = set_acpi(eeepc, cm, value);
	if (value < 0)
		return -EIO;
	rv = parse_arg(buf, &value);
	if (rv < 0)
		return rv;
	rv = set_acpi(eeepc, cm, value);
	if (rv < 0)
		return -EIO;
	return count;
}

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);
}

#define EEEPC_CREATE_DEVICE_ATTR(_name, _mode, _cm)			\
	static ssize_t show_##_name(struct device *dev,			\
#define EEEPC_ACPI_SHOW_FUNC(_name, _cm)				\
	static ssize_t _name##_show(struct device *dev,			\
				    struct device_attribute *attr,	\
				    char *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,	\
				     const char *buf, size_t 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);
EEEPC_CREATE_DEVICE_ATTR(cardr, 0644, CM_ASL_CARDREADER);
EEEPC_CREATE_DEVICE_ATTR(disp, 0200, CM_ASL_DISPLAYSWITCH);
#define EEEPC_CREATE_DEVICE_ATTR_RW(_name, _cm)				\
	EEEPC_ACPI_SHOW_FUNC(_name, _cm)				\
	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 {
	int num;
@@ -329,14 +332,17 @@ struct eeepc_cpufv {
static int get_cpufv(struct eeepc_laptop *eeepc, struct eeepc_cpufv *c)
{
	c->cur = get_acpi(eeepc, CM_ASL_CPUFV);
	if (c->cur < 0)
		return -ENODEV;

	c->num = (c->cur >> 8) & 0xff;
	c->cur &= 0xff;
	if (c->cur < 0 || c->num <= 0 || c->num > 12)
	if (c->num == 0 || c->num > 12)
		return -ENODEV;
	return 0;
}

static ssize_t show_available_cpufv(struct device *dev,
static ssize_t available_cpufv_show(struct device *dev,
				    struct device_attribute *attr,
				    char *buf)
{
@@ -353,7 +359,7 @@ static ssize_t show_available_cpufv(struct device *dev,
	return len;
}

static ssize_t show_cpufv(struct device *dev,
static ssize_t cpufv_show(struct device *dev,
			  struct device_attribute *attr,
			  char *buf)
{
@@ -365,7 +371,7 @@ static ssize_t show_cpufv(struct device *dev,
	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,
			   const char *buf, size_t count)
{
@@ -377,16 +383,18 @@ static ssize_t store_cpufv(struct device *dev,
		return -EPERM;
	if (get_cpufv(eeepc, &c))
		return -ENODEV;
	rv = parse_arg(buf, count, &value);
	rv = parse_arg(buf, &value);
	if (rv < 0)
		return rv;
	if (!rv || value < 0 || value >= c.num)
	if (value < 0 || value >= c.num)
		return -EINVAL;
	set_acpi(eeepc, CM_ASL_CPUFV, value);
	rv = set_acpi(eeepc, CM_ASL_CPUFV, value);
	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,
			  char *buf)
{
@@ -395,14 +403,14 @@ static ssize_t show_cpufv_disabled(struct device *dev,
	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,
			   const char *buf, size_t count)
{
	struct eeepc_laptop *eeepc = dev_get_drvdata(dev);
	int rv, value;

	rv = parse_arg(buf, count, &value);
	rv = parse_arg(buf, &value);
	if (rv < 0)
		return rv;

@@ -412,7 +420,7 @@ static ssize_t store_cpufv_disabled(struct device *dev,
			pr_warn("cpufv enabled (not officially supported "
				"on this model)\n");
		eeepc->cpufv_disabled = false;
		return rv;
		return count;
	case 1:
		return -EPERM;
	default:
@@ -421,29 +429,9 @@ static ssize_t store_cpufv_disabled(struct device *dev,
}


static struct device_attribute dev_attr_cpufv = {
	.attr = {
		.name = "cpufv",
		.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 DEVICE_ATTR_RW(cpufv);
static DEVICE_ATTR_RO(available_cpufv);
static DEVICE_ATTR_RW(cpufv_disabled);

static struct attribute *platform_attributes[] = {
	&dev_attr_camera.attr,
@@ -680,7 +668,9 @@ static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc,

	status = acpi_get_handle(NULL, node, &handle);

	if (ACPI_SUCCESS(status)) {
	if (ACPI_FAILURE(status))
		return -ENODEV;

	status = acpi_install_notify_handler(handle,
					     ACPI_SYSTEM_NOTIFY,
					     eeepc_rfkill_notify,
@@ -693,9 +683,6 @@ static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc,
	 * changed during setup.
	 */
	eeepc_rfkill_hotplug(eeepc, handle);
	} else
		return -ENODEV;

	return 0;
}

@@ -707,7 +694,9 @@ static void eeepc_unregister_rfkill_notifier(struct eeepc_laptop *eeepc,

	status = acpi_get_handle(NULL, node, &handle);

	if (ACPI_SUCCESS(status)) {
	if (ACPI_FAILURE(status))
		return;

	status = acpi_remove_notify_handler(handle,
					     ACPI_SYSTEM_NOTIFY,
					     eeepc_rfkill_notify);
@@ -721,7 +710,6 @@ static void eeepc_unregister_rfkill_notifier(struct eeepc_laptop *eeepc,
		 */
	eeepc_rfkill_hotplug(eeepc, handle);
}
}

static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot,
				    u8 *value)
@@ -1042,10 +1030,11 @@ static ssize_t store_sys_hwmon(void (*set)(int), const char *buf, size_t count)
{
	int rv, value;

	rv = parse_arg(buf, count, &value);
	if (rv > 0)
		set(value);
	rv = parse_arg(buf, &value);
	if (rv < 0)
		return rv;
	set(value);
	return count;
}

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());
}

#define EEEPC_CREATE_SENSOR_ATTR(_name, _mode, _get, _set)		\
	static ssize_t show_##_name(struct device *dev,			\
#define EEEPC_SENSOR_SHOW_FUNC(_name, _get)				\
	static ssize_t _name##_show(struct device *dev,			\
				    struct device_attribute *attr,	\
				    char *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,	\
				     const char *buf, size_t 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)

#define EEEPC_CREATE_SENSOR_ATTR_RO(_name, _get)			\
	EEEPC_SENSOR_SHOW_FUNC(_name, _get)				\
	static DEVICE_ATTR_RO(_name)

EEEPC_CREATE_SENSOR_ATTR(fan1_input, S_IRUGO, eeepc_get_fan_rpm, NULL);
EEEPC_CREATE_SENSOR_ATTR(pwm1, S_IRUGO | S_IWUSR,
			 eeepc_get_fan_pwm, eeepc_set_fan_pwm);
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[] = {
	&dev_attr_pwm1.attr,
@@ -1424,8 +1423,9 @@ static int eeepc_acpi_add(struct acpi_device *device)
		result = eeepc_backlight_init(eeepc);
		if (result)
			goto fail_backlight;
	} else
	} else {
		pr_info("Backlight controlled by ACPI video driver\n");
	}

	result = eeepc_input_init(eeepc);
	if (result)
+9 −14
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ static ssize_t irst_show_wakeup_events(struct device *dev,
	acpi = to_acpi_device(dev);

	status = acpi_evaluate_integer(acpi->handle, "GFFS", NULL, &value);
	if (!ACPI_SUCCESS(status))
	if (ACPI_FAILURE(status))
		return -EINVAL;

	return sprintf(buf, "%lld\n", value);
@@ -59,7 +59,7 @@ static ssize_t irst_store_wakeup_events(struct device *dev,

	status = acpi_execute_simple_method(acpi->handle, "SFFS", value);

	if (!ACPI_SUCCESS(status))
	if (ACPI_FAILURE(status))
		return -EINVAL;

	return count;
@@ -81,7 +81,7 @@ static ssize_t irst_show_wakeup_time(struct device *dev,
	acpi = to_acpi_device(dev);

	status = acpi_evaluate_integer(acpi->handle, "GFTV", NULL, &value);
	if (!ACPI_SUCCESS(status))
	if (ACPI_FAILURE(status))
		return -EINVAL;

	return sprintf(buf, "%lld\n", value);
@@ -105,7 +105,7 @@ static ssize_t irst_store_wakeup_time(struct device *dev,

	status = acpi_execute_simple_method(acpi->handle, "SFTV", value);

	if (!ACPI_SUCCESS(status))
	if (ACPI_FAILURE(status))
		return -EINVAL;

	return count;
@@ -119,21 +119,16 @@ static struct device_attribute irst_timeout_attr = {

static int irst_add(struct acpi_device *acpi)
{
	int error = 0;
	int error;

	error = device_create_file(&acpi->dev, &irst_timeout_attr);
	if (error)
		goto out;
	if (unlikely(error))
		return error;

	error = device_create_file(&acpi->dev, &irst_wakeup_attr);
	if (error)
		goto out_timeout;

	return 0;

out_timeout:
	if (unlikely(error))
		device_remove_file(&acpi->dev, &irst_timeout_attr);
out:

	return error;
}

+379 −227

File changed.

Preview size limit exceeded, changes collapsed.

+22 −22

File changed.

Contains only whitespace changes.