return 0;
 }
 
-static const struct soc_device_attribute dpi_soc_devices[] = {
-       { .machine = "OMAP3[456]*" },
-       { .machine = "[AD]M37*" },
-       { /* sentinel */ }
-};
-
-static int dpi_init_regulator(struct dpi_data *dpi)
-{
-       struct regulator *vdds_dsi;
-
-       /*
-        * The DPI uses the DSI VDDS on OMAP34xx, OMAP35xx, OMAP36xx, AM37xx and
-        * DM37xx only.
-        */
-       if (!soc_device_match(dpi_soc_devices))
-               return 0;
-
-       if (dpi->vdds_dsi_reg)
-               return 0;
-
-       vdds_dsi = devm_regulator_get(&dpi->pdev->dev, "vdds_dsi");
-       if (IS_ERR(vdds_dsi)) {
-               if (PTR_ERR(vdds_dsi) != -EPROBE_DEFER)
-                       DSSERR("can't get VDDS_DSI regulator\n");
-               return PTR_ERR(vdds_dsi);
-       }
-
-       dpi->vdds_dsi_reg = vdds_dsi;
-
-       return 0;
-}
-
 static void dpi_init_pll(struct dpi_data *dpi)
 {
        struct dss_pll *pll;
        struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);
        int r;
 
-       r = dpi_init_regulator(dpi);
-       if (r)
-               return r;
-
        dpi_init_pll(dpi);
 
        r = dss_mgr_connect(dssdev);
        omapdss_device_unregister(out);
 }
 
+static const struct soc_device_attribute dpi_soc_devices[] = {
+       { .machine = "OMAP3[456]*" },
+       { .machine = "[AD]M37*" },
+       { /* sentinel */ }
+};
+
+static int dpi_init_regulator(struct dpi_data *dpi)
+{
+       struct regulator *vdds_dsi;
+
+       /*
+        * The DPI uses the DSI VDDS on OMAP34xx, OMAP35xx, OMAP36xx, AM37xx and
+        * DM37xx only.
+        */
+       if (!soc_device_match(dpi_soc_devices))
+               return 0;
+
+       vdds_dsi = devm_regulator_get(&dpi->pdev->dev, "vdds_dsi");
+       if (IS_ERR(vdds_dsi)) {
+               if (PTR_ERR(vdds_dsi) != -EPROBE_DEFER)
+                       DSSERR("can't get VDDS_DSI regulator\n");
+               return PTR_ERR(vdds_dsi);
+       }
+
+       dpi->vdds_dsi_reg = vdds_dsi;
+
+       return 0;
+}
+
 int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
                  struct device_node *port, enum dss_model dss_model)
 {
 
        mutex_init(&dpi->lock);
 
+       r = dpi_init_regulator(dpi);
+       if (r)
+               return r;
+
        return dpi_init_output_port(dpi, port);
 }
 
 
        WARN_ON(r < 0 && r != -ENOSYS);
 }
 
-static int dsi_regulator_init(struct dsi_data *dsi)
-{
-       struct regulator *vdds_dsi;
-
-       if (dsi->vdds_dsi_reg != NULL)
-               return 0;
-
-       vdds_dsi = devm_regulator_get(dsi->dev, "vdd");
-
-       if (IS_ERR(vdds_dsi)) {
-               if (PTR_ERR(vdds_dsi) != -EPROBE_DEFER)
-                       DSSERR("can't get DSI VDD regulator\n");
-               return PTR_ERR(vdds_dsi);
-       }
-
-       dsi->vdds_dsi_reg = vdds_dsi;
-
-       return 0;
-}
-
 static void _dsi_print_reset_status(struct dsi_data *dsi)
 {
        u32 l;
 
        DSSDBG("PLL init\n");
 
-       r = dsi_regulator_init(dsi);
-       if (r)
-               return r;
-
        r = dsi_runtime_get(dsi);
        if (r)
                return r;
 static int dsi_connect(struct omap_dss_device *dssdev,
                struct omap_dss_device *dst)
 {
-       struct dsi_data *dsi = to_dsi_data(dssdev);
        int r;
 
-       r = dsi_regulator_init(dsi);
-       if (r)
-               return r;
-
        r = dss_mgr_connect(dssdev);
        if (r)
                return r;
                return r;
        }
 
+       dsi->vdds_dsi_reg = devm_regulator_get(dev, "vdd");
+       if (IS_ERR(dsi->vdds_dsi_reg)) {
+               if (PTR_ERR(dsi->vdds_dsi_reg) != -EPROBE_DEFER)
+                       DSSERR("can't get DSI VDD regulator\n");
+               return PTR_ERR(dsi->vdds_dsi_reg);
+       }
+
        soc = soc_device_match(dsi_soc_devices);
        if (soc)
                dsi->data = soc->data;
 
        return IRQ_HANDLED;
 }
 
