107 lines
2.8 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2023 Rockchip Electronics Co., Ltd. */
#ifndef _RKVPSS_COMMON_H
#define _RKVPSS_COMMON_H
#include <linux/clk.h>
#include <linux/kfifo.h>
#include <linux/mutex.h>
#include <media/media-device.h>
#include <media/media-entity.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
#include <media/videobuf2-v4l2.h>
#include "../isp/isp_vpss.h"
#include <linux/rk-camera-module.h>
#define RKVPSS_PLANE_Y 0
#define RKVPSS_PLANE_UV 1
#define RKVPSS_DEFAULT_WIDTH 1920
#define RKVPSS_DEFAULT_HEIGHT 1080
#define RKVPSS_MAX_WIDTH 4672
#define RKVPSS_MAX_HEIGHT 3504
#define RKVPSS_MIN_WIDTH 32
#define RKVPSS_MIN_HEIGHT 32
#define RKVPSS_UNITE_MAX_WIDTH 8192
#define RKVPSS_UNITE_MAX_HEIGHT 6144
#define RKVPSS_VIDEO_NAME_LEN 16
#define RKVPSS_REG_CACHE_SYNC 0xeeeeeeee
#define RKVPSS_REG_CACHE 0xffffffff
#define RKVPSS_SW_REG_SIZE 0x35c0
#define RKVPSS_SW_REG_SIZE_MAX (RKVPSS_SW_REG_SIZE * 2)
struct rkvpss_device;
enum rkvpss_ver {
VPSS_V10 = 0x00,
};
enum rkvpss_fmt_pix_type {
FMT_YUV,
FMT_RGB,
};
enum rkvpss_rotate {
ROTATE_0 = 0,
ROTATE_90,
ROTATE_180,
ROTATE_270,
};
/* One structure per video node */
struct rkvpss_vdev_node {
struct vb2_queue buf_queue;
struct video_device vdev;
struct media_pad pad;
};
struct rkvpss_buffer {
struct vb2_v4l2_buffer vb;
struct list_head queue;
u32 dma[VIDEO_MAX_PLANES];
void *vaddr[VIDEO_MAX_PLANES];
};
static inline struct rkvpss_vdev_node *vdev_to_node(struct video_device *vdev)
{
return container_of(vdev, struct rkvpss_vdev_node, vdev);
}
static inline struct rkvpss_vdev_node *queue_to_node(struct vb2_queue *q)
{
return container_of(q, struct rkvpss_vdev_node, buf_queue);
}
static inline struct rkvpss_buffer *to_rkvpss_buffer(struct vb2_v4l2_buffer *vb)
{
return container_of(vb, struct rkvpss_buffer, vb);
}
static inline struct vb2_queue *to_vb2_queue(struct file *file)
{
struct rkvpss_vdev_node *vnode = video_drvdata(file);
return &vnode->buf_queue;
}
extern int rkvpss_debug;
extern struct platform_driver rkvpss_plat_drv;
extern int rkvpss_cfginfo_num;
void rkvpss_idx_write(struct rkvpss_device *dev, u32 reg, u32 val, int idx);
void rkvpss_unite_write(struct rkvpss_device *dev, u32 reg, u32 val);
void rkvpss_idx_set_bits(struct rkvpss_device *dev, u32 reg, u32 mask, u32 val, int idx);
void rkvpss_unite_set_bits(struct rkvpss_device *dev, u32 reg, u32 mask, u32 val);
u32 rkvpss_idx_read(struct rkvpss_device *dev, u32 reg, int idx);
void rkvpss_idx_clear_bits(struct rkvpss_device *dev, u32 reg, u32 mask, int idx);
void rkvpss_unite_clear_bits(struct rkvpss_device *dev, u32 reg, u32 mask);
void rkvpss_update_regs(struct rkvpss_device *dev, u32 start, u32 end);
int rkvpss_attach_hw(struct rkvpss_device *vpss);
void rkvpss_set_clk_rate(struct clk *clk, unsigned long rate);
#endif