Commit d1fefd5b authored by Dmitry Torokhov's avatar Dmitry Torokhov

Input: remove race when instantiating polled device attributes

Polled device's attributes controlling polling rate and whether polling is
enabled are attached to input device. We should have device core
instantiate them for us, so that they are created by the time new device
notification is sent to userspace, instead of doing it ourselves
afterwards.
Tested-by: default avatarAlexander Shiyan <shc_work@mail.ru>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 27245519
...@@ -147,6 +147,11 @@ static struct attribute_group input_polldev_attribute_group = { ...@@ -147,6 +147,11 @@ static struct attribute_group input_polldev_attribute_group = {
.attrs = sysfs_attrs .attrs = sysfs_attrs
}; };
static const struct attribute_group *input_polldev_attribute_groups[] = {
&input_polldev_attribute_group,
NULL
};
/** /**
* input_allocate_polled_device - allocate memory for polled device * input_allocate_polled_device - allocate memory for polled device
* *
...@@ -204,24 +209,21 @@ int input_register_polled_device(struct input_polled_dev *dev) ...@@ -204,24 +209,21 @@ int input_register_polled_device(struct input_polled_dev *dev)
input_set_drvdata(input, dev); input_set_drvdata(input, dev);
INIT_DELAYED_WORK(&dev->work, input_polled_device_work); INIT_DELAYED_WORK(&dev->work, input_polled_device_work);
if (!dev->poll_interval) if (!dev->poll_interval)
dev->poll_interval = 500; dev->poll_interval = 500;
if (!dev->poll_interval_max) if (!dev->poll_interval_max)
dev->poll_interval_max = dev->poll_interval; dev->poll_interval_max = dev->poll_interval;
input->open = input_open_polled_device; input->open = input_open_polled_device;
input->close = input_close_polled_device; input->close = input_close_polled_device;
input->dev.groups = input_polldev_attribute_groups;
error = input_register_device(input); error = input_register_device(input);
if (error) if (error)
return error; return error;
error = sysfs_create_group(&input->dev.kobj,
&input_polldev_attribute_group);
if (error) {
input_unregister_device(input);
return error;
}
/* /*
* Take extra reference to the underlying input device so * Take extra reference to the underlying input device so
* that it survives call to input_unregister_polled_device() * that it survives call to input_unregister_polled_device()
...@@ -245,9 +247,6 @@ EXPORT_SYMBOL(input_register_polled_device); ...@@ -245,9 +247,6 @@ EXPORT_SYMBOL(input_register_polled_device);
*/ */
void input_unregister_polled_device(struct input_polled_dev *dev) void input_unregister_polled_device(struct input_polled_dev *dev)
{ {
sysfs_remove_group(&dev->input->dev.kobj,
&input_polldev_attribute_group);
input_unregister_device(dev->input); input_unregister_device(dev->input);
} }
EXPORT_SYMBOL(input_unregister_polled_device); EXPORT_SYMBOL(input_unregister_polled_device);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment