Thread (1 message) 1 message, 1 author, 2014-01-07

Re: [PATCH] Input: twl4030 - convert to using managed resources

From: Jingoo Han <hidden>
Date: 2014-01-07 00:35:52

On Tuesday, January 07, 2014 3:07 AM, Dmitry Torokhov wrote:
On Mon, Jan 06, 2014 at 11:25:54AM +0900, Jingoo Han wrote:
quoted
On Saturday, January 04, 2014 6:02 PM, Dmitry Torokhov wrote:
quoted
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---

Compile-tested only.


 drivers/input/keyboard/twl4030_keypad.c | 70 +++++++++++----------------------
 1 file changed, 22 insertions(+), 48 deletions(-)
diff --git a/drivers/input/keyboard/twl4030_keypad.c b/drivers/input/keyboard/twl4030_keypad.c
index f663c19..71eb041 100644
--- a/drivers/input/keyboard/twl4030_keypad.c
+++ b/drivers/input/keyboard/twl4030_keypad.c
[.....]
quoted
-static int twl4030_kp_remove(struct platform_device *pdev)
-{
-	struct twl4030_keypad *kp = platform_get_drvdata(pdev);
-
-	free_irq(kp->irq, kp);
-	input_unregister_device(kp->input);
Hi Dmitry Torokhov,

IMHO, input_unregister_device() seems to be necessary,
because input_register_device() is still used.
If I am wrong, please let me know kindly.
No, input_unregister_device() is not needed (although it can be used)
with managed input devices (ones that are allocated with
devm_input_allocate_device()) because input_register_device() will
automatically insert devres entry for such devices. So for managed input
devices that were registered with input subsystem there are 2 separate
devres entries: one for unregistering the device and another is to
finally release all resources. If you had a sequence:

	devm_kzalloc(...);
	devm_input_allocate_device(...);
	devm_devm_ioremap_resource(...);
	devm_request_irq(...);
	input_register_device(...);

then unwind sequence will be:

	unregister input device (but input device structure is still
		present in memory and input_event() can be called, but
		events won't be delivered anywhere - that is done so
		that we can survive releasing IRQs after unregistering
		managed input device)
	free IRQ
	release resources
	free input device structure
	free kzalloc memory

Hope this helps.
Oh, I really appreciate your detailed and kind comments. :-)

I checked the following. As you said, input_register_device()
automatically inserts devres entry.

./drivers/input/input.c
int input_register_device(struct input_dev *dev)
{
        struct input_devres *devres = NULL;
        struct input_handler *handler;
        unsigned int packet_size;
        const char *path;
        int error;

        if (dev->devres_managed) {
                devres = devres_alloc(devm_input_device_unregister,
                                      sizeof(struct input_devres), GFP_KERNEL);

Thank you so much.

Best regards,
Jingoo Han
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help