@@ -528,6 +528,7 @@ static struct regulator_init_data sdp3430_vdac = {
/* VPLL2 for digital video outputs */
static struct regulator_consumer_supply sdp3430_vpll2_supplies[] = {
REGULATOR_SUPPLY("vdds_dsi", "omapdisplay"),
+ REGULATOR_SUPPLY("vdds_dsi", "dss_dsi1"),
};
static struct regulator_init_data sdp3430_vpll2 = {
@@ -191,11 +191,6 @@ static int omap_dss_probe(struct platform_device *pdev)
goto err_sdi;
}
- r = dsi_init(pdev);
- if (r) {
- DSSERR("Failed to initialize DSI\n");
- goto err_dsi;
- }
}
r = dss_initialize_debugfs();
@@ -228,9 +223,6 @@ err_register:
dss_uninitialize_debugfs();
err_debugfs:
if (cpu_is_omap34xx())
- dsi_exit();
-err_dsi:
- if (cpu_is_omap34xx())
sdi_exit();
err_sdi:
dpi_exit();
@@ -222,6 +222,7 @@ struct dsi_irq_stats {
static struct
{
+ struct platform_device *pdev;
void __iomem *base;
struct dsi_clock_info current_cinfo;
@@ -295,11 +296,20 @@ static inline u32 dsi_read_reg(const struct dsi_reg idx)
/* DSI1 HW IP initialisation */
static int omap_dsi1hw_probe(struct platform_device *pdev)
{
- return 0;
+ int r;
+ dsi.pdev = pdev;
+ r = dsi_init(pdev);
+ if (r) {
+ DSSERR("Failed to initialize DSI\n");
+ goto err_dsi;
+ }
+err_dsi:
+ return r;
}
static int omap_dsi1hw_remove(struct platform_device *pdev)
{
+ dsi_exit();
return 0;
}
@@ -312,6 +322,20 @@ static struct platform_driver omap_dsi1hw_driver = {
},
};
+static struct regulator *dsi_get_vdds_dsi(void)
+{
+ struct regulator *reg;
+
+ if (dsi.vdds_dsi_reg != NULL)
+ return dsi.vdds_dsi_reg;
+
+ reg = regulator_get(&dsi.pdev->dev, "vdds_dsi");
+ if (!IS_ERR(reg))
+ dsi.vdds_dsi_reg = reg;
+
+ return reg;
+}
+
void dsi_save_context(void)
{
@@ -3292,7 +3316,7 @@ int dsi_init(struct platform_device *pdev)
goto err1;
}
- dsi.vdds_dsi_reg = dss_get_vdds_dsi();
+ dsi.vdds_dsi_reg = dsi_get_vdds_dsi();
if (IS_ERR(dsi.vdds_dsi_reg)) {
iounmap(dsi.base);
DSSERR("can't get VDDS_DSI regulator\n");