162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
462306a36Sopenharmony_ci * Author: Jacob Chen <jacob-chen@iotwrt.com>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci#ifndef __RGA_H__
762306a36Sopenharmony_ci#define __RGA_H__
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/platform_device.h>
1062306a36Sopenharmony_ci#include <media/videobuf2-v4l2.h>
1162306a36Sopenharmony_ci#include <media/v4l2-ctrls.h>
1262306a36Sopenharmony_ci#include <media/v4l2-device.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define RGA_NAME "rockchip-rga"
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistruct rga_fmt {
1762306a36Sopenharmony_ci	u32 fourcc;
1862306a36Sopenharmony_ci	int depth;
1962306a36Sopenharmony_ci	u8 uv_factor;
2062306a36Sopenharmony_ci	u8 y_div;
2162306a36Sopenharmony_ci	u8 x_div;
2262306a36Sopenharmony_ci	u8 color_swap;
2362306a36Sopenharmony_ci	u8 hw_format;
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistruct rga_frame {
2762306a36Sopenharmony_ci	/* Original dimensions */
2862306a36Sopenharmony_ci	u32 width;
2962306a36Sopenharmony_ci	u32 height;
3062306a36Sopenharmony_ci	u32 colorspace;
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	/* Crop */
3362306a36Sopenharmony_ci	struct v4l2_rect crop;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	/* Image format */
3662306a36Sopenharmony_ci	struct rga_fmt *fmt;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	/* Variables that can calculated once and reused */
3962306a36Sopenharmony_ci	u32 stride;
4062306a36Sopenharmony_ci	u32 size;
4162306a36Sopenharmony_ci};
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistruct rockchip_rga_version {
4462306a36Sopenharmony_ci	u32 major;
4562306a36Sopenharmony_ci	u32 minor;
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistruct rga_ctx {
4962306a36Sopenharmony_ci	struct v4l2_fh fh;
5062306a36Sopenharmony_ci	struct rockchip_rga *rga;
5162306a36Sopenharmony_ci	struct rga_frame in;
5262306a36Sopenharmony_ci	struct rga_frame out;
5362306a36Sopenharmony_ci	struct v4l2_ctrl_handler ctrl_handler;
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	/* Control values */
5662306a36Sopenharmony_ci	u32 op;
5762306a36Sopenharmony_ci	u32 hflip;
5862306a36Sopenharmony_ci	u32 vflip;
5962306a36Sopenharmony_ci	u32 rotate;
6062306a36Sopenharmony_ci	u32 fill_color;
6162306a36Sopenharmony_ci};
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistruct rockchip_rga {
6462306a36Sopenharmony_ci	struct v4l2_device v4l2_dev;
6562306a36Sopenharmony_ci	struct v4l2_m2m_dev *m2m_dev;
6662306a36Sopenharmony_ci	struct video_device *vfd;
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci	struct device *dev;
6962306a36Sopenharmony_ci	struct regmap *grf;
7062306a36Sopenharmony_ci	void __iomem *regs;
7162306a36Sopenharmony_ci	struct clk *sclk;
7262306a36Sopenharmony_ci	struct clk *aclk;
7362306a36Sopenharmony_ci	struct clk *hclk;
7462306a36Sopenharmony_ci	struct rockchip_rga_version version;
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	/* vfd lock */
7762306a36Sopenharmony_ci	struct mutex mutex;
7862306a36Sopenharmony_ci	/* ctrl parm lock */
7962306a36Sopenharmony_ci	spinlock_t ctrl_lock;
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	struct rga_ctx *curr;
8262306a36Sopenharmony_ci	dma_addr_t cmdbuf_phy;
8362306a36Sopenharmony_ci	void *cmdbuf_virt;
8462306a36Sopenharmony_ci	unsigned int *src_mmu_pages;
8562306a36Sopenharmony_ci	unsigned int *dst_mmu_pages;
8662306a36Sopenharmony_ci};
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistruct rga_frame *rga_get_frame(struct rga_ctx *ctx, enum v4l2_buf_type type);
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci/* RGA Buffers Manage */
9162306a36Sopenharmony_ciextern const struct vb2_ops rga_qops;
9262306a36Sopenharmony_civoid rga_buf_map(struct vb2_buffer *vb);
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/* RGA Hardware */
9562306a36Sopenharmony_cistatic inline void rga_write(struct rockchip_rga *rga, u32 reg, u32 value)
9662306a36Sopenharmony_ci{
9762306a36Sopenharmony_ci	writel(value, rga->regs + reg);
9862306a36Sopenharmony_ci};
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cistatic inline u32 rga_read(struct rockchip_rga *rga, u32 reg)
10162306a36Sopenharmony_ci{
10262306a36Sopenharmony_ci	return readl(rga->regs + reg);
10362306a36Sopenharmony_ci};
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistatic inline void rga_mod(struct rockchip_rga *rga, u32 reg, u32 val, u32 mask)
10662306a36Sopenharmony_ci{
10762306a36Sopenharmony_ci	u32 temp = rga_read(rga, reg) & ~(mask);
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	temp |= val & mask;
11062306a36Sopenharmony_ci	rga_write(rga, reg, temp);
11162306a36Sopenharmony_ci};
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_civoid rga_hw_start(struct rockchip_rga *rga);
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci#endif
116