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