aboutsummaryrefslogtreecommitdiff
path: root/drivers/video/omap2/dss/dsi.c
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2011-02-22 15:53:46 +0200
committerTomi Valkeinen <tomi.valkeinen@ti.com>2011-03-11 15:46:23 +0200
commit5f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4 (patch)
tree8ed7158d7e8b39cb184ade1bed6794963f44b9fc /drivers/video/omap2/dss/dsi.c
parentac425ed5fb0b6564d4eeee9fb13ef0c1f6da8e8f (diff)
OMAP: DSS2: Delay regulator_get() calls
DSS submodules DPI/SDI/DSI/VENC require a regulator to function. However, if the board doesn't use, say, SDI, the board shouldn't need to configure vdds_sdi regulator required by the SDI module. Currently the regulators are acquired when the DSS driver is loaded. This means that if the kernel is configured with SDI, vdds_sdi regulator is needed for all boards. This patch changes the DSS driver to acquire the regulators only when a display of particular type is initialized. For example, vdds_sdi is acquired when sdi_init_display() is called. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/video/omap2/dss/dsi.c')
-rw-r--r--drivers/video/omap2/dss/dsi.c36
1 files changed, 13 insertions, 23 deletions
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
index c7b5382e1a6b..2928cddeb3fc 100644
--- a/drivers/video/omap2/dss/dsi.c
+++ b/drivers/video/omap2/dss/dsi.c
@@ -291,20 +291,6 @@ static inline u32 dsi_read_reg(const struct dsi_reg idx)
return __raw_readl(dsi.base + idx.idx);
}
-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)
{
@@ -3236,6 +3222,19 @@ int dsi_init_display(struct omap_dss_device *dssdev)
dsi.vc[0].dssdev = dssdev;
dsi.vc[1].dssdev = dssdev;
+ if (dsi.vdds_dsi_reg == NULL) {
+ struct regulator *vdds_dsi;
+
+ vdds_dsi = regulator_get(&dsi.pdev->dev, "vdds_dsi");
+
+ if (IS_ERR(vdds_dsi)) {
+ DSSERR("can't get VDDS_DSI regulator\n");
+ return PTR_ERR(vdds_dsi);
+ }
+
+ dsi.vdds_dsi_reg = vdds_dsi;
+ }
+
return 0;
}
@@ -3295,13 +3294,6 @@ static int dsi_init(struct platform_device *pdev)
goto err1;
}
- dsi.vdds_dsi_reg = dsi_get_vdds_dsi();
- if (IS_ERR(dsi.vdds_dsi_reg)) {
- DSSERR("can't get VDDS_DSI regulator\n");
- r = PTR_ERR(dsi.vdds_dsi_reg);
- goto err2;
- }
-
enable_clocks(1);
rev = dsi_read_reg(DSI_REVISION);
@@ -3311,8 +3303,6 @@ static int dsi_init(struct platform_device *pdev)
enable_clocks(0);
return 0;
-err2:
- iounmap(dsi.base);
err1:
destroy_workqueue(dsi.workqueue);
return r;