drm/rockchip: add output_if check for display interfaces

Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Change-Id: I3dc3795ada17c3e1a3cd84b37b9e81923a1d7f1b
This commit is contained in:
Damon Ding
2023-04-23 17:40:09 +08:00
committed by Tao Huang
parent c3ee4f9954
commit 876039f6e7
5 changed files with 35 additions and 7 deletions

View File

@ -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;

View File

@ -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)

View File

@ -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;

View File

@ -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;

View File

@ -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;
}