From 876039f6e70463878e7af94c031a724b5c86535f Mon Sep 17 00:00:00 2001 From: Damon Ding Date: Sun, 23 Apr 2023 17:40:09 +0800 Subject: [PATCH] drm/rockchip: add output_if check for display interfaces Signed-off-by: Damon Ding Change-Id: I3dc3795ada17c3e1a3cd84b37b9e81923a1d7f1b --- drivers/gpu/drm/rockchip/cdn-dp-core.c | 5 +++++ drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 7 +++++++ drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 1 + drivers/gpu/drm/rockchip/rockchip_drm_tve.c | 6 ++++++ drivers/gpu/drm/rockchip/rockchip_rgb.c | 23 ++++++++++++++------- 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c index bf67c88c94bd..913615bda680 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c @@ -729,6 +729,8 @@ out: static void cdn_dp_encoder_disable(struct drm_encoder *encoder) { struct cdn_dp_device *dp = encoder_to_dp(encoder); + struct drm_crtc *crtc = encoder->crtc; + struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); int ret; mutex_lock(&dp->lock); @@ -752,6 +754,8 @@ static void cdn_dp_encoder_disable(struct drm_encoder *encoder) */ if (!dp->connected && cdn_dp_connected_port(dp)) schedule_work(&dp->event_work); + + s->output_if &= ~VOP_OUTPUT_IF_DP0; } static int cdn_dp_encoder_atomic_check(struct drm_encoder *encoder, @@ -773,6 +777,7 @@ static int cdn_dp_encoder_atomic_check(struct drm_encoder *encoder, } s->output_mode = ROCKCHIP_OUT_MODE_AAAA; + s->output_if |= VOP_OUTPUT_IF_DP0; s->output_type = DRM_MODE_CONNECTOR_DisplayPort; s->tv_state = &conn_state->tv; s->eotf = TRADITIONAL_GAMMA_SDR; diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c index c2d7db8fda87..bd8e94470087 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c @@ -1091,6 +1091,8 @@ static void dw_mipi_dsi_post_disable(struct dw_mipi_dsi *dsi) static void dw_mipi_dsi_encoder_disable(struct drm_encoder *encoder) { struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder); + struct drm_crtc *crtc = encoder->crtc; + struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); if (dsi->panel) drm_panel_disable(dsi->panel); @@ -1105,6 +1107,11 @@ static void dw_mipi_dsi_encoder_disable(struct drm_encoder *encoder) if (IS_ENABLED(CONFIG_CPU_RK3568) && dsi->pdata->soc_type == RK3568) vop2_standby(encoder->crtc, 0); + + if (dsi->slave) + s->output_if &= ~(VOP_OUTPUT_IF_MIPI1 | VOP_OUTPUT_IF_MIPI0); + else + s->output_if &= ~(dsi->id ? VOP_OUTPUT_IF_MIPI1 : VOP_OUTPUT_IF_MIPI0); } static void dw_mipi_dsi_vop_routing(struct dw_mipi_dsi *dsi) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h index 2b26b32ffc07..cda2e5eb9f13 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h @@ -159,6 +159,7 @@ struct post_csc { #define VOP_OUTPUT_IF_DP1 BIT(10) #define VOP_OUTPUT_IF_HDMI0 BIT(11) #define VOP_OUTPUT_IF_HDMI1 BIT(12) +#define VOP_OUTPUT_IF_TV BIT(13) struct rockchip_crtc_state { struct drm_crtc_state base; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_tve.c b/drivers/gpu/drm/rockchip/rockchip_drm_tve.c index e0182b29488b..990b9cf9d4f6 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_tve.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_tve.c @@ -421,6 +421,8 @@ static void rockchip_tve_encoder_enable(struct drm_encoder *encoder) static void rockchip_tve_encoder_disable(struct drm_encoder *encoder) { struct rockchip_tve *tve = encoder_to_tve(encoder); + struct drm_crtc *crtc = encoder->crtc; + struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); mutex_lock(&tve->suspend_lock); @@ -428,6 +430,8 @@ static void rockchip_tve_encoder_disable(struct drm_encoder *encoder) cvbs_set_disable(tve); mutex_unlock(&tve->suspend_lock); + + s->output_if &= ~VOP_OUTPUT_IF_TV; } static void rockchip_tve_encoder_mode_set(struct drm_encoder *encoder, @@ -483,6 +487,8 @@ rockchip_tve_encoder_atomic_check(struct drm_encoder *encoder, */ if (tve->soc_type == SOC_RK3528) s->output_if |= VOP_OUTPUT_IF_BT656; + else + s->output_if |= VOP_OUTPUT_IF_TV; s->color_space = V4L2_COLORSPACE_SMPTE170M; s->tv_state = &conn_state->tv; diff --git a/drivers/gpu/drm/rockchip/rockchip_rgb.c b/drivers/gpu/drm/rockchip/rockchip_rgb.c index 9ff31861a5c6..9a7b1a78cb6f 100644 --- a/drivers/gpu/drm/rockchip/rockchip_rgb.c +++ b/drivers/gpu/drm/rockchip/rockchip_rgb.c @@ -173,6 +173,8 @@ static void rockchip_rgb_encoder_enable(struct drm_encoder *encoder) static void rockchip_rgb_encoder_disable(struct drm_encoder *encoder) { struct rockchip_rgb *rgb = encoder_to_rgb(encoder); + struct drm_crtc *crtc = encoder->crtc; + struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); if (rgb->panel) { drm_panel_disable(rgb->panel); @@ -186,6 +188,13 @@ static void rockchip_rgb_encoder_disable(struct drm_encoder *encoder) rgb->funcs->disable(rgb); pinctrl_pm_select_sleep_state(rgb->dev); + + if (s->output_if & VOP_OUTPUT_IF_RGB) + s->output_if &= ~VOP_OUTPUT_IF_RGB; + else if (s->output_if & VOP_OUTPUT_IF_BT656) + s->output_if &= ~VOP_OUTPUT_IF_BT656; + else if (s->output_if & VOP_OUTPUT_IF_BT1120) + s->output_if &= ~VOP_OUTPUT_IF_BT1120; } static int @@ -205,39 +214,39 @@ rockchip_rgb_encoder_atomic_check(struct drm_encoder *encoder, switch (s->bus_format) { case MEDIA_BUS_FMT_RGB666_1X18: s->output_mode = ROCKCHIP_OUT_MODE_P666; - s->output_if = VOP_OUTPUT_IF_RGB; + s->output_if |= VOP_OUTPUT_IF_RGB; break; case MEDIA_BUS_FMT_RGB565_1X16: s->output_mode = ROCKCHIP_OUT_MODE_P565; - s->output_if = VOP_OUTPUT_IF_RGB; + s->output_if |= VOP_OUTPUT_IF_RGB; break; case MEDIA_BUS_FMT_SRGB888_3X8: s->output_mode = ROCKCHIP_OUT_MODE_S888; - s->output_if = VOP_OUTPUT_IF_RGB; + s->output_if |= VOP_OUTPUT_IF_RGB; break; case MEDIA_BUS_FMT_SRGB888_DUMMY_4X8: s->output_mode = ROCKCHIP_OUT_MODE_S888_DUMMY; - s->output_if = VOP_OUTPUT_IF_RGB; + s->output_if |= VOP_OUTPUT_IF_RGB; break; case MEDIA_BUS_FMT_YUYV8_2X8: case MEDIA_BUS_FMT_YVYU8_2X8: case MEDIA_BUS_FMT_UYVY8_2X8: case MEDIA_BUS_FMT_VYUY8_2X8: s->output_mode = ROCKCHIP_OUT_MODE_BT656; - s->output_if = VOP_OUTPUT_IF_BT656; + s->output_if |= VOP_OUTPUT_IF_BT656; break; case MEDIA_BUS_FMT_YUYV8_1X16: case MEDIA_BUS_FMT_YVYU8_1X16: case MEDIA_BUS_FMT_UYVY8_1X16: case MEDIA_BUS_FMT_VYUY8_1X16: s->output_mode = ROCKCHIP_OUT_MODE_BT1120; - s->output_if = VOP_OUTPUT_IF_BT1120; + s->output_if |= VOP_OUTPUT_IF_BT1120; break; case MEDIA_BUS_FMT_RGB888_1X24: case MEDIA_BUS_FMT_RGB666_1X24_CPADHI: default: s->output_mode = ROCKCHIP_OUT_MODE_P888; - s->output_if = VOP_OUTPUT_IF_RGB; + s->output_if |= VOP_OUTPUT_IF_RGB; break; }