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