csi2_dev->reset = devm_reset_control_get_shared(dev, NULL);
        if (IS_ERR(csi2_dev->reset)) {
                dev_err(dev, "failed to get reset controller\n");
-               return PTR_ERR(csi2_dev->reset);
+               ret = PTR_ERR(csi2_dev->reset);
+               goto error_clock_rate_exclusive;
        }
 
        /* D-PHY */
        csi2_dev->dphy = devm_phy_get(dev, "dphy");
        if (IS_ERR(csi2_dev->dphy)) {
                dev_err(dev, "failed to get MIPI D-PHY\n");
-               return PTR_ERR(csi2_dev->dphy);
+               ret = PTR_ERR(csi2_dev->dphy);
+               goto error_clock_rate_exclusive;
        }
 
        ret = phy_init(csi2_dev->dphy);
        if (ret) {
                dev_err(dev, "failed to initialize MIPI D-PHY\n");
-               return ret;
+               goto error_clock_rate_exclusive;
        }
 
        /* Runtime PM */
        pm_runtime_enable(dev);
 
        return 0;
+
+error_clock_rate_exclusive:
+       clk_rate_exclusive_put(csi2_dev->clock_mod);
+
+       return ret;
 }
 
 static void
 
        ret = sun6i_mipi_csi2_bridge_setup(csi2_dev);
        if (ret)
-               return ret;
+               goto error_resources;
 
        return 0;
+
+error_resources:
+       sun6i_mipi_csi2_resources_cleanup(csi2_dev);
+
+       return ret;
 }
 
 static int sun6i_mipi_csi2_remove(struct platform_device *platform_dev)