Commit f2a9d5e8 authored by Alan Jenkins's avatar Alan Jenkins Committed by Len Brown
Browse files

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: default avatarAlan Jenkins <alan-jenkins@tuffmail.co.uk>
Signed-off-by: default avatarCorentin Chary <corentincj@iksaif.net>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 1e779854
Loading
Loading
Loading
Loading
+41 −29
Original line number Diff line number Diff line
@@ -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;