int irq_emma;
        int ret;
 
-       pcdev = kzalloc(sizeof *pcdev, GFP_KERNEL);
+       pcdev = devm_kzalloc(&pdev->dev, sizeof(*pcdev), GFP_KERNEL);
        if (!pcdev)
                return -ENOMEM;
 
 
        pcdev->clk_emma_ipg = devm_clk_get(&pdev->dev, "ipg");
        if (IS_ERR(pcdev->clk_emma_ipg)) {
-               ret = PTR_ERR(pcdev->clk_emma_ipg);
-               goto free_dev;
+               return PTR_ERR(pcdev->clk_emma_ipg);
        }
 
        pcdev->clk_emma_ahb = devm_clk_get(&pdev->dev, "ahb");
        if (IS_ERR(pcdev->clk_emma_ipg)) {
-               ret = PTR_ERR(pcdev->clk_emma_ahb);
-               goto free_dev;
+               return PTR_ERR(pcdev->clk_emma_ahb);
        }
 
        irq_emma = platform_get_irq(pdev, 0);
        res_emma = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (irq_emma < 0 || res_emma == NULL) {
                dev_err(&pdev->dev, "Missing platform resources data\n");
-               ret = -ENODEV;
-               goto free_dev;
+               return -ENODEV;
        }
 
        ret = v4l2_device_register(&pdev->dev, &pcdev->v4l2_dev);
        if (ret)
-               goto free_dev;
+               return ret;
 
        mutex_init(&pcdev->dev_mutex);
 
 
        platform_set_drvdata(pdev, pcdev);
 
-       if (devm_request_mem_region(&pdev->dev, res_emma->start,
-           resource_size(res_emma), MEM2MEM_NAME) == NULL)
-               goto rel_vdev;
-
-       pcdev->base_emma = devm_ioremap(&pdev->dev, res_emma->start,
-                                       resource_size(res_emma));
-       if (!pcdev->base_emma)
+       pcdev->base_emma = devm_request_and_ioremap(&pdev->dev, res_emma);
+       if (!pcdev->base_emma) {
+               ret = -ENXIO;
                goto rel_vdev;
+       }
 
        pcdev->irq_emma = irq_emma;
        pcdev->res_emma = res_emma;
 
        if (devm_request_irq(&pdev->dev, pcdev->irq_emma, emmaprp_irq,
-                            0, MEM2MEM_NAME, pcdev) < 0)
+                            0, MEM2MEM_NAME, pcdev) < 0) {
+               ret = -ENODEV;
                goto rel_vdev;
+       }
 
        pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev);
        if (IS_ERR(pcdev->alloc_ctx)) {
        video_device_release(vfd);
 unreg_dev:
        v4l2_device_unregister(&pcdev->v4l2_dev);
-free_dev:
-       kfree(pcdev);
 
        return ret;
 }
        v4l2_m2m_release(pcdev->m2m_dev);
        vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
        v4l2_device_unregister(&pcdev->v4l2_dev);
-       kfree(pcdev);
 
        return 0;
 }