mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 19:56:18 +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)
|
static int eeepc_hotk_check(void)
|
||||||
{
|
{
|
||||||
const struct key_entry *key;
|
|
||||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
@ -604,31 +603,6 @@ static int eeepc_hotk_check(void)
|
||||||
pr_info("Get control methods supported: 0x%x\n",
|
pr_info("Get control methods supported: 0x%x\n",
|
||||||
ehotk->cm_supported);
|
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 {
|
} else {
|
||||||
pr_err("Hotkey device not present, aborting\n");
|
pr_err("Hotkey device not present, aborting\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -1142,6 +1116,40 @@ static int eeepc_hwmon_init(struct device *dev)
|
||||||
return result;
|
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)
|
static int eeepc_hotk_add(struct acpi_device *device)
|
||||||
{
|
{
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
|
@ -1162,7 +1170,7 @@ static int eeepc_hotk_add(struct acpi_device *device)
|
||||||
|
|
||||||
result = eeepc_hotk_check();
|
result = eeepc_hotk_check();
|
||||||
if (result)
|
if (result)
|
||||||
goto fail_check;
|
goto fail_platform_driver;
|
||||||
eeepc_enable_camera();
|
eeepc_enable_camera();
|
||||||
|
|
||||||
/* Register platform stuff */
|
/* Register platform stuff */
|
||||||
|
@ -1192,6 +1200,10 @@ static int eeepc_hotk_add(struct acpi_device *device)
|
||||||
pr_info("Backlight controlled by ACPI video "
|
pr_info("Backlight controlled by ACPI video "
|
||||||
"driver\n");
|
"driver\n");
|
||||||
|
|
||||||
|
result = eeepc_input_init(dev);
|
||||||
|
if (result)
|
||||||
|
goto fail_input;
|
||||||
|
|
||||||
result = eeepc_hwmon_init(dev);
|
result = eeepc_hwmon_init(dev);
|
||||||
if (result)
|
if (result)
|
||||||
goto fail_hwmon;
|
goto fail_hwmon;
|
||||||
|
@ -1205,6 +1217,8 @@ static int eeepc_hotk_add(struct acpi_device *device)
|
||||||
fail_rfkill:
|
fail_rfkill:
|
||||||
eeepc_hwmon_exit();
|
eeepc_hwmon_exit();
|
||||||
fail_hwmon:
|
fail_hwmon:
|
||||||
|
eeepc_input_exit();
|
||||||
|
fail_input:
|
||||||
eeepc_backlight_exit();
|
eeepc_backlight_exit();
|
||||||
fail_backlight:
|
fail_backlight:
|
||||||
sysfs_remove_group(&platform_device->dev.kobj,
|
sysfs_remove_group(&platform_device->dev.kobj,
|
||||||
|
@ -1216,8 +1230,6 @@ fail_platform_device2:
|
||||||
fail_platform_device1:
|
fail_platform_device1:
|
||||||
platform_driver_unregister(&platform_driver);
|
platform_driver_unregister(&platform_driver);
|
||||||
fail_platform_driver:
|
fail_platform_driver:
|
||||||
eeepc_input_exit();
|
|
||||||
fail_check:
|
|
||||||
kfree(ehotk);
|
kfree(ehotk);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
Loading…
Reference in a new issue