diff options
| -rw-r--r-- | drivers/misc/thinkpad_acpi.c | 32 | ||||
| -rw-r--r-- | drivers/misc/thinkpad_acpi.h | 9 |
2 files changed, 40 insertions, 1 deletions
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index 4d7189330ec1..4427c994bc7d 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
| @@ -510,13 +510,14 @@ static char *next_cmd(char **cmds) | |||
| 510 | /**************************************************************************** | 510 | /**************************************************************************** |
| 511 | **************************************************************************** | 511 | **************************************************************************** |
| 512 | * | 512 | * |
| 513 | * Device model: hwmon and platform | 513 | * Device model: input, hwmon and platform |
| 514 | * | 514 | * |
| 515 | **************************************************************************** | 515 | **************************************************************************** |
| 516 | ****************************************************************************/ | 516 | ****************************************************************************/ |
| 517 | 517 | ||
| 518 | static struct platform_device *tpacpi_pdev; | 518 | static struct platform_device *tpacpi_pdev; |
| 519 | static struct class_device *tpacpi_hwmon; | 519 | static struct class_device *tpacpi_hwmon; |
| 520 | static struct input_dev *tpacpi_inputdev; | ||
| 520 | 521 | ||
| 521 | static struct platform_driver tpacpi_pdriver = { | 522 | static struct platform_driver tpacpi_pdriver = { |
| 522 | .driver = { | 523 | .driver = { |
| @@ -4363,6 +4364,20 @@ static int __init thinkpad_acpi_module_init(void) | |||
| 4363 | thinkpad_acpi_module_exit(); | 4364 | thinkpad_acpi_module_exit(); |
| 4364 | return ret; | 4365 | return ret; |
| 4365 | } | 4366 | } |
| 4367 | tpacpi_inputdev = input_allocate_device(); | ||
| 4368 | if (!tpacpi_inputdev) { | ||
| 4369 | printk(IBM_ERR "unable to allocate input device\n"); | ||
| 4370 | thinkpad_acpi_module_exit(); | ||
| 4371 | return -ENOMEM; | ||
| 4372 | } else { | ||
| 4373 | /* Prepare input device, but don't register */ | ||
| 4374 | tpacpi_inputdev->name = "ThinkPad Extra Buttons"; | ||
| 4375 | tpacpi_inputdev->phys = IBM_DRVR_NAME "/input0"; | ||
| 4376 | tpacpi_inputdev->id.bustype = BUS_HOST; | ||
| 4377 | tpacpi_inputdev->id.vendor = TPACPI_HKEY_INPUT_VENDOR; | ||
| 4378 | tpacpi_inputdev->id.product = TPACPI_HKEY_INPUT_PRODUCT; | ||
| 4379 | tpacpi_inputdev->id.version = TPACPI_HKEY_INPUT_VERSION; | ||
| 4380 | } | ||
| 4366 | for (i = 0; i < ARRAY_SIZE(ibms_init); i++) { | 4381 | for (i = 0; i < ARRAY_SIZE(ibms_init); i++) { |
| 4367 | ret = ibm_init(&ibms_init[i]); | 4382 | ret = ibm_init(&ibms_init[i]); |
| 4368 | if (ret >= 0 && *ibms_init[i].param) | 4383 | if (ret >= 0 && *ibms_init[i].param) |
| @@ -4372,6 +4387,14 @@ static int __init thinkpad_acpi_module_init(void) | |||
| 4372 | return ret; | 4387 | return ret; |
| 4373 | } | 4388 | } |
| 4374 | } | 4389 | } |
| 4390 | ret = input_register_device(tpacpi_inputdev); | ||
| 4391 | if (ret < 0) { | ||
| 4392 | printk(IBM_ERR "unable to register input device\n"); | ||
| 4393 | thinkpad_acpi_module_exit(); | ||
| 4394 | return ret; | ||
| 4395 | } else { | ||
| 4396 | tp_features.input_device_registered = 1; | ||
| 4397 | } | ||
| 4375 | 4398 | ||
| 4376 | return 0; | 4399 | return 0; |
| 4377 | } | 4400 | } |
| @@ -4388,6 +4411,13 @@ static void thinkpad_acpi_module_exit(void) | |||
| 4388 | 4411 | ||
| 4389 | dbg_printk(TPACPI_DBG_INIT, "finished subdriver exit path...\n"); | 4412 | dbg_printk(TPACPI_DBG_INIT, "finished subdriver exit path...\n"); |
| 4390 | 4413 | ||
| 4414 | if (tpacpi_inputdev) { | ||
| 4415 | if (tp_features.input_device_registered) | ||
| 4416 | input_unregister_device(tpacpi_inputdev); | ||
| 4417 | else | ||
| 4418 | input_free_device(tpacpi_inputdev); | ||
| 4419 | } | ||
| 4420 | |||
| 4391 | if (tpacpi_hwmon) | 4421 | if (tpacpi_hwmon) |
| 4392 | hwmon_device_unregister(tpacpi_hwmon); | 4422 | hwmon_device_unregister(tpacpi_hwmon); |
| 4393 | 4423 | ||
diff --git a/drivers/misc/thinkpad_acpi.h b/drivers/misc/thinkpad_acpi.h index 78ea4c88d560..00f1bd73df8f 100644 --- a/drivers/misc/thinkpad_acpi.h +++ b/drivers/misc/thinkpad_acpi.h | |||
| @@ -39,6 +39,7 @@ | |||
| 39 | #include <linux/platform_device.h> | 39 | #include <linux/platform_device.h> |
| 40 | #include <linux/hwmon.h> | 40 | #include <linux/hwmon.h> |
| 41 | #include <linux/hwmon-sysfs.h> | 41 | #include <linux/hwmon-sysfs.h> |
| 42 | #include <linux/input.h> | ||
| 42 | #include <asm/uaccess.h> | 43 | #include <asm/uaccess.h> |
| 43 | 44 | ||
| 44 | #include <linux/dmi.h> | 45 | #include <linux/dmi.h> |
| @@ -48,6 +49,7 @@ | |||
| 48 | #include <acpi/acpi_drivers.h> | 49 | #include <acpi/acpi_drivers.h> |
| 49 | #include <acpi/acnamesp.h> | 50 | #include <acpi/acnamesp.h> |
| 50 | 51 | ||
| 52 | #include <linux/pci_ids.h> | ||
| 51 | 53 | ||
| 52 | /**************************************************************************** | 54 | /**************************************************************************** |
| 53 | * Main driver | 55 | * Main driver |
| @@ -98,6 +100,11 @@ static const char *str_supported(int is_supported); | |||
| 98 | #define vdbg_printk(a_dbg_level, format, arg...) | 100 | #define vdbg_printk(a_dbg_level, format, arg...) |
| 99 | #endif | 101 | #endif |
| 100 | 102 | ||
| 103 | /* Input IDs */ | ||
| 104 | #define TPACPI_HKEY_INPUT_VENDOR PCI_VENDOR_ID_IBM | ||
| 105 | #define TPACPI_HKEY_INPUT_PRODUCT 0x5054 /* "TP" */ | ||
| 106 | #define TPACPI_HKEY_INPUT_VERSION 0x4101 | ||
| 107 | |||
| 101 | /* ACPI HIDs */ | 108 | /* ACPI HIDs */ |
| 102 | #define IBM_HKEY_HID "IBM0068" | 109 | #define IBM_HKEY_HID "IBM0068" |
| 103 | #define IBM_PCI_HID "PNP0A03" | 110 | #define IBM_PCI_HID "PNP0A03" |
| @@ -161,6 +168,7 @@ static int parse_strtoul(const char *buf, unsigned long max, | |||
| 161 | static struct platform_device *tpacpi_pdev; | 168 | static struct platform_device *tpacpi_pdev; |
| 162 | static struct class_device *tpacpi_hwmon; | 169 | static struct class_device *tpacpi_hwmon; |
| 163 | static struct platform_driver tpacpi_pdriver; | 170 | static struct platform_driver tpacpi_pdriver; |
| 171 | static struct input_dev *tpacpi_inputdev; | ||
| 164 | static int tpacpi_create_driver_attributes(struct device_driver *drv); | 172 | static int tpacpi_create_driver_attributes(struct device_driver *drv); |
| 165 | static void tpacpi_remove_driver_attributes(struct device_driver *drv); | 173 | static void tpacpi_remove_driver_attributes(struct device_driver *drv); |
| 166 | 174 | ||
| @@ -233,6 +241,7 @@ static struct { | |||
| 233 | u16 light_status:1; | 241 | u16 light_status:1; |
| 234 | u16 wan:1; | 242 | u16 wan:1; |
| 235 | u16 fan_ctrl_status_undef:1; | 243 | u16 fan_ctrl_status_undef:1; |
| 244 | u16 input_device_registered:1; | ||
| 236 | } tp_features; | 245 | } tp_features; |
| 237 | 246 | ||
| 238 | static struct list_head tpacpi_all_drivers; | 247 | static struct list_head tpacpi_all_drivers; |
