drm/rockchip: get rid of rockchip_drm_crtc_mode_config
authorMark Yao <mark.yao@rock-chips.com>
Mon, 21 Mar 2016 13:14:32 +0000 (21:14 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 30 Mar 2016 07:24:12 +0000 (15:24 +0800)
We need to take care of the vop status when use rockchip_drm_crtc_mode_config,
if vop is disabled, the function would failed, that is terrible.

Save connector type and output mode on drm_display_mode->private_flags on
connector mode_fixup, then we can configure the type and mode safely
on crtc mode_set.

Change-Id: I129cf8a2f100fc19fe96f1d8985e905bea477e28
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
drivers/gpu/drm/rockchip/dw-mipi-dsi.c
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
drivers/gpu/drm/rockchip/rockchip_drm_drv.h
drivers/gpu/drm/rockchip/rockchip_drm_vop.c
drivers/gpu/drm/rockchip/rockchip_drm_vop.h

index 2b44a1feec170ebf3abfaea6c359eab430cd9eb3..6f895db4075ec9d996e227efed591182722f8b72 100644 (file)
@@ -97,6 +97,21 @@ rockchip_dp_drm_encoder_mode_fixup(struct drm_encoder *encoder,
                                   const struct drm_display_mode *mode,
                                   struct drm_display_mode *adjusted_mode)
 {
                                   const struct drm_display_mode *mode,
                                   struct drm_display_mode *adjusted_mode)
 {
+       /*
+        * FIXME(Yakir): driver should configure the CRTC output video
+        * mode with the display information which indicated the monitor
+        * support colorimetry.
+        *
+        * But don't know why the CRTC driver seems could only output the
+        * RGBaaa rightly. For example, if connect the "innolux,n116bge"
+        * eDP screen, EDID would indicated that screen only accepted the
+        * 6bpc mode. But if I configure CRTC to RGB666 output, then eDP
+        * screen would show a blue picture (RGB888 show a green picture).
+        * But if I configure CTRC to RGBaaa, and eDP driver still keep
+        * RGB666 input video mode, then screen would works prefect.
+        */
+       adjusted_mode->private_flags = ROCKCHIP_DSP_MODE(eDP, AAAA);
+
        /* do nothing */
        return true;
 }
        /* do nothing */
        return true;
 }
@@ -114,27 +129,6 @@ static void rockchip_dp_drm_encoder_enable(struct drm_encoder *encoder)
        int ret;
        u32 val;
 
        int ret;
        u32 val;
 
-       /*
-        * FIXME(Yakir): driver should configure the CRTC output video
-        * mode with the display information which indicated the monitor
-        * support colorimetry.
-        *
-        * But don't know why the CRTC driver seems could only output the
-        * RGBaaa rightly. For example, if connect the "innolux,n116bge"
-        * eDP screen, EDID would indicated that screen only accepted the
-        * 6bpc mode. But if I configure CRTC to RGB666 output, then eDP
-        * screen would show a blue picture (RGB888 show a green picture).
-        * But if I configure CTRC to RGBaaa, and eDP driver still keep
-        * RGB666 input video mode, then screen would works prefect.
-        */
-       ret = rockchip_drm_crtc_mode_config(encoder->crtc,
-                                           DRM_MODE_CONNECTOR_eDP,
-                                           ROCKCHIP_OUT_MODE_AAAA);
-       if (ret < 0) {
-               dev_err(dp->dev, "Could not set crtc mode config (%d)\n", ret);
-               return;
-       }
-
        ret = rockchip_drm_encoder_get_mux_id(dp->dev->of_node, encoder);
        if (ret < 0)
                return;
        ret = rockchip_drm_encoder_get_mux_id(dp->dev->of_node, encoder);
        if (ret < 0)
                return;
index f8f8f29fb7c336d8fffe1a74bddbad66e01854f6..27cf4065bd4a4c8e18d53508da0565011ac3a334 100644 (file)
@@ -879,6 +879,23 @@ static bool dw_mipi_dsi_encoder_mode_fixup(struct drm_encoder *encoder,
                                        const struct drm_display_mode *mode,
                                        struct drm_display_mode *adjusted_mode)
 {
                                        const struct drm_display_mode *mode,
                                        struct drm_display_mode *adjusted_mode)
 {
+       struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder);
+
+       switch (dsi->format) {
+       case MIPI_DSI_FMT_RGB888:
+               adjusted_mode->private_flags = ROCKCHIP_DSP_MODE(DSI, P888);
+               break;
+       case MIPI_DSI_FMT_RGB666:
+               adjusted_mode->private_flags = ROCKCHIP_DSP_MODE(DSI, P666);
+               break;
+       case MIPI_DSI_FMT_RGB565:
+               adjusted_mode->private_flags = ROCKCHIP_DSP_MODE(DSI, P565);
+               break;
+       default:
+               WARN_ON(1);
+               return false;
+       }
+
        return true;
 }
 
        return true;
 }
 
