162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd 462306a36Sopenharmony_ci * Author: Jacob Chen <jacob-chen@iotwrt.com> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#ifndef __RGA_H__ 762306a36Sopenharmony_ci#define __RGA_H__ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/platform_device.h> 1062306a36Sopenharmony_ci#include <media/videobuf2-v4l2.h> 1162306a36Sopenharmony_ci#include <media/v4l2-ctrls.h> 1262306a36Sopenharmony_ci#include <media/v4l2-device.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define RGA_NAME "rockchip-rga" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistruct rga_fmt { 1762306a36Sopenharmony_ci u32 fourcc; 1862306a36Sopenharmony_ci int depth; 1962306a36Sopenharmony_ci u8 uv_factor; 2062306a36Sopenharmony_ci u8 y_div; 2162306a36Sopenharmony_ci u8 x_div; 2262306a36Sopenharmony_ci u8 color_swap; 2362306a36Sopenharmony_ci u8 hw_format; 2462306a36Sopenharmony_ci}; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistruct rga_frame { 2762306a36Sopenharmony_ci /* Original dimensions */ 2862306a36Sopenharmony_ci u32 width; 2962306a36Sopenharmony_ci u32 height; 3062306a36Sopenharmony_ci u32 colorspace; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci /* Crop */ 3362306a36Sopenharmony_ci struct v4l2_rect crop; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci /* Image format */ 3662306a36Sopenharmony_ci struct rga_fmt *fmt; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci /* Variables that can calculated once and reused */ 3962306a36Sopenharmony_ci u32 stride; 4062306a36Sopenharmony_ci u32 size; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct rockchip_rga_version { 4462306a36Sopenharmony_ci u32 major; 4562306a36Sopenharmony_ci u32 minor; 4662306a36Sopenharmony_ci}; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistruct rga_ctx { 4962306a36Sopenharmony_ci struct v4l2_fh fh; 5062306a36Sopenharmony_ci struct rockchip_rga *rga; 5162306a36Sopenharmony_ci struct rga_frame in; 5262306a36Sopenharmony_ci struct rga_frame out; 5362306a36Sopenharmony_ci struct v4l2_ctrl_handler ctrl_handler; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci /* Control values */ 5662306a36Sopenharmony_ci u32 op; 5762306a36Sopenharmony_ci u32 hflip; 5862306a36Sopenharmony_ci u32 vflip; 5962306a36Sopenharmony_ci u32 rotate; 6062306a36Sopenharmony_ci u32 fill_color; 6162306a36Sopenharmony_ci}; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistruct rockchip_rga { 6462306a36Sopenharmony_ci struct v4l2_device v4l2_dev; 6562306a36Sopenharmony_ci struct v4l2_m2m_dev *m2m_dev; 6662306a36Sopenharmony_ci struct video_device *vfd; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci struct device *dev; 6962306a36Sopenharmony_ci struct regmap *grf; 7062306a36Sopenharmony_ci void __iomem *regs; 7162306a36Sopenharmony_ci struct clk *sclk; 7262306a36Sopenharmony_ci struct clk *aclk; 7362306a36Sopenharmony_ci struct clk *hclk; 7462306a36Sopenharmony_ci struct rockchip_rga_version version; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci /* vfd lock */ 7762306a36Sopenharmony_ci struct mutex mutex; 7862306a36Sopenharmony_ci /* ctrl parm lock */ 7962306a36Sopenharmony_ci spinlock_t ctrl_lock; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci struct rga_ctx *curr; 8262306a36Sopenharmony_ci dma_addr_t cmdbuf_phy; 8362306a36Sopenharmony_ci void *cmdbuf_virt; 8462306a36Sopenharmony_ci unsigned int *src_mmu_pages; 8562306a36Sopenharmony_ci unsigned int *dst_mmu_pages; 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistruct rga_frame *rga_get_frame(struct rga_ctx *ctx, enum v4l2_buf_type type); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* RGA Buffers Manage */ 9162306a36Sopenharmony_ciextern const struct vb2_ops rga_qops; 9262306a36Sopenharmony_civoid rga_buf_map(struct vb2_buffer *vb); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci/* RGA Hardware */ 9562306a36Sopenharmony_cistatic inline void rga_write(struct rockchip_rga *rga, u32 reg, u32 value) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci writel(value, rga->regs + reg); 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistatic inline u32 rga_read(struct rockchip_rga *rga, u32 reg) 10162306a36Sopenharmony_ci{ 10262306a36Sopenharmony_ci return readl(rga->regs + reg); 10362306a36Sopenharmony_ci}; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cistatic inline void rga_mod(struct rockchip_rga *rga, u32 reg, u32 val, u32 mask) 10662306a36Sopenharmony_ci{ 10762306a36Sopenharmony_ci u32 temp = rga_read(rga, reg) & ~(mask); 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci temp |= val & mask; 11062306a36Sopenharmony_ci rga_write(rga, reg, temp); 11162306a36Sopenharmony_ci}; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_civoid rga_hw_start(struct rockchip_rga *rga); 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci#endif 116