1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /* Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd. */
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #ifndef _RKISP_BRIDGE_H
5*4882a593Smuzhiyun #define _RKISP_BRIDGE_H
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #include "linux/platform_device.h"
8*4882a593Smuzhiyun #include <linux/rk-isp1-config.h>
9*4882a593Smuzhiyun #include "isp_ispp.h"
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #define BRIDGE_DEV_NAME DRIVER_NAME "-bridge-ispp"
12*4882a593Smuzhiyun #define BRIDGE_BUF_MAX RKISP_ISPP_BUF_MAX
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun struct rkisp_bridge_device;
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun struct rkisp_bridge_ops {
17*4882a593Smuzhiyun int (*config)(struct rkisp_bridge_device *dev);
18*4882a593Smuzhiyun void (*disable)(struct rkisp_bridge_device *dev);
19*4882a593Smuzhiyun bool (*is_stopped)(struct rkisp_bridge_device *dev);
20*4882a593Smuzhiyun int (*start)(struct rkisp_bridge_device *dev);
21*4882a593Smuzhiyun int (*stop)(struct rkisp_bridge_device *dev);
22*4882a593Smuzhiyun void (*update_mi)(struct rkisp_bridge_device *dev);
23*4882a593Smuzhiyun int (*frame_end)(struct rkisp_bridge_device *dev, u32 state);
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun struct rkisp_bridge_config {
27*4882a593Smuzhiyun const int frame_end_id;
28*4882a593Smuzhiyun u32 offset;
29*4882a593Smuzhiyun struct {
30*4882a593Smuzhiyun u32 y0_base;
31*4882a593Smuzhiyun u32 uv0_base;
32*4882a593Smuzhiyun u32 y1_base;
33*4882a593Smuzhiyun u32 uv1_base;
34*4882a593Smuzhiyun u32 g0_base;
35*4882a593Smuzhiyun u32 g1_base;
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun u32 y0_base_shd;
38*4882a593Smuzhiyun u32 uv0_base_shd;
39*4882a593Smuzhiyun u32 g0_base_shd;
40*4882a593Smuzhiyun } reg;
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun struct rkisp_bridge_buf {
44*4882a593Smuzhiyun struct rkisp_ispp_buf dbufs;
45*4882a593Smuzhiyun struct rkisp_dummy_buffer dummy[GROUP_BUF_MAX];
46*4882a593Smuzhiyun };
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun struct rkisp_bridge_work {
49*4882a593Smuzhiyun struct work_struct work;
50*4882a593Smuzhiyun struct rkisp_bridge_device *dev;
51*4882a593Smuzhiyun void *param;
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun struct rkisp_bridge_device {
55*4882a593Smuzhiyun struct rkisp_device *ispdev;
56*4882a593Smuzhiyun struct v4l2_subdev sd;
57*4882a593Smuzhiyun struct v4l2_rect crop;
58*4882a593Smuzhiyun struct media_pad pad;
59*4882a593Smuzhiyun wait_queue_head_t done;
60*4882a593Smuzhiyun struct rkisp_bridge_ops *ops;
61*4882a593Smuzhiyun struct rkisp_bridge_config *cfg;
62*4882a593Smuzhiyun struct frame_debug_info dbg;
63*4882a593Smuzhiyun struct workqueue_struct *wq;
64*4882a593Smuzhiyun struct hrtimer frame_qst;
65*4882a593Smuzhiyun u64 fs_ns;
66*4882a593Smuzhiyun u8 work_mode;
67*4882a593Smuzhiyun u8 buf_num;
68*4882a593Smuzhiyun bool pingpong;
69*4882a593Smuzhiyun bool stopping;
70*4882a593Smuzhiyun bool linked;
71*4882a593Smuzhiyun bool en;
72*4882a593Smuzhiyun bool frame_early;
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20) || IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V30)
76*4882a593Smuzhiyun int rkisp_register_bridge_subdev(struct rkisp_device *dev,
77*4882a593Smuzhiyun struct v4l2_device *v4l2_dev);
78*4882a593Smuzhiyun void rkisp_unregister_bridge_subdev(struct rkisp_device *dev);
79*4882a593Smuzhiyun void rkisp_bridge_isr(u32 *mis_val, struct rkisp_device *dev);
80*4882a593Smuzhiyun void rkisp_bridge_update_mi(struct rkisp_device *dev, u32 isp_mis);
81*4882a593Smuzhiyun void rkisp_get_bridge_sd(struct platform_device *dev, struct v4l2_subdev **sd);
82*4882a593Smuzhiyun #else
rkisp_register_bridge_subdev(struct rkisp_device * dev,struct v4l2_device * v4l2_dev)83*4882a593Smuzhiyun static inline int rkisp_register_bridge_subdev(struct rkisp_device *dev, struct v4l2_device *v4l2_dev) { return 0; }
rkisp_unregister_bridge_subdev(struct rkisp_device * dev)84*4882a593Smuzhiyun static inline void rkisp_unregister_bridge_subdev(struct rkisp_device *dev) {}
rkisp_bridge_update_mi(struct rkisp_device * dev,u32 isp_mis)85*4882a593Smuzhiyun static inline void rkisp_bridge_update_mi(struct rkisp_device *dev, u32 isp_mis) {}
86*4882a593Smuzhiyun #endif
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20)
89*4882a593Smuzhiyun int rkisp_bridge_get_fbcbuf_fd(struct rkisp_device *dev, struct isp2x_buf_idxfd *idxfd);
90*4882a593Smuzhiyun void rkisp_bridge_sendtopp_buffer(struct rkisp_device *dev, u32 dev_id, u32 buf_idx);
91*4882a593Smuzhiyun void rkisp_bridge_save_spbuf(struct rkisp_device *dev, struct rkisp_buffer *sp_buf);
92*4882a593Smuzhiyun void rkisp_bridge_stop_spstream(struct rkisp_device *dev);
93*4882a593Smuzhiyun void rkisp_bridge_init_ops_v20(struct rkisp_bridge_device *dev);
94*4882a593Smuzhiyun #else
rkisp_bridge_get_fbcbuf_fd(struct rkisp_device * dev,struct isp2x_buf_idxfd * idxfd)95*4882a593Smuzhiyun static inline int rkisp_bridge_get_fbcbuf_fd(struct rkisp_device *dev, struct isp2x_buf_idxfd *idxfd) { return 0; }
rkisp_bridge_init_ops_v20(struct rkisp_bridge_device * dev)96*4882a593Smuzhiyun static inline void rkisp_bridge_init_ops_v20(struct rkisp_bridge_device *dev) {}
97*4882a593Smuzhiyun #endif
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V30)
100*4882a593Smuzhiyun void rkisp_bridge_init_ops_v30(struct rkisp_bridge_device *dev);
101*4882a593Smuzhiyun #else
rkisp_bridge_init_ops_v30(struct rkisp_bridge_device * dev)102*4882a593Smuzhiyun static inline void rkisp_bridge_init_ops_v30(struct rkisp_bridge_device *dev) {}
103*4882a593Smuzhiyun #endif
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun #endif
106