Lines Matching +full:exynos4210 +full:- +full:rotator
1 // SPDX-License-Identifier: GPL-2.0-only
25 #include "regs-rotator.h"
28 * Rotator supports image crop/rotator and input/output DMA operations.
35 #define rot_read(offset) readl(rot->regs + (offset))
36 #define rot_write(cfg, offset) writel(cfg, rot->regs + (offset))
49 * A structure of rotator context.
52 * @clock: rotator gate clock.
53 * @limit_tbl: limitation of rotator.
106 if (rot->task) { in rotator_irq_handler()
107 struct exynos_drm_ipp_task *task = rot->task; in rotator_irq_handler()
109 rot->task = NULL; in rotator_irq_handler()
110 pm_runtime_mark_last_busy(rot->dev); in rotator_irq_handler()
111 pm_runtime_put_autosuspend(rot->dev); in rotator_irq_handler()
113 irq_status == ROT_IRQ_STATUS_COMPLETE ? 0 : -EINVAL); in rotator_irq_handler()
144 val = ROT_SET_BUF_SIZE_H(buf->buf.height) | in rotator_src_set_buf()
145 ROT_SET_BUF_SIZE_W(buf->buf.pitch[0] / buf->format->cpp[0]); in rotator_src_set_buf()
149 val = ROT_CROP_POS_Y(buf->rect.y) | ROT_CROP_POS_X(buf->rect.x); in rotator_src_set_buf()
151 val = ROT_SRC_CROP_SIZE_H(buf->rect.h) | in rotator_src_set_buf()
152 ROT_SRC_CROP_SIZE_W(buf->rect.w); in rotator_src_set_buf()
156 rot_write(buf->dma_addr[0], ROT_SRC_BUF_ADDR(0)); in rotator_src_set_buf()
157 rot_write(buf->dma_addr[1], ROT_SRC_BUF_ADDR(1)); in rotator_src_set_buf()
192 val = ROT_SET_BUF_SIZE_H(buf->buf.height) | in rotator_dst_set_buf()
193 ROT_SET_BUF_SIZE_W(buf->buf.pitch[0] / buf->format->cpp[0]); in rotator_dst_set_buf()
197 val = ROT_CROP_POS_Y(buf->rect.y) | ROT_CROP_POS_X(buf->rect.x); in rotator_dst_set_buf()
201 rot_write(buf->dma_addr[0], ROT_DST_BUF_ADDR(0)); in rotator_dst_set_buf()
202 rot_write(buf->dma_addr[1], ROT_DST_BUF_ADDR(1)); in rotator_dst_set_buf()
224 ret = pm_runtime_resume_and_get(rot->dev); in rotator_commit()
226 dev_err(rot->dev, "failed to enable ROTATOR device.\n"); in rotator_commit()
229 rot->task = task; in rotator_commit()
231 rotator_src_set_fmt(rot, task->src.buf.fourcc); in rotator_commit()
232 rotator_src_set_buf(rot, &task->src); in rotator_commit()
233 rotator_dst_set_transf(rot, task->transform.rotation); in rotator_commit()
234 rotator_dst_set_buf(rot, &task->dst); in rotator_commit()
248 struct exynos_drm_ipp *ipp = &rot->ipp; in rotator_bind()
250 rot->drm_dev = drm_dev; in rotator_bind()
251 ipp->drm_dev = drm_dev; in rotator_bind()
252 exynos_drm_register_dma(drm_dev, dev, &rot->dma_priv); in rotator_bind()
256 rot->formats, rot->num_formats, "rotator"); in rotator_bind()
258 dev_info(dev, "The exynos rotator has been probed successfully\n"); in rotator_bind()
267 struct exynos_drm_ipp *ipp = &rot->ipp; in rotator_unbind()
270 exynos_drm_unregister_dma(rot->drm_dev, rot->dev, &rot->dma_priv); in rotator_unbind()
280 struct device *dev = &pdev->dev; in rotator_probe()
288 return -ENOMEM; in rotator_probe()
291 rot->formats = variant->formats; in rotator_probe()
292 rot->num_formats = variant->num_formats; in rotator_probe()
293 rot->dev = dev; in rotator_probe()
294 rot->regs = devm_platform_ioremap_resource(pdev, 0); in rotator_probe()
295 if (IS_ERR(rot->regs)) in rotator_probe()
296 return PTR_ERR(rot->regs); in rotator_probe()
309 rot->clock = devm_clk_get(dev, "rotator"); in rotator_probe()
310 if (IS_ERR(rot->clock)) { in rotator_probe()
312 return PTR_ERR(rot->clock); in rotator_probe()
334 struct device *dev = &pdev->dev; in rotator_remove()
345 clk_disable_unprepare(rot->clock); in rotator_runtime_suspend()
353 return clk_prepare_enable(rot->clock); in rotator_runtime_resume()
433 .compatible = "samsung,s5pv210-rotator",
436 .compatible = "samsung,exynos4210-rotator",
439 .compatible = "samsung,exynos4212-rotator",
442 .compatible = "samsung,exynos5250-rotator",
456 .name = "exynos-rotator",