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

Commit b7a8399e authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'for_linus' of git://cavan.codon.org.uk/platform-drivers-x86

Pull x86 platform drivers update from Matthew Garrett:
 "Nothing amazingly special here.  Some cleanups, a new driver to
  support a single button on some new HPs, a tiny amount of hardware
  enablement"

* 'for_linus' of git://cavan.codon.org.uk/platform-drivers-x86:
  ipc: add intel-mid's pci id macros
  hp-wireless: new driver for hp wireless button for Windows 8
  toshiba_acpi: Support RFKILL hotkey scancode
  hp_accel: Add a new PnP ID HPQ6007 for new HP laptops
  sony-laptop: remove unnecessary assigment of len
  fujitsu-laptop: fix error return code
  dell-laptop: Only install the i8042 filter when rfkill is active
  X86 platform: New BayTrail IOSF-SB MBI driver
  drivers: platform: Include appropriate header file in mxm-wmi.c
  drivers: platform: Mark functions as static in hp_accel.c
  dell-laptop: rkill whitelist Precision models
  ipc: simplify platform data approach
  asus-wmi: Convert to use devm_hwmon_device_register_with_groups
  compal-laptop: Use devm_hwmon_device_register_with_groups
  compal-laptop: Replace SENSOR_DEVICE_ATTR with DEVICE_ATTR
  eeepc-laptop: Convert to use devm_hwmon_device_register_with_groups
  compal-laptop: Use devm_kzalloc to allocate local data structure
  dell-laptop: fix to return error code in dell_send_intensity()
parents 30c867ee b4b0b4a9
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -197,6 +197,17 @@ config HP_ACCEL
	  To compile this driver as a module, choose M here: the module will
	  be called hp_accel.

config HP_WIRELESS
	tristate "HP WIRELESS"
	depends on ACPI
	depends on INPUT
	help
	 This driver provides supports for new HP wireless button for Windows 8.
	 On such systems the driver should load automatically (via ACPI alias).

	 To compile this driver as a module, choose M here: the module will
	 be called hp-wireless.

config HP_WMI
	tristate "HP WMI extras"
	depends on ACPI_WMI
@@ -808,4 +819,12 @@ config PVPANIC
	  a paravirtualized device provided by QEMU; it lets a virtual machine
	  (guest) communicate panic events to the host.

config INTEL_BAYTRAIL_MBI
	tristate
	depends on PCI
	---help---
	  Needed on Baytrail platforms for access to the IOSF Sideband Mailbox
	  Interface. This is a requirement for systems that need to configure
	  the PUNIT for power management features such as RAPL.

endif # X86_PLATFORM_DEVICES
+2 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ obj-$(CONFIG_DELL_WMI_AIO) += dell-wmi-aio.o
obj-$(CONFIG_ACER_WMI)		+= acer-wmi.o
obj-$(CONFIG_ACERHDF)		+= acerhdf.o
obj-$(CONFIG_HP_ACCEL)		+= hp_accel.o
obj-$(CONFIG_HP_WIRELESS)	+= hp-wireless.o
obj-$(CONFIG_HP_WMI)		+= hp-wmi.o
obj-$(CONFIG_AMILO_RFKILL)	+= amilo-rfkill.o
obj-$(CONFIG_TC1100_WMI)	+= tc1100-wmi.o
@@ -54,3 +55,4 @@ obj-$(CONFIG_INTEL_RST) += intel-rst.o
obj-$(CONFIG_INTEL_SMARTCONNECT)	+= intel-smartconnect.o

obj-$(CONFIG_PVPANIC)           += pvpanic.o
obj-$(CONFIG_INTEL_BAYTRAIL_MBI)	+= intel_baytrail.o
+11 −37
Original line number Diff line number Diff line
@@ -183,7 +183,6 @@ struct asus_wmi {

	struct input_dev *inputdev;
	struct backlight_device *backlight_device;
	struct device *hwmon_device;
	struct platform_device *platform_device;

	struct led_classdev wlan_led;
@@ -1072,20 +1071,12 @@ static ssize_t asus_hwmon_temp1(struct device *dev,
	return sprintf(buf, "%d\n", value);
}

static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO, asus_hwmon_pwm1, NULL, 0);
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, asus_hwmon_temp1, NULL, 0);

