From 781a1bf608983f840e987e351b894371e59ead0a Mon Sep 17 00:00:00 2001 From: Guochun Huang Date: Tue, 8 Aug 2023 02:40:06 +0000 Subject: [PATCH] drm/rockchip: dsi: set vop2 standby before command mode in rk3566/rk3568 Change-Id: I49bd967dfb6c561a7c187cb075ff0192f6caf69a Signed-off-by: Guochun Huang --- drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c | 16 ++++++++++++++++ drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c | 13 +++++++++++++ include/drm/bridge/dw_mipi_dsi.h | 1 + 3 files changed, 30 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c index cf0605f753bb..f45ffe530583 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c @@ -877,21 +877,29 @@ static void dw_mipi_dsi_bridge_post_atomic_disable(struct drm_bridge *bridge, struct drm_bridge_state *old_bridge_state) { struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); + const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data; if (dsi->panel) drm_panel_unprepare(dsi->panel); dw_mipi_dsi_post_disable(dsi); + + if (pdata->stream_standby) + pdata->stream_standby(pdata->priv_data, 0); } static void dw_mipi_dsi_bridge_atomic_disable(struct drm_bridge *bridge, struct drm_bridge_state *old_bridge_state) { struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); + const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data; if (dsi->panel) drm_panel_disable(dsi->panel); + if (pdata->stream_standby) + pdata->stream_standby(pdata->priv_data, 1); + dw_mipi_dsi_disable(dsi); } @@ -978,6 +986,10 @@ static void dw_mipi_dsi_bridge_atomic_pre_enable(struct drm_bridge *bridge, struct drm_bridge_state *old_bridge_state) { struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); + const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data; + + if (pdata->stream_standby) + pdata->stream_standby(pdata->priv_data, 1); dw_mipi_dsi_pre_enable(dsi); @@ -1010,9 +1022,13 @@ static void dw_mipi_dsi_bridge_atomic_enable(struct drm_bridge *bridge, struct drm_bridge_state *old_bridge_state) { struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); + const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data; dw_mipi_dsi_enable(dsi); + if (pdata->stream_standby) + pdata->stream_standby(pdata->priv_data, 0); + if (dsi->panel) drm_panel_enable(dsi->panel); diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c index 90501241e699..c6bb6db85c4d 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c @@ -1424,6 +1424,15 @@ static const struct phy_ops dw_mipi_dsi_dphy_ops = { .exit = dw_mipi_dsi_dphy_exit, }; +static void +dw_mipi_dsi_rockchip_stream_standby(void *priv_data, bool standby) +{ + struct dw_mipi_dsi_rockchip *dsi = priv_data; + struct drm_encoder *encoder = &dsi->encoder; + + rockchip_drm_crtc_standby(encoder->crtc, standby); +} + static int dw_mipi_dsi_rockchip_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -1533,6 +1542,10 @@ static int dw_mipi_dsi_rockchip_probe(struct platform_device *pdev) dsi->pdata.max_data_lanes = dsi->cdata->max_data_lanes; dsi->pdata.phy_ops = &dw_mipi_dsi_rockchip_phy_ops; dsi->pdata.priv_data = dsi; + + if (dsi->cdata->soc_type == RK3568) + dsi->pdata.stream_standby = dw_mipi_dsi_rockchip_stream_standby; + platform_set_drvdata(pdev, dsi); mutex_init(&dsi->usage_mutex); diff --git a/include/drm/bridge/dw_mipi_dsi.h b/include/drm/bridge/dw_mipi_dsi.h index 8dc4ab1474d9..4844b7d01177 100644 --- a/include/drm/bridge/dw_mipi_dsi.h +++ b/include/drm/bridge/dw_mipi_dsi.h @@ -57,6 +57,7 @@ struct dw_mipi_dsi_plat_data { const struct dw_mipi_dsi_phy_ops *phy_ops; const struct dw_mipi_dsi_host_ops *host_ops; + void (*stream_standby)(void *priv_data, bool standby); void *priv_data; };