int ret;
 
        /* JPEG IP abstraction struct */
-       jpeg = kzalloc(sizeof(struct s5p_jpeg), GFP_KERNEL);
+       jpeg = devm_kzalloc(&pdev->dev, sizeof(struct s5p_jpeg), GFP_KERNEL);
        if (!jpeg)
                return -ENOMEM;
 
 
        /* memory-mapped registers */
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               dev_err(&pdev->dev, "cannot find IO resource\n");
-               ret = -ENOENT;
-               goto jpeg_alloc_rollback;
-       }
-
-       jpeg->ioarea = request_mem_region(res->start, resource_size(res),
-                                         pdev->name);
-       if (!jpeg->ioarea) {
-               dev_err(&pdev->dev, "cannot request IO\n");
-               ret = -ENXIO;
-               goto jpeg_alloc_rollback;
-       }
 
-       jpeg->regs = ioremap(res->start, resource_size(res));
-       if (!jpeg->regs) {
-               dev_err(&pdev->dev, "cannot map IO\n");
-               ret = -ENXIO;
-               goto mem_region_rollback;
+       jpeg->regs = devm_request_and_ioremap(&pdev->dev, res);
+       if (jpeg->regs == NULL) {
+               dev_err(&pdev->dev, "Failed to obtain io memory\n");
+               return -ENOENT;
        }
 
-       dev_dbg(&pdev->dev, "registers %p (%p, %p)\n",
-               jpeg->regs, jpeg->ioarea, res);
-
        /* interrupt service routine registration */
        jpeg->irq = ret = platform_get_irq(pdev, 0);
        if (ret < 0) {
                dev_err(&pdev->dev, "cannot find IRQ\n");
-               goto ioremap_rollback;
+               return ret;
        }
 
-       ret = request_irq(jpeg->irq, s5p_jpeg_irq, 0,
-                         dev_name(&pdev->dev), jpeg);
-
+       ret = devm_request_irq(&pdev->dev, jpeg->irq, s5p_jpeg_irq, 0,
+                       dev_name(&pdev->dev), jpeg);
        if (ret) {
                dev_err(&pdev->dev, "cannot claim IRQ %d\n", jpeg->irq);
-               goto ioremap_rollback;
+               return ret;
        }
 
        /* clocks */
        if (IS_ERR(jpeg->clk)) {
                dev_err(&pdev->dev, "cannot get clock\n");
                ret = PTR_ERR(jpeg->clk);
-               goto request_irq_rollback;
+               return ret;
        }
        dev_dbg(&pdev->dev, "clock source %p\n", jpeg->clk);
        clk_enable(jpeg->clk);
        clk_disable(jpeg->clk);
        clk_put(jpeg->clk);
 
-request_irq_rollback:
-       free_irq(jpeg->irq, jpeg);
-
-ioremap_rollback:
-       iounmap(jpeg->regs);
-
-mem_region_rollback:
-       release_resource(jpeg->ioarea);
-       release_mem_region(jpeg->ioarea->start, resource_size(jpeg->ioarea));
-
-jpeg_alloc_rollback:
-       kfree(jpeg);
        return ret;
 }
 
        clk_disable(jpeg->clk);
        clk_put(jpeg->clk);
 
-       free_irq(jpeg->irq, jpeg);
-
-       iounmap(jpeg->regs);
-
-       release_resource(jpeg->ioarea);
-       release_mem_region(jpeg->ioarea->start, resource_size(jpeg->ioarea));
-       kfree(jpeg);
-
        return 0;
 }