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 wait_queue_head_t irq_queue; 90 91 struct rga_ctx *curr; 92 dma_addr_t cmdbuf_phy; 93 void *cmdbuf_virt; 94 unsigned int *src_mmu_pages; 95 unsigned int *dst_mmu_pages; 96 }; 97 98 struct rga_frame *rga_get_frame(struct rga_ctx *ctx, enum v4l2_buf_type type); 99 100 /* RGA Buffers Manage */ 101 extern const struct vb2_ops rga_qops; 102 void rga_buf_map(struct vb2_buffer *vb); 103 104 /* RGA Hardware */ 105 static inline void rga_write(struct rockchip_rga *rga, u32 reg, u32 value) 106 { 107 writel(value, rga->regs + reg); 108 }; 109 110 static inline u32 rga_read(struct rockchip_rga *rga, u32 reg) 111 { 112 return readl(rga->regs + reg); 113 }; 114 115 static inline void rga_mod(struct rockchip_rga *rga, u32 reg, u32 val, u32 mask) 116 { 117 u32 temp = rga_read(rga, reg) & ~(mask); 118 119 temp |= val & mask; 120 rga_write(rga, reg, temp); 121 }; 122 123 void rga_hw_start(struct rockchip_rga *rga); 124 125 #endif 126