static ssize_t
show_name(struct device *dev, struct device_attribute *attr, char *buf)
{
	return sprintf(buf, "asus\n");
}
static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, 0);
static DEVICE_ATTR(pwm1, S_IRUGO, asus_hwmon_pwm1, NULL);
static DEVICE_ATTR(temp1_input, S_IRUGO, asus_hwmon_temp1, NULL);

static struct attribute *hwmon_attributes[] = {
	&sensor_dev_attr_pwm1.dev_attr.attr,
	&sensor_dev_attr_temp1_input.dev_attr.attr,
	&sensor_dev_attr_name.dev_attr.attr,
	&dev_attr_pwm1.attr,
	&dev_attr_temp1_input.attr,
	NULL
};

@@ -1099,9 +1090,9 @@ static umode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj,
	int dev_id = -1;
	u32 value = ASUS_WMI_UNSUPPORTED_METHOD;

	if (attr == &sensor_dev_attr_pwm1.dev_attr.attr)
	if (attr == &dev_attr_pwm1.attr)
		dev_id = ASUS_WMI_DEVID_FAN_CTRL;
	else if (attr == &sensor_dev_attr_temp1_input.dev_attr.attr)
	else if (attr == &dev_attr_temp1_input.attr)
		dev_id = ASUS_WMI_DEVID_THERMAL_CTRL;

	if (dev_id != -1) {
@@ -1136,35 +1127,20 @@ static struct attribute_group hwmon_attribute_group = {
	.is_visible = asus_hwmon_sysfs_is_visible,
	.attrs = hwmon_attributes
};

static void asus_wmi_hwmon_exit(struct asus_wmi *asus)
{
	struct device *hwmon;

	hwmon = asus->hwmon_device;
	if (!hwmon)
		return;
	sysfs_remove_group(&hwmon->kobj, &hwmon_attribute_group);
	hwmon_device_unregister(hwmon);
	asus->hwmon_device = NULL;
}
__ATTRIBUTE_GROUPS(hwmon_attribute);

static int asus_wmi_hwmon_init(struct asus_wmi *asus)
{
	struct device *hwmon;
	int result;

	hwmon = hwmon_device_register(&asus->platform_device->dev);
	hwmon = hwmon_device_register_with_groups(&asus->platform_device->dev,
						  "asus", asus,
						  hwmon_attribute_groups);
	if (IS_ERR(hwmon)) {
		pr_err("Could not register asus hwmon device\n");
		return PTR_ERR(hwmon);
	}
	dev_set_drvdata(hwmon, asus);
	asus->hwmon_device = hwmon;
	result = sysfs_create_group(&hwmon->kobj, &hwmon_attribute_group);
	if (result)
		asus_wmi_hwmon_exit(asus);
	return result;
	return 0;
}

/*
@@ -1835,7 +1811,6 @@ static int asus_wmi_add(struct platform_device *pdev)
fail_rfkill:
	asus_wmi_led_exit(asus);
fail_leds:
	asus_wmi_hwmon_exit(asus);
fail_hwmon:
	asus_wmi_input_exit(asus);
fail_input:
@@ -1853,7 +1828,6 @@ static int asus_wmi_remove(struct platform_device *device)
	wmi_remove_notify_handler(asus->driver->event_guid);
	asus_wmi_backlight_exit(asus);
	asus_wmi_input_exit(asus);
	asus_wmi_hwmon_exit(asus);
	asus_wmi_led_exit(asus);
	asus_wmi_rfkill_exit(asus);
	asus_wmi_debugfs_exit(asus);
+55 −66
Original line number Diff line number Diff line
@@ -173,8 +173,7 @@
/* ======= */
struct compal_data{
	/* Fan control */
	struct device *hwmon_dev;
	int pwm_enable; /* 0:full on, 1:set by pwm1, 2:control by moterboard */
	int pwm_enable; /* 0:full on, 1:set by pwm1, 2:control by motherboard */
	unsigned char curr_pwm;

	/* Power supply */
@@ -402,15 +401,6 @@ SIMPLE_MASKED_STORE_SHOW(wake_up_wlan, WAKE_UP_ADDR, WAKE_UP_WLAN)
SIMPLE_MASKED_STORE_SHOW(wake_up_key,	WAKE_UP_ADDR, WAKE_UP_KEY)
SIMPLE_MASKED_STORE_SHOW(wake_up_mouse,	WAKE_UP_ADDR, WAKE_UP_MOUSE)


/* General hwmon interface */
static ssize_t hwmon_name_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	return sprintf(buf, "%s\n", DRIVER_NAME);
}


/* Fan control interface */
static ssize_t pwm_enable_show(struct device *dev,
		struct device_attribute *attr, char *buf)
@@ -665,55 +655,55 @@ static DEVICE_ATTR(wake_up_key,
static DEVICE_ATTR(wake_up_mouse,
		0644, wake_up_mouse_show,	wake_up_mouse_store);

static SENSOR_DEVICE_ATTR(name,        S_IRUGO, hwmon_name_show,   NULL, 1);
static SENSOR_DEVICE_ATTR(fan1_input,  S_IRUGO, fan_show,          NULL, 1);
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, temp_cpu,          NULL, 1);
static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, temp_cpu_local,    NULL, 1);
static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, temp_cpu_DTS,      NULL, 1);
static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, temp_northbridge,  NULL, 1);
static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, temp_vga,          NULL, 1);
static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO, temp_SKIN,         NULL, 1);
static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, label_cpu,         NULL, 1);
static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO, label_cpu_local,   NULL, 1);
static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO, label_cpu_DTS,     NULL, 1);
static SENSOR_DEVICE_ATTR(temp4_label, S_IRUGO, label_northbridge, NULL, 1);
static SENSOR_DEVICE_ATTR(temp5_label, S_IRUGO, label_vga,         NULL, 1);
static SENSOR_DEVICE_ATTR(temp6_label, S_IRUGO, label_SKIN,        NULL, 1);
static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, pwm_show, pwm_store, 1);
static SENSOR_DEVICE_ATTR(pwm1_enable,
		S_IRUGO | S_IWUSR, pwm_enable_show, pwm_enable_store, 0);

