Lines Matching refs:ctx
201 struct fimd_context *ctx = crtc->ctx; in fimd_wait_for_vblank() local
203 if (ctx->suspended) in fimd_wait_for_vblank()
206 atomic_set(&ctx->wait_vsync_event, 1); in fimd_wait_for_vblank()
212 if (!wait_event_timeout(ctx->wait_vsync_queue, in fimd_wait_for_vblank()
213 !atomic_read(&ctx->wait_vsync_event), in fimd_wait_for_vblank()
218 static void fimd_enable_video_output(struct fimd_context *ctx, unsigned int win, in fimd_enable_video_output() argument
221 u32 val = readl(ctx->regs + WINCON(win)); in fimd_enable_video_output()
228 writel(val, ctx->regs + WINCON(win)); in fimd_enable_video_output()
231 static void fimd_enable_shadow_channel_path(struct fimd_context *ctx, in fimd_enable_shadow_channel_path() argument
235 u32 val = readl(ctx->regs + SHADOWCON); in fimd_enable_shadow_channel_path()
242 writel(val, ctx->regs + SHADOWCON); in fimd_enable_shadow_channel_path()
245 static void fimd_clear_channel(struct fimd_context *ctx) in fimd_clear_channel() argument
253 u32 val = readl(ctx->regs + WINCON(win)); in fimd_clear_channel()
256 fimd_enable_video_output(ctx, win, false); in fimd_clear_channel()
258 if (ctx->driver_data->has_shadowcon) in fimd_clear_channel()
259 fimd_enable_shadow_channel_path(ctx, win, in fimd_clear_channel()
268 unsigned int state = ctx->suspended; in fimd_clear_channel()
270 ctx->suspended = 0; in fimd_clear_channel()
271 fimd_wait_for_vblank(ctx->crtc); in fimd_clear_channel()
272 ctx->suspended = state; in fimd_clear_channel()
276 static int fimd_iommu_attach_devices(struct fimd_context *ctx, in fimd_iommu_attach_devices() argument
281 if (is_drm_iommu_supported(ctx->drm_dev)) { in fimd_iommu_attach_devices()
288 fimd_clear_channel(ctx); in fimd_iommu_attach_devices()
289 ret = drm_iommu_attach_device(ctx->drm_dev, ctx->dev); in fimd_iommu_attach_devices()
300 static void fimd_iommu_detach_devices(struct fimd_context *ctx) in fimd_iommu_detach_devices() argument
303 if (is_drm_iommu_supported(ctx->drm_dev)) in fimd_iommu_detach_devices()
304 drm_iommu_detach_device(ctx->drm_dev, ctx->dev); in fimd_iommu_detach_devices()
307 static u32 fimd_calc_clkdiv(struct fimd_context *ctx, in fimd_calc_clkdiv() argument
313 if (ctx->i80_if) { in fimd_calc_clkdiv()
322 clkdiv = DIV_ROUND_UP(clk_get_rate(ctx->lcd_clk), ideal_clk); in fimd_calc_clkdiv()
339 struct fimd_context *ctx = crtc->ctx; in fimd_commit() local
341 struct fimd_driver_data *driver_data = ctx->driver_data; in fimd_commit()
342 void *timing_base = ctx->regs + driver_data->timing_base; in fimd_commit()
345 if (ctx->suspended) in fimd_commit()
352 if (ctx->i80_if) { in fimd_commit()
353 val = ctx->i80ifcon | I80IFEN_ENABLE; in fimd_commit()
360 if (driver_data->has_vtsel && ctx->sysreg && in fimd_commit()
361 regmap_update_bits(ctx->sysreg, in fimd_commit()
373 vidcon1 = ctx->vidcon1; in fimd_commit()
378 writel(vidcon1, ctx->regs + driver_data->timing_base + VIDCON1); in fimd_commit()
388 writel(val, ctx->regs + driver_data->timing_base + VIDTCON0); in fimd_commit()
398 writel(val, ctx->regs + driver_data->timing_base + VIDTCON1); in fimd_commit()
402 writel(ctx->vidout_con, timing_base + VIDOUT_CON); in fimd_commit()
405 if (ctx->sysreg && regmap_update_bits(ctx->sysreg, in fimd_commit()
418 writel(val, ctx->regs + driver_data->timing_base + VIDTCON2); in fimd_commit()
424 val = ctx->vidcon0; in fimd_commit()
427 if (ctx->driver_data->has_clksel) in fimd_commit()
430 clkdiv = fimd_calc_clkdiv(ctx, mode); in fimd_commit()
434 writel(val, ctx->regs + VIDCON0); in fimd_commit()
439 struct fimd_context *ctx = crtc->ctx; in fimd_enable_vblank() local
442 if (ctx->suspended) in fimd_enable_vblank()
445 if (!test_and_set_bit(0, &ctx->irq_flags)) { in fimd_enable_vblank()
446 val = readl(ctx->regs + VIDINTCON0); in fimd_enable_vblank()
450 if (ctx->i80_if) { in fimd_enable_vblank()
463 writel(val, ctx->regs + VIDINTCON0); in fimd_enable_vblank()
471 struct fimd_context *ctx = crtc->ctx; in fimd_disable_vblank() local
474 if (ctx->suspended) in fimd_disable_vblank()
477 if (test_and_clear_bit(0, &ctx->irq_flags)) { in fimd_disable_vblank()
478 val = readl(ctx->regs + VIDINTCON0); in fimd_disable_vblank()
482 if (ctx->i80_if) { in fimd_disable_vblank()
489 writel(val, ctx->regs + VIDINTCON0); in fimd_disable_vblank()
493 static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win) in fimd_win_set_pixfmt() argument
495 struct exynos_drm_plane *plane = &ctx->planes[win]; in fimd_win_set_pixfmt()
504 if (ctx->driver_data->has_limited_fmt && !win) { in fimd_win_set_pixfmt()
560 writel(val, ctx->regs + WINCON(win)); in fimd_win_set_pixfmt()
572 writel(val, ctx->regs + VIDOSD_C(win)); in fimd_win_set_pixfmt()
576 writel(val, ctx->regs + VIDWnALPHA0(win)); in fimd_win_set_pixfmt()
577 writel(val, ctx->regs + VIDWnALPHA1(win)); in fimd_win_set_pixfmt()
581 static void fimd_win_set_colkey(struct fimd_context *ctx, unsigned int win) in fimd_win_set_colkey() argument
590 writel(keycon0, ctx->regs + WKEYCON0_BASE(win)); in fimd_win_set_colkey()
591 writel(keycon1, ctx->regs + WKEYCON1_BASE(win)); in fimd_win_set_colkey()
600 static void fimd_shadow_protect_win(struct fimd_context *ctx, in fimd_shadow_protect_win() argument
605 if (ctx->driver_data->has_shadowcon) { in fimd_shadow_protect_win()
613 val = readl(ctx->regs + reg); in fimd_shadow_protect_win()
618 writel(val, ctx->regs + reg); in fimd_shadow_protect_win()
623 struct fimd_context *ctx = crtc->ctx; in fimd_win_commit() local
629 if (ctx->suspended) in fimd_win_commit()
635 plane = &ctx->planes[win]; in fimd_win_commit()
638 if (ctx->suspended) { in fimd_win_commit()
654 fimd_shadow_protect_win(ctx, win, true); in fimd_win_commit()
663 writel(val, ctx->regs + VIDWx_BUF_START(win, 0)); in fimd_win_commit()
668 writel(val, ctx->regs + VIDWx_BUF_END(win, 0)); in fimd_win_commit()
682 writel(val, ctx->regs + VIDWx_BUF_SIZE(win, 0)); in fimd_win_commit()
689 writel(val, ctx->regs + VIDOSD_A(win)); in fimd_win_commit()
701 writel(val, ctx->regs + VIDOSD_B(win)); in fimd_win_commit()
712 writel(val, ctx->regs + offset); in fimd_win_commit()
717 fimd_win_set_pixfmt(ctx, win); in fimd_win_commit()
721 fimd_win_set_colkey(ctx, win); in fimd_win_commit()
723 fimd_enable_video_output(ctx, win, true); in fimd_win_commit()
725 if (ctx->driver_data->has_shadowcon) in fimd_win_commit()
726 fimd_enable_shadow_channel_path(ctx, win, true); in fimd_win_commit()
729 fimd_shadow_protect_win(ctx, win, false); in fimd_win_commit()
733 if (ctx->i80_if) in fimd_win_commit()
734 atomic_set(&ctx->win_updated, 1); in fimd_win_commit()
739 struct fimd_context *ctx = crtc->ctx; in fimd_win_disable() local
745 plane = &ctx->planes[win]; in fimd_win_disable()
747 if (ctx->suspended) { in fimd_win_disable()
754 fimd_shadow_protect_win(ctx, win, true); in fimd_win_disable()
756 fimd_enable_video_output(ctx, win, false); in fimd_win_disable()
758 if (ctx->driver_data->has_shadowcon) in fimd_win_disable()
759 fimd_enable_shadow_channel_path(ctx, win, false); in fimd_win_disable()
762 fimd_shadow_protect_win(ctx, win, false); in fimd_win_disable()
767 static void fimd_window_suspend(struct fimd_context *ctx) in fimd_window_suspend() argument
773 plane = &ctx->planes[i]; in fimd_window_suspend()
776 fimd_win_disable(ctx->crtc, i); in fimd_window_suspend()
780 static void fimd_window_resume(struct fimd_context *ctx) in fimd_window_resume() argument
786 plane = &ctx->planes[i]; in fimd_window_resume()
792 static void fimd_apply(struct fimd_context *ctx) in fimd_apply() argument
798 plane = &ctx->planes[i]; in fimd_apply()
800 fimd_win_commit(ctx->crtc, i); in fimd_apply()
802 fimd_win_disable(ctx->crtc, i); in fimd_apply()
805 fimd_commit(ctx->crtc); in fimd_apply()
808 static int fimd_poweron(struct fimd_context *ctx) in fimd_poweron() argument
812 if (!ctx->suspended) in fimd_poweron()
815 ctx->suspended = false; in fimd_poweron()
817 pm_runtime_get_sync(ctx->dev); in fimd_poweron()
819 ret = clk_prepare_enable(ctx->bus_clk); in fimd_poweron()
825 ret = clk_prepare_enable(ctx->lcd_clk); in fimd_poweron()
832 if (test_and_clear_bit(0, &ctx->irq_flags)) { in fimd_poweron()
833 ret = fimd_enable_vblank(ctx->crtc); in fimd_poweron()
840 fimd_window_resume(ctx); in fimd_poweron()
842 fimd_apply(ctx); in fimd_poweron()
847 clk_disable_unprepare(ctx->lcd_clk); in fimd_poweron()
849 clk_disable_unprepare(ctx->bus_clk); in fimd_poweron()
851 ctx->suspended = true; in fimd_poweron()
855 static int fimd_poweroff(struct fimd_context *ctx) in fimd_poweroff() argument
857 if (ctx->suspended) in fimd_poweroff()
865 fimd_window_suspend(ctx); in fimd_poweroff()
867 clk_disable_unprepare(ctx->lcd_clk); in fimd_poweroff()
868 clk_disable_unprepare(ctx->bus_clk); in fimd_poweroff()
870 pm_runtime_put_sync(ctx->dev); in fimd_poweroff()
872 ctx->suspended = true; in fimd_poweroff()
882 fimd_poweron(crtc->ctx); in fimd_dpms()
887 fimd_poweroff(crtc->ctx); in fimd_dpms()
897 struct fimd_context *ctx = dev_get_drvdata(dev); in fimd_trigger() local
898 struct fimd_driver_data *driver_data = ctx->driver_data; in fimd_trigger()
899 void *timing_base = ctx->regs + driver_data->timing_base; in fimd_trigger()
906 if (atomic_read(&ctx->triggering)) in fimd_trigger()
910 atomic_set(&ctx->triggering, 1); in fimd_trigger()
920 if (!test_bit(0, &ctx->irq_flags)) in fimd_trigger()
921 atomic_set(&ctx->triggering, 0); in fimd_trigger()
926 struct fimd_context *ctx = crtc->ctx; in fimd_te_handler() local
929 if (ctx->pipe < 0 || !ctx->drm_dev) in fimd_te_handler()
936 if (atomic_add_unless(&ctx->win_updated, -1, 0)) in fimd_te_handler()
937 fimd_trigger(ctx->dev); in fimd_te_handler()
940 if (atomic_read(&ctx->wait_vsync_event)) { in fimd_te_handler()
941 atomic_set(&ctx->wait_vsync_event, 0); in fimd_te_handler()
942 wake_up(&ctx->wait_vsync_queue); in fimd_te_handler()
945 if (test_bit(0, &ctx->irq_flags)) in fimd_te_handler()
946 drm_handle_vblank(ctx->drm_dev, ctx->pipe); in fimd_te_handler()
951 struct fimd_context *ctx = crtc->ctx; in fimd_dp_clock_enable() local
959 if (ctx->driver_data != &exynos5_fimd_driver_data) in fimd_dp_clock_enable()
963 writel(DP_MIE_CLK_DP_ENABLE, ctx->regs + DP_MIE_CLKCON); in fimd_dp_clock_enable()
981 struct fimd_context *ctx = (struct fimd_context *)dev_id; in fimd_irq_handler() local
984 val = readl(ctx->regs + VIDINTCON1); in fimd_irq_handler()
986 clear_bit = ctx->i80_if ? VIDINTCON1_INT_I80 : VIDINTCON1_INT_FRAME; in fimd_irq_handler()
988 writel(clear_bit, ctx->regs + VIDINTCON1); in fimd_irq_handler()
991 if (ctx->pipe < 0 || !ctx->drm_dev) in fimd_irq_handler()
994 if (ctx->i80_if) { in fimd_irq_handler()
995 exynos_drm_crtc_finish_pageflip(ctx->drm_dev, ctx->pipe); in fimd_irq_handler()
998 atomic_set(&ctx->triggering, 0); in fimd_irq_handler()
1000 drm_handle_vblank(ctx->drm_dev, ctx->pipe); in fimd_irq_handler()
1001 exynos_drm_crtc_finish_pageflip(ctx->drm_dev, ctx->pipe); in fimd_irq_handler()
1004 if (atomic_read(&ctx->wait_vsync_event)) { in fimd_irq_handler()
1005 atomic_set(&ctx->wait_vsync_event, 0); in fimd_irq_handler()
1006 wake_up(&ctx->wait_vsync_queue); in fimd_irq_handler()
1016 struct fimd_context *ctx = dev_get_drvdata(dev); in fimd_bind() local
1024 ctx->drm_dev = drm_dev; in fimd_bind()
1025 ctx->pipe = priv->pipe++; in fimd_bind()
1028 type = (zpos == ctx->default_win) ? DRM_PLANE_TYPE_PRIMARY : in fimd_bind()
1030 ret = exynos_plane_init(drm_dev, &ctx->planes[zpos], in fimd_bind()
1031 1 << ctx->pipe, type, zpos); in fimd_bind()
1036 exynos_plane = &ctx->planes[ctx->default_win]; in fimd_bind()
1037 ctx->crtc = exynos_drm_crtc_create(drm_dev, &exynos_plane->base, in fimd_bind()
1038 ctx->pipe, EXYNOS_DISPLAY_TYPE_LCD, in fimd_bind()
1039 &fimd_crtc_ops, ctx); in fimd_bind()
1040 if (IS_ERR(ctx->crtc)) in fimd_bind()
1041 return PTR_ERR(ctx->crtc); in fimd_bind()
1043 if (ctx->display) in fimd_bind()
1044 exynos_drm_create_enc_conn(drm_dev, ctx->display); in fimd_bind()
1046 return fimd_iommu_attach_devices(ctx, drm_dev); in fimd_bind()
1052 struct fimd_context *ctx = dev_get_drvdata(dev); in fimd_unbind() local
1054 fimd_dpms(ctx->crtc, DRM_MODE_DPMS_OFF); in fimd_unbind()
1056 fimd_iommu_detach_devices(ctx); in fimd_unbind()
1058 if (ctx->display) in fimd_unbind()
1059 exynos_dpi_remove(ctx->display); in fimd_unbind()
1070 struct fimd_context *ctx; in fimd_probe() local
1078 ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); in fimd_probe()
1079 if (!ctx) in fimd_probe()
1087 ctx->dev = dev; in fimd_probe()
1088 ctx->suspended = true; in fimd_probe()
1089 ctx->driver_data = drm_fimd_get_driver_data(pdev); in fimd_probe()
1092 ctx->vidcon1 |= VIDCON1_INV_VDEN; in fimd_probe()
1094 ctx->vidcon1 |= VIDCON1_INV_VCLK; in fimd_probe()
1100 ctx->i80_if = true; in fimd_probe()
1102 if (ctx->driver_data->has_vidoutcon) in fimd_probe()
1103 ctx->vidout_con |= VIDOUT_CON_F_I80_LDI0; in fimd_probe()
1105 ctx->vidcon0 |= VIDCON0_VIDOUT_I80_LDI0; in fimd_probe()
1110 ctx->vidcon0 |= VIDCON0_DSI_EN; in fimd_probe()
1114 ctx->i80ifcon = LCD_CS_SETUP(val); in fimd_probe()
1117 ctx->i80ifcon |= LCD_WR_SETUP(val); in fimd_probe()
1120 ctx->i80ifcon |= LCD_WR_ACTIVE(val); in fimd_probe()
1123 ctx->i80ifcon |= LCD_WR_HOLD(val); in fimd_probe()
1127 ctx->sysreg = syscon_regmap_lookup_by_phandle(dev->of_node, in fimd_probe()
1129 if (IS_ERR(ctx->sysreg)) { in fimd_probe()
1131 ctx->sysreg = NULL; in fimd_probe()
1134 ctx->bus_clk = devm_clk_get(dev, "fimd"); in fimd_probe()
1135 if (IS_ERR(ctx->bus_clk)) { in fimd_probe()
1137 ret = PTR_ERR(ctx->bus_clk); in fimd_probe()
1141 ctx->lcd_clk = devm_clk_get(dev, "sclk_fimd"); in fimd_probe()
1142 if (IS_ERR(ctx->lcd_clk)) { in fimd_probe()
1144 ret = PTR_ERR(ctx->lcd_clk); in fimd_probe()
1150 ctx->regs = devm_ioremap_resource(dev, res); in fimd_probe()
1151 if (IS_ERR(ctx->regs)) { in fimd_probe()
1152 ret = PTR_ERR(ctx->regs); in fimd_probe()
1157 ctx->i80_if ? "lcd_sys" : "vsync"); in fimd_probe()
1165 0, "drm_fimd", ctx); in fimd_probe()
1171 init_waitqueue_head(&ctx->wait_vsync_queue); in fimd_probe()
1172 atomic_set(&ctx->wait_vsync_event, 0); in fimd_probe()
1174 platform_set_drvdata(pdev, ctx); in fimd_probe()
1176 ctx->display = exynos_dpi_probe(dev); in fimd_probe()
1177 if (IS_ERR(ctx->display)) { in fimd_probe()
1178 ret = PTR_ERR(ctx->display); in fimd_probe()