[PATCH 2/3] HID: multitouch: use input_register callback
From: Benjamin Tissoires <hidden>
Date: 2011-11-29 12:13:50
Also in:
lkml
Subsystem:
hid core layer, the rest · Maintainers:
Jiri Kosina, Benjamin Tissoires, Linus Torvalds
Use the input_register mechanism to avoid a race in which the device may emit events before the slots are ready. Signed-off-by: Benjamin Tissoires <redacted> --- drivers/hid/hid-multitouch.c | 37 ++++++++++++++++++++++++------------- 1 files changed, 24 insertions(+), 13 deletions(-)
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 91c13bc..bd6e410 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c@@ -574,6 +574,29 @@ static void mt_set_input_mode(struct hid_device *hdev) } } +static int mt_input_register(struct hid_device *hdev, + struct hid_input *hidinput) +{ + int ret; + struct mt_device *td = hid_get_drvdata(hdev); + + td->slots = kzalloc(td->maxcontacts * sizeof(struct mt_slot), + GFP_KERNEL); + if (!td->slots) { + dev_err(&hdev->dev, "cannot allocate multitouch slots\n"); + return -ENOMEM; + } + + ret = sysfs_create_group(&hdev->dev.kobj, &mt_attribute_group); + if (ret) + hid_warn(hdev, + "can't create sysfs quirks attribute err: %d\n", ret); + + mt_set_input_mode(hdev); + + return 0; +} + static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) { int ret, i;
@@ -610,19 +633,6 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) if (ret) goto fail; - td->slots = kzalloc(td->maxcontacts * sizeof(struct mt_slot), - GFP_KERNEL); - if (!td->slots) { - dev_err(&hdev->dev, "cannot allocate multitouch slots\n"); - hid_hw_stop(hdev); - ret = -ENOMEM; - goto fail; - } - - ret = sysfs_create_group(&hdev->dev.kobj, &mt_attribute_group); - - mt_set_input_mode(hdev); - return 0; fail:
@@ -843,6 +853,7 @@ static struct hid_driver mt_driver = { .input_mapping = mt_input_mapping, .input_mapped = mt_input_mapped, .feature_mapping = mt_feature_mapping, + .input_register = mt_input_register, .usage_table = mt_grabbed_usages, .event = mt_event, #ifdef CONFIG_PM
--
1.7.4.4