-static int hdmi_init_regulator(struct omap_hdmi *hdmi)
-{
-       struct regulator *reg;
-
-       if (hdmi->vdda_reg != NULL)
-               return 0;
-
-       reg = devm_regulator_get(&hdmi->pdev->dev, "vdda");
-
-       if (IS_ERR(reg)) {
-               if (PTR_ERR(reg) != -EPROBE_DEFER)
-                       DSSERR("can't get VDDA regulator\n");
-               return PTR_ERR(reg);
-       }
-
-       hdmi->vdda_reg = reg;
-
-       return 0;
-}
-
 static int hdmi_power_on_core(struct omap_hdmi *hdmi)
 {
        int r;
 static int hdmi_connect(struct omap_dss_device *dssdev,
                struct omap_dss_device *dst)
 {
-       struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
        int r;
 
-       r = hdmi_init_regulator(hdmi);
-       if (r)
-               return r;
-
        r = dss_mgr_connect(dssdev);
        if (r)
                return r;
                goto err_free;
        }
 
+       hdmi->vdda_reg = devm_regulator_get(&pdev->dev, "vdda");
+       if (IS_ERR(hdmi->vdda_reg)) {
+               r = PTR_ERR(hdmi->vdda_reg);
+               if (r != -EPROBE_DEFER)
+                       DSSERR("can't get VDDA regulator\n");
+               goto err_free;
+       }
+
        pm_runtime_enable(&pdev->dev);
 
        r = hdmi4_init_output(hdmi);
 
        return IRQ_HANDLED;
 }
 
-static int hdmi_init_regulator(struct omap_hdmi *hdmi)
-{
-       struct regulator *reg;
-
-       if (hdmi->vdda_reg != NULL)
-               return 0;
-
-       reg = devm_regulator_get(&hdmi->pdev->dev, "vdda");
-       if (IS_ERR(reg)) {
-               DSSERR("can't get VDDA regulator\n");
-               return PTR_ERR(reg);
-       }
-
-       hdmi->vdda_reg = reg;
-
-       return 0;
-}
-
 static int hdmi_power_on_core(struct omap_hdmi *hdmi)
 {
        int r;
 static int hdmi_connect(struct omap_dss_device *dssdev,
                struct omap_dss_device *dst)
 {
-       struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
        int r;
 
-       r = hdmi_init_regulator(hdmi);
-       if (r)
-               return r;
-
        r = dss_mgr_connect(dssdev);
        if (r)
                return r;
                goto err_free;
        }
 
+       hdmi->vdda_reg = devm_regulator_get(&pdev->dev, "vdda");
+       if (IS_ERR(hdmi->vdda_reg)) {
+               r = PTR_ERR(hdmi->vdda_reg);
+               if (r != -EPROBE_DEFER)
+                       DSSERR("can't get VDDA regulator\n");
+               goto err_free;
+       }
+
        pm_runtime_enable(&pdev->dev);
 
        r = hdmi5_init_output(hdmi);
 
        return 0;
 }
 
-static int sdi_init_regulator(struct sdi_device *sdi)
-{
-       struct regulator *vdds_sdi;
-
-       if (sdi->vdds_sdi_reg)
-               return 0;
-
-       vdds_sdi = devm_regulator_get(&sdi->pdev->dev, "vdds_sdi");
-       if (IS_ERR(vdds_sdi)) {
-               if (PTR_ERR(vdds_sdi) != -EPROBE_DEFER)
-                       DSSERR("can't get VDDS_SDI regulator\n");
-               return PTR_ERR(vdds_sdi);
-       }
-
-       sdi->vdds_sdi_reg = vdds_sdi;
-
-       return 0;
-}
-
 static int sdi_connect(struct omap_dss_device *dssdev,
                struct omap_dss_device *dst)
 {
-       struct sdi_device *sdi = dssdev_to_sdi(dssdev);
        int r;
 
-       r = sdi_init_regulator(sdi);
-       if (r)
-               return r;
-
        r = dss_mgr_connect(dssdev);
        if (r)
                return r;
        sdi->pdev = pdev;
        port->data = sdi;
 
+       sdi->vdds_sdi_reg = devm_regulator_get(&pdev->dev, "vdds_sdi");
+       if (IS_ERR(sdi->vdds_sdi_reg)) {
+               r = PTR_ERR(sdi->vdds_sdi_reg);
+               if (r != -EPROBE_DEFER)
+                       DSSERR("can't get VDDS_SDI regulator\n");
+               goto err_free;
+       }
+
        r = sdi_init_output(sdi);
        if (r)
                goto err_free;
 
        }
 }
 
-static int venc_init_regulator(struct venc_device *venc)
-{
-       struct regulator *vdda_dac;
-
-       if (venc->vdda_dac_reg != NULL)
-               return 0;
-
-       vdda_dac = devm_regulator_get(&venc->pdev->dev, "vdda");
-       if (IS_ERR(vdda_dac)) {
-               if (PTR_ERR(vdda_dac) != -EPROBE_DEFER)
-                       DSSERR("can't get VDDA_DAC regulator\n");
-               return PTR_ERR(vdda_dac);
-       }
-
-       venc->vdda_dac_reg = vdda_dac;
-
-       return 0;
-}
-
 static int venc_dump_regs(struct seq_file *s, void *p)
 {
        struct venc_device *venc = s->private;
 static int venc_connect(struct omap_dss_device *dssdev,
                struct omap_dss_device *dst)
 {
-       struct venc_device *venc = dssdev_to_venc(dssdev);
        int r;
 
-       r = venc_init_regulator(venc);
-       if (r)
-               return r;
-
        r = dss_mgr_connect(dssdev);
        if (r)
                return r;
                goto err_free;
        }
 
+       venc->vdda_dac_reg = devm_regulator_get(&pdev->dev, "vdda");
+       if (IS_ERR(venc->vdda_dac_reg)) {
+               r = PTR_ERR(venc->vdda_dac_reg);
+               if (r != -EPROBE_DEFER)
+                       DSSERR("can't get VDDA_DAC regulator\n");
+               goto err_free;
+       }
+
        r = venc_get_clocks(venc);
        if (r)
                goto err_free;