1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
4 * Author: Jacob Chen <jacob-chen@iotwrt.com>
5 */
6#ifndef __RGA_H__
7#define __RGA_H__
8
9#include <linux/platform_device.h>
10#include <media/videobuf2-v4l2.h>
11#include <media/v4l2-ctrls.h>
12#include <media/v4l2-device.h>
13
14#define RGA_NAME "rockchip-rga"
15
16struct rga_fmt {
17	u32 fourcc;
18	int depth;
19	u8 uv_factor;
20	u8 y_div;
21	u8 x_div;
22	u8 color_swap;
23	u8 hw_format;
24};
25
26struct rga_frame {
27	/* Original dimensions */
28	u32 width;
29	u32 height;
30	u32 colorspace;
31
32	/* Crop */
33	struct v4l2_rect crop;
34
35	/* Image format */
36	struct rga_fmt *fmt;
37
38	/* Variables that can calculated once and reused */
39	u32 stride;
40	u32 size;
41};
42
43struct rockchip_rga_version {
44	u32 major;
45	u32 minor;
46};
47
48struct rga_ctx {
49	struct v4l2_fh fh;
50	struct rockchip_rga *rga;
51	struct rga_frame in;
52	struct rga_frame out;
53	struct v4l2_ctrl_handler ctrl_handler;
54
55	/* Control values */
56	u32 op;
57	u32 hflip;
58	u32 vflip;
59	u32 rotate;
60	u32 fill_color;
61};
62
63struct rockchip_rga {
64	struct v4l2_device v4l2_dev;
65	struct v4l2_m2m_dev *m2m_dev;
66	struct video_device *vfd;
67
68	struct device *dev;
69	struct regmap *grf;
70	void __iomem *regs;
71	struct clk *sclk;
72	struct clk *aclk;
73	struct clk *hclk;
74	struct rockchip_rga_version version;
75
76	/* vfd lock */
77	struct mutex mutex;
78	/* ctrl parm lock */
79	spinlock_t ctrl_lock;
80
81	struct rga_ctx *curr;
82	dma_addr_t cmdbuf_phy;
83	void *cmdbuf_virt;
84	unsigned int *src_mmu_pages;
85	unsigned int *dst_mmu_pages;
86};
87
88struct rga_frame *rga_get_frame(struct rga_ctx *ctx, enum v4l2_buf_type type);
89
90/* RGA Buffers Manage */
91extern const struct vb2_ops rga_qops;
92void rga_buf_map(struct vb2_buffer *vb);
93
94/* RGA Hardware */
95static inline void rga_write(struct rockchip_rga *rga, u32 reg, u32 value)
96{
97	writel(value, rga->regs + reg);
98};
99
100static inline u32 rga_read(struct rockchip_rga *rga, u32 reg)
101{
102	return readl(rga->regs + reg);
103};
104
105static inline void rga_mod(struct rockchip_rga *rga, u32 reg, u32 val, u32 mask)
106{
107	u32 temp = rga_read(rga, reg) & ~(mask);
108
109	temp |= val & mask;
110	rga_write(rga, reg, temp);
111};
112
113void rga_hw_start(struct rockchip_rga *rga);
114
115#endif
116