162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Samsung S5P G2D - 2D Graphics Accelerator Driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2011 Samsung Electronics Co., Ltd.
662306a36Sopenharmony_ci * Kamil Debski, <k.debski@samsung.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/platform_device.h>
1062306a36Sopenharmony_ci#include <media/v4l2-device.h>
1162306a36Sopenharmony_ci#include <media/v4l2-ctrls.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#define G2D_NAME "s5p-g2d"
1462306a36Sopenharmony_ci#define TYPE_G2D_3X 3
1562306a36Sopenharmony_ci#define TYPE_G2D_4X 4
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistruct g2d_dev {
1862306a36Sopenharmony_ci	struct v4l2_device	v4l2_dev;
1962306a36Sopenharmony_ci	struct v4l2_m2m_dev	*m2m_dev;
2062306a36Sopenharmony_ci	struct video_device	*vfd;
2162306a36Sopenharmony_ci	struct mutex		mutex;
2262306a36Sopenharmony_ci	spinlock_t		ctrl_lock;
2362306a36Sopenharmony_ci	atomic_t		num_inst;
2462306a36Sopenharmony_ci	void __iomem		*regs;
2562306a36Sopenharmony_ci	struct clk		*clk;
2662306a36Sopenharmony_ci	struct clk		*gate;
2762306a36Sopenharmony_ci	struct g2d_ctx		*curr;
2862306a36Sopenharmony_ci	struct g2d_variant	*variant;
2962306a36Sopenharmony_ci	int irq;
3062306a36Sopenharmony_ci};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistruct g2d_frame {
3362306a36Sopenharmony_ci	/* Original dimensions */
3462306a36Sopenharmony_ci	u32	width;
3562306a36Sopenharmony_ci	u32	height;
3662306a36Sopenharmony_ci	/* Crop size */
3762306a36Sopenharmony_ci	u32	c_width;
3862306a36Sopenharmony_ci	u32	c_height;
3962306a36Sopenharmony_ci	/* Offset */
4062306a36Sopenharmony_ci	u32	o_width;
4162306a36Sopenharmony_ci	u32	o_height;
4262306a36Sopenharmony_ci	/* Image format */
4362306a36Sopenharmony_ci	struct g2d_fmt *fmt;
4462306a36Sopenharmony_ci	/* Variables that can calculated once and reused */
4562306a36Sopenharmony_ci	u32	stride;
4662306a36Sopenharmony_ci	u32	bottom;
4762306a36Sopenharmony_ci	u32	right;
4862306a36Sopenharmony_ci	u32	size;
4962306a36Sopenharmony_ci};
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistruct g2d_ctx {
5262306a36Sopenharmony_ci	struct v4l2_fh fh;
5362306a36Sopenharmony_ci	struct g2d_dev		*dev;
5462306a36Sopenharmony_ci	struct g2d_frame	in;
5562306a36Sopenharmony_ci	struct g2d_frame	out;
5662306a36Sopenharmony_ci	struct v4l2_ctrl	*ctrl_hflip;
5762306a36Sopenharmony_ci	struct v4l2_ctrl	*ctrl_vflip;
5862306a36Sopenharmony_ci	struct v4l2_ctrl_handler ctrl_handler;
5962306a36Sopenharmony_ci	u32 rop;
6062306a36Sopenharmony_ci	u32 flip;
6162306a36Sopenharmony_ci};
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistruct g2d_fmt {
6462306a36Sopenharmony_ci	u32	fourcc;
6562306a36Sopenharmony_ci	int	depth;
6662306a36Sopenharmony_ci	u32	hw;
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cistruct g2d_variant {
7062306a36Sopenharmony_ci	unsigned short hw_rev;
7162306a36Sopenharmony_ci};
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_civoid g2d_reset(struct g2d_dev *d);
7462306a36Sopenharmony_civoid g2d_set_src_size(struct g2d_dev *d, struct g2d_frame *f);
7562306a36Sopenharmony_civoid g2d_set_src_addr(struct g2d_dev *d, dma_addr_t a);
7662306a36Sopenharmony_civoid g2d_set_dst_size(struct g2d_dev *d, struct g2d_frame *f);
7762306a36Sopenharmony_civoid g2d_set_dst_addr(struct g2d_dev *d, dma_addr_t a);
7862306a36Sopenharmony_civoid g2d_start(struct g2d_dev *d);
7962306a36Sopenharmony_civoid g2d_clear_int(struct g2d_dev *d);
8062306a36Sopenharmony_civoid g2d_set_rop4(struct g2d_dev *d, u32 r);
8162306a36Sopenharmony_civoid g2d_set_flip(struct g2d_dev *d, u32 r);
8262306a36Sopenharmony_civoid g2d_set_v41_stretch(struct g2d_dev *d,
8362306a36Sopenharmony_ci			struct g2d_frame *src, struct g2d_frame *dst);
8462306a36Sopenharmony_civoid g2d_set_cmd(struct g2d_dev *d, u32 c);
85