Lines Matching refs:ctx
75 struct decon_context *ctx = crtc->ctx; in decon_wait_for_vblank() local
77 if (ctx->suspended) in decon_wait_for_vblank()
80 atomic_set(&ctx->wait_vsync_event, 1); in decon_wait_for_vblank()
86 if (!wait_event_timeout(ctx->wait_vsync_queue, in decon_wait_for_vblank()
87 !atomic_read(&ctx->wait_vsync_event), in decon_wait_for_vblank()
92 static void decon_clear_channel(struct decon_context *ctx) in decon_clear_channel() argument
100 u32 val = readl(ctx->regs + WINCON(win)); in decon_clear_channel()
104 writel(val, ctx->regs + WINCON(win)); in decon_clear_channel()
111 unsigned int state = ctx->suspended; in decon_clear_channel()
113 ctx->suspended = 0; in decon_clear_channel()
114 decon_wait_for_vblank(ctx->crtc); in decon_clear_channel()
115 ctx->suspended = state; in decon_clear_channel()
119 static int decon_ctx_initialize(struct decon_context *ctx, in decon_ctx_initialize() argument
124 ctx->drm_dev = drm_dev; in decon_ctx_initialize()
125 ctx->pipe = priv->pipe++; in decon_ctx_initialize()
128 if (is_drm_iommu_supported(ctx->drm_dev)) { in decon_ctx_initialize()
135 decon_clear_channel(ctx); in decon_ctx_initialize()
136 ret = drm_iommu_attach_device(ctx->drm_dev, ctx->dev); in decon_ctx_initialize()
146 static void decon_ctx_remove(struct decon_context *ctx) in decon_ctx_remove() argument
149 if (is_drm_iommu_supported(ctx->drm_dev)) in decon_ctx_remove()
150 drm_iommu_detach_device(ctx->drm_dev, ctx->dev); in decon_ctx_remove()
153 static u32 decon_calc_clkdiv(struct decon_context *ctx, in decon_calc_clkdiv() argument
160 clkdiv = DIV_ROUND_UP(clk_get_rate(ctx->vclk), ideal_clk); in decon_calc_clkdiv()
177 struct decon_context *ctx = crtc->ctx; in decon_commit() local
181 if (ctx->suspended) in decon_commit()
188 if (!ctx->i80_if) { in decon_commit()
196 writel(val, ctx->regs + VIDTCON0); in decon_commit()
199 writel(val, ctx->regs + VIDTCON1); in decon_commit()
208 writel(val, ctx->regs + VIDTCON2); in decon_commit()
211 writel(val, ctx->regs + VIDTCON3); in decon_commit()
217 writel(val, ctx->regs + VIDTCON4); in decon_commit()
219 writel(mode->vdisplay - 1, ctx->regs + LINECNT_OP_THRESHOLD); in decon_commit()
226 writel(val, ctx->regs + VIDCON0); in decon_commit()
228 clkdiv = decon_calc_clkdiv(ctx, mode); in decon_commit()
231 writel(val, ctx->regs + VCLKCON1); in decon_commit()
232 writel(val, ctx->regs + VCLKCON2); in decon_commit()
235 val = readl(ctx->regs + DECON_UPDATE); in decon_commit()
237 writel(val, ctx->regs + DECON_UPDATE); in decon_commit()
242 struct decon_context *ctx = crtc->ctx; in decon_enable_vblank() local
245 if (ctx->suspended) in decon_enable_vblank()
248 if (!test_and_set_bit(0, &ctx->irq_flags)) { in decon_enable_vblank()
249 val = readl(ctx->regs + VIDINTCON0); in decon_enable_vblank()
253 if (!ctx->i80_if) { in decon_enable_vblank()
259 writel(val, ctx->regs + VIDINTCON0); in decon_enable_vblank()
267 struct decon_context *ctx = crtc->ctx; in decon_disable_vblank() local
270 if (ctx->suspended) in decon_disable_vblank()
273 if (test_and_clear_bit(0, &ctx->irq_flags)) { in decon_disable_vblank()
274 val = readl(ctx->regs + VIDINTCON0); in decon_disable_vblank()
277 if (!ctx->i80_if) in decon_disable_vblank()
280 writel(val, ctx->regs + VIDINTCON0); in decon_disable_vblank()
284 static void decon_win_set_pixfmt(struct decon_context *ctx, unsigned int win) in decon_win_set_pixfmt() argument
286 struct exynos_drm_plane *plane = &ctx->planes[win]; in decon_win_set_pixfmt()
290 val = readl(ctx->regs + WINCON(win)); in decon_win_set_pixfmt()
358 writel(val, ctx->regs + WINCON(win)); in decon_win_set_pixfmt()
361 static void decon_win_set_colkey(struct decon_context *ctx, unsigned int win) in decon_win_set_colkey() argument
370 writel(keycon0, ctx->regs + WKEYCON0_BASE(win)); in decon_win_set_colkey()
371 writel(keycon1, ctx->regs + WKEYCON1_BASE(win)); in decon_win_set_colkey()
380 static void decon_shadow_protect_win(struct decon_context *ctx, in decon_shadow_protect_win() argument
387 val = readl(ctx->regs + SHADOWCON); in decon_shadow_protect_win()
392 writel(val, ctx->regs + SHADOWCON); in decon_shadow_protect_win()
397 struct decon_context *ctx = crtc->ctx; in decon_win_commit() local
405 if (ctx->suspended) in decon_win_commit()
411 plane = &ctx->planes[win]; in decon_win_commit()
414 if (ctx->suspended) { in decon_win_commit()
430 decon_shadow_protect_win(ctx, win, true); in decon_win_commit()
434 writel(val, ctx->regs + VIDW_BUF_START(win)); in decon_win_commit()
439 writel(plane->fb_width + padding, ctx->regs + VIDW_WHOLE_X(win)); in decon_win_commit()
440 writel(plane->fb_height, ctx->regs + VIDW_WHOLE_Y(win)); in decon_win_commit()
443 writel(plane->src_x, ctx->regs + VIDW_OFFSET_X(win)); in decon_win_commit()
444 writel(plane->src_y, ctx->regs + VIDW_OFFSET_Y(win)); in decon_win_commit()
462 writel(val, ctx->regs + VIDOSD_A(win)); in decon_win_commit()
473 writel(val, ctx->regs + VIDOSD_B(win)); in decon_win_commit()
483 writel(alpha, ctx->regs + VIDOSD_C(win)); in decon_win_commit()
489 writel(alpha, ctx->regs + VIDOSD_D(win)); in decon_win_commit()
491 decon_win_set_pixfmt(ctx, win); in decon_win_commit()
495 decon_win_set_colkey(ctx, win); in decon_win_commit()
498 val = readl(ctx->regs + WINCON(win)); in decon_win_commit()
501 writel(val, ctx->regs + WINCON(win)); in decon_win_commit()
504 decon_shadow_protect_win(ctx, win, false); in decon_win_commit()
506 val = readl(ctx->regs + DECON_UPDATE); in decon_win_commit()
508 writel(val, ctx->regs + DECON_UPDATE); in decon_win_commit()
515 struct decon_context *ctx = crtc->ctx; in decon_win_disable() local
522 plane = &ctx->planes[win]; in decon_win_disable()
524 if (ctx->suspended) { in decon_win_disable()
531 decon_shadow_protect_win(ctx, win, true); in decon_win_disable()
534 val = readl(ctx->regs + WINCON(win)); in decon_win_disable()
536 writel(val, ctx->regs + WINCON(win)); in decon_win_disable()
539 decon_shadow_protect_win(ctx, win, false); in decon_win_disable()
541 val = readl(ctx->regs + DECON_UPDATE); in decon_win_disable()
543 writel(val, ctx->regs + DECON_UPDATE); in decon_win_disable()
548 static void decon_window_suspend(struct decon_context *ctx) in decon_window_suspend() argument
554 plane = &ctx->planes[i]; in decon_window_suspend()
557 decon_win_disable(ctx->crtc, i); in decon_window_suspend()
561 static void decon_window_resume(struct decon_context *ctx) in decon_window_resume() argument
567 plane = &ctx->planes[i]; in decon_window_resume()
573 static void decon_apply(struct decon_context *ctx) in decon_apply() argument
579 plane = &ctx->planes[i]; in decon_apply()
581 decon_win_commit(ctx->crtc, i); in decon_apply()
583 decon_win_disable(ctx->crtc, i); in decon_apply()
586 decon_commit(ctx->crtc); in decon_apply()
589 static void decon_init(struct decon_context *ctx) in decon_init() argument
593 writel(VIDCON0_SWRESET, ctx->regs + VIDCON0); in decon_init()
596 if (!ctx->i80_if) in decon_init()
598 writel(val, ctx->regs + VIDOUTCON0); in decon_init()
600 writel(VCLKCON0_CLKVALUP | VCLKCON0_VCLKFREE, ctx->regs + VCLKCON0); in decon_init()
602 if (!ctx->i80_if) in decon_init()
603 writel(VIDCON1_VCLK_HOLD, ctx->regs + VIDCON1(0)); in decon_init()
606 static int decon_poweron(struct decon_context *ctx) in decon_poweron() argument
610 if (!ctx->suspended) in decon_poweron()
613 ctx->suspended = false; in decon_poweron()
615 pm_runtime_get_sync(ctx->dev); in decon_poweron()
617 ret = clk_prepare_enable(ctx->pclk); in decon_poweron()
623 ret = clk_prepare_enable(ctx->aclk); in decon_poweron()
629 ret = clk_prepare_enable(ctx->eclk); in decon_poweron()
635 ret = clk_prepare_enable(ctx->vclk); in decon_poweron()
641 decon_init(ctx); in decon_poweron()
644 if (test_and_clear_bit(0, &ctx->irq_flags)) { in decon_poweron()
645 ret = decon_enable_vblank(ctx->crtc); in decon_poweron()
652 decon_window_resume(ctx); in decon_poweron()
654 decon_apply(ctx); in decon_poweron()
659 clk_disable_unprepare(ctx->vclk); in decon_poweron()
661 clk_disable_unprepare(ctx->eclk); in decon_poweron()
663 clk_disable_unprepare(ctx->aclk); in decon_poweron()
665 clk_disable_unprepare(ctx->pclk); in decon_poweron()
667 ctx->suspended = true; in decon_poweron()
671 static int decon_poweroff(struct decon_context *ctx) in decon_poweroff() argument
673 if (ctx->suspended) in decon_poweroff()
681 decon_window_suspend(ctx); in decon_poweroff()
683 clk_disable_unprepare(ctx->vclk); in decon_poweroff()
684 clk_disable_unprepare(ctx->eclk); in decon_poweroff()
685 clk_disable_unprepare(ctx->aclk); in decon_poweroff()
686 clk_disable_unprepare(ctx->pclk); in decon_poweroff()
688 pm_runtime_put_sync(ctx->dev); in decon_poweroff()
690 ctx->suspended = true; in decon_poweroff()
700 decon_poweron(crtc->ctx); in decon_dpms()
705 decon_poweroff(crtc->ctx); in decon_dpms()
727 struct decon_context *ctx = (struct decon_context *)dev_id; in decon_irq_handler() local
730 val = readl(ctx->regs + VIDINTCON1); in decon_irq_handler()
732 clear_bit = ctx->i80_if ? VIDINTCON1_INT_I80 : VIDINTCON1_INT_FRAME; in decon_irq_handler()
734 writel(clear_bit, ctx->regs + VIDINTCON1); in decon_irq_handler()
737 if (ctx->pipe < 0 || !ctx->drm_dev) in decon_irq_handler()
740 if (!ctx->i80_if) { in decon_irq_handler()
741 drm_handle_vblank(ctx->drm_dev, ctx->pipe); in decon_irq_handler()
742 exynos_drm_crtc_finish_pageflip(ctx->drm_dev, ctx->pipe); in decon_irq_handler()
745 if (atomic_read(&ctx->wait_vsync_event)) { in decon_irq_handler()
746 atomic_set(&ctx->wait_vsync_event, 0); in decon_irq_handler()
747 wake_up(&ctx->wait_vsync_queue); in decon_irq_handler()
756 struct decon_context *ctx = dev_get_drvdata(dev); in decon_bind() local
763 ret = decon_ctx_initialize(ctx, drm_dev); in decon_bind()
770 type = (zpos == ctx->default_win) ? DRM_PLANE_TYPE_PRIMARY : in decon_bind()
772 ret = exynos_plane_init(drm_dev, &ctx->planes[zpos], in decon_bind()
773 1 << ctx->pipe, type, zpos); in decon_bind()
778 exynos_plane = &ctx->planes[ctx->default_win]; in decon_bind()
779 ctx->crtc = exynos_drm_crtc_create(drm_dev, &exynos_plane->base, in decon_bind()
780 ctx->pipe, EXYNOS_DISPLAY_TYPE_LCD, in decon_bind()
781 &decon_crtc_ops, ctx); in decon_bind()
782 if (IS_ERR(ctx->crtc)) { in decon_bind()
783 decon_ctx_remove(ctx); in decon_bind()
784 return PTR_ERR(ctx->crtc); in decon_bind()
787 if (ctx->display) in decon_bind()
788 exynos_drm_create_enc_conn(drm_dev, ctx->display); in decon_bind()
797 struct decon_context *ctx = dev_get_drvdata(dev); in decon_unbind() local
799 decon_dpms(ctx->crtc, DRM_MODE_DPMS_OFF); in decon_unbind()
801 if (ctx->display) in decon_unbind()
802 exynos_dpi_remove(ctx->display); in decon_unbind()
804 decon_ctx_remove(ctx); in decon_unbind()
815 struct decon_context *ctx; in decon_probe() local
823 ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); in decon_probe()
824 if (!ctx) in decon_probe()
832 ctx->dev = dev; in decon_probe()
833 ctx->suspended = true; in decon_probe()
837 ctx->i80_if = true; in decon_probe()
840 ctx->regs = of_iomap(dev->of_node, 0); in decon_probe()
841 if (!ctx->regs) { in decon_probe()
846 ctx->pclk = devm_clk_get(dev, "pclk_decon0"); in decon_probe()
847 if (IS_ERR(ctx->pclk)) { in decon_probe()
849 ret = PTR_ERR(ctx->pclk); in decon_probe()
853 ctx->aclk = devm_clk_get(dev, "aclk_decon0"); in decon_probe()
854 if (IS_ERR(ctx->aclk)) { in decon_probe()
856 ret = PTR_ERR(ctx->aclk); in decon_probe()
860 ctx->eclk = devm_clk_get(dev, "decon0_eclk"); in decon_probe()
861 if (IS_ERR(ctx->eclk)) { in decon_probe()
863 ret = PTR_ERR(ctx->eclk); in decon_probe()
867 ctx->vclk = devm_clk_get(dev, "decon0_vclk"); in decon_probe()
868 if (IS_ERR(ctx->vclk)) { in decon_probe()
870 ret = PTR_ERR(ctx->vclk); in decon_probe()
875 ctx->i80_if ? "lcd_sys" : "vsync"); in decon_probe()
883 0, "drm_decon", ctx); in decon_probe()
889 init_waitqueue_head(&ctx->wait_vsync_queue); in decon_probe()
890 atomic_set(&ctx->wait_vsync_event, 0); in decon_probe()
892 platform_set_drvdata(pdev, ctx); in decon_probe()
894 ctx->display = exynos_dpi_probe(dev); in decon_probe()
895 if (IS_ERR(ctx->display)) { in decon_probe()
896 ret = PTR_ERR(ctx->display); in decon_probe()
912 iounmap(ctx->regs); in decon_probe()
921 struct decon_context *ctx = dev_get_drvdata(&pdev->dev); in decon_remove() local
925 iounmap(ctx->regs); in decon_remove()