[PATCH] drm/omap: dsi: Fix PM for display blank with paired dss_pll calls
Tony Lindgren
tony at atomide.com
Thu Jan 31 03:32:10 UTC 2019
Currently dsi_display_init_dsi() calls dss_pll_enable() but it is not
paired with dss_pll_disable() in dsi_display_uninit_dsi(). This leaves
the DSS clocks enabled when the display is blanked wasting about extra
5mW of power while idle.
Let's fix this by setting a dsi->disconnect_lanes flag and making
the current dsi_pll_uninit() into dsi_pll_disable(). This way we can
just call dss_pll_disable() from dsi_display_uninit_dsi() and the
code becomes a bit easier to follow.
Signed-off-by: Tony Lindgren <tony at atomide.com>
---
drivers/gpu/drm/omapdrm/dss/dsi.c | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -339,6 +339,7 @@ struct dsi_data {
int irq;
bool is_enabled;
+ unsigned int disconnect_lanes:1;
struct clk *dss_clk;
struct regmap *syscon;
@@ -1382,10 +1383,12 @@ static int dsi_pll_enable(struct dss_pll *pll)
return r;
}
-static void dsi_pll_uninit(struct dsi_data *dsi, bool disconnect_lanes)
+static void dsi_pll_disable(struct dss_pll *pll)
{
+ struct dsi_data *dsi = container_of(pll, struct dsi_data, pll);
+
dsi_pll_power(dsi, DSI_PLL_POWER_OFF);
- if (disconnect_lanes) {
+ if (dsi->disconnect_lanes) {
WARN_ON(!dsi->vdds_dsi_enabled);
regulator_disable(dsi->vdds_dsi_reg);
dsi->vdds_dsi_enabled = false;
@@ -1397,13 +1400,6 @@ static void dsi_pll_uninit(struct dsi_data *dsi, bool disconnect_lanes)
DSSDBG("PLL uninit done\n");
}
-static void dsi_pll_disable(struct dss_pll *pll)
-{
- struct dsi_data *dsi = container_of(pll, struct dsi_data, pll);
-
- dsi_pll_uninit(dsi, true);
-}
-
static int dsi_dump_dsi_clocks(struct seq_file *s, void *p)
{
struct dsi_data *dsi = p;
@@ -4158,7 +4154,9 @@ static void dsi_display_uninit_dsi(struct dsi_data *dsi, bool disconnect_lanes,
dss_select_dsi_clk_source(dsi->dss, dsi->module_id, DSS_CLK_SRC_FCK);
dsi_cio_uninit(dsi);
- dsi_pll_uninit(dsi, disconnect_lanes);
+
+ dsi->disconnect_lanes = disconnect_lanes;
+ dss_pll_disable(&dsi->pll);
}
static int dsi_display_enable(struct omap_dss_device *dssdev)
--
2.20.1
More information about the dri-devel
mailing list