Lines Matching refs:vop
61 #define VOP_WIN_GET_YRGBADDR(vop, win) \ argument
62 vop_readl(vop, win->base + win->phy->yrgb_mst.offset)
64 #define to_vop(x) container_of(x, struct vop, crtc)
77 struct vop *vop; member
83 struct vop { struct
379 static inline void vop_writel(struct vop *vop, uint32_t offset, uint32_t v) in vop_writel() argument
381 writel(v, vop->regs + offset); in vop_writel()
382 vop->regsbak[offset >> 2] = v; in vop_writel()
385 static inline uint32_t vop_readl(struct vop *vop, uint32_t offset) in vop_readl() argument
387 return readl(vop->regs + offset); in vop_readl()
390 static inline uint32_t vop_read_reg(struct vop *vop, uint32_t base, in vop_read_reg() argument
393 return (vop_readl(vop, base + reg->offset) >> reg->shift) & reg->mask; in vop_read_reg()
396 static inline void vop_cfg_done(struct vop *vop) in vop_cfg_done() argument
398 writel(0x01, vop->regs + REG_CFG_DONE); in vop_cfg_done()
401 static inline void vop_mask_write(struct vop *vop, uint32_t offset, in vop_mask_write() argument
405 uint32_t cached_val = vop->regsbak[offset >> 2]; in vop_mask_write()
408 writel(cached_val, vop->regs + offset); in vop_mask_write()
409 vop->regsbak[offset >> 2] = cached_val; in vop_mask_write()
413 static inline void vop_mask_write_relaxed(struct vop *vop, uint32_t offset, in vop_mask_write_relaxed() argument
417 uint32_t cached_val = vop->regsbak[offset >> 2]; in vop_mask_write_relaxed()
420 writel_relaxed(cached_val, vop->regs + offset); in vop_mask_write_relaxed()
421 vop->regsbak[offset >> 2] = cached_val; in vop_mask_write_relaxed()
518 static void scl_vop_cal_scl_fac(struct vop *vop, const struct vop_win_data *win, in scl_vop_cal_scl_fac() argument
557 VOP_SCL_SET(vop, win, lb_mode, lb_mode); in scl_vop_cal_scl_fac()
576 VOP_SCL_SET(vop, win, scale_yrgb_x, val); in scl_vop_cal_scl_fac()
579 VOP_SCL_SET(vop, win, scale_yrgb_y, val); in scl_vop_cal_scl_fac()
581 VOP_SCL_SET(vop, win, vsd_yrgb_gt4, vskiplines == 4); in scl_vop_cal_scl_fac()
582 VOP_SCL_SET(vop, win, vsd_yrgb_gt2, vskiplines == 2); in scl_vop_cal_scl_fac()
584 VOP_SCL_SET(vop, win, yrgb_hor_scl_mode, yrgb_hor_scl_mode); in scl_vop_cal_scl_fac()
585 VOP_SCL_SET(vop, win, yrgb_ver_scl_mode, yrgb_ver_scl_mode); in scl_vop_cal_scl_fac()
586 VOP_SCL_SET(vop, win, yrgb_hsd_mode, SCALE_DOWN_BIL); in scl_vop_cal_scl_fac()
587 VOP_SCL_SET(vop, win, yrgb_vsd_mode, SCALE_DOWN_BIL); in scl_vop_cal_scl_fac()
588 VOP_SCL_SET(vop, win, yrgb_vsu_mode, vsu_mode); in scl_vop_cal_scl_fac()
592 VOP_SCL_SET(vop, win, scale_cbcr_x, val); in scl_vop_cal_scl_fac()
595 VOP_SCL_SET(vop, win, scale_cbcr_y, val); in scl_vop_cal_scl_fac()
597 VOP_SCL_SET(vop, win, vsd_cbcr_gt4, vskiplines == 4); in scl_vop_cal_scl_fac()
598 VOP_SCL_SET(vop, win, vsd_cbcr_gt2, vskiplines == 2); in scl_vop_cal_scl_fac()
599 VOP_SCL_SET(vop, win, cbcr_hor_scl_mode, cbcr_hor_scl_mode); in scl_vop_cal_scl_fac()
600 VOP_SCL_SET(vop, win, cbcr_ver_scl_mode, cbcr_ver_scl_mode); in scl_vop_cal_scl_fac()
601 VOP_SCL_SET(vop, win, cbcr_hsd_mode, SCALE_DOWN_BIL); in scl_vop_cal_scl_fac()
602 VOP_SCL_SET(vop, win, cbcr_vsd_mode, SCALE_DOWN_BIL); in scl_vop_cal_scl_fac()
603 VOP_SCL_SET(vop, win, cbcr_vsu_mode, vsu_mode); in scl_vop_cal_scl_fac()
607 static void vop_dsp_hold_valid_irq_enable(struct vop *vop) in vop_dsp_hold_valid_irq_enable() argument
611 if (WARN_ON(!vop->is_enabled)) in vop_dsp_hold_valid_irq_enable()
614 spin_lock_irqsave(&vop->irq_lock, flags); in vop_dsp_hold_valid_irq_enable()
616 vop_mask_write(vop, INTR_CTRL0, DSP_HOLD_VALID_INTR_MASK, in vop_dsp_hold_valid_irq_enable()
619 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_dsp_hold_valid_irq_enable()
622 static void vop_dsp_hold_valid_irq_disable(struct vop *vop) in vop_dsp_hold_valid_irq_disable() argument
626 if (WARN_ON(!vop->is_enabled)) in vop_dsp_hold_valid_irq_disable()
629 spin_lock_irqsave(&vop->irq_lock, flags); in vop_dsp_hold_valid_irq_disable()
631 vop_mask_write(vop, INTR_CTRL0, DSP_HOLD_VALID_INTR_MASK, in vop_dsp_hold_valid_irq_disable()
634 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_dsp_hold_valid_irq_disable()
639 struct vop *vop = to_vop(crtc); in vop_enable() local
642 if (vop->is_enabled) in vop_enable()
645 ret = pm_runtime_get_sync(vop->dev); in vop_enable()
647 dev_err(vop->dev, "failed to get pm runtime: %d\n", ret); in vop_enable()
651 ret = clk_enable(vop->hclk); in vop_enable()
653 dev_err(vop->dev, "failed to enable hclk - %d\n", ret); in vop_enable()
657 ret = clk_enable(vop->dclk); in vop_enable()
659 dev_err(vop->dev, "failed to enable dclk - %d\n", ret); in vop_enable()
663 ret = clk_enable(vop->aclk); in vop_enable()
665 dev_err(vop->dev, "failed to enable aclk - %d\n", ret); in vop_enable()
675 ret = rockchip_drm_dma_attach_device(vop->drm_dev, vop->dev); in vop_enable()
677 dev_err(vop->dev, "failed to attach dma mapping, %d\n", ret); in vop_enable()
681 memcpy(vop->regs, vop->regsbak, vop->len); in vop_enable()
685 vop->is_enabled = true; in vop_enable()
687 spin_lock(&vop->reg_lock); in vop_enable()
689 VOP_CTRL_SET(vop, standby, 0); in vop_enable()
691 spin_unlock(&vop->reg_lock); in vop_enable()
693 enable_irq(vop->irq); in vop_enable()
695 drm_vblank_on(vop->drm_dev, vop->pipe); in vop_enable()
700 clk_disable(vop->aclk); in vop_enable()
702 clk_disable(vop->dclk); in vop_enable()
704 clk_disable(vop->hclk); in vop_enable()
709 struct vop *vop = to_vop(crtc); in vop_disable() local
711 if (!vop->is_enabled) in vop_disable()
714 drm_vblank_off(crtc->dev, vop->pipe); in vop_disable()
723 reinit_completion(&vop->dsp_hold_completion); in vop_disable()
724 vop_dsp_hold_valid_irq_enable(vop); in vop_disable()
726 spin_lock(&vop->reg_lock); in vop_disable()
728 VOP_CTRL_SET(vop, standby, 1); in vop_disable()
730 spin_unlock(&vop->reg_lock); in vop_disable()
732 wait_for_completion(&vop->dsp_hold_completion); in vop_disable()
734 vop_dsp_hold_valid_irq_disable(vop); in vop_disable()
736 disable_irq(vop->irq); in vop_disable()
738 vop->is_enabled = false; in vop_disable()
743 rockchip_drm_dma_detach_device(vop->drm_dev, vop->dev); in vop_disable()
745 clk_disable(vop->dclk); in vop_disable()
746 clk_disable(vop->aclk); in vop_disable()
747 clk_disable(vop->hclk); in vop_disable()
748 pm_runtime_put(vop->dev); in vop_disable()
799 struct vop *vop = to_vop(crtc); in vop_update_plane_event() local
919 mutex_lock(&vop->vsync_mutex); in vop_update_plane_event()
921 ret = drm_vblank_get(plane->dev, vop->pipe); in vop_update_plane_event()
924 mutex_unlock(&vop->vsync_mutex); in vop_update_plane_event()
932 drm_vblank_put(plane->dev, vop->pipe); in vop_update_plane_event()
933 mutex_unlock(&vop->vsync_mutex); in vop_update_plane_event()
937 vop->vsync_work_pending = true; in vop_update_plane_event()
939 mutex_unlock(&vop->vsync_mutex); in vop_update_plane_event()
941 spin_lock(&vop->reg_lock); in vop_update_plane_event()
943 VOP_WIN_SET(vop, win, format, format); in vop_update_plane_event()
944 VOP_WIN_SET(vop, win, yrgb_vir, y_vir_stride); in vop_update_plane_event()
945 VOP_WIN_SET(vop, win, yrgb_mst, yrgb_mst); in vop_update_plane_event()
947 VOP_WIN_SET(vop, win, uv_vir, uv_vir_stride); in vop_update_plane_event()
948 VOP_WIN_SET(vop, win, uv_mst, uv_mst); in vop_update_plane_event()
952 scl_vop_cal_scl_fac(vop, win, actual_w, actual_h, in vop_update_plane_event()
958 VOP_WIN_SET(vop, win, act_info, val); in vop_update_plane_event()
962 VOP_WIN_SET(vop, win, dsp_info, val); in vop_update_plane_event()
965 VOP_WIN_SET(vop, win, dsp_st, val); in vop_update_plane_event()
966 VOP_WIN_SET(vop, win, rb_swap, rb_swap); in vop_update_plane_event()
969 VOP_WIN_SET(vop, win, dst_alpha_ctl, in vop_update_plane_event()
976 VOP_WIN_SET(vop, win, src_alpha_ctl, val); in vop_update_plane_event()
978 VOP_WIN_SET(vop, win, src_alpha_ctl, SRC_ALPHA_EN(0)); in vop_update_plane_event()
981 VOP_WIN_SET(vop, win, enable, 1); in vop_update_plane_event()
983 vop_cfg_done(vop); in vop_update_plane_event()
984 spin_unlock(&vop->reg_lock); in vop_update_plane_event()
1018 struct vop *vop; in vop_disable_plane() local
1024 vop = to_vop(plane->crtc); in vop_disable_plane()
1026 ret = drm_vblank_get(plane->dev, vop->pipe); in vop_disable_plane()
1032 mutex_lock(&vop->vsync_mutex); in vop_disable_plane()
1036 drm_vblank_put(plane->dev, vop->pipe); in vop_disable_plane()
1037 mutex_unlock(&vop->vsync_mutex); in vop_disable_plane()
1041 vop->vsync_work_pending = true; in vop_disable_plane()
1042 mutex_unlock(&vop->vsync_mutex); in vop_disable_plane()
1044 spin_lock(&vop->reg_lock); in vop_disable_plane()
1045 VOP_WIN_SET(vop, win, enable, 0); in vop_disable_plane()
1046 vop_cfg_done(vop); in vop_disable_plane()
1047 spin_unlock(&vop->reg_lock); in vop_disable_plane()
1068 struct vop *vop = to_vop(crtc); in rockchip_drm_crtc_mode_config() local
1070 vop->connector_type = connector_type; in rockchip_drm_crtc_mode_config()
1071 vop->connector_out_mode = out_mode; in rockchip_drm_crtc_mode_config()
1079 struct vop *vop = to_vop(crtc); in vop_crtc_enable_vblank() local
1082 if (!vop->is_enabled) in vop_crtc_enable_vblank()
1085 spin_lock_irqsave(&vop->irq_lock, flags); in vop_crtc_enable_vblank()
1087 vop_mask_write(vop, INTR_CTRL0, FS_INTR_MASK, FS_INTR_EN(1)); in vop_crtc_enable_vblank()
1089 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_crtc_enable_vblank()
1096 struct vop *vop = to_vop(crtc); in vop_crtc_disable_vblank() local
1099 if (!vop->is_enabled) in vop_crtc_disable_vblank()
1102 spin_lock_irqsave(&vop->irq_lock, flags); in vop_crtc_disable_vblank()
1103 vop_mask_write(vop, INTR_CTRL0, FS_INTR_MASK, FS_INTR_EN(0)); in vop_crtc_disable_vblank()
1104 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_crtc_disable_vblank()
1168 struct vop *vop = to_vop(crtc); in vop_crtc_mode_set() local
1186 clk_disable(vop->dclk); in vop_crtc_mode_set()
1188 switch (vop->connector_type) { in vop_crtc_mode_set()
1190 VOP_CTRL_SET(vop, rgb_en, 1); in vop_crtc_mode_set()
1193 VOP_CTRL_SET(vop, edp_en, 1); in vop_crtc_mode_set()
1196 VOP_CTRL_SET(vop, hdmi_en, 1); in vop_crtc_mode_set()
1200 vop->connector_type); in vop_crtc_mode_set()
1204 VOP_CTRL_SET(vop, out_mode, vop->connector_out_mode); in vop_crtc_mode_set()
1209 VOP_CTRL_SET(vop, pin_pol, val); in vop_crtc_mode_set()
1211 VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len); in vop_crtc_mode_set()
1214 VOP_CTRL_SET(vop, hact_st_end, val); in vop_crtc_mode_set()
1215 VOP_CTRL_SET(vop, hpost_st_end, val); in vop_crtc_mode_set()
1217 VOP_CTRL_SET(vop, vtotal_pw, (vtotal << 16) | vsync_len); in vop_crtc_mode_set()
1220 VOP_CTRL_SET(vop, vact_st_end, val); in vop_crtc_mode_set()
1221 VOP_CTRL_SET(vop, vpost_st_end, val); in vop_crtc_mode_set()
1231 reset_control_assert(vop->dclk_rst); in vop_crtc_mode_set()
1233 reset_control_deassert(vop->dclk_rst); in vop_crtc_mode_set()
1235 clk_set_rate(vop->dclk, adjusted_mode->clock * 1000); in vop_crtc_mode_set()
1237 ret_clk = clk_enable(vop->dclk); in vop_crtc_mode_set()
1239 dev_err(vop->dev, "failed to enable dclk - %d\n", ret_clk); in vop_crtc_mode_set()
1264 struct vop *vop = to_vop(crtc); in vop_crtc_page_flip() local
1269 if (!vop->is_enabled) { in vop_crtc_page_flip()
1286 struct vop *vop = vop_win->vop; in vop_win_state_complete() local
1287 struct drm_crtc *crtc = &vop->crtc; in vop_win_state_complete()
1298 drm_vblank_put(crtc->dev, vop->pipe); in vop_win_state_complete()
1321 yrgb_mst = VOP_WIN_GET_YRGBADDR(vop_win->vop, vop_win->data); in vop_win_state_is_active()
1328 enabled = VOP_WIN_GET(vop_win->vop, vop_win->data, enable); in vop_win_state_is_active()
1385 struct vop *vop = data; in vop_isr_thread() local
1386 const struct vop_data *vop_data = vop->data; in vop_isr_thread()
1389 mutex_lock(&vop->vsync_mutex); in vop_isr_thread()
1391 if (!vop->vsync_work_pending) in vop_isr_thread()
1394 vop->vsync_work_pending = false; in vop_isr_thread()
1397 struct vop_win *vop_win = &vop->win[i]; in vop_isr_thread()
1401 vop->vsync_work_pending = true; in vop_isr_thread()
1405 mutex_unlock(&vop->vsync_mutex); in vop_isr_thread()
1412 struct vop *vop = data; in vop_isr() local
1421 spin_lock_irqsave(&vop->irq_lock, flags); in vop_isr()
1422 intr0_reg = vop_readl(vop, INTR_CTRL0); in vop_isr()
1426 vop_writel(vop, INTR_CTRL0, in vop_isr()
1428 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_isr()
1435 complete(&vop->dsp_hold_completion); in vop_isr()
1441 drm_handle_vblank(vop->drm_dev, vop->pipe); in vop_isr()
1443 ret = (vop->vsync_work_pending) ? IRQ_WAKE_THREAD : IRQ_HANDLED; in vop_isr()
1453 static int vop_create_crtc(struct vop *vop) in vop_create_crtc() argument
1455 const struct vop_data *vop_data = vop->data; in vop_create_crtc()
1456 struct device *dev = vop->dev; in vop_create_crtc()
1457 struct drm_device *drm_dev = vop->drm_dev; in vop_create_crtc()
1459 struct drm_crtc *crtc = &vop->crtc; in vop_create_crtc()
1470 struct vop_win *vop_win = &vop->win[i]; in vop_create_crtc()
1477 ret = drm_universal_plane_init(vop->drm_dev, &vop_win->base, in vop_create_crtc()
1506 struct vop_win *vop_win = &vop->win[i]; in vop_create_crtc()
1513 ret = drm_universal_plane_init(vop->drm_dev, &vop_win->base, in vop_create_crtc()
1532 init_completion(&vop->dsp_hold_completion); in vop_create_crtc()
1534 vop->pipe = drm_crtc_index(crtc); in vop_create_crtc()
1535 rockchip_register_crtc_funcs(drm_dev, &private_crtc_funcs, vop->pipe); in vop_create_crtc()
1547 static void vop_destroy_crtc(struct vop *vop) in vop_destroy_crtc() argument
1549 struct drm_crtc *crtc = &vop->crtc; in vop_destroy_crtc()
1551 rockchip_unregister_crtc_funcs(vop->drm_dev, vop->pipe); in vop_destroy_crtc()
1556 static int vop_initial(struct vop *vop) in vop_initial() argument
1558 const struct vop_data *vop_data = vop->data; in vop_initial()
1563 vop->hclk = devm_clk_get(vop->dev, "hclk_vop"); in vop_initial()
1564 if (IS_ERR(vop->hclk)) { in vop_initial()
1565 dev_err(vop->dev, "failed to get hclk source\n"); in vop_initial()
1566 return PTR_ERR(vop->hclk); in vop_initial()
1568 vop->aclk = devm_clk_get(vop->dev, "aclk_vop"); in vop_initial()
1569 if (IS_ERR(vop->aclk)) { in vop_initial()
1570 dev_err(vop->dev, "failed to get aclk source\n"); in vop_initial()
1571 return PTR_ERR(vop->aclk); in vop_initial()
1573 vop->dclk = devm_clk_get(vop->dev, "dclk_vop"); in vop_initial()
1574 if (IS_ERR(vop->dclk)) { in vop_initial()
1575 dev_err(vop->dev, "failed to get dclk source\n"); in vop_initial()
1576 return PTR_ERR(vop->dclk); in vop_initial()
1579 ret = clk_prepare(vop->dclk); in vop_initial()
1581 dev_err(vop->dev, "failed to prepare dclk\n"); in vop_initial()
1586 ret = clk_prepare_enable(vop->hclk); in vop_initial()
1588 dev_err(vop->dev, "failed to prepare/enable hclk\n"); in vop_initial()
1592 ret = clk_prepare_enable(vop->aclk); in vop_initial()
1594 dev_err(vop->dev, "failed to prepare/enable aclk\n"); in vop_initial()
1601 ahb_rst = devm_reset_control_get(vop->dev, "ahb"); in vop_initial()
1603 dev_err(vop->dev, "failed to get ahb reset\n"); in vop_initial()
1611 memcpy(vop->regsbak, vop->regs, vop->len); in vop_initial()
1614 vop_writel(vop, init_table[i].offset, init_table[i].value); in vop_initial()
1619 VOP_WIN_SET(vop, win, enable, 0); in vop_initial()
1622 vop_cfg_done(vop); in vop_initial()
1627 vop->dclk_rst = devm_reset_control_get(vop->dev, "dclk"); in vop_initial()
1628 if (IS_ERR(vop->dclk_rst)) { in vop_initial()
1629 dev_err(vop->dev, "failed to get dclk reset\n"); in vop_initial()
1630 ret = PTR_ERR(vop->dclk_rst); in vop_initial()
1633 reset_control_assert(vop->dclk_rst); in vop_initial()
1635 reset_control_deassert(vop->dclk_rst); in vop_initial()
1637 clk_disable(vop->hclk); in vop_initial()
1638 clk_disable(vop->aclk); in vop_initial()
1640 vop->is_enabled = false; in vop_initial()
1645 clk_disable_unprepare(vop->aclk); in vop_initial()
1647 clk_disable_unprepare(vop->hclk); in vop_initial()
1649 clk_unprepare(vop->dclk); in vop_initial()
1656 static void vop_win_init(struct vop *vop) in vop_win_init() argument
1658 const struct vop_data *vop_data = vop->data; in vop_win_init()
1662 struct vop_win *vop_win = &vop->win[i]; in vop_win_init()
1666 vop_win->vop = vop; in vop_win_init()
1677 struct vop *vop; in vop_bind() local
1688 alloc_size = sizeof(*vop) + sizeof(*vop->win) * vop_data->win_size; in vop_bind()
1689 vop = devm_kzalloc(dev, alloc_size, GFP_KERNEL); in vop_bind()
1690 if (!vop) in vop_bind()
1693 vop->dev = dev; in vop_bind()
1694 vop->data = vop_data; in vop_bind()
1695 vop->drm_dev = drm_dev; in vop_bind()
1696 dev_set_drvdata(dev, vop); in vop_bind()
1698 vop_win_init(vop); in vop_bind()
1701 vop->len = resource_size(res); in vop_bind()
1702 vop->regs = devm_ioremap_resource(dev, res); in vop_bind()
1703 if (IS_ERR(vop->regs)) in vop_bind()
1704 return PTR_ERR(vop->regs); in vop_bind()
1706 vop->regsbak = devm_kzalloc(dev, vop->len, GFP_KERNEL); in vop_bind()
1707 if (!vop->regsbak) in vop_bind()
1710 ret = vop_initial(vop); in vop_bind()
1721 vop->irq = (unsigned int)irq; in vop_bind()
1723 spin_lock_init(&vop->reg_lock); in vop_bind()
1724 spin_lock_init(&vop->irq_lock); in vop_bind()
1726 mutex_init(&vop->vsync_mutex); in vop_bind()
1728 ret = devm_request_threaded_irq(dev, vop->irq, vop_isr, vop_isr_thread, in vop_bind()
1729 IRQF_SHARED, dev_name(dev), vop); in vop_bind()
1734 disable_irq(vop->irq); in vop_bind()
1736 ret = vop_create_crtc(vop); in vop_bind()
1746 struct vop *vop = dev_get_drvdata(dev); in vop_unbind() local
1749 vop_destroy_crtc(vop); in vop_unbind()