Lines Matching +full:exynos4210 +full:- +full:rotator
1 // SPDX-License-Identifier: GPL-2.0-or-later
26 #include "regs-fimc.h"
30 * supports image scaler/rotator and input/output DMA operations.
117 return readl(ctx->regs + reg); in fimc_read()
122 writel(val, ctx->regs + reg); in fimc_write()
127 void __iomem *r = ctx->regs + reg; in fimc_set_bits()
134 void __iomem *r = ctx->regs + reg; in fimc_clear_bits()
188 DRM_DEV_DEBUG_KMS(ctx->dev, "enable[%d]\n", enable); in fimc_handle_jpeg()
203 DRM_DEV_DEBUG_KMS(ctx->dev, "enable[%d]\n", enable); in fimc_mask_irq()
227 DRM_DEV_DEBUG_KMS(ctx->dev, "flag[0x%x]\n", flag); in fimc_check_ovf()
234 DRM_DEV_ERROR(ctx->dev, in fimc_check_ovf()
236 ctx->id, status); in fimc_check_ovf()
249 DRM_DEV_DEBUG_KMS(ctx->dev, "cfg[0x%x]\n", cfg); in fimc_check_frame_end()
271 DRM_DEV_DEBUG_KMS(ctx->dev, "present[%d]before[%d]\n", in fimc_get_buf_id()
276 DRM_DEV_ERROR(ctx->dev, "failed to get frame count.\n"); in fimc_get_buf_id()
277 return -EIO; in fimc_get_buf_id()
280 buf_id = frame_cnt - 1; in fimc_get_buf_id()
281 DRM_DEV_DEBUG_KMS(ctx->dev, "buf_id[%d]\n", buf_id); in fimc_get_buf_id()
290 DRM_DEV_DEBUG_KMS(ctx->dev, "enable[%d]\n", enable); in fimc_handle_lastend()
305 DRM_DEV_DEBUG_KMS(ctx->dev, "fmt[0x%x]\n", fmt); in fimc_src_set_fmt_order()
370 DRM_DEV_DEBUG_KMS(ctx->dev, "fmt[0x%x]\n", fmt); in fimc_src_set_fmt()
423 DRM_DEV_DEBUG_KMS(ctx->dev, "rotation[%x]\n", rotation); in fimc_src_set_transf()
472 unsigned int real_width = buf->buf.pitch[0] / buf->format->cpp[0]; in fimc_set_window()
476 h1 = buf->rect.x; in fimc_set_window()
477 h2 = real_width - buf->rect.w - buf->rect.x; in fimc_set_window()
478 v1 = buf->rect.y; in fimc_set_window()
479 v2 = buf->buf.height - buf->rect.h - buf->rect.y; in fimc_set_window()
481 DRM_DEV_DEBUG_KMS(ctx->dev, "x[%d]y[%d]w[%d]h[%d]hsize[%d]vsize[%d]\n", in fimc_set_window()
482 buf->rect.x, buf->rect.y, buf->rect.w, buf->rect.h, in fimc_set_window()
483 real_width, buf->buf.height); in fimc_set_window()
484 DRM_DEV_DEBUG_KMS(ctx->dev, "h1[%d]h2[%d]v1[%d]v2[%d]\n", h1, h2, v1, in fimc_set_window()
489 * check figure 43-21 in user manual in fimc_set_window()
507 unsigned int real_width = buf->buf.pitch[0] / buf->format->cpp[0]; in fimc_src_set_size()
510 DRM_DEV_DEBUG_KMS(ctx->dev, "hsize[%d]vsize[%d]\n", real_width, in fimc_src_set_size()
511 buf->buf.height); in fimc_src_set_size()
515 EXYNOS_ORGISIZE_VERTICAL(buf->buf.height)); in fimc_src_set_size()
519 DRM_DEV_DEBUG_KMS(ctx->dev, "x[%d]y[%d]w[%d]h[%d]\n", buf->rect.x, in fimc_src_set_size()
520 buf->rect.y, buf->rect.w, buf->rect.h); in fimc_src_set_size()
526 cfg |= (EXYNOS_CIREAL_ISIZE_WIDTH(buf->rect.w) | in fimc_src_set_size()
527 EXYNOS_CIREAL_ISIZE_HEIGHT(buf->rect.h)); in fimc_src_set_size()
536 EXYNOS_CISRCFMT_SOURCEVSIZE(buf->buf.height)); in fimc_src_set_size()
540 cfg = (EXYNOS_CIIYOFF_HORIZONTAL(buf->rect.x) | in fimc_src_set_size()
541 EXYNOS_CIIYOFF_VERTICAL(buf->rect.y)); in fimc_src_set_size()
543 cfg = (EXYNOS_CIICBOFF_HORIZONTAL(buf->rect.x) | in fimc_src_set_size()
544 EXYNOS_CIICBOFF_VERTICAL(buf->rect.y)); in fimc_src_set_size()
546 cfg = (EXYNOS_CIICROFF_HORIZONTAL(buf->rect.x) | in fimc_src_set_size()
547 EXYNOS_CIICROFF_VERTICAL(buf->rect.y)); in fimc_src_set_size()
556 fimc_write(ctx, buf->dma_addr[0], EXYNOS_CIIYSA(0)); in fimc_src_set_addr()
557 fimc_write(ctx, buf->dma_addr[1], EXYNOS_CIICBSA(0)); in fimc_src_set_addr()
558 fimc_write(ctx, buf->dma_addr[2], EXYNOS_CIICRSA(0)); in fimc_src_set_addr()
565 DRM_DEV_DEBUG_KMS(ctx->dev, "fmt[0x%x]\n", fmt); in fimc_dst_set_fmt_order()
636 DRM_DEV_DEBUG_KMS(ctx->dev, "fmt[0x%x]\n", fmt); in fimc_dst_set_fmt()
696 DRM_DEV_DEBUG_KMS(ctx->dev, "rotation[0x%x]\n", rotation); in fimc_dst_set_transf()
750 src_w = src->h; in fimc_set_prescaler()
751 src_h = src->w; in fimc_set_prescaler()
753 src_w = src->w; in fimc_set_prescaler()
754 src_h = src->h; in fimc_set_prescaler()
758 dst_w = dst->h; in fimc_set_prescaler()
759 dst_h = dst->w; in fimc_set_prescaler()
761 dst_w = dst->w; in fimc_set_prescaler()
762 dst_h = dst->h; in fimc_set_prescaler()
768 dev_err(ctx->dev, "failed to get ratio horizontal.\n"); in fimc_set_prescaler()
769 return -EINVAL; in fimc_set_prescaler()
774 dev_err(ctx->dev, "failed to get ratio vertical.\n"); in fimc_set_prescaler()
775 return -EINVAL; in fimc_set_prescaler()
780 DRM_DEV_DEBUG_KMS(ctx->dev, "pre_dst_width[%d]pre_dst_height[%d]\n", in fimc_set_prescaler()
782 DRM_DEV_DEBUG_KMS(ctx->dev, "hfactor[%d]vfactor[%d]\n", hfactor, in fimc_set_prescaler()
785 sc->hratio = (src_w << 14) / (dst_w << hfactor); in fimc_set_prescaler()
786 sc->vratio = (src_h << 14) / (dst_h << vfactor); in fimc_set_prescaler()
787 sc->up_h = (dst_w >= src_w) ? true : false; in fimc_set_prescaler()
788 sc->up_v = (dst_h >= src_h) ? true : false; in fimc_set_prescaler()
789 DRM_DEV_DEBUG_KMS(ctx->dev, "hratio[%d]vratio[%d]up_h[%d]up_v[%d]\n", in fimc_set_prescaler()
790 sc->hratio, sc->vratio, sc->up_h, sc->up_v); in fimc_set_prescaler()
792 shfactor = FIMC_SHFACTOR - (hfactor + vfactor); in fimc_set_prescaler()
793 DRM_DEV_DEBUG_KMS(ctx->dev, "shfactor[%d]\n", shfactor); in fimc_set_prescaler()
811 DRM_DEV_DEBUG_KMS(ctx->dev, "range[%d]bypass[%d]up_h[%d]up_v[%d]\n", in fimc_set_scaler()
812 sc->range, sc->bypass, sc->up_h, sc->up_v); in fimc_set_scaler()
813 DRM_DEV_DEBUG_KMS(ctx->dev, "hratio[%d]vratio[%d]\n", in fimc_set_scaler()
814 sc->hratio, sc->vratio); in fimc_set_scaler()
824 if (sc->range) in fimc_set_scaler()
827 if (sc->bypass) in fimc_set_scaler()
829 if (sc->up_h) in fimc_set_scaler()
831 if (sc->up_v) in fimc_set_scaler()
834 cfg |= (EXYNOS_CISCCTRL_MAINHORRATIO((sc->hratio >> 6)) | in fimc_set_scaler()
835 EXYNOS_CISCCTRL_MAINVERRATIO((sc->vratio >> 6))); in fimc_set_scaler()
841 cfg_ext |= (EXYNOS_CIEXTEN_MAINHORRATIO_EXT(sc->hratio) | in fimc_set_scaler()
842 EXYNOS_CIEXTEN_MAINVERRATIO_EXT(sc->vratio)); in fimc_set_scaler()
849 unsigned int real_width = buf->buf.pitch[0] / buf->format->cpp[0]; in fimc_dst_set_size()
852 DRM_DEV_DEBUG_KMS(ctx->dev, "hsize[%d]vsize[%d]\n", real_width, in fimc_dst_set_size()
853 buf->buf.height); in fimc_dst_set_size()
857 EXYNOS_ORGOSIZE_VERTICAL(buf->buf.height)); in fimc_dst_set_size()
861 DRM_DEV_DEBUG_KMS(ctx->dev, "x[%d]y[%d]w[%d]h[%d]\n", buf->rect.x, in fimc_dst_set_size()
862 buf->rect.y, in fimc_dst_set_size()
863 buf->rect.w, buf->rect.h); in fimc_dst_set_size()
869 if (buf->buf.width >= FIMC_WIDTH_ITU_709) in fimc_dst_set_size()
883 cfg |= (EXYNOS_CITRGFMT_TARGETHSIZE(buf->rect.h) | in fimc_dst_set_size()
884 EXYNOS_CITRGFMT_TARGETVSIZE(buf->rect.w)); in fimc_dst_set_size()
886 cfg |= (EXYNOS_CITRGFMT_TARGETHSIZE(buf->rect.w) | in fimc_dst_set_size()
887 EXYNOS_CITRGFMT_TARGETVSIZE(buf->rect.h)); in fimc_dst_set_size()
891 cfg = EXYNOS_CITAREA_TARGET_AREA(buf->rect.w * buf->rect.h); in fimc_dst_set_size()
895 cfg = (EXYNOS_CIOYOFF_HORIZONTAL(buf->rect.x) | in fimc_dst_set_size()
896 EXYNOS_CIOYOFF_VERTICAL(buf->rect.y)); in fimc_dst_set_size()
898 cfg = (EXYNOS_CIOCBOFF_HORIZONTAL(buf->rect.x) | in fimc_dst_set_size()
899 EXYNOS_CIOCBOFF_VERTICAL(buf->rect.y)); in fimc_dst_set_size()
901 cfg = (EXYNOS_CIOCROFF_HORIZONTAL(buf->rect.x) | in fimc_dst_set_size()
902 EXYNOS_CIOCROFF_VERTICAL(buf->rect.y)); in fimc_dst_set_size()
913 DRM_DEV_DEBUG_KMS(ctx->dev, "buf_id[%d]enqueu[%d]\n", buf_id, enqueue); in fimc_dst_set_buf_seq()
915 spin_lock_irqsave(&ctx->lock, flags); in fimc_dst_set_buf_seq()
933 spin_unlock_irqrestore(&ctx->lock, flags); in fimc_dst_set_buf_seq()
939 fimc_write(ctx, buf->dma_addr[0], EXYNOS_CIOYSA(0)); in fimc_dst_set_addr()
940 fimc_write(ctx, buf->dma_addr[1], EXYNOS_CIOCBSA(0)); in fimc_dst_set_addr()
941 fimc_write(ctx, buf->dma_addr[2], EXYNOS_CIOCRSA(0)); in fimc_dst_set_addr()
953 DRM_DEV_DEBUG_KMS(ctx->dev, "fimc id[%d]\n", ctx->id); in fimc_irq_handler()
966 DRM_DEV_DEBUG_KMS(ctx->dev, "buf_id[%d]\n", buf_id); in fimc_irq_handler()
968 if (ctx->task) { in fimc_irq_handler()
969 struct exynos_drm_ipp_task *task = ctx->task; in fimc_irq_handler()
971 ctx->task = NULL; in fimc_irq_handler()
972 pm_runtime_mark_last_busy(ctx->dev); in fimc_irq_handler()
973 pm_runtime_put_autosuspend(ctx->dev); in fimc_irq_handler()
1006 memset(&ctx->sc, 0x0, sizeof(ctx->sc)); in fimc_reset()
1019 fimc_set_scaler(ctx, &ctx->sc); in fimc_start()
1089 pm_runtime_get_sync(ctx->dev); in fimc_commit()
1090 ctx->task = task; in fimc_commit()
1092 fimc_src_set_fmt(ctx, task->src.buf.fourcc, task->src.buf.modifier); in fimc_commit()
1093 fimc_src_set_size(ctx, &task->src); in fimc_commit()
1095 fimc_src_set_addr(ctx, &task->src); in fimc_commit()
1096 fimc_dst_set_fmt(ctx, task->dst.buf.fourcc, task->dst.buf.modifier); in fimc_commit()
1097 fimc_dst_set_transf(ctx, task->transform.rotation); in fimc_commit()
1098 fimc_dst_set_size(ctx, &task->dst); in fimc_commit()
1099 fimc_dst_set_addr(ctx, &task->dst); in fimc_commit()
1100 fimc_set_prescaler(ctx, &ctx->sc, &task->src.rect, &task->dst.rect); in fimc_commit()
1114 if (ctx->task) { in fimc_abort()
1115 struct exynos_drm_ipp_task *task = ctx->task; in fimc_abort()
1117 ctx->task = NULL; in fimc_abort()
1118 pm_runtime_mark_last_busy(ctx->dev); in fimc_abort()
1119 pm_runtime_put_autosuspend(ctx->dev); in fimc_abort()
1120 exynos_drm_ipp_task_done(task, -EIO); in fimc_abort()
1133 struct exynos_drm_ipp *ipp = &ctx->ipp; in fimc_bind()
1135 ctx->drm_dev = drm_dev; in fimc_bind()
1136 ipp->drm_dev = drm_dev; in fimc_bind()
1137 exynos_drm_register_dma(drm_dev, dev, &ctx->dma_priv); in fimc_bind()
1142 ctx->formats, ctx->num_formats, "fimc"); in fimc_bind()
1154 struct exynos_drm_ipp *ipp = &ctx->ipp; in fimc_unbind()
1157 exynos_drm_unregister_dma(drm_dev, dev, &ctx->dma_priv); in fimc_unbind()
1170 if (IS_ERR(ctx->clocks[i])) in fimc_put_clocks()
1172 clk_put(ctx->clocks[i]); in fimc_put_clocks()
1173 ctx->clocks[i] = ERR_PTR(-EINVAL); in fimc_put_clocks()
1179 struct device *fimc_dev = ctx->dev; in fimc_setup_clocks()
1184 ctx->clocks[i] = ERR_PTR(-EINVAL); in fimc_setup_clocks()
1188 dev = fimc_dev->parent; in fimc_setup_clocks()
1192 ctx->clocks[i] = clk_get(dev, fimc_clock_names[i]); in fimc_setup_clocks()
1193 if (IS_ERR(ctx->clocks[i])) { in fimc_setup_clocks()
1194 ret = PTR_ERR(ctx->clocks[i]); in fimc_setup_clocks()
1201 ret = clk_prepare_enable(ctx->clocks[FIMC_CLK_LCLK]); in fimc_setup_clocks()
1211 int id = of_alias_get_id(dev->of_node, "fimc"); in exynos_drm_check_fimc_device()
1215 return -ENODEV; in exynos_drm_check_fimc_device()
1264 struct device *dev = &pdev->dev; in fimc_probe()
1271 return -ENODEV; in fimc_probe()
1275 return -ENOMEM; in fimc_probe()
1277 ctx->dev = dev; in fimc_probe()
1278 ctx->id = of_alias_get_id(dev->of_node, "fimc"); in fimc_probe()
1285 return -ENOMEM; in fimc_probe()
1288 if (ctx->id < 3) { in fimc_probe()
1304 if (ctx->id < 3) { in fimc_probe()
1320 ctx->formats = formats; in fimc_probe()
1321 ctx->num_formats = num_formats; in fimc_probe()
1324 ctx->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); in fimc_probe()
1325 ctx->regs = devm_ioremap_resource(dev, ctx->regs_res); in fimc_probe()
1326 if (IS_ERR(ctx->regs)) in fimc_probe()
1327 return PTR_ERR(ctx->regs); in fimc_probe()
1333 return -ENOENT; in fimc_probe()
1336 ret = devm_request_irq(dev, res->start, fimc_irq_handler, in fimc_probe()
1347 spin_lock_init(&ctx->lock); in fimc_probe()
1372 struct device *dev = &pdev->dev; in fimc_remove()
1389 DRM_DEV_DEBUG_KMS(dev, "id[%d]\n", ctx->id); in fimc_runtime_suspend()
1390 clk_disable_unprepare(ctx->clocks[FIMC_CLK_GATE]); in fimc_runtime_suspend()
1398 DRM_DEV_DEBUG_KMS(dev, "id[%d]\n", ctx->id); in fimc_runtime_resume()
1399 return clk_prepare_enable(ctx->clocks[FIMC_CLK_GATE]); in fimc_runtime_resume()
1410 { .compatible = "samsung,exynos4210-fimc" },
1411 { .compatible = "samsung,exynos4212-fimc" },
1421 .name = "exynos-drm-fimc",