diff options
| -rw-r--r-- | MAINTAINERS | 6 | ||||
| -rw-r--r-- | drivers/platform/x86/acer-wmi.c | 60 | ||||
| -rw-r--r-- | drivers/platform/x86/asus-laptop.c | 19 | ||||
| -rw-r--r-- | drivers/platform/x86/samsung-laptop.c | 10 | ||||
| -rw-r--r-- | drivers/platform/x86/sony-laptop.c | 15 |
5 files changed, 62 insertions, 48 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 915564eda145..3ab0949599cd 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -228,7 +228,7 @@ S: Maintained | |||
| 228 | F: drivers/platform/x86/acerhdf.c | 228 | F: drivers/platform/x86/acerhdf.c |
| 229 | 229 | ||
| 230 | ACER WMI LAPTOP EXTRAS | 230 | ACER WMI LAPTOP EXTRAS |
| 231 | M: Joey Lee <jlee@novell.com> | 231 | M: "Lee, Chun-Yi" <jlee@suse.com> |
| 232 | L: platform-driver-x86@vger.kernel.org | 232 | L: platform-driver-x86@vger.kernel.org |
| 233 | S: Maintained | 233 | S: Maintained |
| 234 | F: drivers/platform/x86/acer-wmi.c | 234 | F: drivers/platform/x86/acer-wmi.c |
| @@ -5077,7 +5077,7 @@ S: Maintained | |||
| 5077 | F: drivers/media/radio/radio-mr800.c | 5077 | F: drivers/media/radio/radio-mr800.c |
| 5078 | 5078 | ||
| 5079 | MSI LAPTOP SUPPORT | 5079 | MSI LAPTOP SUPPORT |
| 5080 | M: "Lee, Chun-Yi" <jlee@novell.com> | 5080 | M: "Lee, Chun-Yi" <jlee@suse.com> |
| 5081 | L: platform-driver-x86@vger.kernel.org | 5081 | L: platform-driver-x86@vger.kernel.org |
| 5082 | S: Maintained | 5082 | S: Maintained |
| 5083 | F: drivers/platform/x86/msi-laptop.c | 5083 | F: drivers/platform/x86/msi-laptop.c |
| @@ -8526,7 +8526,7 @@ F: Documentation/x86/ | |||
| 8526 | F: arch/x86/ | 8526 | F: arch/x86/ |
| 8527 | 8527 | ||
| 8528 | X86 PLATFORM DRIVERS | 8528 | X86 PLATFORM DRIVERS |
| 8529 | M: Matthew Garrett <mjg@redhat.com> | 8529 | M: Matthew Garrett <matthew.garrett@nebula.com> |
| 8530 | L: platform-driver-x86@vger.kernel.org | 8530 | L: platform-driver-x86@vger.kernel.org |
| 8531 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86.git | 8531 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86.git |
| 8532 | S: Maintained | 8532 | S: Maintained |
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index 06f4eb7ab87e..afed7018a2b5 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c | |||
| @@ -125,8 +125,11 @@ static const struct key_entry acer_wmi_keymap[] = { | |||
| 125 | {KE_IGNORE, 0x63, {KEY_BRIGHTNESSDOWN} }, | 125 | {KE_IGNORE, 0x63, {KEY_BRIGHTNESSDOWN} }, |
| 126 | {KE_KEY, 0x64, {KEY_SWITCHVIDEOMODE} }, /* Display Switch */ | 126 | {KE_KEY, 0x64, {KEY_SWITCHVIDEOMODE} }, /* Display Switch */ |
| 127 | {KE_IGNORE, 0x81, {KEY_SLEEP} }, | 127 | {KE_IGNORE, 0x81, {KEY_SLEEP} }, |
| 128 | {KE_KEY, 0x82, {KEY_TOUCHPAD_TOGGLE} }, /* Touch Pad On/Off */ | 128 | {KE_KEY, 0x82, {KEY_TOUCHPAD_TOGGLE} }, /* Touch Pad Toggle */ |
| 129 | {KE_KEY, KEY_TOUCHPAD_ON, {KEY_TOUCHPAD_ON} }, | ||
| 130 | {KE_KEY, KEY_TOUCHPAD_OFF, {KEY_TOUCHPAD_OFF} }, | ||
| 129 | {KE_IGNORE, 0x83, {KEY_TOUCHPAD_TOGGLE} }, | 131 | {KE_IGNORE, 0x83, {KEY_TOUCHPAD_TOGGLE} }, |
| 132 | {KE_KEY, 0x85, {KEY_TOUCHPAD_TOGGLE} }, | ||
| 130 | {KE_END, 0} | 133 | {KE_END, 0} |
| 131 | }; | 134 | }; |
| 132 | 135 | ||
| @@ -147,6 +150,7 @@ struct event_return_value { | |||
| 147 | #define ACER_WMID3_GDS_THREEG (1<<6) /* 3G */ | 150 | #define ACER_WMID3_GDS_THREEG (1<<6) /* 3G */ |
| 148 | #define ACER_WMID3_GDS_WIMAX (1<<7) /* WiMAX */ | 151 | #define ACER_WMID3_GDS_WIMAX (1<<7) /* WiMAX */ |
| 149 | #define ACER_WMID3_GDS_BLUETOOTH (1<<11) /* BT */ | 152 | #define ACER_WMID3_GDS_BLUETOOTH (1<<11) /* BT */ |
| 153 | #define ACER_WMID3_GDS_TOUCHPAD (1<<1) /* Touchpad */ | ||
| 150 | 154 | ||
| 151 | struct lm_input_params { | 155 | struct lm_input_params { |
| 152 | u8 function_num; /* Function Number */ | 156 | u8 function_num; /* Function Number */ |
| @@ -875,7 +879,7 @@ WMI_execute_u32(u32 method_id, u32 in, u32 *out) | |||
| 875 | struct acpi_buffer input = { (acpi_size) sizeof(u32), (void *)(&in) }; | 879 | struct acpi_buffer input = { (acpi_size) sizeof(u32), (void *)(&in) }; |
| 876 | struct acpi_buffer result = { ACPI_ALLOCATE_BUFFER, NULL }; | 880 | struct acpi_buffer result = { ACPI_ALLOCATE_BUFFER, NULL }; |
| 877 | union acpi_object *obj; | 881 | union acpi_object *obj; |
| 878 | u32 tmp; | 882 | u32 tmp = 0; |
| 879 | acpi_status status; | 883 | acpi_status status; |
| 880 | 884 | ||
| 881 | status = wmi_evaluate_method(WMID_GUID1, 1, method_id, &input, &result); | 885 | status = wmi_evaluate_method(WMID_GUID1, 1, method_id, &input, &result); |
| @@ -884,14 +888,14 @@ WMI_execute_u32(u32 method_id, u32 in, u32 *out) | |||
| 884 | return status; | 888 | return status; |
| 885 | 889 | ||
| 886 | obj = (union acpi_object *) result.pointer; | 890 | obj = (union acpi_object *) result.pointer; |
| 887 | if (obj && obj->type == ACPI_TYPE_BUFFER && | 891 | if (obj) { |
| 888 | (obj->buffer.length == sizeof(u32) || | 892 | if (obj->type == ACPI_TYPE_BUFFER && |
| 889 | obj->buffer.length == sizeof(u64))) { | 893 | (obj->buffer.length == sizeof(u32) || |
| 890 | tmp = *((u32 *) obj->buffer.pointer); | 894 | obj->buffer.length == sizeof(u64))) { |
| 891 | } else if (obj->type == ACPI_TYPE_INTEGER) { | 895 | tmp = *((u32 *) obj->buffer.pointer); |
| 892 | tmp = (u32) obj->integer.value; | 896 | } else if (obj->type == ACPI_TYPE_INTEGER) { |
| 893 | } else { | 897 | tmp = (u32) obj->integer.value; |
| 894 | tmp = 0; | 898 | } |
| 895 | } | 899 | } |
| 896 | 900 | ||
| 897 | if (out) | 901 | if (out) |
| @@ -1193,12 +1197,14 @@ static acpi_status WMID_set_capabilities(void) | |||
| 1193 | return status; | 1197 | return status; |
| 1194 | 1198 | ||
| 1195 | obj = (union acpi_object *) out.pointer; | 1199 | obj = (union acpi_object *) out.pointer; |
| 1196 | if (obj && obj->type == ACPI_TYPE_BUFFER && | 1200 | if (obj) { |
| 1197 | (obj->buffer.length == sizeof(u32) || | 1201 | if (obj->type == ACPI_TYPE_BUFFER && |
| 1198 | obj->buffer.length == sizeof(u64))) { | 1202 | (obj->buffer.length == sizeof(u32) || |
| 1199 | devices = *((u32 *) obj->buffer.pointer); | 1203 | obj->buffer.length == sizeof(u64))) { |
| 1200 | } else if (obj->type == ACPI_TYPE_INTEGER) { | 1204 | devices = *((u32 *) obj->buffer.pointer); |
| 1201 | devices = (u32) obj->integer.value; | 1205 | } else if (obj->type == ACPI_TYPE_INTEGER) { |
| 1206 | devices = (u32) obj->integer.value; | ||
| 1207 | } | ||
| 1202 | } else { | 1208 | } else { |
| 1203 | kfree(out.pointer); | 1209 | kfree(out.pointer); |
| 1204 | return AE_ERROR; | 1210 | return AE_ERROR; |
| @@ -1676,6 +1682,7 @@ static void acer_wmi_notify(u32 value, void *context) | |||
| 1676 | acpi_status status; | 1682 | acpi_status status; |
| 1677 | u16 device_state; | 1683 | u16 device_state; |
| 1678 | const struct key_entry *key; | 1684 | const struct key_entry *key; |
| 1685 | u32 scancode; | ||
| 1679 | 1686 | ||
| 1680 | status = wmi_get_event_data(value, &response); | 1687 | status = wmi_get_event_data(value, &response); |
| 1681 | if (status != AE_OK) { | 1688 | if (status != AE_OK) { |
| @@ -1712,6 +1719,7 @@ static void acer_wmi_notify(u32 value, void *context) | |||
| 1712 | pr_warn("Unknown key number - 0x%x\n", | 1719 | pr_warn("Unknown key number - 0x%x\n", |
| 1713 | return_value.key_num); | 1720 | return_value.key_num); |
| 1714 | } else { | 1721 | } else { |
| 1722 | scancode = return_value.key_num; | ||
| 1715 | switch (key->keycode) { | 1723 | switch (key->keycode) { |
| 1716 | case KEY_WLAN: | 1724 | case KEY_WLAN: |
| 1717 | case KEY_BLUETOOTH: | 1725 | case KEY_BLUETOOTH: |
| @@ -1725,9 +1733,11 @@ static void acer_wmi_notify(u32 value, void *context) | |||
| 1725 | rfkill_set_sw_state(bluetooth_rfkill, | 1733 | rfkill_set_sw_state(bluetooth_rfkill, |
| 1726 | !(device_state & ACER_WMID3_GDS_BLUETOOTH)); | 1734 | !(device_state & ACER_WMID3_GDS_BLUETOOTH)); |
| 1727 | break; | 1735 | break; |
| 1736 | case KEY_TOUCHPAD_TOGGLE: | ||
| 1737 | scancode = (device_state & ACER_WMID3_GDS_TOUCHPAD) ? | ||
| 1738 | KEY_TOUCHPAD_ON : KEY_TOUCHPAD_OFF; | ||
| 1728 | } | 1739 | } |
| 1729 | sparse_keymap_report_entry(acer_wmi_input_dev, key, | 1740 | sparse_keymap_report_event(acer_wmi_input_dev, scancode, 1, true); |
| 1730 | 1, true); | ||
| 1731 | } | 1741 | } |
| 1732 | break; | 1742 | break; |
| 1733 | case WMID_ACCEL_EVENT: | 1743 | case WMID_ACCEL_EVENT: |
| @@ -1946,12 +1956,14 @@ static u32 get_wmid_devices(void) | |||
| 1946 | return 0; | 1956 | return 0; |
| 1947 | 1957 | ||
| 1948 | obj = (union acpi_object *) out.pointer; | 1958 | obj = (union acpi_object *) out.pointer; |
| 1949 | if (obj && obj->type == ACPI_TYPE_BUFFER && | 1959 | if (obj) { |
| 1950 | (obj->buffer.length == sizeof(u32) || | 1960 | if (obj->type == ACPI_TYPE_BUFFER && |
| 1951 | obj->buffer.length == sizeof(u64))) { | 1961 | (obj->buffer.length == sizeof(u32) || |
| 1952 | devices = *((u32 *) obj->buffer.pointer); | 1962 | obj->buffer.length == sizeof(u64))) { |
| 1953 | } else if (obj->type == ACPI_TYPE_INTEGER) { | 1963 | devices = *((u32 *) obj->buffer.pointer); |
| 1954 | devices = (u32) obj->integer.value; | 1964 | } else if (obj->type == ACPI_TYPE_INTEGER) { |
| 1965 | devices = (u32) obj->integer.value; | ||
| 1966 | } | ||
| 1955 | } | 1967 | } |
| 1956 | 1968 | ||
| 1957 | kfree(out.pointer); | 1969 | kfree(out.pointer); |
diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c index ec1d3bc2dbe2..fcde4e528819 100644 --- a/drivers/platform/x86/asus-laptop.c +++ b/drivers/platform/x86/asus-laptop.c | |||
| @@ -860,8 +860,10 @@ static ssize_t show_infos(struct device *dev, | |||
| 860 | /* | 860 | /* |
| 861 | * The HWRS method return informations about the hardware. | 861 | * The HWRS method return informations about the hardware. |
| 862 | * 0x80 bit is for WLAN, 0x100 for Bluetooth. | 862 | * 0x80 bit is for WLAN, 0x100 for Bluetooth. |
| 863 | * 0x40 for WWAN, 0x10 for WIMAX. | ||
| 863 | * The significance of others is yet to be found. | 864 | * The significance of others is yet to be found. |
| 864 | * If we don't find the method, we assume the device are present. | 865 | * We don't currently use this for device detection, and it |
| 866 | * takes several seconds to run on some systems. | ||
| 865 | */ | 867 | */ |
| 866 | rv = acpi_evaluate_integer(asus->handle, "HWRS", NULL, &temp); | 868 | rv = acpi_evaluate_integer(asus->handle, "HWRS", NULL, &temp); |
| 867 | if (!ACPI_FAILURE(rv)) | 869 | if (!ACPI_FAILURE(rv)) |
| @@ -1682,7 +1684,7 @@ static int asus_laptop_get_info(struct asus_laptop *asus) | |||
| 1682 | { | 1684 | { |
| 1683 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 1685 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
| 1684 | union acpi_object *model = NULL; | 1686 | union acpi_object *model = NULL; |
| 1685 | unsigned long long bsts_result, hwrs_result; | 1687 | unsigned long long bsts_result; |
| 1686 | char *string = NULL; | 1688 | char *string = NULL; |
| 1687 | acpi_status status; | 1689 | acpi_status status; |
| 1688 | 1690 | ||
| @@ -1741,20 +1743,9 @@ static int asus_laptop_get_info(struct asus_laptop *asus) | |||
| 1741 | return -ENOMEM; | 1743 | return -ENOMEM; |
| 1742 | } | 1744 | } |
| 1743 | 1745 | ||
| 1744 | if (*string) | 1746 | if (string) |
| 1745 | pr_notice(" %s model detected\n", string); | 1747 | pr_notice(" %s model detected\n", string); |
| 1746 | 1748 | ||
| 1747 | /* | ||
| 1748 | * The HWRS method return informations about the hardware. | ||
| 1749 | * 0x80 bit is for WLAN, 0x100 for Bluetooth, | ||
| 1750 | * 0x40 for WWAN, 0x10 for WIMAX. | ||
| 1751 | * The significance of others is yet to be found. | ||
| 1752 | */ | ||
| 1753 | status = | ||
| 1754 | acpi_evaluate_integer(asus->handle, "HWRS", NULL, &hwrs_result); | ||
| 1755 | if (!ACPI_FAILURE(status)) | ||
| 1756 | pr_notice(" HWRS returned %x", (int)hwrs_result); | ||
| 1757 | |||
| 1758 | if (!acpi_check_handle(asus->handle, METHOD_WL_STATUS, NULL)) | 1749 | if (!acpi_check_handle(asus->handle, METHOD_WL_STATUS, NULL)) |
| 1759 | asus->have_rsts = true; | 1750 | asus->have_rsts = true; |
| 1760 | 1751 | ||
diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c index dd90d15f5210..71623a2ff3e8 100644 --- a/drivers/platform/x86/samsung-laptop.c +++ b/drivers/platform/x86/samsung-laptop.c | |||
| @@ -1523,6 +1523,16 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = { | |||
| 1523 | }, | 1523 | }, |
| 1524 | .driver_data = &samsung_broken_acpi_video, | 1524 | .driver_data = &samsung_broken_acpi_video, |
| 1525 | }, | 1525 | }, |
| 1526 | { | ||
| 1527 | .callback = samsung_dmi_matched, | ||
| 1528 | .ident = "N250P", | ||
| 1529 | .matches = { | ||
| 1530 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
| 1531 | DMI_MATCH(DMI_PRODUCT_NAME, "N250P"), | ||
| 1532 | DMI_MATCH(DMI_BOARD_NAME, "N250P"), | ||
| 1533 | }, | ||
| 1534 | .driver_data = &samsung_broken_acpi_video, | ||
| 1535 | }, | ||
| 1526 | { }, | 1536 | { }, |
| 1527 | }; | 1537 | }; |
| 1528 | MODULE_DEVICE_TABLE(dmi, samsung_dmi_table); | 1538 | MODULE_DEVICE_TABLE(dmi, samsung_dmi_table); |
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c index daaddec68def..b8ad71f7863f 100644 --- a/drivers/platform/x86/sony-laptop.c +++ b/drivers/platform/x86/sony-laptop.c | |||
| @@ -786,28 +786,29 @@ static int sony_nc_int_call(acpi_handle handle, char *name, int *value, | |||
| 786 | static int sony_nc_buffer_call(acpi_handle handle, char *name, u64 *value, | 786 | static int sony_nc_buffer_call(acpi_handle handle, char *name, u64 *value, |
| 787 | void *buffer, size_t buflen) | 787 | void *buffer, size_t buflen) |
| 788 | { | 788 | { |
| 789 | int ret = 0; | ||
| 789 | size_t len = len; | 790 | size_t len = len; |
| 790 | union acpi_object *object = __call_snc_method(handle, name, value); | 791 | union acpi_object *object = __call_snc_method(handle, name, value); |
| 791 | 792 | ||
| 792 | if (!object) | 793 | if (!object) |
| 793 | return -EINVAL; | 794 | return -EINVAL; |
| 794 | 795 | ||
| 795 | if (object->type == ACPI_TYPE_BUFFER) | 796 | if (object->type == ACPI_TYPE_BUFFER) { |
| 796 | len = MIN(buflen, object->buffer.length); | 797 | len = MIN(buflen, object->buffer.length); |
| 798 | memcpy(buffer, object->buffer.pointer, len); | ||
| 797 | 799 | ||
| 798 | else if (object->type == ACPI_TYPE_INTEGER) | 800 | } else if (object->type == ACPI_TYPE_INTEGER) { |
| 799 | len = MIN(buflen, sizeof(object->integer.value)); | 801 | len = MIN(buflen, sizeof(object->integer.value)); |
| 802 | memcpy(buffer, &object->integer.value, len); | ||
| 800 | 803 | ||
| 801 | else { | 804 | } else { |
| 802 | pr_warn("Invalid acpi_object: expected 0x%x got 0x%x\n", | 805 | pr_warn("Invalid acpi_object: expected 0x%x got 0x%x\n", |
| 803 | ACPI_TYPE_BUFFER, object->type); | 806 | ACPI_TYPE_BUFFER, object->type); |
| 804 | kfree(object); | 807 | ret = -EINVAL; |
| 805 | return -EINVAL; | ||
| 806 | } | 808 | } |
| 807 | 809 | ||
| 808 | memcpy(buffer, object->buffer.pointer, len); | ||
| 809 | kfree(object); | 810 | kfree(object); |
| 810 | return 0; | 811 | return ret; |
| 811 | } | 812 | } |
| 812 | 813 | ||
| 813 | struct sony_nc_handles { | 814 | struct sony_nc_handles { |
