|
@@ -310,7 +310,7 @@ static void scl_vop_cal_scl_fac(struct vop *vop, const struct vop_win_data *win,
|
|
|
uint16_t vsu_mode;
|
|
|
uint16_t lb_mode;
|
|
|
uint32_t val;
|
|
|
- int vskiplines;
|
|
|
+ int vskiplines = 0;
|
|
|
|
|
|
if (dst_w > 3840) {
|
|
|
DRM_ERROR("Maximum destination width (3840) exceeded\n");
|
|
@@ -560,6 +560,22 @@ static void vop_plane_destroy(struct drm_plane *plane)
|
|
|
drm_plane_cleanup(plane);
|
|
|
}
|
|
|
|
|
|
+static int vop_plane_prepare_fb(struct drm_plane *plane,
|
|
|
+ const struct drm_plane_state *new_state)
|
|
|
+{
|
|
|
+ if (plane->state->fb)
|
|
|
+ drm_framebuffer_reference(plane->state->fb);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void vop_plane_cleanup_fb(struct drm_plane *plane,
|
|
|
+ const struct drm_plane_state *old_state)
|
|
|
+{
|
|
|
+ if (old_state->fb)
|
|
|
+ drm_framebuffer_unreference(old_state->fb);
|
|
|
+}
|
|
|
+
|
|
|
static int vop_plane_atomic_check(struct drm_plane *plane,
|
|
|
struct drm_plane_state *state)
|
|
|
{
|
|
@@ -756,6 +772,8 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
|
|
|
}
|
|
|
|
|
|
static const struct drm_plane_helper_funcs plane_helper_funcs = {
|
|
|
+ .prepare_fb = vop_plane_prepare_fb,
|
|
|
+ .cleanup_fb = vop_plane_cleanup_fb,
|
|
|
.atomic_check = vop_plane_atomic_check,
|
|
|
.atomic_update = vop_plane_atomic_update,
|
|
|
.atomic_disable = vop_plane_atomic_disable,
|
|
@@ -818,38 +836,6 @@ static const struct drm_plane_funcs vop_plane_funcs = {
|
|
|
.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);
|
|
@@ -931,6 +917,7 @@ static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
|
|
|
static void vop_crtc_enable(struct drm_crtc *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;
|
|
|
u16 hsync_len = adjusted_mode->hsync_end - adjusted_mode->hsync_start;
|
|
|
u16 hdisplay = adjusted_mode->hdisplay;
|
|
@@ -985,6 +972,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);
|
|
|
+ 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);
|
|
|
val = hact_st << 16;
|
|
@@ -1044,13 +1048,34 @@ static void vop_crtc_destroy(struct drm_crtc *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 = {
|
|
|
.set_config = drm_atomic_helper_set_config,
|
|
|
.page_flip = drm_atomic_helper_page_flip,
|
|
|
.destroy = vop_crtc_destroy,
|
|
|
.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)
|