hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/* 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