}
        }
 
-       return sun4i_dclk_create(dev, tcon);
+       return 0;
 }
 
 static void sun4i_tcon_free_clocks(struct sun4i_tcon *tcon)
 {
-       sun4i_dclk_free(tcon);
        clk_disable_unprepare(tcon->clk);
 }
 
                return ret;
        }
 
+       ret = sun4i_tcon_init_clocks(dev, tcon);
+       if (ret) {
+               dev_err(dev, "Couldn't init our TCON clocks\n");
+               goto err_assert_reset;
+       }
+
        ret = sun4i_tcon_init_regmap(dev, tcon);
        if (ret) {
                dev_err(dev, "Couldn't init our TCON regmap\n");
-               goto err_assert_reset;
+               goto err_free_clocks;
        }
 
-       ret = sun4i_tcon_init_clocks(dev, tcon);
+       ret = sun4i_dclk_create(dev, tcon);
        if (ret) {
-               dev_err(dev, "Couldn't init our TCON clocks\n");
-               goto err_assert_reset;
+               dev_err(dev, "Couldn't create our TCON dot clock\n");
+               goto err_free_clocks;
        }
 
        ret = sun4i_tcon_init_irq(dev, tcon);
        if (ret) {
                dev_err(dev, "Couldn't init our TCON interrupts\n");
-               goto err_free_clocks;
+               goto err_free_dotclock;
        }
 
        tcon->crtc = sun4i_crtc_init(drm);
 
        return 0;
 
+err_free_dotclock:
+       sun4i_dclk_free(tcon);
 err_free_clocks:
        sun4i_tcon_free_clocks(tcon);
 err_assert_reset:
 {
        struct sun4i_tcon *tcon = dev_get_drvdata(dev);
 
+       sun4i_dclk_free(tcon);
        sun4i_tcon_free_clocks(tcon);
 }