Lines Matching refs:vop

58 #define VOP_WIN_GET_YRGBADDR(vop, win) \  argument
59 vop_readl(vop, win->base + win->phy->yrgb_mst.offset)
61 #define to_vop(x) container_of(x, struct vop, crtc)
74 struct vop *vop; member
80 struct vop { struct
308 static inline void vop_writel(struct vop *vop, uint32_t offset, uint32_t v) in vop_writel() argument
310 writel(v, vop->regs + offset); in vop_writel()
311 vop->regsbak[offset >> 2] = v; in vop_writel()
314 static inline uint32_t vop_readl(struct vop *vop, uint32_t offset) in vop_readl() argument
316 return readl(vop->regs + offset); in vop_readl()
319 static inline uint32_t vop_read_reg(struct vop *vop, uint32_t base, in vop_read_reg() argument
322 return (vop_readl(vop, base + reg->offset) >> reg->shift) & reg->mask; in vop_read_reg()
325 static inline void vop_cfg_done(struct vop *vop) in vop_cfg_done() argument
327 writel(0x01, vop->regs + REG_CFG_DONE); in vop_cfg_done()
330 static inline void vop_mask_write(struct vop *vop, uint32_t offset, in vop_mask_write() argument
334 uint32_t cached_val = vop->regsbak[offset >> 2]; in vop_mask_write()
337 writel(cached_val, vop->regs + offset); in vop_mask_write()
338 vop->regsbak[offset >> 2] = cached_val; in vop_mask_write()
342 static inline void vop_mask_write_relaxed(struct vop *vop, uint32_t offset, in vop_mask_write_relaxed() argument
346 uint32_t cached_val = vop->regsbak[offset >> 2]; in vop_mask_write_relaxed()
349 writel_relaxed(cached_val, vop->regs + offset); in vop_mask_write_relaxed()
350 vop->regsbak[offset >> 2] = cached_val; in vop_mask_write_relaxed()
386 static void vop_dsp_hold_valid_irq_enable(struct vop *vop) in vop_dsp_hold_valid_irq_enable() argument
390 if (WARN_ON(!vop->is_enabled)) in vop_dsp_hold_valid_irq_enable()
393 spin_lock_irqsave(&vop->irq_lock, flags); in vop_dsp_hold_valid_irq_enable()
395 vop_mask_write(vop, INTR_CTRL0, DSP_HOLD_VALID_INTR_MASK, in vop_dsp_hold_valid_irq_enable()
398 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_dsp_hold_valid_irq_enable()
401 static void vop_dsp_hold_valid_irq_disable(struct vop *vop) in vop_dsp_hold_valid_irq_disable() argument
405 if (WARN_ON(!vop->is_enabled)) in vop_dsp_hold_valid_irq_disable()
408 spin_lock_irqsave(&vop->irq_lock, flags); in vop_dsp_hold_valid_irq_disable()
410 vop_mask_write(vop, INTR_CTRL0, DSP_HOLD_VALID_INTR_MASK, in vop_dsp_hold_valid_irq_disable()
413 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_dsp_hold_valid_irq_disable()
418 struct vop *vop = to_vop(crtc); in vop_enable() local
421 if (vop->is_enabled) in vop_enable()
424 ret = pm_runtime_get_sync(vop->dev); in vop_enable()
426 dev_err(vop->dev, "failed to get pm runtime: %d\n", ret); in vop_enable()
430 ret = clk_enable(vop->hclk); in vop_enable()
432 dev_err(vop->dev, "failed to enable hclk - %d\n", ret); in vop_enable()
436 ret = clk_enable(vop->dclk); in vop_enable()
438 dev_err(vop->dev, "failed to enable dclk - %d\n", ret); in vop_enable()
442 ret = clk_enable(vop->aclk); in vop_enable()
444 dev_err(vop->dev, "failed to enable aclk - %d\n", ret); in vop_enable()
454 ret = rockchip_drm_dma_attach_device(vop->drm_dev, vop->dev); in vop_enable()
456 dev_err(vop->dev, "failed to attach dma mapping, %d\n", ret); in vop_enable()
463 vop->is_enabled = true; in vop_enable()
465 spin_lock(&vop->reg_lock); in vop_enable()
467 VOP_CTRL_SET(vop, standby, 0); in vop_enable()
469 spin_unlock(&vop->reg_lock); in vop_enable()
471 enable_irq(vop->irq); in vop_enable()
473 drm_vblank_on(vop->drm_dev, vop->pipe); in vop_enable()
478 clk_disable(vop->aclk); in vop_enable()
480 clk_disable(vop->dclk); in vop_enable()
482 clk_disable(vop->hclk); in vop_enable()
487 struct vop *vop = to_vop(crtc); in vop_disable() local
489 if (!vop->is_enabled) in vop_disable()
492 drm_vblank_off(crtc->dev, vop->pipe); in vop_disable()
501 reinit_completion(&vop->dsp_hold_completion); in vop_disable()
502 vop_dsp_hold_valid_irq_enable(vop); in vop_disable()
504 spin_lock(&vop->reg_lock); in vop_disable()
506 VOP_CTRL_SET(vop, standby, 1); in vop_disable()
508 spin_unlock(&vop->reg_lock); in vop_disable()
510 wait_for_completion(&vop->dsp_hold_completion); in vop_disable()
512 vop_dsp_hold_valid_irq_disable(vop); in vop_disable()
514 disable_irq(vop->irq); in vop_disable()
516 vop->is_enabled = false; in vop_disable()
521 rockchip_drm_dma_detach_device(vop->drm_dev, vop->dev); in vop_disable()
523 clk_disable(vop->dclk); in vop_disable()
524 clk_disable(vop->aclk); in vop_disable()
525 clk_disable(vop->hclk); in vop_disable()
526 pm_runtime_put(vop->dev); in vop_disable()
577 struct vop *vop = to_vop(crtc); in vop_update_plane_event() local
657 mutex_lock(&vop->vsync_mutex); in vop_update_plane_event()
659 ret = drm_vblank_get(plane->dev, vop->pipe); in vop_update_plane_event()
662 mutex_unlock(&vop->vsync_mutex); in vop_update_plane_event()
670 drm_vblank_put(plane->dev, vop->pipe); in vop_update_plane_event()
671 mutex_unlock(&vop->vsync_mutex); in vop_update_plane_event()
675 vop->vsync_work_pending = true; in vop_update_plane_event()
677 mutex_unlock(&vop->vsync_mutex); in vop_update_plane_event()
679 spin_lock(&vop->reg_lock); in vop_update_plane_event()
681 VOP_WIN_SET(vop, win, format, format); in vop_update_plane_event()
682 VOP_WIN_SET(vop, win, yrgb_vir, y_vir_stride); in vop_update_plane_event()
683 VOP_WIN_SET(vop, win, yrgb_mst, yrgb_mst); in vop_update_plane_event()
686 VOP_WIN_SET(vop, win, act_info, val); in vop_update_plane_event()
687 VOP_WIN_SET(vop, win, dsp_info, val); in vop_update_plane_event()
690 VOP_WIN_SET(vop, win, dsp_st, val); in vop_update_plane_event()
693 VOP_WIN_SET(vop, win, dst_alpha_ctl, in vop_update_plane_event()
700 VOP_WIN_SET(vop, win, src_alpha_ctl, val); in vop_update_plane_event()
702 VOP_WIN_SET(vop, win, src_alpha_ctl, SRC_ALPHA_EN(0)); in vop_update_plane_event()
705 VOP_WIN_SET(vop, win, enable, 1); in vop_update_plane_event()
707 vop_cfg_done(vop); in vop_update_plane_event()
708 spin_unlock(&vop->reg_lock); in vop_update_plane_event()
742 struct vop *vop; in vop_disable_plane() local
748 vop = to_vop(plane->crtc); in vop_disable_plane()
750 ret = drm_vblank_get(plane->dev, vop->pipe); in vop_disable_plane()
756 mutex_lock(&vop->vsync_mutex); in vop_disable_plane()
760 drm_vblank_put(plane->dev, vop->pipe); in vop_disable_plane()
761 mutex_unlock(&vop->vsync_mutex); in vop_disable_plane()
765 vop->vsync_work_pending = true; in vop_disable_plane()
766 mutex_unlock(&vop->vsync_mutex); in vop_disable_plane()
768 spin_lock(&vop->reg_lock); in vop_disable_plane()
769 VOP_WIN_SET(vop, win, enable, 0); in vop_disable_plane()
770 vop_cfg_done(vop); in vop_disable_plane()
771 spin_unlock(&vop->reg_lock); in vop_disable_plane()
792 struct vop *vop = to_vop(crtc); in rockchip_drm_crtc_mode_config() local
794 vop->connector_type = connector_type; in rockchip_drm_crtc_mode_config()
795 vop->connector_out_mode = out_mode; in rockchip_drm_crtc_mode_config()
803 struct vop *vop = to_vop(crtc); in vop_crtc_enable_vblank() local
806 if (!vop->is_enabled) in vop_crtc_enable_vblank()
809 spin_lock_irqsave(&vop->irq_lock, flags); in vop_crtc_enable_vblank()
811 vop_mask_write(vop, INTR_CTRL0, FS_INTR_MASK, FS_INTR_EN(1)); in vop_crtc_enable_vblank()
813 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_crtc_enable_vblank()
820 struct vop *vop = to_vop(crtc); in vop_crtc_disable_vblank() local
823 if (!vop->is_enabled) in vop_crtc_disable_vblank()
826 spin_lock_irqsave(&vop->irq_lock, flags); in vop_crtc_disable_vblank()
827 vop_mask_write(vop, INTR_CTRL0, FS_INTR_MASK, FS_INTR_EN(0)); in vop_crtc_disable_vblank()
828 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_crtc_disable_vblank()
892 struct vop *vop = to_vop(crtc); in vop_crtc_mode_set() local
910 clk_disable(vop->dclk); in vop_crtc_mode_set()
912 switch (vop->connector_type) { in vop_crtc_mode_set()
914 VOP_CTRL_SET(vop, rgb_en, 1); in vop_crtc_mode_set()
917 VOP_CTRL_SET(vop, edp_en, 1); in vop_crtc_mode_set()
920 VOP_CTRL_SET(vop, hdmi_en, 1); in vop_crtc_mode_set()
924 vop->connector_type); in vop_crtc_mode_set()
928 VOP_CTRL_SET(vop, out_mode, vop->connector_out_mode); in vop_crtc_mode_set()
933 VOP_CTRL_SET(vop, pin_pol, val); in vop_crtc_mode_set()
935 VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len); in vop_crtc_mode_set()
938 VOP_CTRL_SET(vop, hact_st_end, val); in vop_crtc_mode_set()
939 VOP_CTRL_SET(vop, hpost_st_end, val); in vop_crtc_mode_set()
941 VOP_CTRL_SET(vop, vtotal_pw, (vtotal << 16) | vsync_len); in vop_crtc_mode_set()
944 VOP_CTRL_SET(vop, vact_st_end, val); in vop_crtc_mode_set()
945 VOP_CTRL_SET(vop, vpost_st_end, val); in vop_crtc_mode_set()
955 reset_control_assert(vop->dclk_rst); in vop_crtc_mode_set()
957 reset_control_deassert(vop->dclk_rst); in vop_crtc_mode_set()
959 clk_set_rate(vop->dclk, adjusted_mode->clock * 1000); in vop_crtc_mode_set()
961 ret_clk = clk_enable(vop->dclk); in vop_crtc_mode_set()
963 dev_err(vop->dev, "failed to enable dclk - %d\n", ret_clk); in vop_crtc_mode_set()
988 struct vop *vop = to_vop(crtc); in vop_crtc_page_flip() local
993 if (!vop->is_enabled) { in vop_crtc_page_flip()
1010 struct vop *vop = vop_win->vop; in vop_win_state_complete() local
1011 struct drm_crtc *crtc = &vop->crtc; in vop_win_state_complete()
1022 drm_vblank_put(crtc->dev, vop->pipe); in vop_win_state_complete()
1045 yrgb_mst = VOP_WIN_GET_YRGBADDR(vop_win->vop, vop_win->data); in vop_win_state_is_active()
1052 enabled = VOP_WIN_GET(vop_win->vop, vop_win->data, enable); in vop_win_state_is_active()
1109 struct vop *vop = data; in vop_isr_thread() local
1110 const struct vop_data *vop_data = vop->data; in vop_isr_thread()
1113 mutex_lock(&vop->vsync_mutex); in vop_isr_thread()
1115 if (!vop->vsync_work_pending) in vop_isr_thread()
1118 vop->vsync_work_pending = false; in vop_isr_thread()
1121 struct vop_win *vop_win = &vop->win[i]; in vop_isr_thread()
1125 vop->vsync_work_pending = true; in vop_isr_thread()
1129 mutex_unlock(&vop->vsync_mutex); in vop_isr_thread()
1136 struct vop *vop = data; in vop_isr() local
1145 spin_lock_irqsave(&vop->irq_lock, flags); in vop_isr()
1146 intr0_reg = vop_readl(vop, INTR_CTRL0); in vop_isr()
1150 vop_writel(vop, INTR_CTRL0, in vop_isr()
1152 spin_unlock_irqrestore(&vop->irq_lock, flags); in vop_isr()
1159 complete(&vop->dsp_hold_completion); in vop_isr()
1165 drm_handle_vblank(vop->drm_dev, vop->pipe); in vop_isr()
1167 ret = (vop->vsync_work_pending) ? IRQ_WAKE_THREAD : IRQ_HANDLED; in vop_isr()
1177 static int vop_create_crtc(struct vop *vop) in vop_create_crtc() argument
1179 const struct vop_data *vop_data = vop->data; in vop_create_crtc()
1180 struct device *dev = vop->dev; in vop_create_crtc()
1181 struct drm_device *drm_dev = vop->drm_dev; in vop_create_crtc()
1183 struct drm_crtc *crtc = &vop->crtc; in vop_create_crtc()
1194 struct vop_win *vop_win = &vop->win[i]; in vop_create_crtc()
1201 ret = drm_universal_plane_init(vop->drm_dev, &vop_win->base, in vop_create_crtc()
1230 struct vop_win *vop_win = &vop->win[i]; in vop_create_crtc()
1237 ret = drm_universal_plane_init(vop->drm_dev, &vop_win->base, in vop_create_crtc()
1256 init_completion(&vop->dsp_hold_completion); in vop_create_crtc()
1258 vop->pipe = drm_crtc_index(crtc); in vop_create_crtc()
1259 rockchip_register_crtc_funcs(drm_dev, &private_crtc_funcs, vop->pipe); in vop_create_crtc()
1271 static void vop_destroy_crtc(struct vop *vop) in vop_destroy_crtc() argument
1273 struct drm_crtc *crtc = &vop->crtc; in vop_destroy_crtc()
1275 rockchip_unregister_crtc_funcs(vop->drm_dev, vop->pipe); in vop_destroy_crtc()
1280 static int vop_initial(struct vop *vop) in vop_initial() argument
1282 const struct vop_data *vop_data = vop->data; in vop_initial()
1287 vop->hclk = devm_clk_get(vop->dev, "hclk_vop"); in vop_initial()
1288 if (IS_ERR(vop->hclk)) { in vop_initial()
1289 dev_err(vop->dev, "failed to get hclk source\n"); in vop_initial()
1290 return PTR_ERR(vop->hclk); in vop_initial()
1292 vop->aclk = devm_clk_get(vop->dev, "aclk_vop"); in vop_initial()
1293 if (IS_ERR(vop->aclk)) { in vop_initial()
1294 dev_err(vop->dev, "failed to get aclk source\n"); in vop_initial()
1295 return PTR_ERR(vop->aclk); in vop_initial()
1297 vop->dclk = devm_clk_get(vop->dev, "dclk_vop"); in vop_initial()
1298 if (IS_ERR(vop->dclk)) { in vop_initial()
1299 dev_err(vop->dev, "failed to get dclk source\n"); in vop_initial()
1300 return PTR_ERR(vop->dclk); in vop_initial()
1303 ret = clk_prepare(vop->hclk); in vop_initial()
1305 dev_err(vop->dev, "failed to prepare hclk\n"); in vop_initial()
1309 ret = clk_prepare(vop->dclk); in vop_initial()
1311 dev_err(vop->dev, "failed to prepare dclk\n"); in vop_initial()
1315 ret = clk_prepare(vop->aclk); in vop_initial()
1317 dev_err(vop->dev, "failed to prepare aclk\n"); in vop_initial()
1324 ret = clk_enable(vop->hclk); in vop_initial()
1326 dev_err(vop->dev, "failed to prepare aclk\n"); in vop_initial()
1332 ahb_rst = devm_reset_control_get(vop->dev, "ahb"); in vop_initial()
1334 dev_err(vop->dev, "failed to get ahb reset\n"); in vop_initial()
1342 memcpy(vop->regsbak, vop->regs, vop->len); in vop_initial()
1345 vop_writel(vop, init_table[i].offset, init_table[i].value); in vop_initial()
1350 VOP_WIN_SET(vop, win, enable, 0); in vop_initial()
1353 vop_cfg_done(vop); in vop_initial()
1358 vop->dclk_rst = devm_reset_control_get(vop->dev, "dclk"); in vop_initial()
1359 if (IS_ERR(vop->dclk_rst)) { in vop_initial()
1360 dev_err(vop->dev, "failed to get dclk reset\n"); in vop_initial()
1361 ret = PTR_ERR(vop->dclk_rst); in vop_initial()
1364 reset_control_assert(vop->dclk_rst); in vop_initial()
1366 reset_control_deassert(vop->dclk_rst); in vop_initial()
1368 clk_disable(vop->hclk); in vop_initial()
1370 vop->is_enabled = false; in vop_initial()
1375 clk_disable(vop->hclk); in vop_initial()
1377 clk_unprepare(vop->aclk); in vop_initial()
1379 clk_unprepare(vop->dclk); in vop_initial()
1381 clk_unprepare(vop->hclk); in vop_initial()
1388 static void vop_win_init(struct vop *vop) in vop_win_init() argument
1390 const struct vop_data *vop_data = vop->data; in vop_win_init()
1394 struct vop_win *vop_win = &vop->win[i]; in vop_win_init()
1398 vop_win->vop = vop; in vop_win_init()
1409 struct vop *vop; in vop_bind() local
1420 alloc_size = sizeof(*vop) + sizeof(*vop->win) * vop_data->win_size; in vop_bind()
1421 vop = devm_kzalloc(dev, alloc_size, GFP_KERNEL); in vop_bind()
1422 if (!vop) in vop_bind()
1425 vop->dev = dev; in vop_bind()
1426 vop->data = vop_data; in vop_bind()
1427 vop->drm_dev = drm_dev; in vop_bind()
1428 dev_set_drvdata(dev, vop); in vop_bind()
1430 vop_win_init(vop); in vop_bind()
1433 vop->len = resource_size(res); in vop_bind()
1434 vop->regs = devm_ioremap_resource(dev, res); in vop_bind()
1435 if (IS_ERR(vop->regs)) in vop_bind()
1436 return PTR_ERR(vop->regs); in vop_bind()
1438 vop->regsbak = devm_kzalloc(dev, vop->len, GFP_KERNEL); in vop_bind()
1439 if (!vop->regsbak) in vop_bind()
1442 ret = vop_initial(vop); in vop_bind()
1453 vop->irq = (unsigned int)irq; in vop_bind()
1455 spin_lock_init(&vop->reg_lock); in vop_bind()
1456 spin_lock_init(&vop->irq_lock); in vop_bind()
1458 mutex_init(&vop->vsync_mutex); in vop_bind()
1460 ret = devm_request_threaded_irq(dev, vop->irq, vop_isr, vop_isr_thread, in vop_bind()
1461 IRQF_SHARED, dev_name(dev), vop); in vop_bind()
1466 disable_irq(vop->irq); in vop_bind()
1468 ret = vop_create_crtc(vop); in vop_bind()
1478 struct vop *vop = dev_get_drvdata(dev); in vop_unbind() local
1481 vop_destroy_crtc(vop); in vop_unbind()