Lines Matching refs:vop
46 vop_reg_set(vop, &win->phy->name, win->base, ~0, v, #name)
48 vop_reg_set(vop, &win->phy->scl->name, win->base, ~0, v, #name)
50 vop_reg_set(vop, &win->phy->scl->ext->name, \
53 #define VOP_INTR_SET_MASK(vop, name, mask, v) \ argument
54 vop_reg_set(vop, &vop->data->intr->name, 0, mask, v, #name)
56 #define VOP_REG_SET(vop, group, name, v) \ argument
57 vop_reg_set(vop, &vop->data->group->name, 0, ~0, v, #name)
59 #define VOP_INTR_SET_TYPE(vop, name, type, v) \ argument
62 for (i = 0; i < vop->data->intr->nintrs; i++) { \
63 if (vop->data->intr->intrs[i] & type) { \
68 VOP_INTR_SET_MASK(vop, name, mask, reg); \
70 #define VOP_INTR_GET_TYPE(vop, name, type) \ argument
71 vop_get_intr_type(vop, &vop->data->intr->name, type)
76 #define VOP_WIN_GET_YRGBADDR(vop, win) \ argument
77 vop_readl(vop, win->base + win->phy->yrgb_mst.offset)
80 ((vop_win) - (vop_win)->vop->win)
82 #define to_vop(x) container_of(x, struct vop, crtc)
92 struct vop *vop; member
95 struct vop { struct
141 static inline void vop_writel(struct vop *vop, uint32_t offset, uint32_t v) in vop_writel() argument
143 writel(v, vop->regs + offset); in vop_writel()
144 vop->regsbak[offset >> 2] = v; in vop_writel()
147 static inline uint32_t vop_readl(struct vop *vop, uint32_t offset) in vop_readl() argument
149 return readl(vop->regs + offset); in vop_readl()
152 static inline uint32_t vop_read_reg(struct vop *vop, uint32_t base, in vop_read_reg() argument
155 return (vop_readl(vop, base + reg->offset) >> reg->shift) & reg->mask; in vop_read_reg()
158 static void vop_reg_set(struct vop *vop, const struct vop_reg *reg, in vop_reg_set() argument
165 DRM_DEV_DEBUG(vop->dev, "Warning: not support %s\n", reg_name); in vop_reg_set()
176 uint32_t cached_val = vop->regsbak[offset >> 2]; in vop_reg_set()
179 vop->regsbak[offset >> 2] = v; in vop_reg_set()
183 writel_relaxed(v, vop->regs + offset); in vop_reg_set()
185 writel(v, vop->regs + offset); in vop_reg_set()
188 static inline uint32_t vop_get_intr_type(struct vop *vop, in vop_get_intr_type() argument
192 uint32_t regs = vop_read_reg(vop, 0, reg); in vop_get_intr_type()
194 for (i = 0; i < vop->data->intr->nintrs; i++) { in vop_get_intr_type()
195 if ((type & vop->data->intr->intrs[i]) && (regs & 1 << i)) in vop_get_intr_type()
196 ret |= vop->data->intr->intrs[i]; in vop_get_intr_type()
202 static inline void vop_cfg_done(struct vop *vop) in vop_cfg_done() argument
204 VOP_REG_SET(vop, common, cfg_done, 1); in vop_cfg_done()
280 static void scl_vop_cal_scl_fac(struct vop *vop, const struct vop_win_data *win, in scl_vop_cal_scl_fac() argument
304 DRM_DEV_ERROR(vop->dev, "Maximum dst width (3840) exceeded\n"); in scl_vop_cal_scl_fac()
309 VOP_SCL_SET(vop, win, scale_yrgb_x, in scl_vop_cal_scl_fac()
311 VOP_SCL_SET(vop, win, scale_yrgb_y, in scl_vop_cal_scl_fac()
314 VOP_SCL_SET(vop, win, scale_cbcr_x, in scl_vop_cal_scl_fac()
316 VOP_SCL_SET(vop, win, scale_cbcr_y, in scl_vop_cal_scl_fac()
339 VOP_SCL_SET_EXT(vop, win, lb_mode, lb_mode); in scl_vop_cal_scl_fac()
342 DRM_DEV_ERROR(vop->dev, "not allow yrgb ver scale\n"); in scl_vop_cal_scl_fac()
346 DRM_DEV_ERROR(vop->dev, "not allow cbcr ver scale\n"); in scl_vop_cal_scl_fac()
358 VOP_SCL_SET(vop, win, scale_yrgb_x, val); in scl_vop_cal_scl_fac()
361 VOP_SCL_SET(vop, win, scale_yrgb_y, val); in scl_vop_cal_scl_fac()
363 VOP_SCL_SET_EXT(vop, win, vsd_yrgb_gt4, vskiplines == 4); in scl_vop_cal_scl_fac()
364 VOP_SCL_SET_EXT(vop, win, vsd_yrgb_gt2, vskiplines == 2); in scl_vop_cal_scl_fac()
366 VOP_SCL_SET_EXT(vop, win, yrgb_hor_scl_mode, yrgb_hor_scl_mode); in scl_vop_cal_scl_fac()
367 VOP_SCL_SET_EXT(vop, win, yrgb_ver_scl_mode, yrgb_ver_scl_mode); in scl_vop_cal_scl_fac()
368 VOP_SCL_SET_EXT(vop, win, yrgb_hsd_mode, SCALE_DOWN_BIL); in scl_vop_cal_scl_fac()
369 VOP_SCL_SET_EXT(vop, win, yrgb_vsd_mode, SCALE_DOWN_BIL); in scl_vop_cal_scl_fac()
370 VOP_SCL_SET_EXT(vop, win, yrgb_vsu_mode, vsu_mode); in scl_vop_cal_scl_fac()
374 VOP_SCL_SET(vop, win, scale_cbcr_x, val); in scl_vop_cal_scl_fac()
377 VOP_SCL_SET(vop, win, scale_cbcr_y, val); in scl_vop_cal_scl_fac()
379 VOP_SCL_SET_EXT(vop, win, vsd_cbcr_gt4, vskiplines == 4); in scl_vop_cal_scl_fac()
380 VOP_SCL_SET_EXT(vop, win, vsd_cbcr_gt2, vskiplines == 2); in scl_vop_cal_scl_fac()
381 VOP_SCL_SET_EXT(vop, win, cbcr_hor_scl_mode, cbcr_hor_scl_mode); in scl_vop_cal_scl_fac()
382 VOP_SCL_SET_EXT(vop, win, cbcr_ver_scl_mode, cbcr_ver_scl_mode); in scl_vop_cal_scl_fac()
383 VOP_SCL_SET_EXT(vop, win, cbcr_hsd_mode, SCALE_DOWN_BIL); in scl_vop_cal_scl_fac()
384 VOP_SCL_SET_EXT(vop, win, cbcr_vsd_mode, SCALE_DOWN_BIL); in scl_vop_cal_scl_fac()
385 VOP_SCL_SET_EXT(vop, win, cbcr_vsu_mode, vsu_mode); in scl_vop_cal_scl_fac()
389 static void vop_dsp_hold_valid_irq_enable(struct vop *vop) in vop_dsp_hold_valid_irq_enable() argument
393 if (WARN_ON(!vop->is_enabled)) in vop_dsp_hold_valid_irq_enable()
396 spin_lock_irqsave(&vop->irq_lock, flags); in vop_dsp_hold_valid_irq_enable()
398 VOP_INTR_SET_TYPE(vop, clear, DSP_HOLD_VALID_INTR, 1); in vop_dsp_hold_valid_irq_enable()
399 VOP_INTR_SET_TYPE(vop, enable, DSP_HOLD_VALID_INTR, 1); in vop_dsp_hold_valid_irq_enable()
401 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_dsp_hold_valid_irq_enable()
404 static void vop_dsp_hold_valid_irq_disable(struct vop *vop) in vop_dsp_hold_valid_irq_disable() argument
408 if (WARN_ON(!vop->is_enabled)) in vop_dsp_hold_valid_irq_disable()
411 spin_lock_irqsave(&vop->irq_lock, flags); in vop_dsp_hold_valid_irq_disable()
413 VOP_INTR_SET_TYPE(vop, enable, DSP_HOLD_VALID_INTR, 0); in vop_dsp_hold_valid_irq_disable()
415 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_dsp_hold_valid_irq_disable()
440 static bool vop_line_flag_irq_is_enabled(struct vop *vop) in vop_line_flag_irq_is_enabled() argument
445 spin_lock_irqsave(&vop->irq_lock, flags); in vop_line_flag_irq_is_enabled()
447 line_flag_irq = VOP_INTR_GET_TYPE(vop, enable, LINE_FLAG_INTR); in vop_line_flag_irq_is_enabled()
449 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_line_flag_irq_is_enabled()
454 static void vop_line_flag_irq_enable(struct vop *vop) in vop_line_flag_irq_enable() argument
458 if (WARN_ON(!vop->is_enabled)) in vop_line_flag_irq_enable()
461 spin_lock_irqsave(&vop->irq_lock, flags); in vop_line_flag_irq_enable()
463 VOP_INTR_SET_TYPE(vop, clear, LINE_FLAG_INTR, 1); in vop_line_flag_irq_enable()
464 VOP_INTR_SET_TYPE(vop, enable, LINE_FLAG_INTR, 1); in vop_line_flag_irq_enable()
466 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_line_flag_irq_enable()
469 static void vop_line_flag_irq_disable(struct vop *vop) in vop_line_flag_irq_disable() argument
473 if (WARN_ON(!vop->is_enabled)) in vop_line_flag_irq_disable()
476 spin_lock_irqsave(&vop->irq_lock, flags); in vop_line_flag_irq_disable()
478 VOP_INTR_SET_TYPE(vop, enable, LINE_FLAG_INTR, 0); in vop_line_flag_irq_disable()
480 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_line_flag_irq_disable()
483 static int vop_core_clks_enable(struct vop *vop) in vop_core_clks_enable() argument
487 ret = clk_enable(vop->hclk); in vop_core_clks_enable()
491 ret = clk_enable(vop->aclk); in vop_core_clks_enable()
498 clk_disable(vop->hclk); in vop_core_clks_enable()
502 static void vop_core_clks_disable(struct vop *vop) in vop_core_clks_disable() argument
504 clk_disable(vop->aclk); in vop_core_clks_disable()
505 clk_disable(vop->hclk); in vop_core_clks_disable()
510 struct vop *vop = to_vop(crtc); in vop_enable() local
513 ret = pm_runtime_get_sync(vop->dev); in vop_enable()
515 DRM_DEV_ERROR(vop->dev, "failed to get pm runtime: %d\n", ret); in vop_enable()
519 ret = vop_core_clks_enable(vop); in vop_enable()
523 ret = clk_enable(vop->dclk); in vop_enable()
533 ret = rockchip_drm_dma_attach_device(vop->drm_dev, vop->dev); in vop_enable()
535 DRM_DEV_ERROR(vop->dev, in vop_enable()
540 spin_lock(&vop->reg_lock); in vop_enable()
541 for (i = 0; i < vop->len; i += 4) in vop_enable()
542 writel_relaxed(vop->regsbak[i / 4], vop->regs + i); in vop_enable()
549 for (i = 0; i < vop->data->win_size; i++) { in vop_enable()
550 struct vop_win *vop_win = &vop->win[i]; in vop_enable()
553 VOP_WIN_SET(vop, win, enable, 0); in vop_enable()
555 spin_unlock(&vop->reg_lock); in vop_enable()
557 vop_cfg_done(vop); in vop_enable()
562 vop->is_enabled = true; in vop_enable()
564 spin_lock(&vop->reg_lock); in vop_enable()
566 VOP_REG_SET(vop, common, standby, 1); in vop_enable()
568 spin_unlock(&vop->reg_lock); in vop_enable()
575 clk_disable(vop->dclk); in vop_enable()
577 vop_core_clks_disable(vop); in vop_enable()
579 pm_runtime_put_sync(vop->dev); in vop_enable()
586 struct vop *vop = to_vop(crtc); in vop_crtc_atomic_disable() local
588 WARN_ON(vop->event); in vop_crtc_atomic_disable()
590 mutex_lock(&vop->vop_lock); in vop_crtc_atomic_disable()
600 reinit_completion(&vop->dsp_hold_completion); in vop_crtc_atomic_disable()
601 vop_dsp_hold_valid_irq_enable(vop); in vop_crtc_atomic_disable()
603 spin_lock(&vop->reg_lock); in vop_crtc_atomic_disable()
605 VOP_REG_SET(vop, common, standby, 1); in vop_crtc_atomic_disable()
607 spin_unlock(&vop->reg_lock); in vop_crtc_atomic_disable()
609 wait_for_completion(&vop->dsp_hold_completion); in vop_crtc_atomic_disable()
611 vop_dsp_hold_valid_irq_disable(vop); in vop_crtc_atomic_disable()
613 vop->is_enabled = false; in vop_crtc_atomic_disable()
618 rockchip_drm_dma_detach_device(vop->drm_dev, vop->dev); in vop_crtc_atomic_disable()
620 clk_disable(vop->dclk); in vop_crtc_atomic_disable()
621 vop_core_clks_disable(vop); in vop_crtc_atomic_disable()
622 pm_runtime_put(vop->dev); in vop_crtc_atomic_disable()
623 mutex_unlock(&vop->vop_lock); in vop_crtc_atomic_disable()
690 struct vop *vop = to_vop(old_state->crtc); in vop_plane_atomic_disable() local
695 spin_lock(&vop->reg_lock); in vop_plane_atomic_disable()
697 VOP_WIN_SET(vop, win, enable, 0); in vop_plane_atomic_disable()
699 spin_unlock(&vop->reg_lock); in vop_plane_atomic_disable()
709 struct vop *vop = to_vop(state->crtc); in vop_plane_atomic_update() local
731 if (WARN_ON(!vop->is_enabled)) in vop_plane_atomic_update()
759 spin_lock(&vop->reg_lock); in vop_plane_atomic_update()
761 VOP_WIN_SET(vop, win, format, format); in vop_plane_atomic_update()
762 VOP_WIN_SET(vop, win, yrgb_vir, DIV_ROUND_UP(fb->pitches[0], 4)); in vop_plane_atomic_update()
763 VOP_WIN_SET(vop, win, yrgb_mst, dma_addr); in vop_plane_atomic_update()
776 VOP_WIN_SET(vop, win, uv_vir, DIV_ROUND_UP(fb->pitches[1], 4)); in vop_plane_atomic_update()
777 VOP_WIN_SET(vop, win, uv_mst, dma_addr); in vop_plane_atomic_update()
781 scl_vop_cal_scl_fac(vop, win, actual_w, actual_h, in vop_plane_atomic_update()
785 VOP_WIN_SET(vop, win, act_info, act_info); in vop_plane_atomic_update()
786 VOP_WIN_SET(vop, win, dsp_info, dsp_info); in vop_plane_atomic_update()
787 VOP_WIN_SET(vop, win, dsp_st, dsp_st); in vop_plane_atomic_update()
790 VOP_WIN_SET(vop, win, rb_swap, rb_swap); in vop_plane_atomic_update()
800 VOP_WIN_SET(vop, win, dst_alpha_ctl, in vop_plane_atomic_update()
807 VOP_WIN_SET(vop, win, src_alpha_ctl, val); in vop_plane_atomic_update()
809 VOP_WIN_SET(vop, win, src_alpha_ctl, SRC_ALPHA_EN(0)); in vop_plane_atomic_update()
812 VOP_WIN_SET(vop, win, enable, 1); in vop_plane_atomic_update()
813 spin_unlock(&vop->reg_lock); in vop_plane_atomic_update()
833 struct vop *vop = to_vop(crtc); in vop_crtc_enable_vblank() local
836 if (WARN_ON(!vop->is_enabled)) in vop_crtc_enable_vblank()
839 spin_lock_irqsave(&vop->irq_lock, flags); in vop_crtc_enable_vblank()
841 VOP_INTR_SET_TYPE(vop, clear, FS_INTR, 1); in vop_crtc_enable_vblank()
842 VOP_INTR_SET_TYPE(vop, enable, FS_INTR, 1); in vop_crtc_enable_vblank()
844 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_crtc_enable_vblank()
851 struct vop *vop = to_vop(crtc); in vop_crtc_disable_vblank() local
854 if (WARN_ON(!vop->is_enabled)) in vop_crtc_disable_vblank()
857 spin_lock_irqsave(&vop->irq_lock, flags); in vop_crtc_disable_vblank()
859 VOP_INTR_SET_TYPE(vop, enable, FS_INTR, 0); in vop_crtc_disable_vblank()
861 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_crtc_disable_vblank()
868 struct vop *vop = to_vop(crtc); in vop_crtc_mode_fixup() local
871 clk_round_rate(vop->dclk, mode->clock * 1000) / 1000; in vop_crtc_mode_fixup()
879 struct vop *vop = to_vop(crtc); in vop_crtc_atomic_enable() local
880 const struct vop_data *vop_data = vop->data; in vop_crtc_atomic_enable()
896 mutex_lock(&vop->vop_lock); in vop_crtc_atomic_enable()
898 WARN_ON(vop->event); in vop_crtc_atomic_enable()
902 mutex_unlock(&vop->vop_lock); in vop_crtc_atomic_enable()
903 DRM_DEV_ERROR(vop->dev, "Failed to enable vop (%d)\n", ret); in vop_crtc_atomic_enable()
912 VOP_REG_SET(vop, output, pin_pol, pin_pol); in vop_crtc_atomic_enable()
916 VOP_REG_SET(vop, output, rgb_en, 1); in vop_crtc_atomic_enable()
917 VOP_REG_SET(vop, output, rgb_pin_pol, pin_pol); in vop_crtc_atomic_enable()
920 VOP_REG_SET(vop, output, edp_pin_pol, pin_pol); in vop_crtc_atomic_enable()
921 VOP_REG_SET(vop, output, edp_en, 1); in vop_crtc_atomic_enable()
924 VOP_REG_SET(vop, output, hdmi_pin_pol, pin_pol); in vop_crtc_atomic_enable()
925 VOP_REG_SET(vop, output, hdmi_en, 1); in vop_crtc_atomic_enable()
928 VOP_REG_SET(vop, output, mipi_pin_pol, pin_pol); in vop_crtc_atomic_enable()
929 VOP_REG_SET(vop, output, mipi_en, 1); in vop_crtc_atomic_enable()
933 VOP_REG_SET(vop, output, dp_pin_pol, pin_pol); in vop_crtc_atomic_enable()
934 VOP_REG_SET(vop, output, dp_en, 1); in vop_crtc_atomic_enable()
937 DRM_DEV_ERROR(vop->dev, "unsupported connector_type [%d]\n", in vop_crtc_atomic_enable()
949 VOP_REG_SET(vop, common, pre_dither_down, 1); in vop_crtc_atomic_enable()
951 VOP_REG_SET(vop, common, pre_dither_down, 0); in vop_crtc_atomic_enable()
953 VOP_REG_SET(vop, common, out_mode, s->output_mode); in vop_crtc_atomic_enable()
955 VOP_REG_SET(vop, modeset, htotal_pw, (htotal << 16) | hsync_len); in vop_crtc_atomic_enable()
958 VOP_REG_SET(vop, modeset, hact_st_end, val); in vop_crtc_atomic_enable()
959 VOP_REG_SET(vop, modeset, hpost_st_end, val); in vop_crtc_atomic_enable()
961 VOP_REG_SET(vop, modeset, vtotal_pw, (vtotal << 16) | vsync_len); in vop_crtc_atomic_enable()
964 VOP_REG_SET(vop, modeset, vact_st_end, val); in vop_crtc_atomic_enable()
965 VOP_REG_SET(vop, modeset, vpost_st_end, val); in vop_crtc_atomic_enable()
967 VOP_REG_SET(vop, intr, line_flag_num[0], vact_end); in vop_crtc_atomic_enable()
969 clk_set_rate(vop->dclk, adjusted_mode->clock * 1000); in vop_crtc_atomic_enable()
971 VOP_REG_SET(vop, common, standby, 0); in vop_crtc_atomic_enable()
972 mutex_unlock(&vop->vop_lock); in vop_crtc_atomic_enable()
975 static bool vop_fs_irq_is_pending(struct vop *vop) in vop_fs_irq_is_pending() argument
977 return VOP_INTR_GET_TYPE(vop, status, FS_INTR); in vop_fs_irq_is_pending()
980 static void vop_wait_for_irq_handler(struct vop *vop) in vop_wait_for_irq_handler() argument
993 ret = readx_poll_timeout_atomic(vop_fs_irq_is_pending, vop, pending, in vop_wait_for_irq_handler()
996 DRM_DEV_ERROR(vop->dev, "VOP vblank IRQ stuck for 10 ms\n"); in vop_wait_for_irq_handler()
998 synchronize_irq(vop->irq); in vop_wait_for_irq_handler()
1006 struct vop *vop = to_vop(crtc); in vop_crtc_atomic_flush() local
1010 if (WARN_ON(!vop->is_enabled)) in vop_crtc_atomic_flush()
1013 spin_lock(&vop->reg_lock); in vop_crtc_atomic_flush()
1015 vop_cfg_done(vop); in vop_crtc_atomic_flush()
1017 spin_unlock(&vop->reg_lock); in vop_crtc_atomic_flush()
1024 vop_wait_for_irq_handler(vop); in vop_crtc_atomic_flush()
1029 WARN_ON(vop->event); in vop_crtc_atomic_flush()
1031 vop->event = crtc->state->event; in vop_crtc_atomic_flush()
1046 drm_flip_work_queue(&vop->fb_unref_work, old_plane_state->fb); in vop_crtc_atomic_flush()
1047 set_bit(VOP_PENDING_FB_UNREF, &vop->pending); in vop_crtc_atomic_flush()
1096 static struct drm_connector *vop_get_edp_connector(struct vop *vop) in vop_get_edp_connector() argument
1101 drm_connector_list_iter_begin(vop->drm_dev, &conn_iter); in vop_get_edp_connector()
1116 struct vop *vop = to_vop(crtc); in vop_crtc_set_crc_source() local
1120 connector = vop_get_edp_connector(vop); in vop_crtc_set_crc_source()
1157 struct vop *vop = container_of(work, struct vop, fb_unref_work); in vop_fb_unref_worker() local
1160 drm_crtc_vblank_put(&vop->crtc); in vop_fb_unref_worker()
1164 static void vop_handle_vblank(struct vop *vop) in vop_handle_vblank() argument
1166 struct drm_device *drm = vop->drm_dev; in vop_handle_vblank()
1167 struct drm_crtc *crtc = &vop->crtc; in vop_handle_vblank()
1170 if (vop->event) { in vop_handle_vblank()
1171 drm_crtc_send_vblank_event(crtc, vop->event); in vop_handle_vblank()
1173 vop->event = NULL; in vop_handle_vblank()
1177 if (test_and_clear_bit(VOP_PENDING_FB_UNREF, &vop->pending)) in vop_handle_vblank()
1178 drm_flip_work_commit(&vop->fb_unref_work, system_unbound_wq); in vop_handle_vblank()
1183 struct vop *vop = data; in vop_isr() local
1184 struct drm_crtc *crtc = &vop->crtc; in vop_isr()
1192 if (!pm_runtime_get_if_in_use(vop->dev)) in vop_isr()
1195 if (vop_core_clks_enable(vop)) { in vop_isr()
1196 DRM_DEV_ERROR_RATELIMITED(vop->dev, "couldn't enable clocks\n"); in vop_isr()
1204 spin_lock(&vop->irq_lock); in vop_isr()
1206 active_irqs = VOP_INTR_GET_TYPE(vop, status, INTR_MASK); in vop_isr()
1209 VOP_INTR_SET_TYPE(vop, clear, active_irqs, 1); in vop_isr()
1211 spin_unlock(&vop->irq_lock); in vop_isr()
1218 complete(&vop->dsp_hold_completion); in vop_isr()
1224 complete(&vop->line_flag_completion); in vop_isr()
1231 vop_handle_vblank(vop); in vop_isr()
1238 DRM_DEV_ERROR(vop->dev, "Unknown VOP IRQs: %#02x\n", in vop_isr()
1242 vop_core_clks_disable(vop); in vop_isr()
1244 pm_runtime_put(vop->dev); in vop_isr()
1248 static int vop_create_crtc(struct vop *vop) in vop_create_crtc() argument
1250 const struct vop_data *vop_data = vop->data; in vop_create_crtc()
1251 struct device *dev = vop->dev; in vop_create_crtc()
1252 struct drm_device *drm_dev = vop->drm_dev; in vop_create_crtc()
1254 struct drm_crtc *crtc = &vop->crtc; in vop_create_crtc()
1265 struct vop_win *vop_win = &vop->win[i]; in vop_create_crtc()
1272 ret = drm_universal_plane_init(vop->drm_dev, &vop_win->base, in vop_create_crtc()
1278 DRM_DEV_ERROR(vop->dev, "failed to init plane %d\n", in vop_create_crtc()
1303 struct vop_win *vop_win = &vop->win[i]; in vop_create_crtc()
1310 ret = drm_universal_plane_init(vop->drm_dev, &vop_win->base, in vop_create_crtc()
1317 DRM_DEV_ERROR(vop->dev, "failed to init overlay %d\n", in vop_create_crtc()
1326 DRM_DEV_ERROR(vop->dev, "no port node found in %pOF\n", in vop_create_crtc()
1332 drm_flip_work_init(&vop->fb_unref_work, "fb_unref", in vop_create_crtc()
1335 init_completion(&vop->dsp_hold_completion); in vop_create_crtc()
1336 init_completion(&vop->line_flag_completion); in vop_create_crtc()
1350 static void vop_destroy_crtc(struct vop *vop) in vop_destroy_crtc() argument
1352 struct drm_crtc *crtc = &vop->crtc; in vop_destroy_crtc()
1353 struct drm_device *drm_dev = vop->drm_dev; in vop_destroy_crtc()
1375 drm_flip_work_cleanup(&vop->fb_unref_work); in vop_destroy_crtc()
1378 static int vop_initial(struct vop *vop) in vop_initial() argument
1380 const struct vop_data *vop_data = vop->data; in vop_initial()
1384 vop->hclk = devm_clk_get(vop->dev, "hclk_vop"); in vop_initial()
1385 if (IS_ERR(vop->hclk)) { in vop_initial()
1386 DRM_DEV_ERROR(vop->dev, "failed to get hclk source\n"); in vop_initial()
1387 return PTR_ERR(vop->hclk); in vop_initial()
1389 vop->aclk = devm_clk_get(vop->dev, "aclk_vop"); in vop_initial()
1390 if (IS_ERR(vop->aclk)) { in vop_initial()
1391 DRM_DEV_ERROR(vop->dev, "failed to get aclk source\n"); in vop_initial()
1392 return PTR_ERR(vop->aclk); in vop_initial()
1394 vop->dclk = devm_clk_get(vop->dev, "dclk_vop"); in vop_initial()
1395 if (IS_ERR(vop->dclk)) { in vop_initial()
1396 DRM_DEV_ERROR(vop->dev, "failed to get dclk source\n"); in vop_initial()
1397 return PTR_ERR(vop->dclk); in vop_initial()
1400 ret = pm_runtime_get_sync(vop->dev); in vop_initial()
1402 DRM_DEV_ERROR(vop->dev, "failed to get pm runtime: %d\n", ret); in vop_initial()
1406 ret = clk_prepare(vop->dclk); in vop_initial()
1408 DRM_DEV_ERROR(vop->dev, "failed to prepare dclk\n"); in vop_initial()
1413 ret = clk_prepare_enable(vop->hclk); in vop_initial()
1415 DRM_DEV_ERROR(vop->dev, "failed to prepare/enable hclk\n"); in vop_initial()
1419 ret = clk_prepare_enable(vop->aclk); in vop_initial()
1421 DRM_DEV_ERROR(vop->dev, "failed to prepare/enable aclk\n"); in vop_initial()
1428 ahb_rst = devm_reset_control_get(vop->dev, "ahb"); in vop_initial()
1430 DRM_DEV_ERROR(vop->dev, "failed to get ahb reset\n"); in vop_initial()
1438 VOP_INTR_SET_TYPE(vop, clear, INTR_MASK, 1); in vop_initial()
1439 VOP_INTR_SET_TYPE(vop, enable, INTR_MASK, 0); in vop_initial()
1441 for (i = 0; i < vop->len; i += sizeof(u32)) in vop_initial()
1442 vop->regsbak[i / 4] = readl_relaxed(vop->regs + i); in vop_initial()
1444 VOP_REG_SET(vop, misc, global_regdone_en, 1); in vop_initial()
1445 VOP_REG_SET(vop, common, dsp_blank, 0); in vop_initial()
1451 VOP_WIN_SET(vop, win, channel, (channel + 1) << 4 | channel); in vop_initial()
1452 VOP_WIN_SET(vop, win, enable, 0); in vop_initial()
1453 VOP_WIN_SET(vop, win, gate, 1); in vop_initial()
1456 vop_cfg_done(vop); in vop_initial()
1461 vop->dclk_rst = devm_reset_control_get(vop->dev, "dclk"); in vop_initial()
1462 if (IS_ERR(vop->dclk_rst)) { in vop_initial()
1463 DRM_DEV_ERROR(vop->dev, "failed to get dclk reset\n"); in vop_initial()
1464 ret = PTR_ERR(vop->dclk_rst); in vop_initial()
1467 reset_control_assert(vop->dclk_rst); in vop_initial()
1469 reset_control_deassert(vop->dclk_rst); in vop_initial()
1471 clk_disable(vop->hclk); in vop_initial()
1472 clk_disable(vop->aclk); in vop_initial()
1474 vop->is_enabled = false; in vop_initial()
1476 pm_runtime_put_sync(vop->dev); in vop_initial()
1481 clk_disable_unprepare(vop->aclk); in vop_initial()
1483 clk_disable_unprepare(vop->hclk); in vop_initial()
1485 clk_unprepare(vop->dclk); in vop_initial()
1487 pm_runtime_put_sync(vop->dev); in vop_initial()
1494 static void vop_win_init(struct vop *vop) in vop_win_init() argument
1496 const struct vop_data *vop_data = vop->data; in vop_win_init()
1500 struct vop_win *vop_win = &vop->win[i]; in vop_win_init()
1504 vop_win->vop = vop; in vop_win_init()
1520 struct vop *vop = to_vop(crtc); in rockchip_drm_wait_vact_end() local
1524 if (!crtc || !vop->is_enabled) in rockchip_drm_wait_vact_end()
1527 mutex_lock(&vop->vop_lock); in rockchip_drm_wait_vact_end()
1533 if (vop_line_flag_irq_is_enabled(vop)) { in rockchip_drm_wait_vact_end()
1538 reinit_completion(&vop->line_flag_completion); in rockchip_drm_wait_vact_end()
1539 vop_line_flag_irq_enable(vop); in rockchip_drm_wait_vact_end()
1541 jiffies_left = wait_for_completion_timeout(&vop->line_flag_completion, in rockchip_drm_wait_vact_end()
1543 vop_line_flag_irq_disable(vop); in rockchip_drm_wait_vact_end()
1546 DRM_DEV_ERROR(vop->dev, "Timeout waiting for IRQ\n"); in rockchip_drm_wait_vact_end()
1552 mutex_unlock(&vop->vop_lock); in rockchip_drm_wait_vact_end()
1562 struct vop *vop; in vop_bind() local
1572 alloc_size = sizeof(*vop) + sizeof(*vop->win) * vop_data->win_size; in vop_bind()
1573 vop = devm_kzalloc(dev, alloc_size, GFP_KERNEL); in vop_bind()
1574 if (!vop) in vop_bind()
1577 vop->dev = dev; in vop_bind()
1578 vop->data = vop_data; in vop_bind()
1579 vop->drm_dev = drm_dev; in vop_bind()
1580 dev_set_drvdata(dev, vop); in vop_bind()
1582 vop_win_init(vop); in vop_bind()
1585 vop->len = resource_size(res); in vop_bind()
1586 vop->regs = devm_ioremap_resource(dev, res); in vop_bind()
1587 if (IS_ERR(vop->regs)) in vop_bind()
1588 return PTR_ERR(vop->regs); in vop_bind()
1590 vop->regsbak = devm_kzalloc(dev, vop->len, GFP_KERNEL); in vop_bind()
1591 if (!vop->regsbak) in vop_bind()
1599 vop->irq = (unsigned int)irq; in vop_bind()
1601 spin_lock_init(&vop->reg_lock); in vop_bind()
1602 spin_lock_init(&vop->irq_lock); in vop_bind()
1603 mutex_init(&vop->vop_lock); in vop_bind()
1605 ret = vop_create_crtc(vop); in vop_bind()
1611 ret = vop_initial(vop); in vop_bind()
1618 ret = devm_request_irq(dev, vop->irq, vop_isr, in vop_bind()
1619 IRQF_SHARED, dev_name(dev), vop); in vop_bind()
1627 vop_destroy_crtc(vop); in vop_bind()
1633 struct vop *vop = dev_get_drvdata(dev); in vop_unbind() local
1636 vop_destroy_crtc(vop); in vop_unbind()
1638 clk_unprepare(vop->aclk); in vop_unbind()
1639 clk_unprepare(vop->hclk); in vop_unbind()
1640 clk_unprepare(vop->dclk); in vop_unbind()