|
@@ -818,38 +818,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)
|
|
static int vop_crtc_enable_vblank(struct drm_crtc *crtc)
|
|
{
|
|
{
|
|
struct vop *vop = to_vop(crtc);
|
|
struct vop *vop = to_vop(crtc);
|
|
@@ -931,6 +899,7 @@ static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
|
|
static void vop_crtc_enable(struct drm_crtc *crtc)
|
|
static void vop_crtc_enable(struct drm_crtc *crtc)
|
|
{
|
|
{
|
|
struct vop *vop = to_vop(crtc);
|
|
struct vop *vop = to_vop(crtc);
|
|
|
|
+ struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state);
|
|
struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode;
|
|
struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode;
|
|
u16 hsync_len = adjusted_mode->hsync_end - adjusted_mode->hsync_start;
|
|
u16 hsync_len = adjusted_mode->hsync_end - adjusted_mode->hsync_start;
|
|
u16 hdisplay = adjusted_mode->hdisplay;
|
|
u16 hdisplay = adjusted_mode->hdisplay;
|
|
@@ -985,6 +954,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_NHSYNC) ? 0 : 1;
|
|
val |= (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : (1 << 1);
|
|
val |= (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : (1 << 1);
|
|
VOP_CTRL_SET(vop, pin_pol, val);
|
|
VOP_CTRL_SET(vop, pin_pol, val);
|
|
|
|
+ switch (s->output_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", s->output_type);
|
|
|
|
+ }
|
|
|
|
+ VOP_CTRL_SET(vop, out_mode, s->output_mode);
|
|
|
|
|
|
VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len);
|
|
VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len);
|
|
val = hact_st << 16;
|
|
val = hact_st << 16;
|
|
@@ -1044,13 +1030,34 @@ static void vop_crtc_destroy(struct drm_crtc *crtc)
|
|
drm_crtc_cleanup(crtc);
|
|
drm_crtc_cleanup(crtc);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static struct drm_crtc_state *vop_crtc_duplicate_state(struct drm_crtc *crtc)
|
|
|
|
+{
|
|
|
|
+ struct rockchip_crtc_state *rockchip_state;
|
|
|
|
+
|
|
|
|
+ rockchip_state = kzalloc(sizeof(*rockchip_state), GFP_KERNEL);
|
|
|
|
+ if (!rockchip_state)
|
|
|
|
+ return NULL;
|
|
|
|
+
|
|
|
|
+ __drm_atomic_helper_crtc_duplicate_state(crtc, &rockchip_state->base);
|
|
|
|
+ return &rockchip_state->base;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void vop_crtc_destroy_state(struct drm_crtc *crtc,
|
|
|
|
+ struct drm_crtc_state *state)
|
|
|
|
+{
|
|
|
|
+ struct rockchip_crtc_state *s = to_rockchip_crtc_state(state);
|
|
|
|
+
|
|
|
|
+ __drm_atomic_helper_crtc_destroy_state(crtc, &s->base);
|
|
|
|
+ kfree(s);
|
|
|
|
+}
|
|
|
|
+
|
|
static const struct drm_crtc_funcs vop_crtc_funcs = {
|
|
static const struct drm_crtc_funcs vop_crtc_funcs = {
|
|
.set_config = drm_atomic_helper_set_config,
|
|
.set_config = drm_atomic_helper_set_config,
|
|
.page_flip = drm_atomic_helper_page_flip,
|
|
.page_flip = drm_atomic_helper_page_flip,
|
|
.destroy = vop_crtc_destroy,
|
|
.destroy = vop_crtc_destroy,
|
|
.reset = drm_atomic_helper_crtc_reset,
|
|
.reset = drm_atomic_helper_crtc_reset,
|
|
- .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
|
|
|
|
- .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
|
|
|
|
|
|
+ .atomic_duplicate_state = vop_crtc_duplicate_state,
|
|
|
|
+ .atomic_destroy_state = vop_crtc_destroy_state,
|
|
};
|
|
};
|
|
|
|
|
|
static bool vop_win_pending_is_complete(struct vop_win *vop_win)
|
|
static bool vop_win_pending_is_complete(struct vop_win *vop_win)
|