int res_idx = 0;
        int i, err;
 
-       pdev->dev.platform_data = vpif_capture_get_pdata(pdev);
-       if (!pdev->dev.platform_data) {
-               dev_warn(&pdev->dev, "Missing platform data.  Giving up.\n");
-               return -EINVAL;
-       }
-
        vpif_dev = &pdev->dev;
 
        err = initialize_vpif();
        if (err) {
                v4l2_err(vpif_dev->driver, "Error initializing vpif\n");
-               goto cleanup;
+               return err;
        }
 
        err = v4l2_device_register(vpif_dev, &vpif_obj.v4l2_dev);
                        goto vpif_unregister;
        } while (++res_idx);
 
+       pdev->dev.platform_data = vpif_capture_get_pdata(pdev);
+       if (!pdev->dev.platform_data) {
+               dev_warn(&pdev->dev, "Missing platform data. Giving up.\n");
+               goto vpif_unregister;
+       }
+
        vpif_obj.config = pdev->dev.platform_data;
 
        subdev_count = vpif_obj.config->subdev_count;
        vpif_obj.sd = kcalloc(subdev_count, sizeof(*vpif_obj.sd), GFP_KERNEL);
        if (!vpif_obj.sd) {
                err = -ENOMEM;
-               goto vpif_unregister;
+               goto probe_subdev_out;
        }
 
        if (!vpif_obj.config->asd_sizes[0]) {
        return 0;
 
 probe_subdev_out:
+       v4l2_async_nf_cleanup(&vpif_obj.notifier);
        /* free sub devices memory */
        kfree(vpif_obj.sd);
 vpif_unregister:
        v4l2_device_unregister(&vpif_obj.v4l2_dev);
 vpif_free:
        free_vpif_objs();
-cleanup:
-       v4l2_async_nf_cleanup(&vpif_obj.notifier);
 
        return err;
 }