瀏覽代碼

Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86

* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86:
  hp-wmi: Fix query interface
  ACPI_TOSHIBA needs LEDS support
Linus Torvalds 15 年之前
父節點
當前提交
9c5ea3675d
共有 2 個文件被更改,包括 28 次插入40 次删除
  1. 3 1
      drivers/platform/x86/Kconfig
  2. 25 39
      drivers/platform/x86/hp-wmi.c

+ 3 - 1
drivers/platform/x86/Kconfig

@@ -486,10 +486,12 @@ config TOPSTAR_LAPTOP
 config ACPI_TOSHIBA
 config ACPI_TOSHIBA
 	tristate "Toshiba Laptop Extras"
 	tristate "Toshiba Laptop Extras"
 	depends on ACPI
 	depends on ACPI
+	depends on LEDS_CLASS
+	depends on NEW_LEDS
+	depends on BACKLIGHT_CLASS_DEVICE
 	depends on INPUT
 	depends on INPUT
 	depends on RFKILL || RFKILL = n
 	depends on RFKILL || RFKILL = n
 	select INPUT_POLLDEV
 	select INPUT_POLLDEV
-	select BACKLIGHT_CLASS_DEVICE
 	---help---
 	---help---
 	  This driver adds support for access to certain system settings
 	  This driver adds support for access to certain system settings
 	  on "legacy free" Toshiba laptops.  These laptops can be recognized by
 	  on "legacy free" Toshiba laptops.  These laptops can be recognized by

+ 25 - 39
drivers/platform/x86/hp-wmi.c

