xref: /linux/drivers/media/platform/rockchip/rga/rga.h (revision f7e7b48e6d796da85d99b318def20d9313ef61df)
1*f7e7b48eSJacob Chen /*
2*f7e7b48eSJacob Chen  * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
3*f7e7b48eSJacob Chen  * Author: Jacob Chen <jacob-chen@iotwrt.com>
4*f7e7b48eSJacob Chen  *
5*f7e7b48eSJacob Chen  * This software is licensed under the terms of the GNU General Public
6*f7e7b48eSJacob Chen  * License version 2, as published by the Free Software Foundation, and
7*f7e7b48eSJacob Chen  * may be copied, distributed, and modified under those terms.
8*f7e7b48eSJacob Chen  *
9*f7e7b48eSJacob Chen  * This program is distributed in the hope that it will be useful,
10*f7e7b48eSJacob Chen  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11*f7e7b48eSJacob Chen  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12*f7e7b48eSJacob Chen  * GNU General Public License for more details.
13*f7e7b48eSJacob Chen  */
14*f7e7b48eSJacob Chen #ifndef __RGA_H__
15*f7e7b48eSJacob Chen #define __RGA_H__
16*f7e7b48eSJacob Chen 
17*f7e7b48eSJacob Chen #include <linux/platform_device.h>
18*f7e7b48eSJacob Chen #include <media/videobuf2-v4l2.h>
19*f7e7b48eSJacob Chen #include <media/v4l2-ctrls.h>
20*f7e7b48eSJacob Chen #include <media/v4l2-device.h>
21*f7e7b48eSJacob Chen 
22*f7e7b48eSJacob Chen #define RGA_NAME "rockchip-rga"
23*f7e7b48eSJacob Chen 
24*f7e7b48eSJacob Chen struct rga_fmt {
25*f7e7b48eSJacob Chen 	u32 fourcc;
26*f7e7b48eSJacob Chen 	int depth;
27*f7e7b48eSJacob Chen 	u8 uv_factor;
28*f7e7b48eSJacob Chen 	u8 y_div;
29*f7e7b48eSJacob Chen 	u8 x_div;
30*f7e7b48eSJacob Chen 	u8 color_swap;
31*f7e7b48eSJacob Chen 	u8 hw_format;
32*f7e7b48eSJacob Chen };
33*f7e7b48eSJacob Chen 
34*f7e7b48eSJacob Chen struct rga_frame {
35*f7e7b48eSJacob Chen 	/* Original dimensions */
36*f7e7b48eSJacob Chen 	u32 width;
37*f7e7b48eSJacob Chen 	u32 height;
38*f7e7b48eSJacob Chen 	u32 colorspace;
39*f7e7b48eSJacob Chen 
40*f7e7b48eSJacob Chen 	/* Crop */
41*f7e7b48eSJacob Chen 	struct v4l2_rect crop;
42*f7e7b48eSJacob Chen 
43*f7e7b48eSJacob Chen 	/* Image format */
44*f7e7b48eSJacob Chen 	struct rga_fmt *fmt;
45*f7e7b48eSJacob Chen 
46*f7e7b48eSJacob Chen 	/* Variables that can calculated once and reused */
47*f7e7b48eSJacob Chen 	u32 stride;
48*f7e7b48eSJacob Chen 	u32 size;
49*f7e7b48eSJacob Chen };
50*f7e7b48eSJacob Chen 
51*f7e7b48eSJacob Chen struct rockchip_rga_version {
52*f7e7b48eSJacob Chen 	u32 major;
53*f7e7b48eSJacob Chen 	u32 minor;
54*f7e7b48eSJacob Chen };
55*f7e7b48eSJacob Chen 
56*f7e7b48eSJacob Chen struct rga_ctx {
57*f7e7b48eSJacob Chen 	struct v4l2_fh fh;
58*f7e7b48eSJacob Chen 	struct rockchip_rga *rga;
59*f7e7b48eSJacob Chen 	struct rga_frame in;
60*f7e7b48eSJacob Chen 	struct rga_frame out;
61*f7e7b48eSJacob Chen 	struct v4l2_ctrl_handler ctrl_handler;
62*f7e7b48eSJacob Chen 
63*f7e7b48eSJacob Chen 	/* Control values */
64*f7e7b48eSJacob Chen 	u32 op;
65*f7e7b48eSJacob Chen 	u32 hflip;
66*f7e7b48eSJacob Chen 	u32 vflip;
67*f7e7b48eSJacob Chen 	u32 rotate;
68*f7e7b48eSJacob Chen 	u32 fill_color;
69*f7e7b48eSJacob Chen };
70*f7e7b48eSJacob Chen 
71*f7e7b48eSJacob Chen struct rockchip_rga {
72*f7e7b48eSJacob Chen 	struct v4l2_device v4l2_dev;
73*f7e7b48eSJacob Chen 	struct v4l2_m2m_dev *m2m_dev;
74*f7e7b48eSJacob Chen 	struct video_device *vfd;
75*f7e7b48eSJacob Chen 
76*f7e7b48eSJacob Chen 	struct device *dev;
77*f7e7b48eSJacob Chen 	struct regmap *grf;
78*f7e7b48eSJacob Chen 	void __iomem *regs;
79*f7e7b48eSJacob Chen 	struct clk *sclk;
80*f7e7b48eSJacob Chen 	struct clk *aclk;
81*f7e7b48eSJacob Chen 	struct clk *hclk;
82*f7e7b48eSJacob Chen 	struct rockchip_rga_version version;
83*f7e7b48eSJacob Chen 
84*f7e7b48eSJacob Chen 	/* vfd lock */
85*f7e7b48eSJacob Chen 	struct mutex mutex;
86*f7e7b48eSJacob Chen 	/* ctrl parm lock */
87*f7e7b48eSJacob Chen 	spinlock_t ctrl_lock;
88*f7e7b48eSJacob Chen 
89*f7e7b48eSJacob Chen 	wait_queue_head_t irq_queue;
90*f7e7b48eSJacob Chen 
91*f7e7b48eSJacob Chen 	struct rga_ctx *curr;
92*f7e7b48eSJacob Chen 	dma_addr_t cmdbuf_phy;
93*f7e7b48eSJacob Chen 	void *cmdbuf_virt;
94*f7e7b48eSJacob Chen 	unsigned int *src_mmu_pages;
95*f7e7b48eSJacob Chen 	unsigned int *dst_mmu_pages;
96*f7e7b48eSJacob Chen };
97*f7e7b48eSJacob Chen 
98*f7e7b48eSJacob Chen struct rga_frame *rga_get_frame(struct rga_ctx *ctx, enum v4l2_buf_type type);
99*f7e7b48eSJacob Chen 
100*f7e7b48eSJacob Chen /* RGA Buffers Manage */
101*f7e7b48eSJacob Chen extern const struct vb2_ops rga_qops;
102*f7e7b48eSJacob Chen void rga_buf_map(struct vb2_buffer *vb);
103*f7e7b48eSJacob Chen 
104*f7e7b48eSJacob Chen /* RGA Hardware */
105*f7e7b48eSJacob Chen static inline void rga_write(struct rockchip_rga *rga, u32 reg, u32 value)
106*f7e7b48eSJacob Chen {
107*f7e7b48eSJacob Chen 	writel(value, rga->regs + reg);
108*f7e7b48eSJacob Chen };
109*f7e7b48eSJacob Chen 
110*f7e7b48eSJacob Chen static inline u32 rga_read(struct rockchip_rga *rga, u32 reg)
111*f7e7b48eSJacob Chen {
112*f7e7b48eSJacob Chen 	return readl(rga->regs + reg);
113*f7e7b48eSJacob Chen };
114*f7e7b48eSJacob Chen 
115*f7e7b48eSJacob Chen static inline void rga_mod(struct rockchip_rga *rga, u32 reg, u32 val, u32 mask)
116*f7e7b48eSJacob Chen {
117*f7e7b48eSJacob Chen 	u32 temp = rga_read(rga, reg) & ~(mask);
118*f7e7b48eSJacob Chen 
119*f7e7b48eSJacob Chen 	temp |= val & mask;
120*f7e7b48eSJacob Chen 	rga_write(rga, reg, temp);
121*f7e7b48eSJacob Chen };
122*f7e7b48eSJacob Chen 
123*f7e7b48eSJacob Chen void rga_hw_start(struct rockchip_rga *rga);
124*f7e7b48eSJacob Chen 
125*f7e7b48eSJacob Chen #endif
126