static struct attribute *compal_attributes[] = {
static DEVICE_ATTR(fan1_input,  S_IRUGO, fan_show,          NULL);
static DEVICE_ATTR(temp1_input, S_IRUGO, temp_cpu,          NULL);
static DEVICE_ATTR(temp2_input, S_IRUGO, temp_cpu_local,    NULL);
static DEVICE_ATTR(temp3_input, S_IRUGO, temp_cpu_DTS,      NULL);
static DEVICE_ATTR(temp4_input, S_IRUGO, temp_northbridge,  NULL);
static DEVICE_ATTR(temp5_input, S_IRUGO, temp_vga,          NULL);
static DEVICE_ATTR(temp6_input, S_IRUGO, temp_SKIN,         NULL);
static DEVICE_ATTR(temp1_label, S_IRUGO, label_cpu,         NULL);
static DEVICE_ATTR(temp2_label, S_IRUGO, label_cpu_local,   NULL);
static DEVICE_ATTR(temp3_label, S_IRUGO, label_cpu_DTS,     NULL);
static DEVICE_ATTR(temp4_label, S_IRUGO, label_northbridge, NULL);
static DEVICE_ATTR(temp5_label, S_IRUGO, label_vga,         NULL);
static DEVICE_ATTR(temp6_label, S_IRUGO, label_SKIN,        NULL);
static DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, pwm_show, pwm_store);
static DEVICE_ATTR(pwm1_enable,
		   S_IRUGO | S_IWUSR, pwm_enable_show, pwm_enable_store);

