Loading Documentation/thinkpad-acpi.txt +50 −11 Original line number Diff line number Diff line Loading @@ -225,15 +225,35 @@ sysfs notes: keys mask, and allows one to modify it. Bluetooth -- /proc/acpi/ibm/bluetooth ------------------------------------- Bluetooth --------- This feature shows the presence and current state of a Bluetooth device. If Bluetooth is installed, the following commands can be used: procfs: /proc/acpi/ibm/bluetooth sysfs device attribute: bluetooth/enable This feature shows the presence and current state of a ThinkPad Bluetooth device in the internal ThinkPad CDC slot. Procfs notes: If Bluetooth is installed, the following commands can be used: echo enable > /proc/acpi/ibm/bluetooth echo disable > /proc/acpi/ibm/bluetooth Sysfs notes: If the Bluetooth CDC card is installed, it can be enabled / disabled through the "bluetooth/enable" thinkpad-acpi device attribute, and its current status can also be queried. enable: 0: disables Bluetooth / Bluetooth is disabled 1: enables Bluetooth / Bluetooth is enabled. Note: this interface will be probably be superseeded by the generic rfkill class. Video output control -- /proc/acpi/ibm/video -------------------------------------------- Loading Loading @@ -874,23 +894,42 @@ with EINVAL, try to set pwm1_enable to 1 and pwm1 to at least 128 (255 would be the safest choice, though). EXPERIMENTAL: WAN -- /proc/acpi/ibm/wan --------------------------------------- EXPERIMENTAL: WAN ----------------- procfs: /proc/acpi/ibm/wan sysfs device attribute: wwan/enable This feature is marked EXPERIMENTAL because the implementation directly accesses hardware registers and may not work as expected. USE WITH CAUTION! To use this feature, you need to supply the experimental=1 parameter when loading the module. This feature shows the presence and current state of a WAN (Sierra Wireless EV-DO) device. If WAN is installed, the following commands can be used: This feature shows the presence and current state of a W-WAN (Sierra Wireless EV-DO) device. It was tested on a Lenovo Thinkpad X60. It should probably work on other Thinkpad models which come with this module installed. Procfs notes: If the W-WAN card is installed, the following commands can be used: echo enable > /proc/acpi/ibm/wan echo disable > /proc/acpi/ibm/wan It was tested on a Lenovo Thinkpad X60. It should probably work on other Thinkpad models which come with this module installed. Sysfs notes: If the W-WAN card is installed, it can be enabled / disabled through the "wwan/enable" thinkpad-acpi device attribute, and its current status can also be queried. enable: 0: disables WWAN card / WWAN card is disabled 1: enables WWAN card / WWAN card is enabled. Note: this interface will be probably be superseeded by the generic rfkill class. Multiple Commands, Module Parameters ------------------------------------ Loading drivers/misc/thinkpad_acpi.c +132 −12 Original line number Diff line number Diff line Loading @@ -1020,8 +1020,54 @@ static struct ibm_struct hotkey_driver_data = { * Bluetooth subdriver */ /* sysfs bluetooth enable ---------------------------------------------- */ static ssize_t bluetooth_enable_show(struct device *dev, struct device_attribute *attr, char *buf) { int status; status = bluetooth_get_radiosw(); if (status < 0) return status; return snprintf(buf, PAGE_SIZE, "%d\n", status ? 1 : 0); } static ssize_t bluetooth_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned long t; int res; if (parse_strtoul(buf, 1, &t)) return -EINVAL; res = bluetooth_set_radiosw(t); return (res) ? res : count; } static struct device_attribute dev_attr_bluetooth_enable = __ATTR(enable, S_IWUSR | S_IRUGO, bluetooth_enable_show, bluetooth_enable_store); /* --------------------------------------------------------------------- */ static struct attribute *bluetooth_attributes[] = { &dev_attr_bluetooth_enable.attr, NULL }; static const struct attribute_group bluetooth_attr_group = { .name = TPACPI_BLUETH_SYSFS_GROUP, .attrs = bluetooth_attributes, }; static int __init bluetooth_init(struct ibm_init_struct *iibm) { int res; int status = 0; vdbg_printk(TPACPI_DBG_INIT, "initializing bluetooth subdriver\n"); Loading @@ -1037,17 +1083,29 @@ static int __init bluetooth_init(struct ibm_init_struct *iibm) str_supported(tp_features.bluetooth), status); if (tp_features.bluetooth && !(status & TP_ACPI_BLUETOOTH_HWPRESENT)) { if (tp_features.bluetooth) { if (!(status & TP_ACPI_BLUETOOTH_HWPRESENT)) { /* no bluetooth hardware present in system */ tp_features.bluetooth = 0; dbg_printk(TPACPI_DBG_INIT, "bluetooth hardware not installed\n"); } else { res = sysfs_create_group(&tpacpi_pdev->dev.kobj, &bluetooth_attr_group); if (res) return res; } } return (tp_features.bluetooth)? 0 : 1; } static void bluetooth_exit(void) { sysfs_remove_group(&tpacpi_pdev->dev.kobj, &bluetooth_attr_group); } static int bluetooth_get_radiosw(void) { int status; Loading Loading @@ -1080,6 +1138,7 @@ static int bluetooth_set_radiosw(int radio_on) return 0; } /* procfs -------------------------------------------------------------- */ static int bluetooth_read(char *p) { int len = 0; Loading Loading @@ -1119,14 +1178,61 @@ static struct ibm_struct bluetooth_driver_data = { .name = "bluetooth", .read = bluetooth_read, .write = bluetooth_write, .exit = bluetooth_exit, }; /************************************************************************* * Wan subdriver */ /* sysfs wan enable ---------------------------------------------------- */ static ssize_t wan_enable_show(struct device *dev, struct device_attribute *attr, char *buf) { int status; status = wan_get_radiosw(); if (status < 0) return status; return snprintf(buf, PAGE_SIZE, "%d\n", status ? 1 : 0); } static ssize_t wan_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned long t; int res; if (parse_strtoul(buf, 1, &t)) return -EINVAL; res = wan_set_radiosw(t); return (res) ? res : count; } static struct device_attribute dev_attr_wan_enable = __ATTR(enable, S_IWUSR | S_IRUGO, wan_enable_show, wan_enable_store); /* --------------------------------------------------------------------- */ static struct attribute *wan_attributes[] = { &dev_attr_wan_enable.attr, NULL }; static const struct attribute_group wan_attr_group = { .name = TPACPI_WAN_SYSFS_GROUP, .attrs = wan_attributes, }; static int __init wan_init(struct ibm_init_struct *iibm) { int res; int status = 0; vdbg_printk(TPACPI_DBG_INIT, "initializing wan subdriver\n"); Loading @@ -1140,17 +1246,29 @@ static int __init wan_init(struct ibm_init_struct *iibm) str_supported(tp_features.wan), status); if (tp_features.wan && !(status & TP_ACPI_WANCARD_HWPRESENT)) { if (tp_features.wan) { if (!(status & TP_ACPI_WANCARD_HWPRESENT)) { /* no wan hardware present in system */ tp_features.wan = 0; dbg_printk(TPACPI_DBG_INIT, "wan hardware not installed\n"); } else { res = sysfs_create_group(&tpacpi_pdev->dev.kobj, &wan_attr_group); if (res) return res; } } return (tp_features.wan)? 0 : 1; } static void wan_exit(void) { sysfs_remove_group(&tpacpi_pdev->dev.kobj, &wan_attr_group); } static int wan_get_radiosw(void) { int status; Loading Loading @@ -1183,6 +1301,7 @@ static int wan_set_radiosw(int radio_on) return 0; } /* procfs -------------------------------------------------------------- */ static int wan_read(char *p) { int len = 0; Loading Loading @@ -1222,6 +1341,7 @@ static struct ibm_struct wan_driver_data = { .name = "wan", .read = wan_read, .write = wan_write, .exit = wan_exit, .flags.experimental = 1, }; Loading drivers/misc/thinkpad_acpi.h +4 −0 Original line number Diff line number Diff line Loading @@ -278,6 +278,8 @@ static int beep_write(char *buf); * Bluetooth subdriver */ #define TPACPI_BLUETH_SYSFS_GROUP "bluetooth" enum { /* ACPI GBDC/SBDC bits */ TP_ACPI_BLUETOOTH_HWPRESENT = 0x01, /* Bluetooth hw available */ Loading Loading @@ -551,6 +553,8 @@ static int volume_write(char *buf); * Wan subdriver */ #define TPACPI_WAN_SYSFS_GROUP "wwan" enum { /* ACPI GWAN/SWAN bits */ TP_ACPI_WANCARD_HWPRESENT = 0x01, /* Wan hw available */ Loading Loading
Documentation/thinkpad-acpi.txt +50 −11 Original line number Diff line number Diff line Loading @@ -225,15 +225,35 @@ sysfs notes: keys mask, and allows one to modify it. Bluetooth -- /proc/acpi/ibm/bluetooth ------------------------------------- Bluetooth --------- This feature shows the presence and current state of a Bluetooth device. If Bluetooth is installed, the following commands can be used: procfs: /proc/acpi/ibm/bluetooth sysfs device attribute: bluetooth/enable This feature shows the presence and current state of a ThinkPad Bluetooth device in the internal ThinkPad CDC slot. Procfs notes: If Bluetooth is installed, the following commands can be used: echo enable > /proc/acpi/ibm/bluetooth echo disable > /proc/acpi/ibm/bluetooth Sysfs notes: If the Bluetooth CDC card is installed, it can be enabled / disabled through the "bluetooth/enable" thinkpad-acpi device attribute, and its current status can also be queried. enable: 0: disables Bluetooth / Bluetooth is disabled 1: enables Bluetooth / Bluetooth is enabled. Note: this interface will be probably be superseeded by the generic rfkill class. Video output control -- /proc/acpi/ibm/video -------------------------------------------- Loading Loading @@ -874,23 +894,42 @@ with EINVAL, try to set pwm1_enable to 1 and pwm1 to at least 128 (255 would be the safest choice, though). EXPERIMENTAL: WAN -- /proc/acpi/ibm/wan --------------------------------------- EXPERIMENTAL: WAN ----------------- procfs: /proc/acpi/ibm/wan sysfs device attribute: wwan/enable This feature is marked EXPERIMENTAL because the implementation directly accesses hardware registers and may not work as expected. USE WITH CAUTION! To use this feature, you need to supply the experimental=1 parameter when loading the module. This feature shows the presence and current state of a WAN (Sierra Wireless EV-DO) device. If WAN is installed, the following commands can be used: This feature shows the presence and current state of a W-WAN (Sierra Wireless EV-DO) device. It was tested on a Lenovo Thinkpad X60. It should probably work on other Thinkpad models which come with this module installed. Procfs notes: If the W-WAN card is installed, the following commands can be used: echo enable > /proc/acpi/ibm/wan echo disable > /proc/acpi/ibm/wan It was tested on a Lenovo Thinkpad X60. It should probably work on other Thinkpad models which come with this module installed. Sysfs notes: If the W-WAN card is installed, it can be enabled / disabled through the "wwan/enable" thinkpad-acpi device attribute, and its current status can also be queried. enable: 0: disables WWAN card / WWAN card is disabled 1: enables WWAN card / WWAN card is enabled. Note: this interface will be probably be superseeded by the generic rfkill class. Multiple Commands, Module Parameters ------------------------------------ Loading
drivers/misc/thinkpad_acpi.c +132 −12 Original line number Diff line number Diff line Loading @@ -1020,8 +1020,54 @@ static struct ibm_struct hotkey_driver_data = { * Bluetooth subdriver */ /* sysfs bluetooth enable ---------------------------------------------- */ static ssize_t bluetooth_enable_show(struct device *dev, struct device_attribute *attr, char *buf) { int status; status = bluetooth_get_radiosw(); if (status < 0) return status; return snprintf(buf, PAGE_SIZE, "%d\n", status ? 1 : 0); } static ssize_t bluetooth_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned long t; int res; if (parse_strtoul(buf, 1, &t)) return -EINVAL; res = bluetooth_set_radiosw(t); return (res) ? res : count; } static struct device_attribute dev_attr_bluetooth_enable = __ATTR(enable, S_IWUSR | S_IRUGO, bluetooth_enable_show, bluetooth_enable_store); /* --------------------------------------------------------------------- */ static struct attribute *bluetooth_attributes[] = { &dev_attr_bluetooth_enable.attr, NULL }; static const struct attribute_group bluetooth_attr_group = { .name = TPACPI_BLUETH_SYSFS_GROUP, .attrs = bluetooth_attributes, }; static int __init bluetooth_init(struct ibm_init_struct *iibm) { int res; int status = 0; vdbg_printk(TPACPI_DBG_INIT, "initializing bluetooth subdriver\n"); Loading @@ -1037,17 +1083,29 @@ static int __init bluetooth_init(struct ibm_init_struct *iibm) str_supported(tp_features.bluetooth), status); if (tp_features.bluetooth && !(status & TP_ACPI_BLUETOOTH_HWPRESENT)) { if (tp_features.bluetooth) { if (!(status & TP_ACPI_BLUETOOTH_HWPRESENT)) { /* no bluetooth hardware present in system */ tp_features.bluetooth = 0; dbg_printk(TPACPI_DBG_INIT, "bluetooth hardware not installed\n"); } else { res = sysfs_create_group(&tpacpi_pdev->dev.kobj, &bluetooth_attr_group); if (res) return res; } } return (tp_features.bluetooth)? 0 : 1; } static void bluetooth_exit(void) { sysfs_remove_group(&tpacpi_pdev->dev.kobj, &bluetooth_attr_group); } static int bluetooth_get_radiosw(void) { int status; Loading Loading @@ -1080,6 +1138,7 @@ static int bluetooth_set_radiosw(int radio_on) return 0; } /* procfs -------------------------------------------------------------- */ static int bluetooth_read(char *p) { int len = 0; Loading Loading @@ -1119,14 +1178,61 @@ static struct ibm_struct bluetooth_driver_data = { .name = "bluetooth", .read = bluetooth_read, .write = bluetooth_write, .exit = bluetooth_exit, }; /************************************************************************* * Wan subdriver */ /* sysfs wan enable ---------------------------------------------------- */ static ssize_t wan_enable_show(struct device *dev, struct device_attribute *attr, char *buf) { int status; status = wan_get_radiosw(); if (status < 0) return status; return snprintf(buf, PAGE_SIZE, "%d\n", status ? 1 : 0); } static ssize_t wan_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned long t; int res; if (parse_strtoul(buf, 1, &t)) return -EINVAL; res = wan_set_radiosw(t); return (res) ? res : count; } static struct device_attribute dev_attr_wan_enable = __ATTR(enable, S_IWUSR | S_IRUGO, wan_enable_show, wan_enable_store); /* --------------------------------------------------------------------- */ static struct attribute *wan_attributes[] = { &dev_attr_wan_enable.attr, NULL }; static const struct attribute_group wan_attr_group = { .name = TPACPI_WAN_SYSFS_GROUP, .attrs = wan_attributes, }; static int __init wan_init(struct ibm_init_struct *iibm) { int res; int status = 0; vdbg_printk(TPACPI_DBG_INIT, "initializing wan subdriver\n"); Loading @@ -1140,17 +1246,29 @@ static int __init wan_init(struct ibm_init_struct *iibm) str_supported(tp_features.wan), status); if (tp_features.wan && !(status & TP_ACPI_WANCARD_HWPRESENT)) { if (tp_features.wan) { if (!(status & TP_ACPI_WANCARD_HWPRESENT)) { /* no wan hardware present in system */ tp_features.wan = 0; dbg_printk(TPACPI_DBG_INIT, "wan hardware not installed\n"); } else { res = sysfs_create_group(&tpacpi_pdev->dev.kobj, &wan_attr_group); if (res) return res; } } return (tp_features.wan)? 0 : 1; } static void wan_exit(void) { sysfs_remove_group(&tpacpi_pdev->dev.kobj, &wan_attr_group); } static int wan_get_radiosw(void) { int status; Loading Loading @@ -1183,6 +1301,7 @@ static int wan_set_radiosw(int radio_on) return 0; } /* procfs -------------------------------------------------------------- */ static int wan_read(char *p) { int len = 0; Loading Loading @@ -1222,6 +1341,7 @@ static struct ibm_struct wan_driver_data = { .name = "wan", .read = wan_read, .write = wan_write, .exit = wan_exit, .flags.experimental = 1, }; Loading
drivers/misc/thinkpad_acpi.h +4 −0 Original line number Diff line number Diff line Loading @@ -278,6 +278,8 @@ static int beep_write(char *buf); * Bluetooth subdriver */ #define TPACPI_BLUETH_SYSFS_GROUP "bluetooth" enum { /* ACPI GBDC/SBDC bits */ TP_ACPI_BLUETOOTH_HWPRESENT = 0x01, /* Bluetooth hw available */ Loading Loading @@ -551,6 +553,8 @@ static int volume_write(char *buf); * Wan subdriver */ #define TPACPI_WAN_SYSFS_GROUP "wwan" enum { /* ACPI GWAN/SWAN bits */ TP_ACPI_WANCARD_HWPRESENT = 0x01, /* Wan hw available */ Loading