* published by the Free Software Foundation.
  */
 
+#include <linux/device.h>
 #include <linux/input.h>
 #include <linux/input-polldev.h>
 #include <linux/interrupt.h>
        struct input_dev *input_dev;
        int i, error;
 
-       jornadakbd = kzalloc(sizeof(struct jornadakbd), GFP_KERNEL);
+       jornadakbd = devm_kzalloc(&pdev->dev, sizeof(struct jornadakbd),
+                                 GFP_KERNEL);
        if (!jornadakbd)
                return -ENOMEM;
 
-       poll_dev = input_allocate_polled_device();
+       poll_dev = devm_input_allocate_polled_device(&pdev->dev);
        if (!poll_dev) {
-               error = -ENOMEM;
-               goto failed;
+               dev_err(&pdev->dev, "failed to allocate polled input device\n");
+               return -ENOMEM;
        }
 
        platform_set_drvdata(pdev, jornadakbd);
        input_set_capability(input_dev, EV_MSC, MSC_SCAN);
 
        error = input_register_polled_device(jornadakbd->poll_dev);
-       if (error)
-               goto failed;
-
-       return 0;
-
- failed:
-       printk(KERN_ERR "Jornadakbd: failed to register driver, error: %d\n",
-               error);
-       input_free_polled_device(poll_dev);
-       kfree(jornadakbd);
-       return error;
-
-}
-
-static int jornada680kbd_remove(struct platform_device *pdev)
-{
-       struct jornadakbd *jornadakbd = platform_get_drvdata(pdev);
-
-       input_unregister_polled_device(jornadakbd->poll_dev);
-       input_free_polled_device(jornadakbd->poll_dev);
-       kfree(jornadakbd);
+       if (error) {
+               dev_err(&pdev->dev, "failed to register polled input device\n");
+               return error;
+       }
 
        return 0;
 }
                .owner  = THIS_MODULE,
        },
        .probe  = jornada680kbd_probe,
-       .remove = jornada680kbd_remove,
 };
 module_platform_driver(jornada680kbd_driver);