android13/kernel-5.10/drivers/media/platform/rockchip/isp/bridge.h

106 lines
3.2 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd. */
#ifndef _RKISP_BRIDGE_H
#define _RKISP_BRIDGE_H
#include "linux/platform_device.h"
#include <linux/rk-isp1-config.h>
#include "isp_ispp.h"
#define BRIDGE_DEV_NAME DRIVER_NAME "-bridge-ispp"
#define BRIDGE_BUF_MAX RKISP_ISPP_BUF_MAX
struct rkisp_bridge_device;
struct rkisp_bridge_ops {
int (*config)(struct rkisp_bridge_device *dev);
void (*disable)(struct rkisp_bridge_device *dev);
bool (*is_stopped)(struct rkisp_bridge_device *dev);
int (*start)(struct rkisp_bridge_device *dev);
int (*stop)(struct rkisp_bridge_device *dev);
void (*update_mi)(struct rkisp_bridge_device *dev);
int (*frame_end)(struct rkisp_bridge_device *dev, u32 state);
};
struct rkisp_bridge_config {
const int frame_end_id;
u32 offset;
struct {
u32 y0_base;
u32 uv0_base;
u32 y1_base;
u32 uv1_base;
u32 g0_base;
u32 g1_base;
u32 y0_base_shd;
u32 uv0_base_shd;
u32 g0_base_shd;
} reg;
};
struct rkisp_bridge_buf {
struct rkisp_ispp_buf dbufs;
struct rkisp_dummy_buffer dummy[GROUP_BUF_MAX];
};
struct rkisp_bridge_work {
struct work_struct work;
struct rkisp_bridge_device *dev;
void *param;
};
struct rkisp_bridge_device {
struct rkisp_device *ispdev;
struct v4l2_subdev sd;
struct v4l2_rect crop;
struct media_pad pad;
wait_queue_head_t done;
struct rkisp_bridge_ops *ops;
struct rkisp_bridge_config *cfg;
struct frame_debug_info dbg;
struct workqueue_struct *wq;
struct hrtimer frame_qst;
u64 fs_ns;
u8 work_mode;
u8 buf_num;
bool pingpong;
bool stopping;
bool linked;
bool en;
bool frame_early;
};
#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20) || IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V30)
int rkisp_register_bridge_subdev(struct rkisp_device *dev,
struct v4l2_device *v4l2_dev);
void rkisp_unregister_bridge_subdev(struct rkisp_device *dev);
void rkisp_bridge_isr(u32 *mis_val, struct rkisp_device *dev);
void rkisp_bridge_update_mi(struct rkisp_device *dev, u32 isp_mis);
void rkisp_get_bridge_sd(struct platform_device *dev, struct v4l2_subdev **sd);
#else
static inline int rkisp_register_bridge_subdev(struct rkisp_device *dev, struct v4l2_device *v4l2_dev) { return 0; }
static inline void rkisp_unregister_bridge_subdev(struct rkisp_device *dev) {}
static inline void rkisp_bridge_update_mi(struct rkisp_device *dev, u32 isp_mis) {}
#endif
#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20)
int rkisp_bridge_get_fbcbuf_fd(struct rkisp_device *dev, struct isp2x_buf_idxfd *idxfd);
void rkisp_bridge_sendtopp_buffer(struct rkisp_device *dev, u32 dev_id, u32 buf_idx);
void rkisp_bridge_save_spbuf(struct rkisp_device *dev, struct rkisp_buffer *sp_buf);
void rkisp_bridge_stop_spstream(struct rkisp_device *dev);
void rkisp_bridge_init_ops_v20(struct rkisp_bridge_device *dev);
#else
static inline int rkisp_bridge_get_fbcbuf_fd(struct rkisp_device *dev, struct isp2x_buf_idxfd *idxfd) { return 0; }
static inline void rkisp_bridge_init_ops_v20(struct rkisp_bridge_device *dev) {}
#endif
#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V30)
void rkisp_bridge_init_ops_v30(struct rkisp_bridge_device *dev);
#else
static inline void rkisp_bridge_init_ops_v30(struct rkisp_bridge_device *dev) {}
#endif
#endif