if (ret)
                goto out_pdown;
 
+       ret = v4l2_device_register(mcam->dev, &mcam->v4l2_dev);
+       if (ret)
+               goto out_smbus_shutdown;
+
        v4l2_async_nf_init(&mcam->notifier);
 
        asd = v4l2_async_nf_add_i2c(&mcam->notifier,
                                    struct v4l2_async_connection);
        if (IS_ERR(asd)) {
                ret = PTR_ERR(asd);
-               goto out_smbus_shutdown;
+               goto out_v4l2_device_unregister;
        }
 
        ret = mccic_register(mcam);
        if (ret)
-               goto out_smbus_shutdown;
+               goto out_v4l2_device_unregister;
 
        clkdev_create(mcam->mclk, "xclk", "%d-%04x",
                i2c_adapter_id(cam->i2c_adapter), ov7670_info.addr);
 
 out_mccic_shutdown:
        mccic_shutdown(mcam);
+out_v4l2_device_unregister:
+       v4l2_device_unregister(&mcam->v4l2_dev);
 out_smbus_shutdown:
        cafe_smbus_shutdown(cam);
 out_pdown:
 static void cafe_shutdown(struct cafe_camera *cam)
 {
        mccic_shutdown(&cam->mcam);
+       v4l2_device_unregister(&cam->mcam.v4l2_dev);
        cafe_smbus_shutdown(cam);
        free_irq(cam->pdev->irq, cam);
        pci_iounmap(cam->pdev, cam->mcam.regs);
 
                goto out;
        }
 
-       /*
-        * Register with V4L
-        */
-       ret = v4l2_device_register(cam->dev, &cam->v4l2_dev);
-       if (ret)
-               goto out;
-
        mutex_init(&cam->s_mutex);
        cam->state = S_NOTREADY;
        mcam_set_config_needed(cam, 1);
 
 out:
        v4l2_async_nf_unregister(&cam->notifier);
-       v4l2_device_unregister(&cam->v4l2_dev);
        v4l2_async_nf_cleanup(&cam->notifier);
        return ret;
 }
                mcam_free_dma_bufs(cam);
        v4l2_ctrl_handler_free(&cam->ctrl_handler);
        v4l2_async_nf_unregister(&cam->notifier);
-       v4l2_device_unregister(&cam->v4l2_dev);
        v4l2_async_nf_cleanup(&cam->notifier);
 }
 EXPORT_SYMBOL_GPL(mccic_shutdown);