Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
/* 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/rkisp1-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