mode->hsync_start - 1);
rcar_du_crtc_write(rcrtc, HCR, mode->htotal - 1);
- rcar_du_crtc_write(rcrtc, VDSR, mode->vtotal - mode->vsync_end - 2);
- rcar_du_crtc_write(rcrtc, VDER, mode->vtotal - mode->vsync_end +
- mode->vdisplay - 2);
- rcar_du_crtc_write(rcrtc, VSPR, mode->vtotal - mode->vsync_end +
- mode->vsync_start - 1);
- rcar_du_crtc_write(rcrtc, VCR, mode->vtotal - 1);
+ if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
+ rcar_du_crtc_write(rcrtc, VDSR, (mode->vtotal / 2)
+ - (mode->vsync_end / 2) - 2);
+ rcar_du_crtc_write(rcrtc, VDER, (mode->vtotal / 2)
+ - (mode->vsync_end / 2)
+ + (mode->vdisplay / 2) - 2);
+ rcar_du_crtc_write(rcrtc, VSPR, (mode->vtotal / 2)
+ - (mode->vsync_end / 2)
+ + (mode->vsync_start / 2) - 1);
+ rcar_du_crtc_write(rcrtc, VCR, (mode->vtotal / 2) - 1);
+ } else {
+ rcar_du_crtc_write(rcrtc, VDSR, mode->vtotal
+ - mode->vsync_end - 2);
+ rcar_du_crtc_write(rcrtc, VDER, mode->vtotal - mode->vsync_end
+ + mode->vdisplay - 2);
+ rcar_du_crtc_write(rcrtc, VSPR, mode->vtotal - mode->vsync_end
+ + mode->vsync_start - 1);
+ rcar_du_crtc_write(rcrtc, VCR, mode->vtotal - 1);
+ }
rcar_du_crtc_write(rcrtc, DESR, mode->htotal - mode->hsync_start);
rcar_du_crtc_write(rcrtc, DEWR, mode->hdisplay);
if (plane->crtc != crtc || !plane->enabled)
continue;
+ if (rcrtc->crtc.mode.flags & DRM_MODE_FLAG_INTERLACE)
+ plane->interlace_flag = true;
+ else
+ plane->interlace_flag = false;
rcar_du_plane_setup(plane);
}
*/
rcar_du_crtc_clr_set(rcrtc, DSYSR, DSYSR_TVM_MASK, DSYSR_TVM_MASTER);
+ if (rcrtc->crtc.mode.flags & DRM_MODE_FLAG_INTERLACE) {
+ if (rcrtc->index == 1)
+ rcar_du_crtc_clr_set(rcrtc, DSYSR,
+ DSYSR_SCM_INT_VIDEO, DSYSR_SCM_INT_VIDEO);
+ else
+ rcrtc->group->interlace_grp = true;
+ } else {
+ if (rcrtc->index == 1)
+ rcar_du_crtc_clr_set(rcrtc, DSYSR,
+ DSYSR_SCM_INT_VIDEO, 0);
+ else
+ rcrtc->group->interlace_grp = false;
+ }
rcar_du_group_start_stop(rcrtc->group, true);
rcrtc->started = true;
*/
rcar_du_crtc_clr_set(rcrtc, DSYSR, DSYSR_TVM_MASK, DSYSR_TVM_SWITCH);
+ if (rcrtc->crtc.mode.flags & DRM_MODE_FLAG_INTERLACE) {
+ if (rcrtc->index == 1)
+ rcar_du_crtc_clr_set(rcrtc,
+ DSYSR, DSYSR_SCM_INT_VIDEO, 0);
+ else
+ rcrtc->group->interlace_grp = false;
+ }
+
rcar_du_group_start_stop(rcrtc->group, false);
rcrtc->started = false;
status = rcar_du_crtc_read(rcrtc, DSSR);
rcar_du_crtc_write(rcrtc, DSRCR, status & DSRCR_MASK);
- if (status & DSSR_VBK) {
+ if (status & DSSR_FRM) {
drm_handle_vblank(rcrtc->crtc.dev, rcrtc->index);
rcar_du_crtc_finish_page_flip(rcrtc);
ret = IRQ_HANDLED;
else
mwr = plane->pitch * 8 / plane->format->bpp;
- rcar_du_plane_write(rgrp, index, PnMWR, mwr);
+ if ((plane->interlace_flag) && (plane->format->bpp == 32))
+ rcar_du_plane_write(rgrp, index, PnMWR, mwr * 2);
+ else
+ rcar_du_plane_write(rgrp, index, PnMWR, mwr);
/* The Y position is expressed in raster line units and must be doubled
* for 32bpp formats, according to the R8A7790 datasheet. No mention of
* require a halved Y position value.
*/
rcar_du_plane_write(rgrp, index, PnSPXR, plane->src_x);
- rcar_du_plane_write(rgrp, index, PnSPYR, plane->src_y *
- (plane->format->bpp == 32 ? 2 : 1));
+ if ((!plane->interlace_flag) && (plane->format->bpp == 32))
+ rcar_du_plane_write(rgrp, index, PnSPYR, plane->src_y * 2);
+ else
+ rcar_du_plane_write(rgrp, index, PnSPYR, plane->src_y);
rcar_du_plane_write(rgrp, index, PnDSA0R, plane->dma[0]);
if (plane->format->planes == 2) {
rplane->height = crtc_h;
rcar_du_plane_compute_base(rplane, fb);
+
+ if (crtc->mode.flags & DRM_MODE_FLAG_INTERLACE)
+ rplane->interlace_flag = true;
+ else
+ rplane->interlace_flag = false;
rcar_du_plane_setup(rplane);
mutex_lock(&rplane->group->planes.lock);
plane->hwplane = &planes->planes[i + 2];
plane->hwplane->zpos = 1;
+ plane->hwplane->interlace_flag = false;
ret = drm_plane_init(rcdu->ddev, &plane->plane, crtcs,
&rcar_du_plane_funcs, formats,