@@ -79,12 +79,13 @@ struct bios_args {
 	u32 command;
 	u32 command;
 	u32 commandtype;
 	u32 commandtype;
 	u32 datasize;
 	u32 datasize;
-	char *data;
+	u32 data;
 };
 };
 
 
 struct bios_return {
 struct bios_return {
 	u32 sigpass;
 	u32 sigpass;
 	u32 return_code;
 	u32 return_code;
+	u32 value;
 };
 };
 
 
 struct key_entry {
 struct key_entry {
@@ -148,7 +149,7 @@ static struct platform_driver hp_wmi_driver = {
  *       buffer = kzalloc(128, GFP_KERNEL);
  *       buffer = kzalloc(128, GFP_KERNEL);
  *       ret = hp_wmi_perform_query(0x7, 0, buffer, 128)
  *       ret = hp_wmi_perform_query(0x7, 0, buffer, 128)
  */
  */
-static int hp_wmi_perform_query(int query, int write, char *buffer,
+static int hp_wmi_perform_query(int query, int write, u32 *buffer,
 				int buffersize)
 				int buffersize)
 {
 {
 	struct bios_return bios_return;
 	struct bios_return bios_return;
@@ -159,7 +160,7 @@ static int hp_wmi_perform_query(int query, int write, char *buffer,
 		.command = write ? 0x2 : 0x1,
 		.command = write ? 0x2 : 0x1,
 		.commandtype = query,
 		.commandtype = query,
 		.datasize = buffersize,
 		.datasize = buffersize,
-		.data = buffer,
+		.data = *buffer,
 	};
 	};
 	struct acpi_buffer input = { sizeof(struct bios_args), &args };
 	struct acpi_buffer input = { sizeof(struct bios_args), &args };
 	struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
 	struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
@@ -177,29 +178,14 @@ static int hp_wmi_perform_query(int query, int write, char *buffer,
 
 
 	bios_return = *((struct bios_return *)obj->buffer.pointer);
 	bios_return = *((struct bios_return *)obj->buffer.pointer);
 
 
-	if (bios_return.return_code) {
-		printk(KERN_WARNING PREFIX "Query %d returned %d\n", query,
-		       bios_return.return_code);
-		kfree(obj);
-		return bios_return.return_code;
-	}
-	if (obj->buffer.length - sizeof(bios_return) > buffersize) {
-		kfree(obj);
-		return -EINVAL;
-	}
-
-	memset(buffer, 0, buffersize);
-	memcpy(buffer,
-	       ((char *)obj->buffer.pointer) + sizeof(struct bios_return),
-	       obj->buffer.length - sizeof(bios_return));
-	kfree(obj);
+	memcpy(buffer, &bios_return.value, sizeof(bios_return.value));
 	return 0;
 	return 0;
 }
 }
 
 
 static int hp_wmi_display_state(void)
 static int hp_wmi_display_state(void)
 {
 {
-	int state;
-	int ret = hp_wmi_perform_query(HPWMI_DISPLAY_QUERY, 0, (char *)&state,
+	int state = 0;
+	int ret = hp_wmi_perform_query(HPWMI_DISPLAY_QUERY, 0, &state,
 				       sizeof(state));
 				       sizeof(state));
 	if (ret)
 	if (ret)
 		return -EINVAL;
 		return -EINVAL;
@@ -208,8 +194,8 @@ static int hp_wmi_display_state(void)
 
 
 static int hp_wmi_hddtemp_state(void)
 static int hp_wmi_hddtemp_state(void)
 {
 {
-	int state;
-	int ret = hp_wmi_perform_query(HPWMI_HDDTEMP_QUERY, 0, (char *)&state,
+	int state = 0;
+	int ret = hp_wmi_perform_query(HPWMI_HDDTEMP_QUERY, 0, &state,
 				       sizeof(state));
 				       sizeof(state));
 	if (ret)
 	if (ret)
 		return -EINVAL;
 		return -EINVAL;
@@ -218,8 +204,8 @@ static int hp_wmi_hddtemp_state(void)
 
 
 static int hp_wmi_als_state(void)
 static int hp_wmi_als_state(void)
 {
 {
-	int state;
-	int ret = hp_wmi_perform_query(HPWMI_ALS_QUERY, 0, (char *)&state,
+	int state = 0;
+	int ret = hp_wmi_perform_query(HPWMI_ALS_QUERY, 0, &state,
 				       sizeof(state));
 				       sizeof(state));
 	if (ret)
 	if (ret)
 		return -EINVAL;
 		return -EINVAL;
@@ -228,8 +214,8 @@ static int hp_wmi_als_state(void)
 
 
 static int hp_wmi_dock_state(void)
 static int hp_wmi_dock_state(void)
 {
 {
-	int state;
-	int ret = hp_wmi_perform_query(HPWMI_HARDWARE_QUERY, 0, (char *)&state,
+	int state = 0;
+	int ret = hp_wmi_perform_query(HPWMI_HARDWARE_QUERY, 0, &state,
 				       sizeof(state));
 				       sizeof(state));
 
 
 	if (ret)
 	if (ret)
@@ -240,8 +226,8 @@ static int hp_wmi_dock_state(void)
 
 
 static int hp_wmi_tablet_state(void)
 static int hp_wmi_tablet_state(void)
 {
 {
-	int state;
-	int ret = hp_wmi_perform_query(HPWMI_HARDWARE_QUERY, 0, (char *)&state,
+	int state = 0;
+	int ret = hp_wmi_perform_query(HPWMI_HARDWARE_QUERY, 0, &state,
 				       sizeof(state));
 				       sizeof(state));
 	if (ret)
 	if (ret)
 		return ret;
 		return ret;
@@ -256,7 +242,7 @@ static int hp_wmi_set_block(void *data, bool blocked)
 	int ret;
 	int ret;
 
 
 	ret = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1,
 	ret = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1,
-				   (char *)&query, sizeof(query));
+				   &query, sizeof(query));
 	if (ret)
 	if (ret)
 		return -EINVAL;
 		return -EINVAL;
 	return 0;
 	return 0;
@@ -268,10 +254,10 @@ static const struct rfkill_ops hp_wmi_rfkill_ops = {
 
 
 static bool hp_wmi_get_sw_state(enum hp_wmi_radio r)
 static bool hp_wmi_get_sw_state(enum hp_wmi_radio r)
 {
 {
-	int wireless;
+	int wireless = 0;
 	int mask;
 	int mask;
 	hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0,
 	hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0,
-			     (char *)&wireless, sizeof(wireless));
+			     &wireless, sizeof(wireless));
 	/* TBD: Pass error */
 	/* TBD: Pass error */
 
 
 	mask = 0x200 << (r * 8);
 	mask = 0x200 << (r * 8);
@@ -284,10 +270,10 @@ static bool hp_wmi_get_sw_state(enum hp_wmi_radio r)
 
 
 static bool hp_wmi_get_hw_state(enum hp_wmi_radio r)
 static bool hp_wmi_get_hw_state(enum hp_wmi_radio r)
 {
 {
-	int wireless;
+	int wireless = 0;
 	int mask;
 	int mask;
 	hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0,
 	hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0,
-			     (char *)&wireless, sizeof(wireless));
+			     &wireless, sizeof(wireless));
 	/* TBD: Pass error */
 	/* TBD: Pass error */
 
 
 	mask = 0x800 << (r * 8);
 	mask = 0x800 << (r * 8);
@@ -347,7 +333,7 @@ static ssize_t set_als(struct device *dev, struct device_attribute *attr,
 		       const char *buf, size_t count)
 		       const char *buf, size_t count)
 {
 {
 	u32 tmp = simple_strtoul(buf, NULL, 10);
 	u32 tmp = simple_strtoul(buf, NULL, 10);
-	int ret = hp_wmi_perform_query(HPWMI_ALS_QUERY, 1, (char *)&tmp,
+	int ret = hp_wmi_perform_query(HPWMI_ALS_QUERY, 1, &tmp,
 				       sizeof(tmp));
 				       sizeof(tmp));
 	if (ret)
 	if (ret)
 		return -EINVAL;
 		return -EINVAL;
@@ -421,7 +407,7 @@ static void hp_wmi_notify(u32 value, void *context)
 	static struct key_entry *key;
 	static struct key_entry *key;
 	union acpi_object *obj;
 	union acpi_object *obj;
 	u32 event_id, event_data;
 	u32 event_id, event_data;
-	int key_code, ret;
+	int key_code = 0, ret;
 	u32 *location;
 	u32 *location;
 	acpi_status status;
 	acpi_status status;
 
 
@@ -475,7 +461,7 @@ static void hp_wmi_notify(u32 value, void *context)
 		break;
 		break;
 	case HPWMI_BEZEL_BUTTON:
 	case HPWMI_BEZEL_BUTTON:
 		ret = hp_wmi_perform_query(HPWMI_HOTKEY_QUERY, 0,
 		ret = hp_wmi_perform_query(HPWMI_HOTKEY_QUERY, 0,
-					   (char *)&key_code,
+					   &key_code,
 					   sizeof(key_code));
 					   sizeof(key_code));
 		if (ret)
 		if (ret)
 			break;
 			break;
@@ -578,9 +564,9 @@ static void cleanup_sysfs(struct platform_device *device)
 static int __devinit hp_wmi_bios_setup(struct platform_device *device)
 static int __devinit hp_wmi_bios_setup(struct platform_device *device)
 {
 {
 	int err;
 	int err;
-	int wireless;
+	int wireless = 0;
 
 
-	err = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, (char *)&wireless,
+	err = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, &wireless,
 				   sizeof(wireless));
 				   sizeof(wireless));
 	if (err)
 	if (err)
 		return err;
 		return err;