Commit | Line | Data |
---|---|---|
d65dd852 HK |
1 | /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ |
2 | /* | |
3 | * Rockchip ISP1 Driver - Common definitions | |
4 | * | |
5 | * Copyright (C) 2019 Collabora, Ltd. | |
6 | * | |
7 | * Based on Rockchip ISP1 driver by Rockchip Electronics Co., Ltd. | |
8 | * Copyright (C) 2017 Rockchip Electronics Co., Ltd. | |
9 | */ | |
10 | ||
11 | #ifndef _RKISP1_COMMON_H | |
12 | #define _RKISP1_COMMON_H | |
13 | ||
14 | #include <linux/clk.h> | |
15 | #include <linux/mutex.h> | |
16 | #include <media/media-device.h> | |
17 | #include <media/media-entity.h> | |
18 | #include <media/v4l2-ctrls.h> | |
19 | #include <media/v4l2-device.h> | |
20 | #include <media/videobuf2-v4l2.h> | |
21 | ||
22 | #include "rkisp1-regs.h" | |
9a28dbd6 | 23 | #include "uapi/rkisp1-config.h" |
d65dd852 HK |
24 | |
25 | #define RKISP1_ISP_MAX_WIDTH 4032 | |
26 | #define RKISP1_ISP_MAX_HEIGHT 3024 | |
27 | #define RKISP1_ISP_MIN_WIDTH 32 | |
28 | #define RKISP1_ISP_MIN_HEIGHT 32 | |
29 | ||
30 | #define RKISP1_RSZ_MP_SRC_MAX_WIDTH 4416 | |
31 | #define RKISP1_RSZ_MP_SRC_MAX_HEIGHT 3312 | |
32 | #define RKISP1_RSZ_SP_SRC_MAX_WIDTH 1920 | |
33 | #define RKISP1_RSZ_SP_SRC_MAX_HEIGHT 1920 | |
34 | #define RKISP1_RSZ_SRC_MIN_WIDTH 32 | |
35 | #define RKISP1_RSZ_SRC_MIN_HEIGHT 16 | |
36 | ||
37 | #define RKISP1_DEFAULT_WIDTH 800 | |
38 | #define RKISP1_DEFAULT_HEIGHT 600 | |
39 | ||
40 | #define RKISP1_DRIVER_NAME "rkisp1" | |
41 | #define RKISP1_BUS_INFO "platform:" RKISP1_DRIVER_NAME | |
42 | ||
43 | #define RKISP1_MAX_BUS_CLK 8 | |
44 | ||
56e3b29f HK |
45 | enum rkisp1_rsz_pad { |
46 | RKISP1_RSZ_PAD_SINK, | |
47 | RKISP1_RSZ_PAD_SRC, | |
48 | }; | |
49 | ||
50 | enum rkisp1_stream_id { | |
51 | RKISP1_MAINPATH, | |
52 | RKISP1_SELFPATH, | |
53 | }; | |
54 | ||
d65dd852 HK |
55 | enum rkisp1_fmt_pix_type { |
56 | RKISP1_FMT_YUV, | |
57 | RKISP1_FMT_RGB, | |
58 | RKISP1_FMT_BAYER, | |
59 | RKISP1_FMT_JPEG, | |
60 | }; | |
61 | ||
62 | enum rkisp1_fmt_raw_pat_type { | |
63 | RKISP1_RAW_RGGB = 0, | |
64 | RKISP1_RAW_GRBG, | |
65 | RKISP1_RAW_GBRG, | |
66 | RKISP1_RAW_BGGR, | |
67 | }; | |
68 | ||
69 | enum rkisp1_isp_pad { | |
70 | RKISP1_ISP_PAD_SINK_VIDEO, | |
71 | RKISP1_ISP_PAD_SINK_PARAMS, | |
72 | RKISP1_ISP_PAD_SOURCE_VIDEO, | |
73 | RKISP1_ISP_PAD_SOURCE_STATS, | |
74 | RKISP1_ISP_PAD_MAX | |
75 | }; | |
76 | ||
77 | /* | |
78 | * struct rkisp1_sensor_async - Sensor information | |
79 | * @mbus: media bus configuration | |
80 | */ | |
81 | struct rkisp1_sensor_async { | |
82 | struct v4l2_async_subdev asd; | |
83 | struct v4l2_mbus_config mbus; | |
84 | unsigned int lanes; | |
85 | struct v4l2_subdev *sd; | |
86 | struct v4l2_ctrl *pixel_rate_ctrl; | |
87 | struct phy *dphy; | |
88 | }; | |
89 | ||
90 | /* | |
91 | * struct rkisp1_isp - ISP sub-device | |
92 | * | |
93 | * See Cropping regions of ISP in rkisp1.c for details | |
94 | * @sink_frm: input size, don't have to be equal to sensor size | |
95 | * @sink_fmt: input format | |
96 | * @sink_crop: crop for sink pad | |
97 | * @src_fmt: output format | |
98 | * @src_crop: output size | |
99adeeb6 | 99 | * @ops_lock: ops serialization |
d65dd852 HK |
100 | * |
101 | * @is_dphy_errctrl_disabled : if dphy errctrl is disabled (avoid endless interrupt) | |
102 | * @frame_sequence: used to synchronize frame_id between video devices. | |
103 | * @quantization: output quantization | |
104 | */ | |
105 | struct rkisp1_isp { | |
106 | struct v4l2_subdev sd; | |
107 | struct media_pad pads[RKISP1_ISP_PAD_MAX]; | |
108 | struct v4l2_subdev_pad_config pad_cfg[RKISP1_ISP_PAD_MAX]; | |
109 | const struct rkisp1_isp_mbus_info *sink_fmt; | |
110 | const struct rkisp1_isp_mbus_info *src_fmt; | |
99adeeb6 | 111 | struct mutex ops_lock; |
d65dd852 HK |
112 | bool is_dphy_errctrl_disabled; |
113 | atomic_t frame_sequence; | |
114 | }; | |
115 | ||
116 | struct rkisp1_vdev_node { | |
117 | struct vb2_queue buf_queue; | |
118 | struct mutex vlock; /* ioctl serialization mutex */ | |
119 | struct video_device vdev; | |
120 | struct media_pad pad; | |
121 | }; | |
122 | ||
123 | struct rkisp1_buffer { | |
124 | struct vb2_v4l2_buffer vb; | |
125 | struct list_head queue; | |
126 | union { | |
127 | u32 buff_addr[VIDEO_MAX_PLANES]; | |
128 | void *vaddr[VIDEO_MAX_PLANES]; | |
129 | }; | |
130 | }; | |
131 | ||
132 | struct rkisp1_dummy_buffer { | |
133 | void *vaddr; | |
134 | dma_addr_t dma_addr; | |
135 | u32 size; | |
136 | }; | |
137 | ||
138 | struct rkisp1_device; | |
139 | ||
56e3b29f HK |
140 | /* |
141 | * struct rkisp1_capture - ISP capture video device | |
142 | * | |
143 | * @pix.fmt: buffer format | |
144 | * @pix.info: pixel information | |
145 | * @pix.cfg: pixel configuration | |
146 | * | |
147 | * @buf.lock: lock to protect buf_queue | |
148 | * @buf.queue: queued buffer list | |
149 | * @buf.dummy: dummy space to store dropped data | |
150 | * | |
151 | * rkisp1 use shadowsock registers, so it need two buffer at a time | |
152 | * @buf.curr: the buffer used for current frame | |
153 | * @buf.next: the buffer used for next frame | |
154 | */ | |
155 | struct rkisp1_capture { | |
156 | struct rkisp1_vdev_node vnode; | |
157 | struct rkisp1_device *rkisp1; | |
158 | enum rkisp1_stream_id id; | |
159 | struct rkisp1_capture_ops *ops; | |
160 | const struct rkisp1_capture_config *config; | |
161 | bool is_streaming; | |
162 | bool is_stopping; | |
163 | wait_queue_head_t done; | |
164 | unsigned int sp_y_stride; | |
165 | struct { | |
166 | /* protects queue, curr and next */ | |
167 | spinlock_t lock; | |
168 | struct list_head queue; | |
169 | struct rkisp1_dummy_buffer dummy; | |
170 | struct rkisp1_buffer *curr; | |
171 | struct rkisp1_buffer *next; | |
172 | } buf; | |
173 | struct { | |
174 | const struct rkisp1_capture_fmt_cfg *cfg; | |
175 | const struct v4l2_format_info *info; | |
176 | struct v4l2_pix_format_mplane fmt; | |
177 | } pix; | |
178 | }; | |
179 | ||
9a28dbd6 JC |
180 | /* |
181 | * struct rkisp1_stats - ISP Statistics device | |
182 | * | |
183 | * @irq_lock: buffer queue lock | |
184 | * @stat: stats buffer list | |
185 | * @readout_wq: workqueue for statistics information read | |
186 | */ | |
187 | struct rkisp1_stats { | |
188 | struct rkisp1_vdev_node vnode; | |
189 | struct rkisp1_device *rkisp1; | |
190 | ||
191 | spinlock_t irq_lock; | |
192 | struct list_head stat; | |
193 | struct v4l2_format vdev_fmt; | |
194 | bool is_streaming; | |
195 | ||
196 | struct workqueue_struct *readout_wq; | |
197 | struct mutex wq_lock; | |
198 | }; | |
199 | ||
bae1155c JC |
200 | /* |
201 | * struct rkisp1_params - ISP input parameters device | |
202 | * | |
203 | * @cur_params: Current ISP parameters | |
204 | * @is_first_params: the first params should take effect immediately | |
205 | */ | |
206 | struct rkisp1_params { | |
207 | struct rkisp1_vdev_node vnode; | |
208 | struct rkisp1_device *rkisp1; | |
209 | ||
210 | spinlock_t config_lock; | |
211 | struct list_head params; | |
212 | struct rkisp1_params_cfg cur_params; | |
213 | struct v4l2_format vdev_fmt; | |
214 | bool is_streaming; | |
215 | bool is_first_params; | |
216 | ||
217 | enum v4l2_quantization quantization; | |
218 | enum rkisp1_fmt_raw_pat_type raw_type; | |
219 | }; | |
220 | ||
56e3b29f HK |
221 | struct rkisp1_resizer { |
222 | struct v4l2_subdev sd; | |
223 | enum rkisp1_stream_id id; | |
224 | struct rkisp1_device *rkisp1; | |
225 | struct media_pad pads[RKISP1_ISP_PAD_MAX]; | |
226 | struct v4l2_subdev_pad_config pad_cfg[RKISP1_ISP_PAD_MAX]; | |
227 | const struct rkisp1_rsz_config *config; | |
228 | enum rkisp1_fmt_pix_type fmt_type; | |
f86a183c | 229 | struct mutex ops_lock; |
56e3b29f HK |
230 | }; |
231 | ||
d65dd852 HK |
232 | struct rkisp1_debug { |
233 | struct dentry *debugfs_dir; | |
234 | unsigned long data_loss; | |
235 | unsigned long pic_size_error; | |
236 | unsigned long mipi_error; | |
9a28dbd6 | 237 | unsigned long stats_error; |
56e3b29f HK |
238 | unsigned long stop_timeout[2]; |
239 | unsigned long frame_drop[2]; | |
d65dd852 HK |
240 | }; |
241 | ||
242 | /* | |
243 | * struct rkisp1_device - ISP platform device | |
244 | * @base_addr: base register address | |
245 | * @active_sensor: sensor in-use, set when streaming on | |
246 | * @isp: ISP sub-device | |
56e3b29f | 247 | * @rkisp1_capture: capture video device |
9a28dbd6 | 248 | * @stats: ISP statistics output device |
bae1155c | 249 | * @params: ISP input parameters device |
d65dd852 HK |
250 | */ |
251 | struct rkisp1_device { | |
252 | void __iomem *base_addr; | |
253 | int irq; | |
254 | struct device *dev; | |
255 | unsigned int clk_size; | |
256 | struct clk_bulk_data clks[RKISP1_MAX_BUS_CLK]; | |
257 | struct v4l2_device v4l2_dev; | |
258 | struct v4l2_ctrl_handler ctrl_handler; | |
259 | struct media_device media_dev; | |
260 | struct v4l2_async_notifier notifier; | |
261 | struct rkisp1_sensor_async *active_sensor; | |
262 | struct rkisp1_isp isp; | |
56e3b29f HK |
263 | struct rkisp1_resizer resizer_devs[2]; |
264 | struct rkisp1_capture capture_devs[2]; | |
9a28dbd6 | 265 | struct rkisp1_stats stats; |
bae1155c | 266 | struct rkisp1_params params; |
d65dd852 HK |
267 | struct media_pipeline pipe; |
268 | struct vb2_alloc_ctx *alloc_ctx; | |
269 | struct rkisp1_debug debug; | |
270 | }; | |
271 | ||
272 | /* | |
273 | * struct rkisp1_isp_mbus_info - ISP pad format info | |
274 | * | |
275 | * Translate mbus_code to hardware format values | |
276 | * | |
277 | * @bus_width: used for parallel | |
278 | */ | |
279 | struct rkisp1_isp_mbus_info { | |
280 | u32 mbus_code; | |
281 | enum rkisp1_fmt_pix_type fmt_type; | |
282 | u32 mipi_dt; | |
283 | u32 yuv_seq; | |
284 | u8 bus_width; | |
285 | enum rkisp1_fmt_raw_pat_type bayer_pat; | |
286 | unsigned int direction; | |
287 | }; | |
288 | ||
289 | static inline void | |
290 | rkisp1_write(struct rkisp1_device *rkisp1, u32 val, unsigned int addr) | |
291 | { | |
292 | writel(val, rkisp1->base_addr + addr); | |
293 | } | |
294 | ||
295 | static inline u32 rkisp1_read(struct rkisp1_device *rkisp1, unsigned int addr) | |
296 | { | |
297 | return readl(rkisp1->base_addr + addr); | |
298 | } | |
299 | ||
300 | void rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop, | |
301 | const struct v4l2_rect *bounds); | |
302 | ||
303 | void rkisp1_sd_adjust_crop(struct v4l2_rect *crop, | |
304 | const struct v4l2_mbus_framefmt *bounds); | |
305 | ||
306 | int rkisp1_isp_register(struct rkisp1_device *rkisp1, | |
307 | struct v4l2_device *v4l2_dev); | |
308 | void rkisp1_isp_unregister(struct rkisp1_device *rkisp1); | |
309 | ||
310 | const struct rkisp1_isp_mbus_info *rkisp1_isp_mbus_info_get(u32 mbus_code); | |
311 | ||
312 | void rkisp1_isp_isr(struct rkisp1_device *rkisp1); | |
313 | void rkisp1_mipi_isr(struct rkisp1_device *rkisp1); | |
56e3b29f | 314 | void rkisp1_capture_isr(struct rkisp1_device *rkisp1); |
9a28dbd6 | 315 | void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris); |
bae1155c | 316 | void rkisp1_params_isr(struct rkisp1_device *rkisp1, u32 isp_mis); |
56e3b29f HK |
317 | |
318 | int rkisp1_capture_devs_register(struct rkisp1_device *rkisp1); | |
319 | void rkisp1_capture_devs_unregister(struct rkisp1_device *rkisp1); | |
320 | ||
321 | int rkisp1_resizer_devs_register(struct rkisp1_device *rkisp1); | |
322 | void rkisp1_resizer_devs_unregister(struct rkisp1_device *rkisp1); | |
d65dd852 | 323 | |
9a28dbd6 JC |
324 | int rkisp1_stats_register(struct rkisp1_stats *stats, |
325 | struct v4l2_device *v4l2_dev, | |
326 | struct rkisp1_device *rkisp1); | |
327 | void rkisp1_stats_unregister(struct rkisp1_stats *stats); | |
328 | ||
bae1155c JC |
329 | void rkisp1_params_configure(struct rkisp1_params *params, |
330 | enum rkisp1_fmt_raw_pat_type bayer_pat, | |
331 | enum v4l2_quantization quantization); | |
332 | void rkisp1_params_disable(struct rkisp1_params *params); | |
333 | int rkisp1_params_register(struct rkisp1_params *params, | |
334 | struct v4l2_device *v4l2_dev, | |
335 | struct rkisp1_device *rkisp1); | |
336 | void rkisp1_params_unregister(struct rkisp1_params *params); | |
337 | ||
338 | void rkisp1_params_isr_handler(struct rkisp1_device *rkisp1, u32 isp_mis); | |
339 | ||
d65dd852 | 340 | #endif /* _RKISP1_COMMON_H */ |