From 9dd3db9ef9ba1142fc5bd6a2be5bbe1517719209 Mon Sep 17 00:00:00 2001 From: Guochun Huang Date: Tue, 7 Dec 2021 11:27:51 +0800 Subject: [PATCH] drm/rockchip: dsi2: add loader protect helper for kernel logo Signed-off-by: Guochun Huang Change-Id: I8132c8c6146e110a1ec0f559ce9ee426a85dd7e2 --- .../gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c index ea1b641ff4f7..d6bbe886ef78 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c @@ -431,9 +431,7 @@ static void dw_mipi_dsi2_set_cmd_mode(struct dw_mipi_dsi2 *dsi2) static void dw_mipi_dsi2_disable(struct dw_mipi_dsi2 *dsi2) { - regmap_write(dsi2->regmap, DSI2_PWR_UP, RESET); regmap_write(dsi2->regmap, DSI2_IPI_PIX_PKT_CFG, 0); - regmap_write(dsi2->regmap, DSI2_PWR_UP, POWER_UP); dw_mipi_dsi2_set_cmd_mode(dsi2); if (dsi2->slave) @@ -903,6 +901,37 @@ dw_mipi_dsi2_encoder_atomic_mode_set(struct drm_encoder *encoder, drm_mode_copy(&dsi2->slave->mode, &crtc_state->adjusted_mode); } +static void dw_mipi_dsi2_loader_protect(struct dw_mipi_dsi2 *dsi2, bool on) +{ + if (on) { + pm_runtime_get_sync(dsi2->dev); + phy_init(dsi2->dcphy); + dsi2->phy_enabled = true; + if (dsi2->dcphy) + dsi2->dcphy->power_count++; + } else { + pm_runtime_put(dsi2->dev); + phy_exit(dsi2->dcphy); + dsi2->phy_enabled = false; + if (dsi2->dcphy) + dsi2->dcphy->power_count--; + } + + if (dsi2->slave) + dw_mipi_dsi2_loader_protect(dsi2->slave, on); +} + +static void dw_mipi_dsi2_encoder_loader_protect(struct drm_encoder *encoder, + bool on) +{ + struct dw_mipi_dsi2 *dsi2 = encoder_to_dsi2(encoder); + + if (dsi2->panel) + panel_simple_loader_protect(dsi2->panel); + + dw_mipi_dsi2_loader_protect(dsi2, on); +} + static const struct drm_encoder_helper_funcs dw_mipi_dsi2_encoder_helper_funcs = { .enable = dw_mipi_dsi2_encoder_enable, @@ -1132,6 +1161,7 @@ static int dw_mipi_dsi2_bind(struct device *dev, struct device *master, dsi2->sub_dev.connector = &dsi2->connector; dsi2->sub_dev.of_node = dev->of_node; + dsi2->sub_dev.loader_protect = dw_mipi_dsi2_encoder_loader_protect; rockchip_drm_register_sub_dev(&dsi2->sub_dev); } else { dsi2->bridge->driver_private = &dsi2->host;