static struct attribute *compal_platform_attrs[] = {
	&dev_attr_wake_up_pme.attr,
	&dev_attr_wake_up_modem.attr,
	&dev_attr_wake_up_lan.attr,
	&dev_attr_wake_up_wlan.attr,
	&dev_attr_wake_up_key.attr,
	&dev_attr_wake_up_mouse.attr,
	/* Maybe put the sensor-stuff in a separate hwmon-driver? That way,
	 * the hwmon sysfs won't be cluttered with the above files. */
	&sensor_dev_attr_name.dev_attr.attr,
	&sensor_dev_attr_pwm1_enable.dev_attr.attr,
	&sensor_dev_attr_pwm1.dev_attr.attr,
	&sensor_dev_attr_fan1_input.dev_attr.attr,
	&sensor_dev_attr_temp1_input.dev_attr.attr,
	&sensor_dev_attr_temp2_input.dev_attr.attr,
	&sensor_dev_attr_temp3_input.dev_attr.attr,
	&sensor_dev_attr_temp4_input.dev_attr.attr,
	&sensor_dev_attr_temp5_input.dev_attr.attr,
	&sensor_dev_attr_temp6_input.dev_attr.attr,
	&sensor_dev_attr_temp1_label.dev_attr.attr,
	&sensor_dev_attr_temp2_label.dev_attr.attr,
	&sensor_dev_attr_temp3_label.dev_attr.attr,
	&sensor_dev_attr_temp4_label.dev_attr.attr,
	&sensor_dev_attr_temp5_label.dev_attr.attr,
	&sensor_dev_attr_temp6_label.dev_attr.attr,
	NULL
};
static struct attribute_group compal_platform_attr_group = {
	.attrs = compal_platform_attrs
};

static struct attribute_group compal_attribute_group = {
	.attrs = compal_attributes
static struct attribute *compal_hwmon_attrs[] = {
	&dev_attr_pwm1_enable.attr,
	&dev_attr_pwm1.attr,
	&dev_attr_fan1_input.attr,
	&dev_attr_temp1_input.attr,
	&dev_attr_temp2_input.attr,
	&dev_attr_temp3_input.attr,
	&dev_attr_temp4_input.attr,
	&dev_attr_temp5_input.attr,
	&dev_attr_temp6_input.attr,
	&dev_attr_temp1_label.attr,
	&dev_attr_temp2_label.attr,
	&dev_attr_temp3_label.attr,
	&dev_attr_temp4_label.attr,
	&dev_attr_temp5_label.attr,
	&dev_attr_temp6_label.attr,
	NULL
};
ATTRIBUTE_GROUPS(compal_hwmon);

static int compal_probe(struct platform_device *);
static int compal_remove(struct platform_device *);
@@ -1021,30 +1011,28 @@ static int compal_probe(struct platform_device *pdev)
{
	int err;
	struct compal_data *data;
	struct device *hwmon_dev;

	if (!extra_features)
		return 0;

	/* Fan control */
	data = kzalloc(sizeof(struct compal_data), GFP_KERNEL);
	data = devm_kzalloc(&pdev->dev, sizeof(struct compal_data), GFP_KERNEL);
	if (!data)
		return -ENOMEM;

	initialize_fan_control_data(data);

	err = sysfs_create_group(&pdev->dev.kobj, &compal_attribute_group);
	if (err) {
		kfree(data);
	err = sysfs_create_group(&pdev->dev.kobj, &compal_platform_attr_group);
	if (err)
		return err;
	}

	data->hwmon_dev = hwmon_device_register(&pdev->dev);
	if (IS_ERR(data->hwmon_dev)) {
		err = PTR_ERR(data->hwmon_dev);
		sysfs_remove_group(&pdev->dev.kobj,
				&compal_attribute_group);
		kfree(data);
		return err;
	hwmon_dev = hwmon_device_register_with_groups(&pdev->dev,
						      DRIVER_NAME, data,
						      compal_hwmon_groups);
	if (IS_ERR(hwmon_dev)) {
		err = PTR_ERR(hwmon_dev);
		goto remove;
	}

	/* Power supply */
@@ -1054,6 +1042,10 @@ static int compal_probe(struct platform_device *pdev)
	platform_set_drvdata(pdev, data);

	return 0;

remove:
	sysfs_remove_group(&pdev->dev.kobj, &compal_platform_attr_group);
	return err;
}

static void __exit compal_cleanup(void)
@@ -1080,12 +1072,9 @@ static int compal_remove(struct platform_device *pdev)
	pwm_disable_control();

	data = platform_get_drvdata(pdev);
	hwmon_device_unregister(data->hwmon_dev);
	power_supply_unregister(&data->psy);

	kfree(data);

	sysfs_remove_group(&pdev->dev.kobj, &compal_attribute_group);
	sysfs_remove_group(&pdev->dev.kobj, &compal_platform_attr_group);

	return 0;
}
+41 −37
Original line number Diff line number Diff line
@@ -559,19 +559,45 @@ static void dell_update_rfkill(struct work_struct *ignored)
}
static DECLARE_DELAYED_WORK(dell_rfkill_work, dell_update_rfkill);

