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