提交 ff43fa8b 编写于 作者: L Linus Torvalds

Merge branch 'for_linus' of...

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:
  wmi: use memcmp instead of strncmp to compare GUIDs
  ACPI, hp-wmi: Fix memory leak in acpi query
  msi-wmi: fix semantically incorrect use of keycode instead of scancode
  msi-wmi: Add mute key support
  asus-laptop: add wimax and wwan support
  eeepc-wmi: fix compiler warning
  ibm_rtl: _RTL_ is not available in UEFI mode
  ibm_rtl: Loosen the DMI criteria to all IBM machines
  drivers/platform/x86/thinkpad_acpi.c: delete double assignment
  eeepc-wmi: add cpufv sysfs documentation
  toshiba_acpi.c: Add key_entry for a lone FN keypress
  ibm_rtl: fix printk format warning
...@@ -47,6 +47,20 @@ Date: January 2007 ...@@ -47,6 +47,20 @@ Date: January 2007
KernelVersion: 2.6.20 KernelVersion: 2.6.20
Contact: "Corentin Chary" <corentincj@iksaif.net> Contact: "Corentin Chary" <corentincj@iksaif.net>
Description: Description:
Control the bluetooth device. 1 means on, 0 means off. Control the wlan device. 1 means on, 0 means off.
This may control the led, the device or both. This may control the led, the device or both.
Users: Lapsus Users: Lapsus
What: /sys/devices/platform/asus_laptop/wimax
Date: October 2010
KernelVersion: 2.6.37
Contact: "Corentin Chary" <corentincj@iksaif.net>
Description:
Control the wimax device. 1 means on, 0 means off.
What: /sys/devices/platform/asus_laptop/wwan
Date: October 2010
KernelVersion: 2.6.37
Contact: "Corentin Chary" <corentincj@iksaif.net>
Description:
Control the wwan (3G) device. 1 means on, 0 means off.
What: /sys/devices/platform/eeepc-wmi/cpufv
Date: Oct 2010
KernelVersion: 2.6.37
Contact: "Corentin Chary" <corentincj@iksaif.net>
Description:
Change CPU clock configuration (write-only).
There are three available clock configuration:
* 0 -> Super Performance Mode
* 1 -> High Performance Mode
* 2 -> Power Saving Mode
...@@ -81,6 +81,8 @@ MODULE_PARM_DESC(wapf, "WAPF value"); ...@@ -81,6 +81,8 @@ MODULE_PARM_DESC(wapf, "WAPF value");
static int wlan_status = 1; static int wlan_status = 1;
static int bluetooth_status = 1; static int bluetooth_status = 1;
static int wimax_status = -1;
static int wwan_status = -1;
module_param(wlan_status, int, 0444); module_param(wlan_status, int, 0444);
MODULE_PARM_DESC(wlan_status, "Set the wireless status on boot " MODULE_PARM_DESC(wlan_status, "Set the wireless status on boot "
...@@ -92,6 +94,16 @@ MODULE_PARM_DESC(bluetooth_status, "Set the wireless status on boot " ...@@ -92,6 +94,16 @@ MODULE_PARM_DESC(bluetooth_status, "Set the wireless status on boot "
"(0 = disabled, 1 = enabled, -1 = don't do anything). " "(0 = disabled, 1 = enabled, -1 = don't do anything). "
"default is 1"); "default is 1");
module_param(wimax_status, int, 0444);
MODULE_PARM_DESC(wimax_status, "Set the wireless status on boot "
"(0 = disabled, 1 = enabled, -1 = don't do anything). "
"default is 1");
module_param(wwan_status, int, 0444);
MODULE_PARM_DESC(wwan_status, "Set the wireless status on boot "
"(0 = disabled, 1 = enabled, -1 = don't do anything). "
"default is 1");
/* /*
* Some events we use, same for all Asus * Some events we use, same for all Asus
*/ */
...@@ -114,6 +126,8 @@ MODULE_PARM_DESC(bluetooth_status, "Set the wireless status on boot " ...@@ -114,6 +126,8 @@ MODULE_PARM_DESC(bluetooth_status, "Set the wireless status on boot "
*/ */
#define WL_RSTS 0x01 /* internal Wifi */ #define WL_RSTS 0x01 /* internal Wifi */
#define BT_RSTS 0x02 /* internal Bluetooth */ #define BT_RSTS 0x02 /* internal Bluetooth */
#define WM_RSTS 0x08 /* internal wimax */
#define WW_RSTS 0x20 /* internal wwan */
/* LED */ /* LED */
#define METHOD_MLED "MLED" #define METHOD_MLED "MLED"
...@@ -132,6 +146,11 @@ MODULE_PARM_DESC(bluetooth_status, "Set the wireless status on boot " ...@@ -132,6 +146,11 @@ MODULE_PARM_DESC(bluetooth_status, "Set the wireless status on boot "
*/ */
#define METHOD_WLAN "WLED" #define METHOD_WLAN "WLED"
#define METHOD_BLUETOOTH "BLED" #define METHOD_BLUETOOTH "BLED"
/* WWAN and WIMAX */
#define METHOD_WWAN "GSMC"
#define METHOD_WIMAX "WMXC"
#define METHOD_WL_STATUS "RSTS" #define METHOD_WL_STATUS "RSTS"
/* Brightness */ /* Brightness */
...@@ -882,6 +901,64 @@ static ssize_t store_bluetooth(struct device *dev, ...@@ -882,6 +901,64 @@ static ssize_t store_bluetooth(struct device *dev,
return sysfs_acpi_set(asus, buf, count, METHOD_BLUETOOTH); return sysfs_acpi_set(asus, buf, count, METHOD_BLUETOOTH);
} }
/*
* Wimax
*/
static int asus_wimax_set(struct asus_laptop *asus, int status)
{
if (write_acpi_int(asus->handle, METHOD_WIMAX, !!status)) {
pr_warning("Error setting wimax status to %d", status);
return -EIO;
}
return 0;
}
static ssize_t show_wimax(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct asus_laptop *asus = dev_get_drvdata(dev);
return sprintf(buf, "%d\n", asus_wireless_status(asus, WM_RSTS));
}
static ssize_t store_wimax(struct device *dev,
struct device_attribute *attr, const char *buf,
size_t count)
{
struct asus_laptop *asus = dev_get_drvdata(dev);
return sysfs_acpi_set(asus, buf, count, METHOD_WIMAX);
}
/*
* Wwan
*/
static int asus_wwan_set(struct asus_laptop *asus, int status)
{
if (write_acpi_int(asus->handle, METHOD_WWAN, !!status)) {
pr_warning("Error setting wwan status to %d", status);
return -EIO;
}
return 0;
}
static ssize_t show_wwan(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct asus_laptop *asus = dev_get_drvdata(dev);
return sprintf(buf, "%d\n", asus_wireless_status(asus, WW_RSTS));
}
static ssize_t store_wwan(struct device *dev,
struct device_attribute *attr, const char *buf,
size_t count)
{
struct asus_laptop *asus = dev_get_drvdata(dev);
return sysfs_acpi_set(asus, buf, count, METHOD_WWAN);
}
/* /*
* Display * Display
*/ */
...@@ -1202,6 +1279,8 @@ static DEVICE_ATTR(infos, S_IRUGO, show_infos, NULL); ...@@ -1202,6 +1279,8 @@ static DEVICE_ATTR(infos, S_IRUGO, show_infos, NULL);
static DEVICE_ATTR(wlan, S_IRUGO | S_IWUSR, show_wlan, store_wlan); static DEVICE_ATTR(wlan, S_IRUGO | S_IWUSR, show_wlan, store_wlan);
static DEVICE_ATTR(bluetooth, S_IRUGO | S_IWUSR, static DEVICE_ATTR(bluetooth, S_IRUGO | S_IWUSR,
show_bluetooth, store_bluetooth); show_bluetooth, store_bluetooth);
static DEVICE_ATTR(wimax, S_IRUGO | S_IWUSR, show_wimax, store_wimax);
static DEVICE_ATTR(wwan, S_IRUGO | S_IWUSR, show_wwan, store_wwan);
static DEVICE_ATTR(display, S_IRUGO | S_IWUSR, show_disp, store_disp); static DEVICE_ATTR(display, S_IRUGO | S_IWUSR, show_disp, store_disp);
static DEVICE_ATTR(ledd, S_IRUGO | S_IWUSR, show_ledd, store_ledd); static DEVICE_ATTR(ledd, S_IRUGO | S_IWUSR, show_ledd, store_ledd);
static DEVICE_ATTR(ls_level, S_IRUGO | S_IWUSR, show_lslvl, store_lslvl); static DEVICE_ATTR(ls_level, S_IRUGO | S_IWUSR, show_lslvl, store_lslvl);
...@@ -1212,6 +1291,8 @@ static struct attribute *asus_attributes[] = { ...@@ -1212,6 +1291,8 @@ static struct attribute *asus_attributes[] = {
&dev_attr_infos.attr, &dev_attr_infos.attr,
&dev_attr_wlan.attr, &dev_attr_wlan.attr,
&dev_attr_bluetooth.attr, &dev_attr_bluetooth.attr,
&dev_attr_wimax.attr,
&dev_attr_wwan.attr,
&dev_attr_display.attr, &dev_attr_display.attr,
&dev_attr_ledd.attr, &dev_attr_ledd.attr,
&dev_attr_ls_level.attr, &dev_attr_ls_level.attr,
...@@ -1239,6 +1320,13 @@ static mode_t asus_sysfs_is_visible(struct kobject *kobj, ...@@ -1239,6 +1320,13 @@ static mode_t asus_sysfs_is_visible(struct kobject *kobj,
} else if (attr == &dev_attr_display.attr) { } else if (attr == &dev_attr_display.attr) {
supported = !acpi_check_handle(handle, METHOD_SWITCH_DISPLAY, NULL); supported = !acpi_check_handle(handle, METHOD_SWITCH_DISPLAY, NULL);
} else if (attr == &dev_attr_wimax.attr) {
supported =
!acpi_check_handle(asus->handle, METHOD_WIMAX, NULL);
} else if (attr == &dev_attr_wwan.attr) {
supported = !acpi_check_handle(asus->handle, METHOD_WWAN, NULL);
} else if (attr == &dev_attr_ledd.attr) { } else if (attr == &dev_attr_ledd.attr) {
supported = !acpi_check_handle(handle, METHOD_LEDD, NULL); supported = !acpi_check_handle(handle, METHOD_LEDD, NULL);
...@@ -1397,7 +1485,8 @@ static int asus_laptop_get_info(struct asus_laptop *asus) ...@@ -1397,7 +1485,8 @@ static int asus_laptop_get_info(struct asus_laptop *asus)
/* /*
* The HWRS method return informations about the hardware. * The HWRS method return informations about the hardware.
* 0x80 bit is for WLAN, 0x100 for Bluetooth. * 0x80 bit is for WLAN, 0x100 for Bluetooth,
* 0x40 for WWAN, 0x10 for WIMAX.
* The significance of others is yet to be found. * The significance of others is yet to be found.
*/ */
status = status =
...@@ -1440,6 +1529,12 @@ static int __devinit asus_acpi_init(struct asus_laptop *asus) ...@@ -1440,6 +1529,12 @@ static int __devinit asus_acpi_init(struct asus_laptop *asus)
if (wlan_status >= 0) if (wlan_status >= 0)
asus_wlan_set(asus, !!wlan_status); asus_wlan_set(asus, !!wlan_status);
if (wimax_status >= 0)
asus_wimax_set(asus, !!wimax_status);
if (wwan_status >= 0)
asus_wwan_set(asus, !!wwan_status);
/* Keyboard Backlight is on by default */ /* Keyboard Backlight is on by default */
if (!acpi_check_handle(asus->handle, METHOD_KBD_LIGHT_SET, NULL)) if (!acpi_check_handle(asus->handle, METHOD_KBD_LIGHT_SET, NULL))
asus_kled_set(asus, 1); asus_kled_set(asus, 1);
......
...@@ -298,7 +298,7 @@ static void eeepc_wmi_notify(u32 value, void *context) ...@@ -298,7 +298,7 @@ static void eeepc_wmi_notify(u32 value, void *context)
kfree(obj); kfree(obj);
} }
static int store_cpufv(struct device *dev, struct device_attribute *attr, static ssize_t store_cpufv(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
int value; int value;
......
...@@ -172,6 +172,8 @@ static int hp_wmi_perform_query(int query, int write, u32 *buffer, ...@@ -172,6 +172,8 @@ static int hp_wmi_perform_query(int query, int write, u32 *buffer,
bios_return = *((struct bios_return *)obj->buffer.pointer); bios_return = *((struct bios_return *)obj->buffer.pointer);
memcpy(buffer, &bios_return.value, sizeof(bios_return.value)); memcpy(buffer, &bios_return.value, sizeof(bios_return.value));
kfree(obj);
return 0; return 0;
} }
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/dmi.h> #include <linux/dmi.h>
#include <linux/efi.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <asm/bios_ebda.h> #include <asm/bios_ebda.h>
...@@ -220,32 +221,13 @@ static void rtl_teardown_sysfs(void) { ...@@ -220,32 +221,13 @@ static void rtl_teardown_sysfs(void) {
sysdev_class_unregister(&class_rtl); sysdev_class_unregister(&class_rtl);
} }
static int dmi_check_cb(const struct dmi_system_id *id)
{
RTL_DEBUG("found IBM server '%s'\n", id->ident);
return 0;
}
#define ibm_dmi_entry(NAME, TYPE) \ static struct dmi_system_id __initdata ibm_rtl_dmi_table[] = {
{ \ { \
.ident = NAME, \
.matches = { \ .matches = { \
DMI_MATCH(DMI_SYS_VENDOR, "IBM"), \ DMI_MATCH(DMI_SYS_VENDOR, "IBM"), \
DMI_MATCH(DMI_PRODUCT_NAME, TYPE), \
}, \ }, \
.callback = dmi_check_cb \ },
}
static struct dmi_system_id __initdata ibm_rtl_dmi_table[] = {
ibm_dmi_entry("BladeCenter LS21", "7971"),
ibm_dmi_entry("BladeCenter LS22", "7901"),
ibm_dmi_entry("BladeCenter HS21 XM", "7995"),
ibm_dmi_entry("BladeCenter HS22", "7870"),
ibm_dmi_entry("BladeCenter HS22V", "7871"),
ibm_dmi_entry("System x3550 M2", "7946"),
ibm_dmi_entry("System x3650 M2", "7947"),
ibm_dmi_entry("System x3550 M3", "7944"),
ibm_dmi_entry("System x3650 M3", "7945"),
{ } { }
}; };
...@@ -257,7 +239,7 @@ static int __init ibm_rtl_init(void) { ...@@ -257,7 +239,7 @@ static int __init ibm_rtl_init(void) {
if (force) if (force)
pr_warning("ibm-rtl: module loaded by force\n"); pr_warning("ibm-rtl: module loaded by force\n");
/* first ensure that we are running on IBM HW */ /* first ensure that we are running on IBM HW */
else if (!dmi_check_system(ibm_rtl_dmi_table)) else if (efi_enabled || !dmi_check_system(ibm_rtl_dmi_table))
return -ENODEV; return -ENODEV;
/* Get the address for the Extended BIOS Data Area */ /* Get the address for the Extended BIOS Data Area */
...@@ -302,7 +284,7 @@ static int __init ibm_rtl_init(void) { ...@@ -302,7 +284,7 @@ static int __init ibm_rtl_init(void) {
RTL_DEBUG("rtl_cmd_width = %u, rtl_cmd_type = %u\n", RTL_DEBUG("rtl_cmd_width = %u, rtl_cmd_type = %u\n",
rtl_cmd_width, rtl_cmd_type); rtl_cmd_width, rtl_cmd_type);
addr = ioread32(&rtl_table->cmd_port_address); addr = ioread32(&rtl_table->cmd_port_address);
RTL_DEBUG("addr = %#llx\n", addr); RTL_DEBUG("addr = %#llx\n", (unsigned long long)addr);
plen = rtl_cmd_width/sizeof(char); plen = rtl_cmd_width/sizeof(char);
rtl_cmd_addr = rtl_port_map(addr, plen); rtl_cmd_addr = rtl_port_map(addr, plen);
RTL_DEBUG("rtl_cmd_addr = %#llx\n", (u64)rtl_cmd_addr); RTL_DEBUG("rtl_cmd_addr = %#llx\n", (u64)rtl_cmd_addr);
......
...@@ -43,16 +43,18 @@ MODULE_ALIAS("wmi:B6F3EEF2-3D2F-49DC-9DE3-85BCE18C62F2"); ...@@ -43,16 +43,18 @@ MODULE_ALIAS("wmi:B6F3EEF2-3D2F-49DC-9DE3-85BCE18C62F2");
#define dprintk(msg...) pr_debug(DRV_PFX msg) #define dprintk(msg...) pr_debug(DRV_PFX msg)
#define KEYCODE_BASE 0xD0 #define SCANCODE_BASE 0xD0
#define MSI_WMI_BRIGHTNESSUP KEYCODE_BASE #define MSI_WMI_BRIGHTNESSUP SCANCODE_BASE
#define MSI_WMI_BRIGHTNESSDOWN (KEYCODE_BASE + 1) #define MSI_WMI_BRIGHTNESSDOWN (SCANCODE_BASE + 1)
#define MSI_WMI_VOLUMEUP (KEYCODE_BASE + 2) #define MSI_WMI_VOLUMEUP (SCANCODE_BASE + 2)
#define MSI_WMI_VOLUMEDOWN (KEYCODE_BASE + 3) #define MSI_WMI_VOLUMEDOWN (SCANCODE_BASE + 3)
#define MSI_WMI_MUTE (SCANCODE_BASE + 4)
static struct key_entry msi_wmi_keymap[] = { static struct key_entry msi_wmi_keymap[] = {
{ KE_KEY, MSI_WMI_BRIGHTNESSUP, {KEY_BRIGHTNESSUP} }, { KE_KEY, MSI_WMI_BRIGHTNESSUP, {KEY_BRIGHTNESSUP} },
{ KE_KEY, MSI_WMI_BRIGHTNESSDOWN, {KEY_BRIGHTNESSDOWN} }, { KE_KEY, MSI_WMI_BRIGHTNESSDOWN, {KEY_BRIGHTNESSDOWN} },
{ KE_KEY, MSI_WMI_VOLUMEUP, {KEY_VOLUMEUP} }, { KE_KEY, MSI_WMI_VOLUMEUP, {KEY_VOLUMEUP} },
{ KE_KEY, MSI_WMI_VOLUMEDOWN, {KEY_VOLUMEDOWN} }, { KE_KEY, MSI_WMI_VOLUMEDOWN, {KEY_VOLUMEDOWN} },
{ KE_KEY, MSI_WMI_MUTE, {KEY_MUTE} },
{ KE_END, 0} { KE_END, 0}
}; };
static ktime_t last_pressed[ARRAY_SIZE(msi_wmi_keymap) - 1]; static ktime_t last_pressed[ARRAY_SIZE(msi_wmi_keymap) - 1];
...@@ -169,7 +171,7 @@ static void msi_wmi_notify(u32 value, void *context) ...@@ -169,7 +171,7 @@ static void msi_wmi_notify(u32 value, void *context)
ktime_t diff; ktime_t diff;
cur = ktime_get_real(); cur = ktime_get_real();
diff = ktime_sub(cur, last_pressed[key->code - diff = ktime_sub(cur, last_pressed[key->code -
KEYCODE_BASE]); SCANCODE_BASE]);
/* Ignore event if the same event happened in a 50 ms /* Ignore event if the same event happened in a 50 ms
timeframe -> Key press may result in 10-20 GPEs */ timeframe -> Key press may result in 10-20 GPEs */
if (ktime_to_us(diff) < 1000 * 50) { if (ktime_to_us(diff) < 1000 * 50) {
...@@ -178,7 +180,7 @@ static void msi_wmi_notify(u32 value, void *context) ...@@ -178,7 +180,7 @@ static void msi_wmi_notify(u32 value, void *context)
key->code, ktime_to_us(diff)); key->code, ktime_to_us(diff));
return; return;
} }
last_pressed[key->code - KEYCODE_BASE] = cur; last_pressed[key->code - SCANCODE_BASE] = cur;
if (key->type == KE_KEY && if (key->type == KE_KEY &&
/* Brightness is served via acpi video driver */ /* Brightness is served via acpi video driver */
......
...@@ -8497,7 +8497,6 @@ static void ibm_exit(struct ibm_struct *ibm) ...@@ -8497,7 +8497,6 @@ static void ibm_exit(struct ibm_struct *ibm)
ibm->acpi->type, ibm->acpi->type,
dispatch_acpi_notify); dispatch_acpi_notify);
ibm->flags.acpi_notify_installed = 0; ibm->flags.acpi_notify_installed = 0;
ibm->flags.acpi_notify_installed = 0;
} }
if (ibm->flags.proc_created) { if (ibm->flags.proc_created) {
......
...@@ -135,6 +135,7 @@ static const struct key_entry toshiba_acpi_keymap[] __initconst = { ...@@ -135,6 +135,7 @@ static const struct key_entry toshiba_acpi_keymap[] __initconst = {
{ KE_KEY, 0x141, { KEY_BRIGHTNESSUP } }, { KE_KEY, 0x141, { KEY_BRIGHTNESSUP } },
{ KE_KEY, 0x142, { KEY_WLAN } }, { KE_KEY, 0x142, { KEY_WLAN } },
{ KE_KEY, 0x143, { KEY_PROG1 } }, { KE_KEY, 0x143, { KEY_PROG1 } },
{ KE_KEY, 0x17f, { KEY_FN } },
{ KE_KEY, 0xb05, { KEY_PROG2 } }, { KE_KEY, 0xb05, { KEY_PROG2 } },
{ KE_KEY, 0xb06, { KEY_WWW } }, { KE_KEY, 0xb06, { KEY_WWW } },
{ KE_KEY, 0xb07, { KEY_MAIL } }, { KE_KEY, 0xb07, { KEY_MAIL } },
......
...@@ -755,7 +755,7 @@ static bool guid_already_parsed(const char *guid_string) ...@@ -755,7 +755,7 @@ static bool guid_already_parsed(const char *guid_string)
struct wmi_block *wblock; struct wmi_block *wblock;
list_for_each_entry(wblock, &wmi_block_list, list) list_for_each_entry(wblock, &wmi_block_list, list)
if (strncmp(wblock->gblock.guid, guid_string, 16) == 0) if (memcmp(wblock->gblock.guid, guid_string, 16) == 0)
return true; return true;
return false; return false;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册