mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 11:46:19 +00:00
eeepc-laptop: make input device a child of the platform device
Sysfs showed the ehotk input device as a "virtual" device - lies! The input device is provided by a physical device, the eeepc platform. This requires that we move the creation of the input device to come after platform device is created. Input initialization is moved from ehotk_check() [sic] to a new function called eeepc_input_init(). This brings the input device into line with the other eeepc-laptop devices. Also, refuse to load if we fail to register the input device. Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk> Signed-off-by: Corentin Chary <corentincj@iksaif.net> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
1e7798547f
commit
f2a9d5e8a6
1 changed files with 41 additions and 29 deletions
|
@ -579,7 +579,6 @@ static void cmsg_quirks(void)
|
|||
|
||||
static int eeepc_hotk_check(void)
|
||||
{
|
||||
const struct key_entry *key;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
int result;
|
||||
|
||||
|
@ -604,31 +603,6 @@ static int eeepc_hotk_check(void)
|
|||
pr_info("Get control methods supported: 0x%x\n",
|
||||
ehotk->cm_supported);
|
||||
}
|
||||
ehotk->inputdev = input_allocate_device();
|
||||
if (!ehotk->inputdev) {
|
||||
pr_info("Unable to allocate input device\n");
|
||||
return 0;
|
||||
}
|
||||
ehotk->inputdev->name = "Asus EeePC extra buttons";
|
||||
ehotk->inputdev->phys = EEEPC_HOTK_FILE "/input0";
|
||||
ehotk->inputdev->id.bustype = BUS_HOST;
|
||||
ehotk->inputdev->getkeycode = eeepc_getkeycode;
|
||||
ehotk->inputdev->setkeycode = eeepc_setkeycode;
|
||||
|
||||
for (key = eeepc_keymap; key->type != KE_END; key++) {
|
||||
switch (key->type) {
|
||||
case KE_KEY:
|
||||
set_bit(EV_KEY, ehotk->inputdev->evbit);
|
||||
set_bit(key->keycode, ehotk->inputdev->keybit);
|
||||
break;
|
||||
}
|
||||
}
|
||||
result = input_register_device(ehotk->inputdev);
|
||||
if (result) {
|
||||
pr_info("Unable to register input device\n");
|
||||
input_free_device(ehotk->inputdev);
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
pr_err("Hotkey device not present, aborting\n");
|
||||
return -EINVAL;
|
||||
|
@ -1142,6 +1116,40 @@ static int eeepc_hwmon_init(struct device *dev)
|
|||
return result;
|
||||
}
|
||||
|
||||
static int eeepc_input_init(struct device *dev)
|
||||
{
|
||||
const struct key_entry *key;
|
||||
int result;
|
||||
|
||||
ehotk->inputdev = input_allocate_device();
|
||||
if (!ehotk->inputdev) {
|
||||
pr_info("Unable to allocate input device\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
ehotk->inputdev->name = "Asus EeePC extra buttons";
|
||||
ehotk->inputdev->dev.parent = dev;
|
||||
ehotk->inputdev->phys = EEEPC_HOTK_FILE "/input0";
|
||||
ehotk->inputdev->id.bustype = BUS_HOST;
|
||||
ehotk->inputdev->getkeycode = eeepc_getkeycode;
|
||||
ehotk->inputdev->setkeycode = eeepc_setkeycode;
|
||||
|
||||
for (key = eeepc_keymap; key->type != KE_END; key++) {
|
||||
switch (key->type) {
|
||||
case KE_KEY:
|
||||
set_bit(EV_KEY, ehotk->inputdev->evbit);
|
||||
set_bit(key->keycode, ehotk->inputdev->keybit);
|
||||
break;
|
||||
}
|
||||
}
|
||||
result = input_register_device(ehotk->inputdev);
|
||||
if (result) {
|
||||
pr_info("Unable to register input device\n");
|
||||
input_free_device(ehotk->inputdev);
|
||||
return result;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int eeepc_hotk_add(struct acpi_device *device)
|
||||
{
|
||||
struct device *dev;
|
||||
|
@ -1162,7 +1170,7 @@ static int eeepc_hotk_add(struct acpi_device *device)
|
|||
|
||||
result = eeepc_hotk_check();
|
||||
if (result)
|
||||
goto fail_check;
|
||||
goto fail_platform_driver;
|
||||
eeepc_enable_camera();
|
||||
|
||||
/* Register platform stuff */
|
||||
|
@ -1192,6 +1200,10 @@ static int eeepc_hotk_add(struct acpi_device *device)
|
|||
pr_info("Backlight controlled by ACPI video "
|
||||
"driver\n");
|
||||
|
||||
result = eeepc_input_init(dev);
|
||||
if (result)
|
||||
goto fail_input;
|
||||
|
||||
result = eeepc_hwmon_init(dev);
|
||||
if (result)
|
||||
goto fail_hwmon;
|
||||
|
@ -1205,6 +1217,8 @@ static int eeepc_hotk_add(struct acpi_device *device)
|
|||
fail_rfkill:
|
||||
eeepc_hwmon_exit();
|
||||
fail_hwmon:
|
||||
eeepc_input_exit();
|
||||
fail_input:
|
||||
eeepc_backlight_exit();
|
||||
fail_backlight:
|
||||
sysfs_remove_group(&platform_device->dev.kobj,
|
||||
|
@ -1216,8 +1230,6 @@ fail_platform_device2:
|
|||
fail_platform_device1:
|
||||
platform_driver_unregister(&platform_driver);
|
||||
fail_platform_driver:
|
||||
eeepc_input_exit();
|
||||
fail_check:
|
||||
kfree(ehotk);
|
||||
|
||||
return result;
|
||||
|
|
Loading…
Reference in a new issue