Lines Matching refs:rcrtc
32 static u32 rcar_du_crtc_read(struct rcar_du_crtc *rcrtc, u32 reg) in rcar_du_crtc_read() argument
34 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_read()
36 return rcar_du_read(rcdu, rcrtc->mmio_offset + reg); in rcar_du_crtc_read()
39 static void rcar_du_crtc_write(struct rcar_du_crtc *rcrtc, u32 reg, u32 data) in rcar_du_crtc_write() argument
41 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_write()
43 rcar_du_write(rcdu, rcrtc->mmio_offset + reg, data); in rcar_du_crtc_write()
46 static void rcar_du_crtc_clr(struct rcar_du_crtc *rcrtc, u32 reg, u32 clr) in rcar_du_crtc_clr() argument
48 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_clr()
50 rcar_du_write(rcdu, rcrtc->mmio_offset + reg, in rcar_du_crtc_clr()
51 rcar_du_read(rcdu, rcrtc->mmio_offset + reg) & ~clr); in rcar_du_crtc_clr()
54 static void rcar_du_crtc_set(struct rcar_du_crtc *rcrtc, u32 reg, u32 set) in rcar_du_crtc_set() argument
56 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_set()
58 rcar_du_write(rcdu, rcrtc->mmio_offset + reg, in rcar_du_crtc_set()
59 rcar_du_read(rcdu, rcrtc->mmio_offset + reg) | set); in rcar_du_crtc_set()
62 static void rcar_du_crtc_clr_set(struct rcar_du_crtc *rcrtc, u32 reg, in rcar_du_crtc_clr_set() argument
65 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_clr_set()
66 u32 value = rcar_du_read(rcdu, rcrtc->mmio_offset + reg); in rcar_du_crtc_clr_set()
68 rcar_du_write(rcdu, rcrtc->mmio_offset + reg, (value & ~clr) | set); in rcar_du_crtc_clr_set()
71 static int rcar_du_crtc_get(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_get() argument
75 ret = clk_prepare_enable(rcrtc->clock); in rcar_du_crtc_get()
79 ret = clk_prepare_enable(rcrtc->extclock); in rcar_du_crtc_get()
83 ret = rcar_du_group_get(rcrtc->group); in rcar_du_crtc_get()
90 clk_disable_unprepare(rcrtc->extclock); in rcar_du_crtc_get()
92 clk_disable_unprepare(rcrtc->clock); in rcar_du_crtc_get()
96 static void rcar_du_crtc_put(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_put() argument
98 rcar_du_group_put(rcrtc->group); in rcar_du_crtc_put()
100 clk_disable_unprepare(rcrtc->extclock); in rcar_du_crtc_put()
101 clk_disable_unprepare(rcrtc->clock); in rcar_du_crtc_put()
108 static void rcar_du_crtc_set_display_timing(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_set_display_timing() argument
110 const struct drm_display_mode *mode = &rcrtc->crtc.state->adjusted_mode; in rcar_du_crtc_set_display_timing()
120 clk = clk_get_rate(rcrtc->clock); in rcar_du_crtc_set_display_timing()
125 if (rcrtc->extclock) { in rcar_du_crtc_set_display_timing()
131 extclk = clk_get_rate(rcrtc->extclock); in rcar_du_crtc_set_display_timing()
140 dev_dbg(rcrtc->group->dev->dev, in rcar_du_crtc_set_display_timing()
141 "crtc%u: using external clock\n", rcrtc->index); in rcar_du_crtc_set_display_timing()
146 rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? ESCR2 : ESCR, in rcar_du_crtc_set_display_timing()
148 rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? OTAR2 : OTAR, 0); in rcar_du_crtc_set_display_timing()
154 rcar_du_crtc_write(rcrtc, DSMR, value); in rcar_du_crtc_set_display_timing()
157 rcar_du_crtc_write(rcrtc, HDSR, mode->htotal - mode->hsync_start - 19); in rcar_du_crtc_set_display_timing()
158 rcar_du_crtc_write(rcrtc, HDER, mode->htotal - mode->hsync_start + in rcar_du_crtc_set_display_timing()
160 rcar_du_crtc_write(rcrtc, HSWR, mode->hsync_end - in rcar_du_crtc_set_display_timing()
162 rcar_du_crtc_write(rcrtc, HCR, mode->htotal - 1); in rcar_du_crtc_set_display_timing()
164 rcar_du_crtc_write(rcrtc, VDSR, mode->crtc_vtotal - in rcar_du_crtc_set_display_timing()
166 rcar_du_crtc_write(rcrtc, VDER, mode->crtc_vtotal - in rcar_du_crtc_set_display_timing()
169 rcar_du_crtc_write(rcrtc, VSPR, mode->crtc_vtotal - in rcar_du_crtc_set_display_timing()
172 rcar_du_crtc_write(rcrtc, VCR, mode->crtc_vtotal - 1); in rcar_du_crtc_set_display_timing()
174 rcar_du_crtc_write(rcrtc, DESR, mode->htotal - mode->hsync_start); in rcar_du_crtc_set_display_timing()
175 rcar_du_crtc_write(rcrtc, DEWR, mode->hdisplay); in rcar_du_crtc_set_display_timing()
181 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_route_output() local
182 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_route_output()
187 rcrtc->outputs |= BIT(output); in rcar_du_crtc_route_output()
193 rcdu->dpad0_source = rcrtc->index; in rcar_du_crtc_route_output()
207 static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_update_planes() argument
216 for (i = 0; i < ARRAY_SIZE(rcrtc->group->planes.planes); ++i) { in rcar_du_crtc_update_planes()
217 struct rcar_du_plane *plane = &rcrtc->group->planes.planes[i]; in rcar_du_crtc_update_planes()
220 if (plane->plane.state->crtc != &rcrtc->crtc) in rcar_du_crtc_update_planes()
255 if (rcrtc->index % 2) { in rcar_du_crtc_update_planes()
263 mutex_lock(&rcrtc->group->lock); in rcar_du_crtc_update_planes()
264 if (rcar_du_group_read(rcrtc->group, DPTSR) != dptsr) { in rcar_du_crtc_update_planes()
265 rcar_du_group_write(rcrtc->group, DPTSR, dptsr); in rcar_du_crtc_update_planes()
266 if (rcrtc->group->used_crtcs) in rcar_du_crtc_update_planes()
267 rcar_du_group_restart(rcrtc->group); in rcar_du_crtc_update_planes()
269 mutex_unlock(&rcrtc->group->lock); in rcar_du_crtc_update_planes()
272 rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR, in rcar_du_crtc_update_planes()
280 void rcar_du_crtc_cancel_page_flip(struct rcar_du_crtc *rcrtc, in rcar_du_crtc_cancel_page_flip() argument
284 struct drm_device *dev = rcrtc->crtc.dev; in rcar_du_crtc_cancel_page_flip()
291 event = rcrtc->event; in rcar_du_crtc_cancel_page_flip()
293 rcrtc->event = NULL; in rcar_du_crtc_cancel_page_flip()
295 drm_crtc_vblank_put(&rcrtc->crtc); in rcar_du_crtc_cancel_page_flip()
300 static void rcar_du_crtc_finish_page_flip(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_finish_page_flip() argument
303 struct drm_device *dev = rcrtc->crtc.dev; in rcar_du_crtc_finish_page_flip()
307 event = rcrtc->event; in rcar_du_crtc_finish_page_flip()
308 rcrtc->event = NULL; in rcar_du_crtc_finish_page_flip()
315 drm_send_vblank_event(dev, rcrtc->index, event); in rcar_du_crtc_finish_page_flip()
316 wake_up(&rcrtc->flip_wait); in rcar_du_crtc_finish_page_flip()
319 drm_crtc_vblank_put(&rcrtc->crtc); in rcar_du_crtc_finish_page_flip()
322 static bool rcar_du_crtc_page_flip_pending(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_page_flip_pending() argument
324 struct drm_device *dev = rcrtc->crtc.dev; in rcar_du_crtc_page_flip_pending()
329 pending = rcrtc->event != NULL; in rcar_du_crtc_page_flip_pending()
335 static void rcar_du_crtc_wait_page_flip(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_wait_page_flip() argument
337 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_wait_page_flip()
339 if (wait_event_timeout(rcrtc->flip_wait, in rcar_du_crtc_wait_page_flip()
340 !rcar_du_crtc_page_flip_pending(rcrtc), in rcar_du_crtc_wait_page_flip()
346 rcar_du_crtc_finish_page_flip(rcrtc); in rcar_du_crtc_wait_page_flip()
353 static void rcar_du_crtc_start(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_start() argument
355 struct drm_crtc *crtc = &rcrtc->crtc; in rcar_du_crtc_start()
358 if (rcrtc->started) in rcar_du_crtc_start()
362 rcar_du_crtc_write(rcrtc, DOOR, DOOR_RGB(0, 0, 0)); in rcar_du_crtc_start()
363 rcar_du_crtc_write(rcrtc, BPOR, BPOR_RGB(0, 0, 0)); in rcar_du_crtc_start()
366 rcar_du_crtc_set_display_timing(rcrtc); in rcar_du_crtc_start()
367 rcar_du_group_set_routing(rcrtc->group); in rcar_du_crtc_start()
370 rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR, 0); in rcar_du_crtc_start()
376 interlaced = rcrtc->crtc.mode.flags & DRM_MODE_FLAG_INTERLACE; in rcar_du_crtc_start()
377 rcar_du_crtc_clr_set(rcrtc, DSYSR, DSYSR_TVM_MASK | DSYSR_SCM_MASK, in rcar_du_crtc_start()
381 rcar_du_group_start_stop(rcrtc->group, true); in rcar_du_crtc_start()
386 rcrtc->started = true; in rcar_du_crtc_start()
389 static void rcar_du_crtc_stop(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_stop() argument
391 struct drm_crtc *crtc = &rcrtc->crtc; in rcar_du_crtc_stop()
393 if (!rcrtc->started) in rcar_du_crtc_stop()
400 rcar_du_crtc_wait_page_flip(rcrtc); in rcar_du_crtc_stop()
406 rcar_du_crtc_clr_set(rcrtc, DSYSR, DSYSR_TVM_MASK, DSYSR_TVM_SWITCH); in rcar_du_crtc_stop()
408 rcar_du_group_start_stop(rcrtc->group, false); in rcar_du_crtc_stop()
410 rcrtc->started = false; in rcar_du_crtc_stop()
413 void rcar_du_crtc_suspend(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_suspend() argument
415 rcar_du_crtc_stop(rcrtc); in rcar_du_crtc_suspend()
416 rcar_du_crtc_put(rcrtc); in rcar_du_crtc_suspend()
419 void rcar_du_crtc_resume(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_resume() argument
423 if (!rcrtc->enabled) in rcar_du_crtc_resume()
426 rcar_du_crtc_get(rcrtc); in rcar_du_crtc_resume()
427 rcar_du_crtc_start(rcrtc); in rcar_du_crtc_resume()
430 for (i = 0; i < ARRAY_SIZE(rcrtc->group->planes.planes); ++i) { in rcar_du_crtc_resume()
431 struct rcar_du_plane *plane = &rcrtc->group->planes.planes[i]; in rcar_du_crtc_resume()
433 if (plane->plane.state->crtc != &rcrtc->crtc) in rcar_du_crtc_resume()
439 rcar_du_crtc_update_planes(rcrtc); in rcar_du_crtc_resume()
448 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_enable() local
450 if (rcrtc->enabled) in rcar_du_crtc_enable()
453 rcar_du_crtc_get(rcrtc); in rcar_du_crtc_enable()
454 rcar_du_crtc_start(rcrtc); in rcar_du_crtc_enable()
456 rcrtc->enabled = true; in rcar_du_crtc_enable()
461 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_disable() local
463 if (!rcrtc->enabled) in rcar_du_crtc_disable()
466 rcar_du_crtc_stop(rcrtc); in rcar_du_crtc_disable()
467 rcar_du_crtc_put(rcrtc); in rcar_du_crtc_disable()
469 rcrtc->enabled = false; in rcar_du_crtc_disable()
470 rcrtc->outputs = 0; in rcar_du_crtc_disable()
484 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_atomic_begin() local
485 struct drm_device *dev = rcrtc->crtc.dev; in rcar_du_crtc_atomic_begin()
492 rcrtc->event = event; in rcar_du_crtc_atomic_begin()
499 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_atomic_flush() local
501 rcar_du_crtc_update_planes(rcrtc); in rcar_du_crtc_atomic_flush()
527 struct rcar_du_crtc *rcrtc = arg; in rcar_du_crtc_irq() local
531 status = rcar_du_crtc_read(rcrtc, DSSR); in rcar_du_crtc_irq()
532 rcar_du_crtc_write(rcrtc, DSRCR, status & DSRCR_MASK); in rcar_du_crtc_irq()
535 drm_handle_vblank(rcrtc->crtc.dev, rcrtc->index); in rcar_du_crtc_irq()
536 rcar_du_crtc_finish_page_flip(rcrtc); in rcar_du_crtc_irq()
555 struct rcar_du_crtc *rcrtc = &rcdu->crtcs[index]; in rcar_du_crtc_create() local
556 struct drm_crtc *crtc = &rcrtc->crtc; in rcar_du_crtc_create()
572 rcrtc->clock = devm_clk_get(rcdu->dev, name); in rcar_du_crtc_create()
573 if (IS_ERR(rcrtc->clock)) { in rcar_du_crtc_create()
575 return PTR_ERR(rcrtc->clock); in rcar_du_crtc_create()
581 rcrtc->extclock = clk; in rcar_du_crtc_create()
582 } else if (PTR_ERR(rcrtc->clock) == -EPROBE_DEFER) { in rcar_du_crtc_create()
587 init_waitqueue_head(&rcrtc->flip_wait); in rcar_du_crtc_create()
589 rcrtc->group = rgrp; in rcar_du_crtc_create()
590 rcrtc->mmio_offset = mmio_offsets[index]; in rcar_du_crtc_create()
591 rcrtc->index = index; in rcar_du_crtc_create()
592 rcrtc->enabled = false; in rcar_du_crtc_create()
620 dev_name(rcdu->dev), rcrtc); in rcar_du_crtc_create()
630 void rcar_du_crtc_enable_vblank(struct rcar_du_crtc *rcrtc, bool enable) in rcar_du_crtc_enable_vblank() argument
633 rcar_du_crtc_write(rcrtc, DSRCR, DSRCR_VBCL); in rcar_du_crtc_enable_vblank()
634 rcar_du_crtc_set(rcrtc, DIER, DIER_VBE); in rcar_du_crtc_enable_vblank()
636 rcar_du_crtc_clr(rcrtc, DIER, DIER_VBE); in rcar_du_crtc_enable_vblank()