@@ -886,7 +903,6 @@ static void dw_mipi_dsi_encoder_commit(struct drm_encoder *encoder)
 {
        struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder);
        int mux  = rockchip_drm_encoder_get_mux_id(dsi->dev->of_node, encoder);
 {
        struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder);
        int mux  = rockchip_drm_encoder_get_mux_id(dsi->dev->of_node, encoder);
-       u32 interface_pix_fmt;
        u32 val;
 
        if (clk_prepare_enable(dsi->pclk)) {
        u32 val;
 
        if (clk_prepare_enable(dsi->pclk)) {
@@ -902,24 +918,6 @@ static void dw_mipi_dsi_encoder_commit(struct drm_encoder *encoder)
 
        clk_disable_unprepare(dsi->pclk);
 
 
        clk_disable_unprepare(dsi->pclk);
 
-       switch (dsi->format) {
-       case MIPI_DSI_FMT_RGB888:
-               interface_pix_fmt = ROCKCHIP_OUT_MODE_P888;
-               break;
-       case MIPI_DSI_FMT_RGB666:
-               interface_pix_fmt = ROCKCHIP_OUT_MODE_P666;
-               break;
-       case MIPI_DSI_FMT_RGB565:
-               interface_pix_fmt = ROCKCHIP_OUT_MODE_P565;
-               break;
-       default:
-               WARN_ON(1);
-               return;
-       }
-
-       rockchip_drm_crtc_mode_config(encoder->crtc, DRM_MODE_CONNECTOR_DSI,
-                                     interface_pix_fmt);
-
        if (mux)
                val = DSI0_SEL_VOP_LIT | (DSI0_SEL_VOP_LIT << 16);
        else
        if (mux)
                val = DSI0_SEL_VOP_LIT | (DSI0_SEL_VOP_LIT << 16);
        else
index 3ac8c4ee19d9072bea130d6deeb5fd4026d7e861..5e80d1eaf64c96486da27c1f089cb83c8cfcf1c7 100644 (file)
@@ -186,6 +186,8 @@ dw_hdmi_rockchip_encoder_mode_fixup(struct drm_encoder *encoder,
                                    const struct drm_display_mode *mode,
                                    struct drm_display_mode *adj_mode)
 {
                                    const struct drm_display_mode *mode,
                                    struct drm_display_mode *adj_mode)
 {
+       adj_mode->private_flags = ROCKCHIP_DSP_MODE(HDMIA, AAAA);
+
        return true;
 }
 
        return true;
 }
 
@@ -201,9 +203,6 @@ static void dw_hdmi_rockchip_encoder_enable(struct drm_encoder *encoder)
        u32 val;
        int mux;
 
        u32 val;
        int mux;
 
-       rockchip_drm_crtc_mode_config(encoder->crtc, DRM_MODE_CONNECTOR_HDMIA,
-                                     ROCKCHIP_OUT_MODE_AAAA);
-
        mux = rockchip_drm_encoder_get_mux_id(hdmi->dev->of_node, encoder);
        if (mux)
                val = HDMI_SEL_VOP_LIT | (HDMI_SEL_VOP_LIT << 16);
        mux = rockchip_drm_encoder_get_mux_id(hdmi->dev->of_node, encoder);
        if (mux)
                val = HDMI_SEL_VOP_LIT | (HDMI_SEL_VOP_LIT << 16);
index 2b41dd4f950fa72fa22a805a8a6962711f5985d5..234cec2eae0efa2f9a3a68a06aec2f84c9f38b3e 100644 (file)
@@ -70,8 +70,6 @@ int rockchip_register_crtc_funcs(struct drm_crtc *crtc,
 void rockchip_unregister_crtc_funcs(struct drm_crtc *crtc);
 int rockchip_drm_encoder_get_mux_id(struct device_node *node,
                                    struct drm_encoder *encoder);
 void rockchip_unregister_crtc_funcs(struct drm_crtc *crtc);
 int rockchip_drm_encoder_get_mux_id(struct device_node *node,
                                    struct drm_encoder *encoder);
-int rockchip_drm_crtc_mode_config(struct drm_crtc *crtc, int connector_type,
-                                 int out_mode);
 int rockchip_drm_dma_attach_device(struct drm_device *drm_dev,
                                   struct device *dev);
 void rockchip_drm_dma_detach_device(struct drm_device *drm_dev,
 int rockchip_drm_dma_attach_device(struct drm_device *drm_dev,
                                   struct device *dev);
 void rockchip_drm_dma_detach_device(struct drm_device *drm_dev,
index 64e1b5a8920d421c891257df4e66014f3ef3e22a..2654e5f0a74a9aea16c8fa84dd0e9d915d2a4003 100644 (file)
@@ -816,38 +816,6 @@ static const struct drm_plane_funcs vop_plane_funcs = {
        .atomic_destroy_state = vop_atomic_plane_destroy_state,
 };
 
        .atomic_destroy_state = vop_atomic_plane_destroy_state,
 };
 
-int rockchip_drm_crtc_mode_config(struct drm_crtc *crtc,
-                                 int connector_type,
-                                 int out_mode)
-{
-       struct vop *vop = to_vop(crtc);
-
-       if (WARN_ON(!vop->is_enabled))
-               return -EINVAL;
-
-       switch (connector_type) {
-       case DRM_MODE_CONNECTOR_LVDS:
-               VOP_CTRL_SET(vop, rgb_en, 1);
-               break;
-       case DRM_MODE_CONNECTOR_eDP:
-               VOP_CTRL_SET(vop, edp_en, 1);
-               break;
-       case DRM_MODE_CONNECTOR_HDMIA:
-               VOP_CTRL_SET(vop, hdmi_en, 1);
-               break;
-       case DRM_MODE_CONNECTOR_DSI:
-               VOP_CTRL_SET(vop, mipi_en, 1);
-               break;
-       default:
-               DRM_ERROR("unsupport connector_type[%d]\n", connector_type);
-               return -EINVAL;
-       };
-       VOP_CTRL_SET(vop, out_mode, out_mode);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(rockchip_drm_crtc_mode_config);
-
 static int vop_crtc_enable_vblank(struct drm_crtc *crtc)
 {
        struct vop *vop = to_vop(crtc);
 static int vop_crtc_enable_vblank(struct drm_crtc *crtc)
 {
        struct vop *vop = to_vop(crtc);
@@ -941,6 +909,8 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
        u16 vact_st = adjusted_mode->vtotal - adjusted_mode->vsync_start;
        u16 vact_end = vact_st + vdisplay;
        uint32_t val;
        u16 vact_st = adjusted_mode->vtotal - adjusted_mode->vsync_start;
        u16 vact_end = vact_st + vdisplay;
        uint32_t val;
+       int type = ROCKCHIP_OUT_MODE_TYPE(adjusted_mode->private_flags);
+       int out_mode = ROCKCHIP_OUT_MODE(adjusted_mode->private_flags);
 
        vop_enable(crtc);
        /*
 
        vop_enable(crtc);
        /*
@@ -983,6 +953,23 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
        val |= (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC) ? 0 : 1;
        val |= (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : (1 << 1);
        VOP_CTRL_SET(vop, pin_pol, val);
        val |= (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC) ? 0 : 1;
        val |= (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : (1 << 1);
        VOP_CTRL_SET(vop, pin_pol, val);
+       switch(type) {
+       case DRM_MODE_CONNECTOR_LVDS:
+               VOP_CTRL_SET(vop, rgb_en, 1);
+               break;
+       case DRM_MODE_CONNECTOR_eDP:
+               VOP_CTRL_SET(vop, edp_en, 1);
+               break;
+       case DRM_MODE_CONNECTOR_HDMIA:
+               VOP_CTRL_SET(vop, hdmi_en, 1);
+               break;
+       case DRM_MODE_CONNECTOR_DSI:
+               VOP_CTRL_SET(vop, mipi_en, 1);
+               break;
+       default:
+               DRM_ERROR("unsupport connector_type[%d]\n", type);
+       }
+       VOP_CTRL_SET(vop, out_mode, out_mode);
 
        VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len);
        val = hact_st << 16;
 
        VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len);
        val = hact_st << 16;
index 071ff0be7a958d6cf9a16e65004737913fa87646..6a4fc2b411345eea677b28efe6d8e1a690eed713 100644 (file)
@@ -183,6 +183,12 @@ struct vop_data {
 /* for use special outface */
 #define ROCKCHIP_OUT_MODE_AAAA 15
 
 /* for use special outface */
 #define ROCKCHIP_OUT_MODE_AAAA 15
 
+#define ROCKCHIP_OUT_MODE_TYPE(x)      ((x) >> 16)
+#define ROCKCHIP_OUT_MODE(x)           ((x) & 0xffff)
+#define ROCKCHIP_DSP_MODE(type, mode) \
+               (DRM_MODE_CONNECTOR_##type << 16) | \
+               (ROCKCHIP_OUT_MODE_##mode & 0xffff)
+
 enum alpha_mode {
        ALPHA_STRAIGHT,
        ALPHA_INVERSE,
 enum alpha_mode {
        ALPHA_STRAIGHT,
        ALPHA_INVERSE,