diff options
Diffstat (limited to 'drivers/misc/thinkpad_acpi.c')
-rw-r--r-- | drivers/misc/thinkpad_acpi.c | 32 |
1 files changed, 31 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 | ||