18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Samsung S5P G2D - 2D Graphics Accelerator Driver
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (c) 2011 Samsung Electronics Co., Ltd.
68c2ecf20Sopenharmony_ci * Kamil Debski, <k.debski@samsung.com>
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
108c2ecf20Sopenharmony_ci#include <media/v4l2-device.h>
118c2ecf20Sopenharmony_ci#include <media/v4l2-ctrls.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#define G2D_NAME "s5p-g2d"
148c2ecf20Sopenharmony_ci#define TYPE_G2D_3X 3
158c2ecf20Sopenharmony_ci#define TYPE_G2D_4X 4
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_cistruct g2d_dev {
188c2ecf20Sopenharmony_ci	struct v4l2_device	v4l2_dev;
198c2ecf20Sopenharmony_ci	struct v4l2_m2m_dev	*m2m_dev;
208c2ecf20Sopenharmony_ci	struct video_device	*vfd;
218c2ecf20Sopenharmony_ci	struct mutex		mutex;
228c2ecf20Sopenharmony_ci	spinlock_t		ctrl_lock;
238c2ecf20Sopenharmony_ci	atomic_t		num_inst;
248c2ecf20Sopenharmony_ci	void __iomem		*regs;
258c2ecf20Sopenharmony_ci	struct clk		*clk;
268c2ecf20Sopenharmony_ci	struct clk		*gate;
278c2ecf20Sopenharmony_ci	struct g2d_ctx		*curr;
288c2ecf20Sopenharmony_ci	struct g2d_variant	*variant;
298c2ecf20Sopenharmony_ci	int irq;
308c2ecf20Sopenharmony_ci};
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cistruct g2d_frame {
338c2ecf20Sopenharmony_ci	/* Original dimensions */
348c2ecf20Sopenharmony_ci	u32	width;
358c2ecf20Sopenharmony_ci	u32	height;
368c2ecf20Sopenharmony_ci	/* Crop size */
378c2ecf20Sopenharmony_ci	u32	c_width;
388c2ecf20Sopenharmony_ci	u32	c_height;
398c2ecf20Sopenharmony_ci	/* Offset */
408c2ecf20Sopenharmony_ci	u32	o_width;
418c2ecf20Sopenharmony_ci	u32	o_height;
428c2ecf20Sopenharmony_ci	/* Image format */
438c2ecf20Sopenharmony_ci	struct g2d_fmt *fmt;
448c2ecf20Sopenharmony_ci	/* Variables that can calculated once and reused */
458c2ecf20Sopenharmony_ci	u32	stride;
468c2ecf20Sopenharmony_ci	u32	bottom;
478c2ecf20Sopenharmony_ci	u32	right;
488c2ecf20Sopenharmony_ci	u32	size;
498c2ecf20Sopenharmony_ci};
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cistruct g2d_ctx {
528c2ecf20Sopenharmony_ci	struct v4l2_fh fh;
538c2ecf20Sopenharmony_ci	struct g2d_dev		*dev;
548c2ecf20Sopenharmony_ci	struct g2d_frame	in;
558c2ecf20Sopenharmony_ci	struct g2d_frame	out;
568c2ecf20Sopenharmony_ci	struct v4l2_ctrl	*ctrl_hflip;
578c2ecf20Sopenharmony_ci	struct v4l2_ctrl	*ctrl_vflip;
588c2ecf20Sopenharmony_ci	struct v4l2_ctrl_handler ctrl_handler;
598c2ecf20Sopenharmony_ci	u32 rop;
608c2ecf20Sopenharmony_ci	u32 flip;
618c2ecf20Sopenharmony_ci};
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_cistruct g2d_fmt {
648c2ecf20Sopenharmony_ci	u32	fourcc;
658c2ecf20Sopenharmony_ci	int	depth;
668c2ecf20Sopenharmony_ci	u32	hw;
678c2ecf20Sopenharmony_ci};
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_cistruct g2d_variant {
708c2ecf20Sopenharmony_ci	unsigned short hw_rev;
718c2ecf20Sopenharmony_ci};
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_civoid g2d_reset(struct g2d_dev *d);
748c2ecf20Sopenharmony_civoid g2d_set_src_size(struct g2d_dev *d, struct g2d_frame *f);
758c2ecf20Sopenharmony_civoid g2d_set_src_addr(struct g2d_dev *d, dma_addr_t a);
768c2ecf20Sopenharmony_civoid g2d_set_dst_size(struct g2d_dev *d, struct g2d_frame *f);
778c2ecf20Sopenharmony_civoid g2d_set_dst_addr(struct g2d_dev *d, dma_addr_t a);
788c2ecf20Sopenharmony_civoid g2d_start(struct g2d_dev *d);
798c2ecf20Sopenharmony_civoid g2d_clear_int(struct g2d_dev *d);
808c2ecf20Sopenharmony_civoid g2d_set_rop4(struct g2d_dev *d, u32 r);
818c2ecf20Sopenharmony_civoid g2d_set_flip(struct g2d_dev *d, u32 r);
828c2ecf20Sopenharmony_civoid g2d_set_v41_stretch(struct g2d_dev *d,
838c2ecf20Sopenharmony_ci			struct g2d_frame *src, struct g2d_frame *dst);
848c2ecf20Sopenharmony_civoid g2d_set_cmd(struct g2d_dev *d, u32 c);
85