Merge branch 'core-objtool-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-block.git] / drivers / staging / media / rkisp1 / rkisp1-common.h
CommitLineData
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
45enum rkisp1_rsz_pad {
46 RKISP1_RSZ_PAD_SINK,
47 RKISP1_RSZ_PAD_SRC,
48};
49
50enum rkisp1_stream_id {
51 RKISP1_MAINPATH,
52 RKISP1_SELFPATH,
53};
54
d65dd852
HK
55enum rkisp1_fmt_pix_type {
56 RKISP1_FMT_YUV,
57 RKISP1_FMT_RGB,
58 RKISP1_FMT_BAYER,
59 RKISP1_FMT_JPEG,
60};
61
62enum rkisp1_fmt_raw_pat_type {
63 RKISP1_RAW_RGGB = 0,
64 RKISP1_RAW_GRBG,
65 RKISP1_RAW_GBRG,
66 RKISP1_RAW_BGGR,
67};
68
69enum 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 */
81struct 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 */
105struct 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
116struct 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
123struct 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
132struct rkisp1_dummy_buffer {
133 void *vaddr;
134 dma_addr_t dma_addr;
135 u32 size;
136};
137
138struct 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 */
155struct 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 */
187struct 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 */
206struct 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
221struct 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
232struct 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 */
251struct 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 */
279struct 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
289static inline void
290rkisp1_write(struct rkisp1_device *rkisp1, u32 val, unsigned int addr)
291{
292 writel(val, rkisp1->base_addr + addr);
293}
294
295static inline u32 rkisp1_read(struct rkisp1_device *rkisp1, unsigned int addr)
296{
297 return readl(rkisp1->base_addr + addr);
298}
299
300void rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop,
301 const struct v4l2_rect *bounds);
302
303void rkisp1_sd_adjust_crop(struct v4l2_rect *crop,
304 const struct v4l2_mbus_framefmt *bounds);
305
306int rkisp1_isp_register(struct rkisp1_device *rkisp1,
307 struct v4l2_device *v4l2_dev);
308void rkisp1_isp_unregister(struct rkisp1_device *rkisp1);
309
310const struct rkisp1_isp_mbus_info *rkisp1_isp_mbus_info_get(u32 mbus_code);
311
312void rkisp1_isp_isr(struct rkisp1_device *rkisp1);
313void rkisp1_mipi_isr(struct rkisp1_device *rkisp1);
56e3b29f 314void rkisp1_capture_isr(struct rkisp1_device *rkisp1);
9a28dbd6 315void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris);
bae1155c 316void rkisp1_params_isr(struct rkisp1_device *rkisp1, u32 isp_mis);
56e3b29f
HK
317
318int rkisp1_capture_devs_register(struct rkisp1_device *rkisp1);
319void rkisp1_capture_devs_unregister(struct rkisp1_device *rkisp1);
320
321int rkisp1_resizer_devs_register(struct rkisp1_device *rkisp1);
322void rkisp1_resizer_devs_unregister(struct rkisp1_device *rkisp1);
d65dd852 323
9a28dbd6
JC
324int rkisp1_stats_register(struct rkisp1_stats *stats,
325 struct v4l2_device *v4l2_dev,
326 struct rkisp1_device *rkisp1);
327void rkisp1_stats_unregister(struct rkisp1_stats *stats);
328
bae1155c
JC
329void rkisp1_params_configure(struct rkisp1_params *params,
330 enum rkisp1_fmt_raw_pat_type bayer_pat,
331 enum v4l2_quantization quantization);
332void rkisp1_params_disable(struct rkisp1_params *params);
333int rkisp1_params_register(struct rkisp1_params *params,
334 struct v4l2_device *v4l2_dev,
335 struct rkisp1_device *rkisp1);
336void rkisp1_params_unregister(struct rkisp1_params *params);
337
338void rkisp1_params_isr_handler(struct rkisp1_device *rkisp1, u32 isp_mis);
339
d65dd852 340#endif /* _RKISP1_COMMON_H */