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