static bool dell_laptop_i8042_filter(unsigned char data, unsigned char str,
			      struct serio *port)
{
	static bool extended;

	if (str & 0x20)
		return false;

	if (unlikely(data == 0xe0)) {
		extended = true;
		return false;
	} else if (unlikely(extended)) {
		switch (data) {
		case 0x8:
			schedule_delayed_work(&dell_rfkill_work,
					      round_jiffies_relative(HZ / 4));
			break;
		}
		extended = false;
	}

	return false;
}

static int __init dell_setup_rfkill(void)
{
	int status;
	int ret;
	int status, ret, whitelisted;
	const char *product;

	/*
	 * rfkill causes trouble on various non Latitudes, according to Dell
	 * actually testing the rfkill functionality is only done on Latitudes.
	 * rfkill support causes trouble on various models, mostly Inspirons.
	 * So we whitelist certain series, and don't support rfkill on others.
	 */
	whitelisted = 0;
	product = dmi_get_system_info(DMI_PRODUCT_NAME);
	if (!force_rfkill && (!product || strncmp(product, "Latitude", 8)))
	if (product &&  (strncmp(product, "Latitude", 8) == 0 ||
			 strncmp(product, "Precision", 9) == 0))
		whitelisted = 1;
	if (!force_rfkill && !whitelisted)
		return 0;

	get_buffer();
@@ -633,7 +659,16 @@ static int __init dell_setup_rfkill(void)
			goto err_wwan;
	}

	ret = i8042_install_filter(dell_laptop_i8042_filter);
	if (ret) {
		pr_warn("Unable to install key filter\n");
		goto err_filter;
	}

	return 0;
err_filter:
	if (wwan_rfkill)
		rfkill_unregister(wwan_rfkill);
err_wwan:
	rfkill_destroy(wwan_rfkill);
	if (bluetooth_rfkill)
@@ -684,7 +719,7 @@ static int dell_send_intensity(struct backlight_device *bd)

out:
	release_buffer();
	return 0;
	return ret;
}

static int dell_get_intensity(struct backlight_device *bd)
@@ -755,30 +790,6 @@ static void touchpad_led_exit(void)
	led_classdev_unregister(&touchpad_led);
}

static bool dell_laptop_i8042_filter(unsigned char data, unsigned char str,
			      struct serio *port)
{
	static bool extended;

	if (str & 0x20)
		return false;

	if (unlikely(data == 0xe0)) {
		extended = true;
		return false;
	} else if (unlikely(extended)) {
		switch (data) {
		case 0x8:
			schedule_delayed_work(&dell_rfkill_work,
					      round_jiffies_relative(HZ / 4));
			break;
		}
		extended = false;
	}

	return false;
}

static int __init dell_init(void)
{
	int max_intensity = 0;
@@ -828,12 +839,6 @@ static int __init dell_init(void)
		goto fail_rfkill;
	}

	ret = i8042_install_filter(dell_laptop_i8042_filter);
	if (ret) {
		pr_warn("Unable to install key filter\n");
		goto fail_filter;
	}

	if (quirks && quirks->touchpad_led)
		touchpad_led_init(&platform_device->dev);

@@ -885,7 +890,6 @@ static int __init dell_init(void)
fail_backlight:
	i8042_remove_filter(dell_laptop_i8042_filter);
	cancel_delayed_work_sync(&dell_rfkill_work);
fail_filter:
	dell_cleanup_rfkill();
fail_rfkill:
	free_page((unsigned long)bufferpage);
Loading