Lines Matching refs:rcrtc

34 static u32 rcar_du_crtc_read(struct rcar_du_crtc *rcrtc, u32 reg)  in rcar_du_crtc_read()  argument
36 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_read()
38 return rcar_du_read(rcdu, rcrtc->mmio_offset + reg); in rcar_du_crtc_read()
41 static void rcar_du_crtc_write(struct rcar_du_crtc *rcrtc, u32 reg, u32 data) in rcar_du_crtc_write() argument
43 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_write()
45 rcar_du_write(rcdu, rcrtc->mmio_offset + reg, data); in rcar_du_crtc_write()
48 static void rcar_du_crtc_clr(struct rcar_du_crtc *rcrtc, u32 reg, u32 clr) in rcar_du_crtc_clr() argument
50 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_clr()
52 rcar_du_write(rcdu, rcrtc->mmio_offset + reg, in rcar_du_crtc_clr()
53 rcar_du_read(rcdu, rcrtc->mmio_offset + reg) & ~clr); in rcar_du_crtc_clr()
56 static void rcar_du_crtc_set(struct rcar_du_crtc *rcrtc, u32 reg, u32 set) in rcar_du_crtc_set() argument
58 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_set()
60 rcar_du_write(rcdu, rcrtc->mmio_offset + reg, in rcar_du_crtc_set()
61 rcar_du_read(rcdu, rcrtc->mmio_offset + reg) | set); in rcar_du_crtc_set()
64 static void rcar_du_crtc_clr_set(struct rcar_du_crtc *rcrtc, u32 reg, in rcar_du_crtc_clr_set() argument
67 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_clr_set()
68 u32 value = rcar_du_read(rcdu, rcrtc->mmio_offset + reg); in rcar_du_crtc_clr_set()
70 rcar_du_write(rcdu, rcrtc->mmio_offset + reg, (value & ~clr) | set); in rcar_du_crtc_clr_set()
73 static int rcar_du_crtc_get(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_get() argument
77 ret = clk_prepare_enable(rcrtc->clock); in rcar_du_crtc_get()
81 ret = clk_prepare_enable(rcrtc->extclock); in rcar_du_crtc_get()
85 ret = rcar_du_group_get(rcrtc->group); in rcar_du_crtc_get()
92 clk_disable_unprepare(rcrtc->extclock); in rcar_du_crtc_get()
94 clk_disable_unprepare(rcrtc->clock); in rcar_du_crtc_get()
98 static void rcar_du_crtc_put(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_put() argument
100 rcar_du_group_put(rcrtc->group); in rcar_du_crtc_put()
102 clk_disable_unprepare(rcrtc->extclock); in rcar_du_crtc_put()
103 clk_disable_unprepare(rcrtc->clock); in rcar_du_crtc_put()
117 static void rcar_du_dpll_divider(struct rcar_du_crtc *rcrtc, in rcar_du_dpll_divider() argument
195 dev_dbg(rcrtc->group->dev->dev, in rcar_du_dpll_divider()
206 static void rcar_du_crtc_set_display_timing(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_set_display_timing() argument
208 const struct drm_display_mode *mode = &rcrtc->crtc.state->adjusted_mode; in rcar_du_crtc_set_display_timing()
209 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_set_display_timing()
220 clk = clk_get_rate(rcrtc->clock); in rcar_du_crtc_set_display_timing()
225 if (rcrtc->extclock) { in rcar_du_crtc_set_display_timing()
232 extclk = clk_get_rate(rcrtc->extclock); in rcar_du_crtc_set_display_timing()
233 if (rcdu->info->dpll_ch & (1 << rcrtc->index)) { in rcar_du_crtc_set_display_timing()
247 rcar_du_dpll_divider(rcrtc, &dpll, extclk, target); in rcar_du_crtc_set_display_timing()
260 if (rcdu->info->dpll_ch & (1 << rcrtc->index)) { in rcar_du_crtc_set_display_timing()
266 if (rcrtc->index == 1) in rcar_du_crtc_set_display_timing()
273 rcar_du_group_write(rcrtc->group, DPLLCR, in rcar_du_crtc_set_display_timing()
280 dev_dbg(rcrtc->group->dev->dev, in rcar_du_crtc_set_display_timing()
285 rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? ESCR2 : ESCR, in rcar_du_crtc_set_display_timing()
287 rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? OTAR2 : OTAR, 0); in rcar_du_crtc_set_display_timing()
293 rcar_du_crtc_write(rcrtc, DSMR, value); in rcar_du_crtc_set_display_timing()
296 rcar_du_crtc_write(rcrtc, HDSR, mode->htotal - mode->hsync_start - 19); in rcar_du_crtc_set_display_timing()
297 rcar_du_crtc_write(rcrtc, HDER, mode->htotal - mode->hsync_start + in rcar_du_crtc_set_display_timing()
299 rcar_du_crtc_write(rcrtc, HSWR, mode->hsync_end - in rcar_du_crtc_set_display_timing()
301 rcar_du_crtc_write(rcrtc, HCR, mode->htotal - 1); in rcar_du_crtc_set_display_timing()
303 rcar_du_crtc_write(rcrtc, VDSR, mode->crtc_vtotal - in rcar_du_crtc_set_display_timing()
305 rcar_du_crtc_write(rcrtc, VDER, mode->crtc_vtotal - in rcar_du_crtc_set_display_timing()
308 rcar_du_crtc_write(rcrtc, VSPR, mode->crtc_vtotal - in rcar_du_crtc_set_display_timing()
311 rcar_du_crtc_write(rcrtc, VCR, mode->crtc_vtotal - 1); in rcar_du_crtc_set_display_timing()
313 rcar_du_crtc_write(rcrtc, DESR, mode->htotal - mode->hsync_start - 1); in rcar_du_crtc_set_display_timing()
314 rcar_du_crtc_write(rcrtc, DEWR, mode->hdisplay); in rcar_du_crtc_set_display_timing()
320 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_route_output() local
321 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_route_output()
327 rcrtc->outputs |= BIT(output); in rcar_du_crtc_route_output()
334 rcdu->dpad0_source = rcrtc->index; in rcar_du_crtc_route_output()
348 static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_update_planes() argument
351 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_update_planes()
359 for (i = 0; i < rcrtc->group->num_planes; ++i) { in rcar_du_crtc_update_planes()
360 struct rcar_du_plane *plane = &rcrtc->group->planes[i]; in rcar_du_crtc_update_planes()
363 if (plane->plane.state->crtc != &rcrtc->crtc || in rcar_du_crtc_update_planes()
399 dspr = (rcrtc->index % 2) + 1; in rcar_du_crtc_update_planes()
400 hwplanes = 1 << (rcrtc->index % 2); in rcar_du_crtc_update_planes()
402 dspr = (rcrtc->index % 2) ? 3 : 1; in rcar_du_crtc_update_planes()
403 hwplanes = 1 << ((rcrtc->index % 2) ? 2 : 0); in rcar_du_crtc_update_planes()
416 mutex_lock(&rcrtc->group->lock); in rcar_du_crtc_update_planes()
418 dptsr_planes = rcrtc->index % 2 ? rcrtc->group->dptsr_planes | hwplanes in rcar_du_crtc_update_planes()
419 : rcrtc->group->dptsr_planes & ~hwplanes; in rcar_du_crtc_update_planes()
421 if (dptsr_planes != rcrtc->group->dptsr_planes) { in rcar_du_crtc_update_planes()
422 rcar_du_group_write(rcrtc->group, DPTSR, in rcar_du_crtc_update_planes()
424 rcrtc->group->dptsr_planes = dptsr_planes; in rcar_du_crtc_update_planes()
426 if (rcrtc->group->used_crtcs) in rcar_du_crtc_update_planes()
427 rcar_du_group_restart(rcrtc->group); in rcar_du_crtc_update_planes()
431 if (rcrtc->group->need_restart) in rcar_du_crtc_update_planes()
432 rcar_du_group_restart(rcrtc->group); in rcar_du_crtc_update_planes()
434 mutex_unlock(&rcrtc->group->lock); in rcar_du_crtc_update_planes()
436 rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR, in rcar_du_crtc_update_planes()
444 void rcar_du_crtc_finish_page_flip(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_finish_page_flip() argument
447 struct drm_device *dev = rcrtc->crtc.dev; in rcar_du_crtc_finish_page_flip()
451 event = rcrtc->event; in rcar_du_crtc_finish_page_flip()
452 rcrtc->event = NULL; in rcar_du_crtc_finish_page_flip()
459 drm_crtc_send_vblank_event(&rcrtc->crtc, event); in rcar_du_crtc_finish_page_flip()
460 wake_up(&rcrtc->flip_wait); in rcar_du_crtc_finish_page_flip()
463 drm_crtc_vblank_put(&rcrtc->crtc); in rcar_du_crtc_finish_page_flip()
466 static bool rcar_du_crtc_page_flip_pending(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_page_flip_pending() argument
468 struct drm_device *dev = rcrtc->crtc.dev; in rcar_du_crtc_page_flip_pending()
473 pending = rcrtc->event != NULL; in rcar_du_crtc_page_flip_pending()
479 static void rcar_du_crtc_wait_page_flip(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_wait_page_flip() argument
481 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_wait_page_flip()
483 if (wait_event_timeout(rcrtc->flip_wait, in rcar_du_crtc_wait_page_flip()
484 !rcar_du_crtc_page_flip_pending(rcrtc), in rcar_du_crtc_wait_page_flip()
490 rcar_du_crtc_finish_page_flip(rcrtc); in rcar_du_crtc_wait_page_flip()
497 static void rcar_du_crtc_setup(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_setup() argument
500 rcar_du_crtc_write(rcrtc, DOOR, DOOR_RGB(0, 0, 0)); in rcar_du_crtc_setup()
501 rcar_du_crtc_write(rcrtc, BPOR, BPOR_RGB(0, 0, 0)); in rcar_du_crtc_setup()
504 rcar_du_crtc_set_display_timing(rcrtc); in rcar_du_crtc_setup()
505 rcar_du_group_set_routing(rcrtc->group); in rcar_du_crtc_setup()
508 rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR, 0); in rcar_du_crtc_setup()
511 if (rcar_du_has(rcrtc->group->dev, RCAR_DU_FEATURE_VSP1_SOURCE)) in rcar_du_crtc_setup()
512 rcar_du_vsp_enable(rcrtc); in rcar_du_crtc_setup()
515 drm_crtc_vblank_on(&rcrtc->crtc); in rcar_du_crtc_setup()
518 static void rcar_du_crtc_start(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_start() argument
527 interlaced = rcrtc->crtc.mode.flags & DRM_MODE_FLAG_INTERLACE; in rcar_du_crtc_start()
528 rcar_du_crtc_clr_set(rcrtc, DSYSR, DSYSR_TVM_MASK | DSYSR_SCM_MASK, in rcar_du_crtc_start()
532 rcar_du_group_start_stop(rcrtc->group, true); in rcar_du_crtc_start()
535 static void rcar_du_crtc_disable_planes(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_disable_planes() argument
537 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_disable_planes()
538 struct drm_crtc *crtc = &rcrtc->crtc; in rcar_du_crtc_disable_planes()
551 spin_lock_irq(&rcrtc->vblank_lock); in rcar_du_crtc_disable_planes()
552 rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR, 0); in rcar_du_crtc_disable_planes()
553 status = rcar_du_crtc_read(rcrtc, DSSR); in rcar_du_crtc_disable_planes()
554 rcrtc->vblank_count = status & DSSR_VBK ? 2 : 1; in rcar_du_crtc_disable_planes()
555 spin_unlock_irq(&rcrtc->vblank_lock); in rcar_du_crtc_disable_planes()
557 if (!wait_event_timeout(rcrtc->vblank_wait, rcrtc->vblank_count == 0, in rcar_du_crtc_disable_planes()
564 static void rcar_du_crtc_stop(struct rcar_du_crtc *rcrtc) in rcar_du_crtc_stop() argument
566 struct drm_crtc *crtc = &rcrtc->crtc; in rcar_du_crtc_stop()
579 rcar_du_crtc_disable_planes(rcrtc); in rcar_du_crtc_stop()
586 rcar_du_crtc_wait_page_flip(rcrtc); in rcar_du_crtc_stop()
590 if (rcar_du_has(rcrtc->group->dev, RCAR_DU_FEATURE_VSP1_SOURCE)) in rcar_du_crtc_stop()
591 rcar_du_vsp_disable(rcrtc); in rcar_du_crtc_stop()
597 rcar_du_crtc_clr_set(rcrtc, DSYSR, DSYSR_TVM_MASK, DSYSR_TVM_SWITCH); in rcar_du_crtc_stop()
599 rcar_du_group_start_stop(rcrtc->group, false); in rcar_du_crtc_stop()
609 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_atomic_enable() local
615 if (!rcrtc->initialized) { in rcar_du_crtc_atomic_enable()
616 rcar_du_crtc_get(rcrtc); in rcar_du_crtc_atomic_enable()
617 rcar_du_crtc_setup(rcrtc); in rcar_du_crtc_atomic_enable()
618 rcrtc->initialized = true; in rcar_du_crtc_atomic_enable()
621 rcar_du_crtc_start(rcrtc); in rcar_du_crtc_atomic_enable()
627 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_atomic_disable() local
629 rcar_du_crtc_stop(rcrtc); in rcar_du_crtc_atomic_disable()
630 rcar_du_crtc_put(rcrtc); in rcar_du_crtc_atomic_disable()
639 rcrtc->initialized = false; in rcar_du_crtc_atomic_disable()
640 rcrtc->outputs = 0; in rcar_du_crtc_atomic_disable()
646 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_atomic_begin() local
655 if (!rcrtc->initialized) { in rcar_du_crtc_atomic_begin()
656 rcar_du_crtc_get(rcrtc); in rcar_du_crtc_atomic_begin()
657 rcar_du_crtc_setup(rcrtc); in rcar_du_crtc_atomic_begin()
658 rcrtc->initialized = true; in rcar_du_crtc_atomic_begin()
661 if (rcar_du_has(rcrtc->group->dev, RCAR_DU_FEATURE_VSP1_SOURCE)) in rcar_du_crtc_atomic_begin()
662 rcar_du_vsp_atomic_begin(rcrtc); in rcar_du_crtc_atomic_begin()
668 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_atomic_flush() local
669 struct drm_device *dev = rcrtc->crtc.dev; in rcar_du_crtc_atomic_flush()
672 rcar_du_crtc_update_planes(rcrtc); in rcar_du_crtc_atomic_flush()
678 rcrtc->event = crtc->state->event; in rcar_du_crtc_atomic_flush()
683 if (rcar_du_has(rcrtc->group->dev, RCAR_DU_FEATURE_VSP1_SOURCE)) in rcar_du_crtc_atomic_flush()
684 rcar_du_vsp_atomic_flush(rcrtc); in rcar_du_crtc_atomic_flush()
742 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_enable_vblank() local
744 rcar_du_crtc_write(rcrtc, DSRCR, DSRCR_VBCL); in rcar_du_crtc_enable_vblank()
745 rcar_du_crtc_set(rcrtc, DIER, DIER_VBE); in rcar_du_crtc_enable_vblank()
746 rcrtc->vblank_enable = true; in rcar_du_crtc_enable_vblank()
753 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_disable_vblank() local
755 rcar_du_crtc_clr(rcrtc, DIER, DIER_VBE); in rcar_du_crtc_disable_vblank()
756 rcrtc->vblank_enable = false; in rcar_du_crtc_disable_vblank()
763 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); in rcar_du_crtc_set_crc_source() local
788 for (i = 0; i < rcrtc->vsp->num_planes; ++i) { in rcar_du_crtc_set_crc_source()
789 if (index == rcrtc->vsp->planes[i].plane.base.id) { in rcar_du_crtc_set_crc_source()
795 if (i >= rcrtc->vsp->num_planes) in rcar_du_crtc_set_crc_source()
872 struct rcar_du_crtc *rcrtc = arg; in rcar_du_crtc_irq() local
873 struct rcar_du_device *rcdu = rcrtc->group->dev; in rcar_du_crtc_irq()
877 spin_lock(&rcrtc->vblank_lock); in rcar_du_crtc_irq()
879 status = rcar_du_crtc_read(rcrtc, DSSR); in rcar_du_crtc_irq()
880 rcar_du_crtc_write(rcrtc, DSRCR, status & DSRCR_MASK); in rcar_du_crtc_irq()
888 if (rcrtc->vblank_count) { in rcar_du_crtc_irq()
889 if (--rcrtc->vblank_count == 0) in rcar_du_crtc_irq()
890 wake_up(&rcrtc->vblank_wait); in rcar_du_crtc_irq()
894 spin_unlock(&rcrtc->vblank_lock); in rcar_du_crtc_irq()
898 drm_crtc_handle_vblank(&rcrtc->crtc); in rcar_du_crtc_irq()
899 rcar_du_crtc_finish_page_flip(rcrtc); in rcar_du_crtc_irq()
921 struct rcar_du_crtc *rcrtc = &rcdu->crtcs[swindex]; in rcar_du_crtc_create() local
922 struct drm_crtc *crtc = &rcrtc->crtc; in rcar_du_crtc_create()
939 rcrtc->clock = devm_clk_get(rcdu->dev, name); in rcar_du_crtc_create()
940 if (IS_ERR(rcrtc->clock)) { in rcar_du_crtc_create()
942 return PTR_ERR(rcrtc->clock); in rcar_du_crtc_create()
948 rcrtc->extclock = clk; in rcar_du_crtc_create()
949 } else if (PTR_ERR(rcrtc->clock) == -EPROBE_DEFER) { in rcar_du_crtc_create()
954 init_waitqueue_head(&rcrtc->flip_wait); in rcar_du_crtc_create()
955 init_waitqueue_head(&rcrtc->vblank_wait); in rcar_du_crtc_create()
956 spin_lock_init(&rcrtc->vblank_lock); in rcar_du_crtc_create()
958 rcrtc->group = rgrp; in rcar_du_crtc_create()
959 rcrtc->mmio_offset = mmio_offsets[hwindex]; in rcar_du_crtc_create()
960 rcrtc->index = hwindex; in rcar_du_crtc_create()
963 primary = &rcrtc->vsp->planes[rcrtc->vsp_pipe].plane; in rcar_du_crtc_create()
995 dev_name(rcdu->dev), rcrtc); in rcar_du_crtc_create()