summaryrefslogtreecommitdiffstats
path: root/drivers/input/input-polldev.c
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2009-12-04 19:22:23 +0100
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2009-12-07 18:26:35 +0100
commit36203c4f3d091b5f6c082663bd1f74273798043a (patch)
treebf5b6efee8f15aae253155263038ac538f7482e9 /drivers/input/input-polldev.c
parentInput: fix memory leak in force feedback core (diff)
downloadlinux-36203c4f3d091b5f6c082663bd1f74273798043a.tar.xz
linux-36203c4f3d091b5f6c082663bd1f74273798043a.zip
Input: add generic support for sparse keymaps
More and more devices choose to reimplement support for sparse keymaps first introduced by wistron driver. Move it into a library module so it can be easily used by interested parties. Reviewed-by: Anisse Astier <anisse@astier.eu> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/input/input-polldev.c')
-rw-r--r--drivers/input/input-polldev.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/input/input-polldev.c b/drivers/input/input-polldev.c
index 6a2eb399b988..aa6713b4a988 100644
--- a/drivers/input/input-polldev.c
+++ b/drivers/input/input-polldev.c
@@ -212,7 +212,7 @@ EXPORT_SYMBOL(input_allocate_polled_device);
* @dev: device to free
*
* The function frees memory allocated for polling device and drops
- * reference to the associated input device (if present).
+ * reference to the associated input device.
*/
void input_free_polled_device(struct input_polled_dev *dev)
{
@@ -258,6 +258,15 @@ int input_register_polled_device(struct input_polled_dev *dev)
return error;
}
+ /*
+ * Take extra reference to the underlying input device so
+ * that it survives call to input_unregister_polled_device()
+ * and is deleted only after input_free_polled_device()
+ * has been invoked. This is needed to ease task of freeing
+ * sparse keymaps.
+ */
+ input_get_device(input);
+
return 0;
}
EXPORT_SYMBOL(input_register_polled_device);
@@ -269,8 +278,6 @@ EXPORT_SYMBOL(input_register_polled_device);
* The function unregisters previously registered polled input
* device from input layer. Polling is stopped and device is
* ready to be freed with call to input_free_polled_device().
- * Callers should not attempt to access dev->input pointer
- * after calling this function.
*/
void input_unregister_polled_device(struct input_polled_dev *dev)
{
@@ -278,7 +285,6 @@ void input_unregister_polled_device(struct input_polled_dev *dev)
&input_polldev_attribute_group);
input_unregister_device(dev->input);
- dev->input = NULL;
}
EXPORT_SYMBOL(input_unregister_polled_device);