diff options
author | Alan Jenkins <alan-jenkins@tuffmail.co.uk> | 2009-08-28 08:56:36 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2009-08-28 15:21:11 -0400 |
commit | f2a9d5e8a649c606f520b7a7b9f4f46fba79c327 (patch) | |
tree | 5e7e64548abc259ce49f0a996478d8a869308aa8 /drivers | |
parent | 1e7798547fe6920ae27fb92c9202353e9e4c55db (diff) |
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/platform/x86/eeepc-laptop.c | 70 |
1 files changed, 41 insertions, 29 deletions
diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c index cf47d1cd1a34..298dac9c6ada 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c | |||
@@ -579,7 +579,6 @@ static void cmsg_quirks(void) | |||
579 | 579 | ||
580 | static int eeepc_hotk_check(void) | 580 | static int eeepc_hotk_check(void) |
581 | { | 581 | { |
582 | const struct key_entry *key; | ||
583 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 582 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
584 | int result; | 583 | int result; |
585 | 584 | ||
@@ -604,31 +603,6 @@ static int eeepc_hotk_check(void) | |||
604 | pr_info("Get control methods supported: 0x%x\n", | 603 | pr_info("Get control methods supported: 0x%x\n", |
605 | ehotk->cm_supported); | 604 | ehotk->cm_supported); |
606 | } | 605 | } |
607 | ehotk->inputdev = input_allocate_device(); | ||
608 | if (!ehotk->inputdev) { | ||
609 | pr_info("Unable to allocate input device\n"); | ||
610 | return 0; | ||
611 | } | ||
612 | ehotk->inputdev->name = "Asus EeePC extra buttons"; | ||
613 | ehotk->inputdev->phys = EEEPC_HOTK_FILE "/input0"; | ||
614 | ehotk->inputdev->id.bustype = BUS_HOST; | ||
615 | ehotk->inputdev->getkeycode = eeepc_getkeycode; | ||
616 | ehotk->inputdev->setkeycode = eeepc_setkeycode; | ||
617 | |||
618 | for (key = eeepc_keymap; key->type != KE_END; key++) { | ||
619 | switch (key->type) { | ||
620 | case KE_KEY: | ||
621 | set_bit(EV_KEY, ehotk->inputdev->evbit); | ||
622 | set_bit(key->keycode, ehotk->inputdev->keybit); | ||
623 | break; | ||
624 | } | ||
625 | } | ||
626 | result = input_register_device(ehotk->inputdev); | ||
627 | if (result) { | ||
628 | pr_info("Unable to register input device\n"); | ||
629 | input_free_device(ehotk->inputdev); | ||
630 | return 0; | ||
631 | } | ||
632 | } else { | 606 | } else { |
633 | pr_err("Hotkey device not present, aborting\n"); | 607 | pr_err("Hotkey device not present, aborting\n"); |
634 | return -EINVAL; | 608 | return -EINVAL; |
@@ -1142,6 +1116,40 @@ static int eeepc_hwmon_init(struct device *dev) | |||
1142 | return result; | 1116 | return result; |
1143 | } | 1117 | } |
1144 | 1118 | ||
1119 | static int eeepc_input_init(struct device *dev) | ||
1120 | { | ||
1121 | const struct key_entry *key; | ||
1122 | int result; | ||
1123 | |||
1124 | ehotk->inputdev = input_allocate_device(); | ||
1125 | if (!ehotk->inputdev) { | ||
1126 | pr_info("Unable to allocate input device\n"); | ||
1127 | return -ENOMEM; | ||
1128 | } | ||
1129 | ehotk->inputdev->name = "Asus EeePC extra buttons"; | ||
1130 | ehotk->inputdev->dev.parent = dev; | ||
1131 | ehotk->inputdev->phys = EEEPC_HOTK_FILE "/input0"; | ||
1132 | ehotk->inputdev->id.bustype = BUS_HOST; | ||
1133 | ehotk->inputdev->getkeycode = eeepc_getkeycode; | ||
1134 | ehotk->inputdev->setkeycode = eeepc_setkeycode; | ||
1135 | |||
1136 | for (key = eeepc_keymap; key->type != KE_END; key++) { | ||
1137 | switch (key->type) { | ||
1138 | case KE_KEY: | ||
1139 | set_bit(EV_KEY, ehotk->inputdev->evbit); | ||
1140 | set_bit(key->keycode, ehotk->inputdev->keybit); | ||
1141 | break; | ||
1142 | } | ||
1143 | } | ||
1144 | result = input_register_device(ehotk->inputdev); | ||
1145 | if (result) { | ||
1146 | pr_info("Unable to register input device\n"); | ||
1147 | input_free_device(ehotk->inputdev); | ||
1148 | return result; | ||
1149 | } | ||
1150 | return 0; | ||
1151 | } | ||
1152 | |||
1145 | static int eeepc_hotk_add(struct acpi_device *device) | 1153 | static int eeepc_hotk_add(struct acpi_device *device) |
1146 | { | 1154 | { |
1147 | struct device *dev; | 1155 | struct device *dev; |
@@ -1162,7 +1170,7 @@ static int eeepc_hotk_add(struct acpi_device *device) | |||
1162 | 1170 | ||
1163 | result = eeepc_hotk_check(); | 1171 | result = eeepc_hotk_check(); |
1164 | if (result) | 1172 | if (result) |
1165 | goto fail_check; | 1173 | goto fail_platform_driver; |
1166 | eeepc_enable_camera(); | 1174 | eeepc_enable_camera(); |
1167 | 1175 | ||
1168 | /* Register platform stuff */ | 1176 | /* Register platform stuff */ |
@@ -1192,6 +1200,10 @@ static int eeepc_hotk_add(struct acpi_device *device) | |||
1192 | pr_info("Backlight controlled by ACPI video " | 1200 | pr_info("Backlight controlled by ACPI video " |
1193 | "driver\n"); | 1201 | "driver\n"); |
1194 | 1202 | ||
1203 | result = eeepc_input_init(dev); | ||
1204 | if (result) | ||
1205 | goto fail_input; | ||
1206 | |||
1195 | result = eeepc_hwmon_init(dev); | 1207 | result = eeepc_hwmon_init(dev); |
1196 | if (result) | 1208 | if (result) |
1197 | goto fail_hwmon; | 1209 | goto fail_hwmon; |
@@ -1205,6 +1217,8 @@ static int eeepc_hotk_add(struct acpi_device *device) | |||
1205 | fail_rfkill: | 1217 | fail_rfkill: |
1206 | eeepc_hwmon_exit(); | 1218 | eeepc_hwmon_exit(); |
1207 | fail_hwmon: | 1219 | fail_hwmon: |
1220 | eeepc_input_exit(); | ||
1221 | fail_input: | ||
1208 | eeepc_backlight_exit(); | 1222 | eeepc_backlight_exit(); |
1209 | fail_backlight: | 1223 | fail_backlight: |
1210 | sysfs_remove_group(&platform_device->dev.kobj, | 1224 | sysfs_remove_group(&platform_device->dev.kobj, |
@@ -1216,8 +1230,6 @@ fail_platform_device2: | |||
1216 | fail_platform_device1: | 1230 | fail_platform_device1: |
1217 | platform_driver_unregister(&platform_driver); | 1231 | platform_driver_unregister(&platform_driver); |
1218 | fail_platform_driver: | 1232 | fail_platform_driver: |
1219 | eeepc_input_exit(); | ||
1220 | fail_check: | ||
1221 | kfree(ehotk); | 1233 | kfree(ehotk); |
1222 | 1234 | ||
1223 | return result; | 1235 | return result; |