Lines Matching refs:ctx
86 struct decon_context *ctx = crtc->ctx; in decon_wait_for_vblank() local
88 if (ctx->suspended) in decon_wait_for_vblank()
91 atomic_set(&ctx->wait_vsync_event, 1); in decon_wait_for_vblank()
97 if (!wait_event_timeout(ctx->wait_vsync_queue, in decon_wait_for_vblank()
98 !atomic_read(&ctx->wait_vsync_event), in decon_wait_for_vblank()
105 struct decon_context *ctx = crtc->ctx; in decon_clear_channels() local
112 u32 val = readl(ctx->regs + WINCON(win)); in decon_clear_channels()
116 writel(val, ctx->regs + WINCON(win)); in decon_clear_channels()
123 unsigned int state = ctx->suspended; in decon_clear_channels()
125 ctx->suspended = 0; in decon_clear_channels()
126 decon_wait_for_vblank(ctx->crtc); in decon_clear_channels()
127 ctx->suspended = state; in decon_clear_channels()
131 static int decon_ctx_initialize(struct decon_context *ctx, in decon_ctx_initialize() argument
137 ctx->drm_dev = drm_dev; in decon_ctx_initialize()
138 ctx->pipe = priv->pipe++; in decon_ctx_initialize()
140 decon_clear_channels(ctx->crtc); in decon_ctx_initialize()
142 ret = drm_iommu_attach_device(drm_dev, ctx->dev); in decon_ctx_initialize()
149 static void decon_ctx_remove(struct decon_context *ctx) in decon_ctx_remove() argument
152 drm_iommu_detach_device(ctx->drm_dev, ctx->dev); in decon_ctx_remove()
155 static u32 decon_calc_clkdiv(struct decon_context *ctx, in decon_calc_clkdiv() argument
162 clkdiv = DIV_ROUND_UP(clk_get_rate(ctx->vclk), ideal_clk); in decon_calc_clkdiv()
169 struct decon_context *ctx = crtc->ctx; in decon_commit() local
173 if (ctx->suspended) in decon_commit()
180 if (!ctx->i80_if) { in decon_commit()
188 writel(val, ctx->regs + VIDTCON0); in decon_commit()
191 writel(val, ctx->regs + VIDTCON1); in decon_commit()
200 writel(val, ctx->regs + VIDTCON2); in decon_commit()
203 writel(val, ctx->regs + VIDTCON3); in decon_commit()
209 writel(val, ctx->regs + VIDTCON4); in decon_commit()
211 writel(mode->vdisplay - 1, ctx->regs + LINECNT_OP_THRESHOLD); in decon_commit()
218 writel(val, ctx->regs + VIDCON0); in decon_commit()
220 clkdiv = decon_calc_clkdiv(ctx, mode); in decon_commit()
223 writel(val, ctx->regs + VCLKCON1); in decon_commit()
224 writel(val, ctx->regs + VCLKCON2); in decon_commit()
227 val = readl(ctx->regs + DECON_UPDATE); in decon_commit()
229 writel(val, ctx->regs + DECON_UPDATE); in decon_commit()
234 struct decon_context *ctx = crtc->ctx; in decon_enable_vblank() local
237 if (ctx->suspended) in decon_enable_vblank()
240 if (!test_and_set_bit(0, &ctx->irq_flags)) { in decon_enable_vblank()
241 val = readl(ctx->regs + VIDINTCON0); in decon_enable_vblank()
245 if (!ctx->i80_if) { in decon_enable_vblank()
251 writel(val, ctx->regs + VIDINTCON0); in decon_enable_vblank()
259 struct decon_context *ctx = crtc->ctx; in decon_disable_vblank() local
262 if (ctx->suspended) in decon_disable_vblank()
265 if (test_and_clear_bit(0, &ctx->irq_flags)) { in decon_disable_vblank()
266 val = readl(ctx->regs + VIDINTCON0); in decon_disable_vblank()
269 if (!ctx->i80_if) in decon_disable_vblank()
272 writel(val, ctx->regs + VIDINTCON0); in decon_disable_vblank()
276 static void decon_win_set_pixfmt(struct decon_context *ctx, unsigned int win, in decon_win_set_pixfmt() argument
282 val = readl(ctx->regs + WINCON(win)); in decon_win_set_pixfmt()
350 writel(val, ctx->regs + WINCON(win)); in decon_win_set_pixfmt()
353 static void decon_win_set_colkey(struct decon_context *ctx, unsigned int win) in decon_win_set_colkey() argument
362 writel(keycon0, ctx->regs + WKEYCON0_BASE(win)); in decon_win_set_colkey()
363 writel(keycon1, ctx->regs + WKEYCON1_BASE(win)); in decon_win_set_colkey()
372 static void decon_shadow_protect_win(struct decon_context *ctx, in decon_shadow_protect_win() argument
379 val = readl(ctx->regs + SHADOWCON); in decon_shadow_protect_win()
384 writel(val, ctx->regs + SHADOWCON); in decon_shadow_protect_win()
390 struct decon_context *ctx = crtc->ctx; in decon_atomic_begin() local
392 if (ctx->suspended) in decon_atomic_begin()
395 decon_shadow_protect_win(ctx, plane->zpos, true); in decon_atomic_begin()
401 struct decon_context *ctx = crtc->ctx; in decon_update_plane() local
412 if (ctx->suspended) in decon_update_plane()
427 writel(val, ctx->regs + VIDW_BUF_START(win)); in decon_update_plane()
432 writel(state->fb->width + padding, ctx->regs + VIDW_WHOLE_X(win)); in decon_update_plane()
433 writel(state->fb->height, ctx->regs + VIDW_WHOLE_Y(win)); in decon_update_plane()
436 writel(plane->src_x, ctx->regs + VIDW_OFFSET_X(win)); in decon_update_plane()
437 writel(plane->src_y, ctx->regs + VIDW_OFFSET_Y(win)); in decon_update_plane()
455 writel(val, ctx->regs + VIDOSD_A(win)); in decon_update_plane()
466 writel(val, ctx->regs + VIDOSD_B(win)); in decon_update_plane()
476 writel(alpha, ctx->regs + VIDOSD_C(win)); in decon_update_plane()
482 writel(alpha, ctx->regs + VIDOSD_D(win)); in decon_update_plane()
484 decon_win_set_pixfmt(ctx, win, state->fb); in decon_update_plane()
488 decon_win_set_colkey(ctx, win); in decon_update_plane()
491 val = readl(ctx->regs + WINCON(win)); in decon_update_plane()
494 writel(val, ctx->regs + WINCON(win)); in decon_update_plane()
497 decon_shadow_protect_win(ctx, win, false); in decon_update_plane()
499 val = readl(ctx->regs + DECON_UPDATE); in decon_update_plane()
501 writel(val, ctx->regs + DECON_UPDATE); in decon_update_plane()
507 struct decon_context *ctx = crtc->ctx; in decon_disable_plane() local
511 if (ctx->suspended) in decon_disable_plane()
515 decon_shadow_protect_win(ctx, win, true); in decon_disable_plane()
518 val = readl(ctx->regs + WINCON(win)); in decon_disable_plane()
520 writel(val, ctx->regs + WINCON(win)); in decon_disable_plane()
522 val = readl(ctx->regs + DECON_UPDATE); in decon_disable_plane()
524 writel(val, ctx->regs + DECON_UPDATE); in decon_disable_plane()
530 struct decon_context *ctx = crtc->ctx; in decon_atomic_flush() local
532 if (ctx->suspended) in decon_atomic_flush()
535 decon_shadow_protect_win(ctx, plane->zpos, false); in decon_atomic_flush()
538 static void decon_init(struct decon_context *ctx) in decon_init() argument
542 writel(VIDCON0_SWRESET, ctx->regs + VIDCON0); in decon_init()
545 if (!ctx->i80_if) in decon_init()
547 writel(val, ctx->regs + VIDOUTCON0); in decon_init()
549 writel(VCLKCON0_CLKVALUP | VCLKCON0_VCLKFREE, ctx->regs + VCLKCON0); in decon_init()
551 if (!ctx->i80_if) in decon_init()
552 writel(VIDCON1_VCLK_HOLD, ctx->regs + VIDCON1(0)); in decon_init()
557 struct decon_context *ctx = crtc->ctx; in decon_enable() local
560 if (!ctx->suspended) in decon_enable()
563 ctx->suspended = false; in decon_enable()
565 pm_runtime_get_sync(ctx->dev); in decon_enable()
567 ret = clk_prepare_enable(ctx->pclk); in decon_enable()
573 ret = clk_prepare_enable(ctx->aclk); in decon_enable()
579 ret = clk_prepare_enable(ctx->eclk); in decon_enable()
585 ret = clk_prepare_enable(ctx->vclk); in decon_enable()
591 decon_init(ctx); in decon_enable()
594 if (test_and_clear_bit(0, &ctx->irq_flags)) in decon_enable()
595 decon_enable_vblank(ctx->crtc); in decon_enable()
597 decon_commit(ctx->crtc); in decon_enable()
602 struct decon_context *ctx = crtc->ctx; in decon_disable() local
605 if (ctx->suspended) in decon_disable()
614 decon_disable_plane(crtc, &ctx->planes[i]); in decon_disable()
616 clk_disable_unprepare(ctx->vclk); in decon_disable()
617 clk_disable_unprepare(ctx->eclk); in decon_disable()
618 clk_disable_unprepare(ctx->aclk); in decon_disable()
619 clk_disable_unprepare(ctx->pclk); in decon_disable()
621 pm_runtime_put_sync(ctx->dev); in decon_disable()
623 ctx->suspended = true; in decon_disable()
642 struct decon_context *ctx = (struct decon_context *)dev_id; in decon_irq_handler() local
646 val = readl(ctx->regs + VIDINTCON1); in decon_irq_handler()
648 clear_bit = ctx->i80_if ? VIDINTCON1_INT_I80 : VIDINTCON1_INT_FRAME; in decon_irq_handler()
650 writel(clear_bit, ctx->regs + VIDINTCON1); in decon_irq_handler()
653 if (ctx->pipe < 0 || !ctx->drm_dev) in decon_irq_handler()
656 if (!ctx->i80_if) { in decon_irq_handler()
657 drm_crtc_handle_vblank(&ctx->crtc->base); in decon_irq_handler()
659 struct exynos_drm_plane *plane = &ctx->planes[win]; in decon_irq_handler()
664 exynos_drm_crtc_finish_update(ctx->crtc, plane); in decon_irq_handler()
668 if (atomic_read(&ctx->wait_vsync_event)) { in decon_irq_handler()
669 atomic_set(&ctx->wait_vsync_event, 0); in decon_irq_handler()
670 wake_up(&ctx->wait_vsync_queue); in decon_irq_handler()
679 struct decon_context *ctx = dev_get_drvdata(dev); in decon_bind() local
686 ret = decon_ctx_initialize(ctx, drm_dev); in decon_bind()
694 ret = exynos_plane_init(drm_dev, &ctx->planes[zpos], in decon_bind()
695 1 << ctx->pipe, type, decon_formats, in decon_bind()
701 exynos_plane = &ctx->planes[DEFAULT_WIN]; in decon_bind()
702 ctx->crtc = exynos_drm_crtc_create(drm_dev, &exynos_plane->base, in decon_bind()
703 ctx->pipe, EXYNOS_DISPLAY_TYPE_LCD, in decon_bind()
704 &decon_crtc_ops, ctx); in decon_bind()
705 if (IS_ERR(ctx->crtc)) { in decon_bind()
706 decon_ctx_remove(ctx); in decon_bind()
707 return PTR_ERR(ctx->crtc); in decon_bind()
710 if (ctx->encoder) in decon_bind()
711 exynos_dpi_bind(drm_dev, ctx->encoder); in decon_bind()
720 struct decon_context *ctx = dev_get_drvdata(dev); in decon_unbind() local
722 decon_disable(ctx->crtc); in decon_unbind()
724 if (ctx->encoder) in decon_unbind()
725 exynos_dpi_remove(ctx->encoder); in decon_unbind()
727 decon_ctx_remove(ctx); in decon_unbind()
738 struct decon_context *ctx; in decon_probe() local
746 ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); in decon_probe()
747 if (!ctx) in decon_probe()
750 ctx->dev = dev; in decon_probe()
751 ctx->suspended = true; in decon_probe()
755 ctx->i80_if = true; in decon_probe()
758 ctx->regs = of_iomap(dev->of_node, 0); in decon_probe()
759 if (!ctx->regs) in decon_probe()
762 ctx->pclk = devm_clk_get(dev, "pclk_decon0"); in decon_probe()
763 if (IS_ERR(ctx->pclk)) { in decon_probe()
765 ret = PTR_ERR(ctx->pclk); in decon_probe()
769 ctx->aclk = devm_clk_get(dev, "aclk_decon0"); in decon_probe()
770 if (IS_ERR(ctx->aclk)) { in decon_probe()
772 ret = PTR_ERR(ctx->aclk); in decon_probe()
776 ctx->eclk = devm_clk_get(dev, "decon0_eclk"); in decon_probe()
777 if (IS_ERR(ctx->eclk)) { in decon_probe()
779 ret = PTR_ERR(ctx->eclk); in decon_probe()
783 ctx->vclk = devm_clk_get(dev, "decon0_vclk"); in decon_probe()
784 if (IS_ERR(ctx->vclk)) { in decon_probe()
786 ret = PTR_ERR(ctx->vclk); in decon_probe()
791 ctx->i80_if ? "lcd_sys" : "vsync"); in decon_probe()
799 0, "drm_decon", ctx); in decon_probe()
805 init_waitqueue_head(&ctx->wait_vsync_queue); in decon_probe()
806 atomic_set(&ctx->wait_vsync_event, 0); in decon_probe()
808 platform_set_drvdata(pdev, ctx); in decon_probe()
810 ctx->encoder = exynos_dpi_probe(dev); in decon_probe()
811 if (IS_ERR(ctx->encoder)) { in decon_probe()
812 ret = PTR_ERR(ctx->encoder); in decon_probe()
828 iounmap(ctx->regs); in decon_probe()
835 struct decon_context *ctx = dev_get_drvdata(&pdev->dev); in decon_remove() local
839 iounmap(ctx->regs); in decon_remove()