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
217 for (i = 0; i < rcrtc->group->num_planes; ++i) { in rcar_du_crtc_update_planes()
218 struct rcar_du_plane *plane = &rcrtc->group->planes[i]; in rcar_du_crtc_update_planes()
221 if (plane->plane.state->crtc != &rcrtc->crtc) in rcar_du_crtc_update_planes()
261 mutex_lock(&rcrtc->group->lock); in rcar_du_crtc_update_planes()
263 dptsr_planes = rcrtc->index % 2 ? rcrtc->group->dptsr_planes | hwplanes in rcar_du_crtc_update_planes()
264 : rcrtc->group->dptsr_planes & ~hwplanes; in rcar_du_crtc_update_planes()
266 if (dptsr_planes != rcrtc->group->dptsr_planes) { in rcar_du_crtc_update_planes()
267 rcar_du_group_write(rcrtc->group, DPTSR, in rcar_du_crtc_update_planes()
269 rcrtc->group->dptsr_planes = dptsr_planes; in rcar_du_crtc_update_planes()
271 if (rcrtc->group->used_crtcs) in rcar_du_crtc_update_planes()
272 rcar_du_group_restart(rcrtc->group); in rcar_du_crtc_update_planes()
275 mutex_unlock(&rcrtc->group->lock); in rcar_du_crtc_update_planes()
277 rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR, in rcar_du_crtc_update_planes()
285 void rcar_du_crtc_cancel_page_flip(struct rcar_du_crtc *rcrtc, in rcar_du_crtc_cancel_page_flip() argument
289 struct drm_device *dev = rcrtc->crtc.dev; in rcar_du_crtc_cancel_page_flip()
296 event = rcrtc->event; in rcar_du_crtc_cancel_page_flip()
298 rcrtc->event = NULL; in rcar_du_crtc_cancel_page_flip()
300 drm_crtc_vblank_put(&rcrtc->crtc); in rcar_du_crtc_cancel_page_flip()
305 static void rcar_du_crtc_finish_page_flip(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_finish_page_flip() argument
308 struct drm_device *dev = rcrtc->crtc.dev; in rcar_du_crtc_finish_page_flip()
312 event = rcrtc->event; in rcar_du_crtc_finish_page_flip()
313 rcrtc->event = NULL; in rcar_du_crtc_finish_page_flip()
320 drm_send_vblank_event(dev, rcrtc->index, event); in rcar_du_crtc_finish_page_flip()
321 wake_up(&rcrtc->flip_wait); in rcar_du_crtc_finish_page_flip()
324 drm_crtc_vblank_put(&rcrtc->crtc); in rcar_du_crtc_finish_page_flip()
327 static bool rcar_du_crtc_page_flip_pending(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_page_flip_pending() argument
329 struct drm_device *dev = rcrtc->crtc.dev; in rcar_du_crtc_page_flip_pending()
334 pending = rcrtc->event != NULL; in rcar_du_crtc_page_flip_pending()
340 static void rcar_du_crtc_wait_page_flip(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_wait_page_flip() argument
342 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_wait_page_flip()
344 if (wait_event_timeout(rcrtc->flip_wait, in rcar_du_crtc_wait_page_flip()
345 !rcar_du_crtc_page_flip_pending(rcrtc), in rcar_du_crtc_wait_page_flip()
351 rcar_du_crtc_finish_page_flip(rcrtc); in rcar_du_crtc_wait_page_flip()
358 static void rcar_du_crtc_start(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_start() argument
360 struct drm_crtc *crtc = &rcrtc->crtc; in rcar_du_crtc_start()
363 if (rcrtc->started) in rcar_du_crtc_start()
367 rcar_du_crtc_write(rcrtc, DOOR, DOOR_RGB(0, 0, 0)); in rcar_du_crtc_start()
368 rcar_du_crtc_write(rcrtc, BPOR, BPOR_RGB(0, 0, 0)); in rcar_du_crtc_start()
371 rcar_du_crtc_set_display_timing(rcrtc); in rcar_du_crtc_start()
372 rcar_du_group_set_routing(rcrtc->group); in rcar_du_crtc_start()
375 rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR, 0); in rcar_du_crtc_start()
381 interlaced = rcrtc->crtc.mode.flags & DRM_MODE_FLAG_INTERLACE; in rcar_du_crtc_start()
382 rcar_du_crtc_clr_set(rcrtc, DSYSR, DSYSR_TVM_MASK | DSYSR_SCM_MASK, in rcar_du_crtc_start()
386 rcar_du_group_start_stop(rcrtc->group, true); in rcar_du_crtc_start()
391 rcrtc->started = true; in rcar_du_crtc_start()
394 static void rcar_du_crtc_stop(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_stop() argument
396 struct drm_crtc *crtc = &rcrtc->crtc; in rcar_du_crtc_stop()
398 if (!rcrtc->started) in rcar_du_crtc_stop()
411 rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR, 0); in rcar_du_crtc_stop()
418 rcar_du_crtc_wait_page_flip(rcrtc); in rcar_du_crtc_stop()
424 rcar_du_crtc_clr_set(rcrtc, DSYSR, DSYSR_TVM_MASK, DSYSR_TVM_SWITCH); in rcar_du_crtc_stop()
426 rcar_du_group_start_stop(rcrtc->group, false); in rcar_du_crtc_stop()
428 rcrtc->started = false; in rcar_du_crtc_stop()
431 void rcar_du_crtc_suspend(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_suspend() argument
433 rcar_du_crtc_stop(rcrtc); in rcar_du_crtc_suspend()
434 rcar_du_crtc_put(rcrtc); in rcar_du_crtc_suspend()
437 void rcar_du_crtc_resume(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_resume() argument
441 if (!rcrtc->enabled) in rcar_du_crtc_resume()
444 rcar_du_crtc_get(rcrtc); in rcar_du_crtc_resume()
445 rcar_du_crtc_start(rcrtc); in rcar_du_crtc_resume()
448 for (i = 0; i < rcrtc->group->num_planes; ++i) { in rcar_du_crtc_resume()
449 struct rcar_du_plane *plane = &rcrtc->group->planes[i]; in rcar_du_crtc_resume()
451 if (plane->plane.state->crtc != &rcrtc->crtc) in rcar_du_crtc_resume()
457 rcar_du_crtc_update_planes(rcrtc); in rcar_du_crtc_resume()
466 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_enable() local
468 if (rcrtc->enabled) in rcar_du_crtc_enable()
471 rcar_du_crtc_get(rcrtc); in rcar_du_crtc_enable()
472 rcar_du_crtc_start(rcrtc); in rcar_du_crtc_enable()
474 rcrtc->enabled = true; in rcar_du_crtc_enable()
479 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_disable() local
481 if (!rcrtc->enabled) in rcar_du_crtc_disable()
484 rcar_du_crtc_stop(rcrtc); in rcar_du_crtc_disable()
485 rcar_du_crtc_put(rcrtc); in rcar_du_crtc_disable()
487 rcrtc->enabled = false; in rcar_du_crtc_disable()
488 rcrtc->outputs = 0; in rcar_du_crtc_disable()
503 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_atomic_begin() local
504 struct drm_device *dev = rcrtc->crtc.dev; in rcar_du_crtc_atomic_begin()
511 rcrtc->event = event; in rcar_du_crtc_atomic_begin()
519 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_atomic_flush() local
521 rcar_du_crtc_update_planes(rcrtc); in rcar_du_crtc_atomic_flush()
547 struct rcar_du_crtc *rcrtc = arg; in rcar_du_crtc_irq() local
551 status = rcar_du_crtc_read(rcrtc, DSSR); in rcar_du_crtc_irq()
552 rcar_du_crtc_write(rcrtc, DSRCR, status & DSRCR_MASK); in rcar_du_crtc_irq()
555 drm_handle_vblank(rcrtc->crtc.dev, rcrtc->index); in rcar_du_crtc_irq()
556 rcar_du_crtc_finish_page_flip(rcrtc); in rcar_du_crtc_irq()
575 struct rcar_du_crtc *rcrtc = &rcdu->crtcs[index]; in rcar_du_crtc_create() local
576 struct drm_crtc *crtc = &rcrtc->crtc; in rcar_du_crtc_create()
592 rcrtc->clock = devm_clk_get(rcdu->dev, name); in rcar_du_crtc_create()
593 if (IS_ERR(rcrtc->clock)) { in rcar_du_crtc_create()
595 return PTR_ERR(rcrtc->clock); in rcar_du_crtc_create()
601 rcrtc->extclock = clk; in rcar_du_crtc_create()
602 } else if (PTR_ERR(rcrtc->clock) == -EPROBE_DEFER) { in rcar_du_crtc_create()
607 init_waitqueue_head(&rcrtc->flip_wait); in rcar_du_crtc_create()
609 rcrtc->group = rgrp; in rcar_du_crtc_create()
610 rcrtc->mmio_offset = mmio_offsets[index]; in rcar_du_crtc_create()
611 rcrtc->index = index; in rcar_du_crtc_create()
612 rcrtc->enabled = false; in rcar_du_crtc_create()
640 dev_name(rcdu->dev), rcrtc); in rcar_du_crtc_create()
650 void rcar_du_crtc_enable_vblank(struct rcar_du_crtc *rcrtc, bool enable) in rcar_du_crtc_enable_vblank() argument
653 rcar_du_crtc_write(rcrtc, DSRCR, DSRCR_VBCL); in rcar_du_crtc_enable_vblank()
654 rcar_du_crtc_set(rcrtc, DIER, DIER_VBE); in rcar_du_crtc_enable_vblank()
656 rcar_du_crtc_clr(rcrtc, DIER, DIER_VBE); in rcar_du_crtc_enable_vblank()