|
@@ -142,17 +142,27 @@ static void dmafetch_set_fmt(struct mmp_overlay *overlay)
|
|
|
static void overlay_set_win(struct mmp_overlay *overlay, struct mmp_win *win)
|
|
|
{
|
|
|
struct lcd_regs *regs = path_regs(overlay->path);
|
|
|
- u32 pitch;
|
|
|
|
|
|
/* assert win supported */
|
|
|
memcpy(&overlay->win, win, sizeof(struct mmp_win));
|
|
|
|
|
|
mutex_lock(&overlay->access_ok);
|
|
|
- pitch = win->xsrc * pixfmt_to_stride(win->pix_fmt);
|
|
|
- writel_relaxed(pitch, ®s->g_pitch);
|
|
|
- writel_relaxed((win->ysrc << 16) | win->xsrc, ®s->g_size);
|
|
|
- writel_relaxed((win->ydst << 16) | win->xdst, ®s->g_size_z);
|
|
|
- writel_relaxed(0, ®s->g_start);
|
|
|
+
|
|
|
+ if (overlay_is_vid(overlay)) {
|
|
|
+ writel_relaxed(win->pitch[0], ®s->v_pitch_yc);
|
|
|
+ writel_relaxed(win->pitch[2] << 16 |
|
|
|
+ win->pitch[1], ®s->v_pitch_uv);
|
|
|
+
|
|
|
+ writel_relaxed((win->ysrc << 16) | win->xsrc, ®s->v_size);
|
|
|
+ writel_relaxed((win->ydst << 16) | win->xdst, ®s->v_size_z);
|
|
|
+ writel_relaxed(win->ypos << 16 | win->xpos, ®s->v_start);
|
|
|
+ } else {
|
|
|
+ writel_relaxed(win->pitch[0], ®s->g_pitch);
|
|
|
+
|
|
|
+ writel_relaxed((win->ysrc << 16) | win->xsrc, ®s->g_size);
|
|
|
+ writel_relaxed((win->ydst << 16) | win->xdst, ®s->g_size_z);
|
|
|
+ writel_relaxed(win->ypos << 16 | win->xpos, ®s->g_start);
|
|
|
+ }
|
|
|
|
|
|
dmafetch_set_fmt(overlay);
|
|
|
mutex_unlock(&overlay->access_ok);
|
|
@@ -234,7 +244,13 @@ static int overlay_set_addr(struct mmp_overlay *overlay, struct mmp_addr *addr)
|
|
|
|
|
|
/* FIXME: assert addr supported */
|
|
|
memcpy(&overlay->addr, addr, sizeof(struct mmp_addr));
|
|
|
- writel(addr->phys[0], ®s->g_0);
|
|
|
+
|
|
|
+ if (overlay_is_vid(overlay)) {
|
|
|
+ writel_relaxed(addr->phys[0], ®s->v_y0);
|
|
|
+ writel_relaxed(addr->phys[1], ®s->v_u0);
|
|
|
+ writel_relaxed(addr->phys[2], ®s->v_v0);
|
|
|
+ } else
|
|
|
+ writel_relaxed(addr->phys[0], ®s->g_0);
|
|
|
|
|
|
return overlay->addr.phys[0];
|
|
|
}
|