1e6938cc1SHelen Koike /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
2e6938cc1SHelen Koike /*
3e6938cc1SHelen Koike  * Rockchip ISP1 Driver - Common definitions
4e6938cc1SHelen Koike  *
5e6938cc1SHelen Koike  * Copyright (C) 2019 Collabora, Ltd.
6e6938cc1SHelen Koike  *
7e6938cc1SHelen Koike  * Based on Rockchip ISP1 driver by Rockchip Electronics Co., Ltd.
8e6938cc1SHelen Koike  * Copyright (C) 2017 Rockchip Electronics Co., Ltd.
9e6938cc1SHelen Koike  */
10e6938cc1SHelen Koike 
11e6938cc1SHelen Koike #ifndef _RKISP1_COMMON_H
12e6938cc1SHelen Koike #define _RKISP1_COMMON_H
13e6938cc1SHelen Koike 
14e6938cc1SHelen Koike #include <linux/clk.h>
1508818e6aSHeiko Stuebner #include <linux/interrupt.h>
16e6938cc1SHelen Koike #include <linux/mutex.h>
17e6938cc1SHelen Koike #include <linux/rkisp1-config.h>
18e6938cc1SHelen Koike #include <media/media-device.h>
19e6938cc1SHelen Koike #include <media/media-entity.h>
20e6938cc1SHelen Koike #include <media/v4l2-ctrls.h>
21e6938cc1SHelen Koike #include <media/v4l2-device.h>
22e6938cc1SHelen Koike #include <media/videobuf2-v4l2.h>
23e6938cc1SHelen Koike 
24e6938cc1SHelen Koike #include "rkisp1-regs.h"
25e6938cc1SHelen Koike 
268682037dSLaurent Pinchart struct dentry;
278682037dSLaurent Pinchart 
28e6938cc1SHelen Koike /*
290f3c2ab2SPaul Elder  * flags on the 'direction' field in struct rkisp1_mbus_info' that indicate
30e6938cc1SHelen Koike  * on which pad the media bus format is supported
31e6938cc1SHelen Koike  */
32e6938cc1SHelen Koike #define RKISP1_ISP_SD_SRC			BIT(0)
33e6938cc1SHelen Koike #define RKISP1_ISP_SD_SINK			BIT(1)
34e6938cc1SHelen Koike 
35e6938cc1SHelen Koike /* min and max values for the widths and heights of the entities */
36e6938cc1SHelen Koike #define RKISP1_ISP_MAX_WIDTH			4032
37e6938cc1SHelen Koike #define RKISP1_ISP_MAX_HEIGHT			3024
38e6938cc1SHelen Koike #define RKISP1_ISP_MIN_WIDTH			32
39e6938cc1SHelen Koike #define RKISP1_ISP_MIN_HEIGHT			32
40e6938cc1SHelen Koike 
41e6938cc1SHelen Koike #define RKISP1_RSZ_MP_SRC_MAX_WIDTH		4416
42e6938cc1SHelen Koike #define RKISP1_RSZ_MP_SRC_MAX_HEIGHT		3312
43e6938cc1SHelen Koike #define RKISP1_RSZ_SP_SRC_MAX_WIDTH		1920
44e6938cc1SHelen Koike #define RKISP1_RSZ_SP_SRC_MAX_HEIGHT		1920
45e6938cc1SHelen Koike #define RKISP1_RSZ_SRC_MIN_WIDTH		32
46e6938cc1SHelen Koike #define RKISP1_RSZ_SRC_MIN_HEIGHT		16
47e6938cc1SHelen Koike 
48e6938cc1SHelen Koike /* the default width and height of all the entities */
49e6938cc1SHelen Koike #define RKISP1_DEFAULT_WIDTH			800
50e6938cc1SHelen Koike #define RKISP1_DEFAULT_HEIGHT			600
51e6938cc1SHelen Koike 
52e6938cc1SHelen Koike #define RKISP1_DRIVER_NAME			"rkisp1"
53e6938cc1SHelen Koike #define RKISP1_BUS_INFO				"platform:" RKISP1_DRIVER_NAME
54e6938cc1SHelen Koike 
55e6938cc1SHelen Koike /* maximum number of clocks */
56e6938cc1SHelen Koike #define RKISP1_MAX_BUS_CLK			8
57e6938cc1SHelen Koike 
58e6938cc1SHelen Koike /* a bitmask of the ready stats */
59e6938cc1SHelen Koike #define RKISP1_STATS_MEAS_MASK			(RKISP1_CIF_ISP_AWB_DONE |	\
60e6938cc1SHelen Koike 						 RKISP1_CIF_ISP_AFM_FIN |	\
61e6938cc1SHelen Koike 						 RKISP1_CIF_ISP_EXP_END |	\
62e6938cc1SHelen Koike 						 RKISP1_CIF_ISP_HIST_MEASURE_RDY)
63e6938cc1SHelen Koike 
64e6938cc1SHelen Koike /* enum for the resizer pads */
65e6938cc1SHelen Koike enum rkisp1_rsz_pad {
66e6938cc1SHelen Koike 	RKISP1_RSZ_PAD_SINK,
67e6938cc1SHelen Koike 	RKISP1_RSZ_PAD_SRC,
68e6938cc1SHelen Koike 	RKISP1_RSZ_PAD_MAX
69e6938cc1SHelen Koike };
70e6938cc1SHelen Koike 
71e6938cc1SHelen Koike /* enum for the capture id */
72e6938cc1SHelen Koike enum rkisp1_stream_id {
73e6938cc1SHelen Koike 	RKISP1_MAINPATH,
74e6938cc1SHelen Koike 	RKISP1_SELFPATH,
75e6938cc1SHelen Koike };
76e6938cc1SHelen Koike 
77e6938cc1SHelen Koike /* bayer patterns */
78e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type {
79e6938cc1SHelen Koike 	RKISP1_RAW_RGGB = 0,
80e6938cc1SHelen Koike 	RKISP1_RAW_GRBG,
81e6938cc1SHelen Koike 	RKISP1_RAW_GBRG,
82e6938cc1SHelen Koike 	RKISP1_RAW_BGGR,
83e6938cc1SHelen Koike };
84e6938cc1SHelen Koike 
85e6938cc1SHelen Koike /* enum for the isp pads */
86e6938cc1SHelen Koike enum rkisp1_isp_pad {
87e6938cc1SHelen Koike 	RKISP1_ISP_PAD_SINK_VIDEO,
88e6938cc1SHelen Koike 	RKISP1_ISP_PAD_SINK_PARAMS,
89e6938cc1SHelen Koike 	RKISP1_ISP_PAD_SOURCE_VIDEO,
90e6938cc1SHelen Koike 	RKISP1_ISP_PAD_SOURCE_STATS,
91e6938cc1SHelen Koike 	RKISP1_ISP_PAD_MAX
92e6938cc1SHelen Koike };
93e6938cc1SHelen Koike 
94e6938cc1SHelen Koike /*
959125aee7SPaul Elder  * struct rkisp1_info - Model-specific ISP Information
969125aee7SPaul Elder  *
979125aee7SPaul Elder  * @clks: array of ISP clock names
989125aee7SPaul Elder  * @clk_size: number of entries in the @clks array
999125aee7SPaul Elder  * @isrs: array of ISP interrupt descriptors
1009125aee7SPaul Elder  * @isr_size: number of entries in the @isrs array
1019125aee7SPaul Elder  * @isp_ver: ISP version
1029125aee7SPaul Elder  *
1039125aee7SPaul Elder  * This structure contains information about the ISP specific to a particular
1049125aee7SPaul Elder  * ISP model, version, or integration in a particular SoC.
1059125aee7SPaul Elder  */
1069125aee7SPaul Elder struct rkisp1_info {
1079125aee7SPaul Elder 	const char * const *clks;
1089125aee7SPaul Elder 	unsigned int clk_size;
1099125aee7SPaul Elder 	const struct rkisp1_isr_data *isrs;
1109125aee7SPaul Elder 	unsigned int isr_size;
1119125aee7SPaul Elder 	enum rkisp1_cif_isp_version isp_ver;
1129125aee7SPaul Elder };
1139125aee7SPaul Elder 
1149125aee7SPaul Elder /*
115e6938cc1SHelen Koike  * struct rkisp1_sensor_async - A container for the v4l2_async_subdev to add to the notifier
116e6938cc1SHelen Koike  *				of the v4l2-async API
117e6938cc1SHelen Koike  *
118e6938cc1SHelen Koike  * @asd:		async_subdev variable for the sensor
119bc374e17SLaurent Pinchart  * @index:		index of the sensor (counting sensor found in DT)
120*b0b8ab68SLaurent Pinchart  * @source_ep:		fwnode for the sensor source endpoint
121e6938cc1SHelen Koike  * @lanes:		number of lanes
122e6938cc1SHelen Koike  * @mbus_type:		type of bus (currently only CSI2 is supported)
123e6938cc1SHelen Koike  * @mbus_flags:		media bus (V4L2_MBUS_*) flags
124e6938cc1SHelen Koike  * @sd:			a pointer to v4l2_subdev struct of the sensor
125e6938cc1SHelen Koike  * @pixel_rate_ctrl:	pixel rate of the sensor, used to initialize the phy
126e6938cc1SHelen Koike  * @dphy:		a pointer to the phy
127e6938cc1SHelen Koike  */
128e6938cc1SHelen Koike struct rkisp1_sensor_async {
129e6938cc1SHelen Koike 	struct v4l2_async_subdev asd;
130bc374e17SLaurent Pinchart 	unsigned int index;
131*b0b8ab68SLaurent Pinchart 	struct fwnode_handle *source_ep;
132e6938cc1SHelen Koike 	unsigned int lanes;
133e6938cc1SHelen Koike 	enum v4l2_mbus_type mbus_type;
134e6938cc1SHelen Koike 	unsigned int mbus_flags;
135e6938cc1SHelen Koike 	struct v4l2_subdev *sd;
136e6938cc1SHelen Koike 	struct v4l2_ctrl *pixel_rate_ctrl;
137e6938cc1SHelen Koike 	struct phy *dphy;
138e6938cc1SHelen Koike };
139e6938cc1SHelen Koike 
140e6938cc1SHelen Koike /*
141e6938cc1SHelen Koike  * struct rkisp1_isp - ISP subdev entity
142e6938cc1SHelen Koike  *
143e6938cc1SHelen Koike  * @sd:				v4l2_subdev variable
144e6938cc1SHelen Koike  * @rkisp1:			pointer to rkisp1_device
145e6938cc1SHelen Koike  * @pads:			media pads
146e6938cc1SHelen Koike  * @pad_cfg:			pads configurations
147e6938cc1SHelen Koike  * @sink_fmt:			input format
148e6938cc1SHelen Koike  * @src_fmt:			output format
149e6938cc1SHelen Koike  * @ops_lock:			ops serialization
150e6938cc1SHelen Koike  * @is_dphy_errctrl_disabled:	if dphy errctrl is disabled (avoid endless interrupt)
151e6938cc1SHelen Koike  * @frame_sequence:		used to synchronize frame_id between video devices.
152e6938cc1SHelen Koike  */
153e6938cc1SHelen Koike struct rkisp1_isp {
154e6938cc1SHelen Koike 	struct v4l2_subdev sd;
155e6938cc1SHelen Koike 	struct media_pad pads[RKISP1_ISP_PAD_MAX];
156e6938cc1SHelen Koike 	struct v4l2_subdev_pad_config pad_cfg[RKISP1_ISP_PAD_MAX];
1570f3c2ab2SPaul Elder 	const struct rkisp1_mbus_info *sink_fmt;
1580f3c2ab2SPaul Elder 	const struct rkisp1_mbus_info *src_fmt;
159e6938cc1SHelen Koike 	struct mutex ops_lock; /* serialize the subdevice ops */
160e6938cc1SHelen Koike 	bool is_dphy_errctrl_disabled;
161e6938cc1SHelen Koike 	__u32 frame_sequence;
162e6938cc1SHelen Koike };
163e6938cc1SHelen Koike 
164e6938cc1SHelen Koike /*
165e6938cc1SHelen Koike  * struct rkisp1_vdev_node - Container for the video nodes: params, stats, mainpath, selfpath
166e6938cc1SHelen Koike  *
167e6938cc1SHelen Koike  * @buf_queue:	queue of buffers
168e6938cc1SHelen Koike  * @vlock:	lock of the video node
169e6938cc1SHelen Koike  * @vdev:	video node
170e6938cc1SHelen Koike  * @pad:	media pad
171e6938cc1SHelen Koike  */
172e6938cc1SHelen Koike struct rkisp1_vdev_node {
173e6938cc1SHelen Koike 	struct vb2_queue buf_queue;
174e6938cc1SHelen Koike 	struct mutex vlock; /* ioctl serialization mutex */
175e6938cc1SHelen Koike 	struct video_device vdev;
176e6938cc1SHelen Koike 	struct media_pad pad;
177e6938cc1SHelen Koike };
178e6938cc1SHelen Koike 
179e6938cc1SHelen Koike /*
180e6938cc1SHelen Koike  * struct rkisp1_buffer - A container for the vb2 buffers used by the video devices:
181e6938cc1SHelen Koike  *			  params, stats, mainpath, selfpath
182e6938cc1SHelen Koike  *
183e6938cc1SHelen Koike  * @vb:		vb2 buffer
184e6938cc1SHelen Koike  * @queue:	entry of the buffer in the queue
185e6938cc1SHelen Koike  * @buff_addr:	dma addresses of each plane, used only by the capture devices: selfpath, mainpath
186e6938cc1SHelen Koike  */
187e6938cc1SHelen Koike struct rkisp1_buffer {
188e6938cc1SHelen Koike 	struct vb2_v4l2_buffer vb;
189e6938cc1SHelen Koike 	struct list_head queue;
190e6938cc1SHelen Koike 	u32 buff_addr[VIDEO_MAX_PLANES];
191e6938cc1SHelen Koike };
192e6938cc1SHelen Koike 
193e6938cc1SHelen Koike /*
194e6938cc1SHelen Koike  * struct rkisp1_dummy_buffer - A buffer to write the next frame to in case
195e6938cc1SHelen Koike  *				there are no vb2 buffers available.
196e6938cc1SHelen Koike  *
197e6938cc1SHelen Koike  * @vaddr:	return value of call to dma_alloc_attrs.
198e6938cc1SHelen Koike  * @dma_addr:	dma address of the buffer.
199e6938cc1SHelen Koike  * @size:	size of the buffer.
200e6938cc1SHelen Koike  */
201e6938cc1SHelen Koike struct rkisp1_dummy_buffer {
202e6938cc1SHelen Koike 	void *vaddr;
203e6938cc1SHelen Koike 	dma_addr_t dma_addr;
204e6938cc1SHelen Koike 	u32 size;
205e6938cc1SHelen Koike };
206e6938cc1SHelen Koike 
207e6938cc1SHelen Koike struct rkisp1_device;
208e6938cc1SHelen Koike 
209e6938cc1SHelen Koike /*
210e6938cc1SHelen Koike  * struct rkisp1_capture - ISP capture video device
211e6938cc1SHelen Koike  *
212e6938cc1SHelen Koike  * @vnode:	  video node
213e6938cc1SHelen Koike  * @rkisp1:	  pointer to rkisp1_device
214e6938cc1SHelen Koike  * @id:		  id of the capture, one of RKISP1_SELFPATH, RKISP1_MAINPATH
215e6938cc1SHelen Koike  * @ops:	  list of callbacks to configure the capture device.
216e6938cc1SHelen Koike  * @config:	  a pointer to the list of registers to configure the capture format.
217e6938cc1SHelen Koike  * @is_streaming: device is streaming
218e6938cc1SHelen Koike  * @is_stopping:  stop_streaming callback was called and the device is in the process of
219e6938cc1SHelen Koike  *		  stopping the streaming.
220e6938cc1SHelen Koike  * @done:	  when stop_streaming callback is called, the device waits for the next irq
221e6938cc1SHelen Koike  *		  handler to stop the streaming by waiting on the 'done' wait queue.
222e6938cc1SHelen Koike  *		  If the irq handler is not called, the stream is stopped by the callback
223e6938cc1SHelen Koike  *		  after timeout.
224e6938cc1SHelen Koike  * @sp_y_stride:  the selfpath allows to configure a y stride that is longer than the image width.
225e6938cc1SHelen Koike  * @buf.lock:	  lock to protect buf.queue
226e6938cc1SHelen Koike  * @buf.queue:	  queued buffer list
227e6938cc1SHelen Koike  * @buf.dummy:	  dummy space to store dropped data
228e6938cc1SHelen Koike  *
229e6938cc1SHelen Koike  * rkisp1 uses shadow registers, so it needs two buffers at a time
230e6938cc1SHelen Koike  * @buf.curr:	  the buffer used for current frame
231e6938cc1SHelen Koike  * @buf.next:	  the buffer used for next frame
232e6938cc1SHelen Koike  * @pix.cfg:	  pixel configuration
233e6938cc1SHelen Koike  * @pix.info:	  a pointer to the v4l2_format_info of the pixel format
234e6938cc1SHelen Koike  * @pix.fmt:	  buffer format
235e6938cc1SHelen Koike  */
236e6938cc1SHelen Koike struct rkisp1_capture {
237e6938cc1SHelen Koike 	struct rkisp1_vdev_node vnode;
238e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
239e6938cc1SHelen Koike 	enum rkisp1_stream_id id;
240a109073bSRikard Falkeborn 	const struct rkisp1_capture_ops *ops;
241e6938cc1SHelen Koike 	const struct rkisp1_capture_config *config;
242e6938cc1SHelen Koike 	bool is_streaming;
243e6938cc1SHelen Koike 	bool is_stopping;
244e6938cc1SHelen Koike 	wait_queue_head_t done;
245e6938cc1SHelen Koike 	unsigned int sp_y_stride;
246e6938cc1SHelen Koike 	struct {
247e6938cc1SHelen Koike 		/* protects queue, curr and next */
248e6938cc1SHelen Koike 		spinlock_t lock;
249e6938cc1SHelen Koike 		struct list_head queue;
250e6938cc1SHelen Koike 		struct rkisp1_dummy_buffer dummy;
251e6938cc1SHelen Koike 		struct rkisp1_buffer *curr;
252e6938cc1SHelen Koike 		struct rkisp1_buffer *next;
253e6938cc1SHelen Koike 	} buf;
254e6938cc1SHelen Koike 	struct {
255e6938cc1SHelen Koike 		const struct rkisp1_capture_fmt_cfg *cfg;
256e6938cc1SHelen Koike 		const struct v4l2_format_info *info;
257e6938cc1SHelen Koike 		struct v4l2_pix_format_mplane fmt;
258e6938cc1SHelen Koike 	} pix;
259e6938cc1SHelen Koike };
260e6938cc1SHelen Koike 
261962fb140SHeiko Stuebner struct rkisp1_stats;
262962fb140SHeiko Stuebner struct rkisp1_stats_ops {
263962fb140SHeiko Stuebner 	void (*get_awb_meas)(struct rkisp1_stats *stats,
264962fb140SHeiko Stuebner 			     struct rkisp1_stat_buffer *pbuf);
265962fb140SHeiko Stuebner 	void (*get_aec_meas)(struct rkisp1_stats *stats,
266962fb140SHeiko Stuebner 			     struct rkisp1_stat_buffer *pbuf);
267962fb140SHeiko Stuebner 	void (*get_hst_meas)(struct rkisp1_stats *stats,
268962fb140SHeiko Stuebner 			     struct rkisp1_stat_buffer *pbuf);
269962fb140SHeiko Stuebner };
270962fb140SHeiko Stuebner 
271e6938cc1SHelen Koike /*
272e6938cc1SHelen Koike  * struct rkisp1_stats - ISP Statistics device
273e6938cc1SHelen Koike  *
274e6938cc1SHelen Koike  * @vnode:	  video node
275e6938cc1SHelen Koike  * @rkisp1:	  pointer to the rkisp1 device
276e6938cc1SHelen Koike  * @lock:	  locks the buffer list 'stat'
277e6938cc1SHelen Koike  * @stat:	  queue of rkisp1_buffer
278e6938cc1SHelen Koike  * @vdev_fmt:	  v4l2_format of the metadata format
279e6938cc1SHelen Koike  */
280e6938cc1SHelen Koike struct rkisp1_stats {
281e6938cc1SHelen Koike 	struct rkisp1_vdev_node vnode;
282e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
283962fb140SHeiko Stuebner 	const struct rkisp1_stats_ops *ops;
284e6938cc1SHelen Koike 
285e6938cc1SHelen Koike 	spinlock_t lock; /* locks the buffers list 'stats' */
286e6938cc1SHelen Koike 	struct list_head stat;
287e6938cc1SHelen Koike 	struct v4l2_format vdev_fmt;
288e6938cc1SHelen Koike };
289e6938cc1SHelen Koike 
2905e8d9d72SHeiko Stuebner struct rkisp1_params;
2915e8d9d72SHeiko Stuebner struct rkisp1_params_ops {
2925e8d9d72SHeiko Stuebner 	void (*lsc_matrix_config)(struct rkisp1_params *params,
2935e8d9d72SHeiko Stuebner 				  const struct rkisp1_cif_isp_lsc_config *pconfig);
2945e8d9d72SHeiko Stuebner 	void (*goc_config)(struct rkisp1_params *params,
2955e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_goc_config *arg);
2965e8d9d72SHeiko Stuebner 	void (*awb_meas_config)(struct rkisp1_params *params,
2975e8d9d72SHeiko Stuebner 				const struct rkisp1_cif_isp_awb_meas_config *arg);
2985e8d9d72SHeiko Stuebner 	void (*awb_meas_enable)(struct rkisp1_params *params,
2995e8d9d72SHeiko Stuebner 				const struct rkisp1_cif_isp_awb_meas_config *arg,
3005e8d9d72SHeiko Stuebner 				bool en);
3015e8d9d72SHeiko Stuebner 	void (*awb_gain_config)(struct rkisp1_params *params,
3025e8d9d72SHeiko Stuebner 				const struct rkisp1_cif_isp_awb_gain_config *arg);
3035e8d9d72SHeiko Stuebner 	void (*aec_config)(struct rkisp1_params *params,
3045e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_aec_config *arg);
3055e8d9d72SHeiko Stuebner 	void (*hst_config)(struct rkisp1_params *params,
3065e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_hst_config *arg);
3075e8d9d72SHeiko Stuebner 	void (*hst_enable)(struct rkisp1_params *params,
3085e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_hst_config *arg, bool en);
3095e8d9d72SHeiko Stuebner 	void (*afm_config)(struct rkisp1_params *params,
3105e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_afc_config *arg);
3115e8d9d72SHeiko Stuebner };
3125e8d9d72SHeiko Stuebner 
313e6938cc1SHelen Koike /*
314e6938cc1SHelen Koike  * struct rkisp1_params - ISP input parameters device
315e6938cc1SHelen Koike  *
316e6938cc1SHelen Koike  * @vnode:		video node
317e6938cc1SHelen Koike  * @rkisp1:		pointer to the rkisp1 device
3185e8d9d72SHeiko Stuebner  * @ops:		pointer to the variant-specific operations
319e6938cc1SHelen Koike  * @config_lock:	locks the buffer list 'params'
320e6938cc1SHelen Koike  * @params:		queue of rkisp1_buffer
321e6938cc1SHelen Koike  * @vdev_fmt:		v4l2_format of the metadata format
322e6938cc1SHelen Koike  * @quantization:	the quantization configured on the isp's src pad
323e6938cc1SHelen Koike  * @raw_type:		the bayer pattern on the isp video sink pad
324e6938cc1SHelen Koike  */
325e6938cc1SHelen Koike struct rkisp1_params {
326e6938cc1SHelen Koike 	struct rkisp1_vdev_node vnode;
327e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
3285e8d9d72SHeiko Stuebner 	const struct rkisp1_params_ops *ops;
329e6938cc1SHelen Koike 
330e6938cc1SHelen Koike 	spinlock_t config_lock; /* locks the buffers list 'params' */
331e6938cc1SHelen Koike 	struct list_head params;
332e6938cc1SHelen Koike 	struct v4l2_format vdev_fmt;
333e6938cc1SHelen Koike 
334e6938cc1SHelen Koike 	enum v4l2_quantization quantization;
335e6938cc1SHelen Koike 	enum rkisp1_fmt_raw_pat_type raw_type;
336e6938cc1SHelen Koike };
337e6938cc1SHelen Koike 
338e6938cc1SHelen Koike /*
339e6938cc1SHelen Koike  * struct rkisp1_resizer - Resizer subdev
340e6938cc1SHelen Koike  *
341e6938cc1SHelen Koike  * @sd:	       v4l2_subdev variable
3423e74a422SLaurent Pinchart  * @regs_base: base register address offset
343e6938cc1SHelen Koike  * @id:	       id of the resizer, one of RKISP1_SELFPATH, RKISP1_MAINPATH
344e6938cc1SHelen Koike  * @rkisp1:    pointer to the rkisp1 device
345e6938cc1SHelen Koike  * @pads:      media pads
346e6938cc1SHelen Koike  * @pad_cfg:   configurations for the pads
347e6938cc1SHelen Koike  * @config:    the set of registers to configure the resizer
348e6938cc1SHelen Koike  * @pixel_enc: pixel encoding of the resizer
349e6938cc1SHelen Koike  * @ops_lock:  a lock for the subdev ops
350e6938cc1SHelen Koike  */
351e6938cc1SHelen Koike struct rkisp1_resizer {
352e6938cc1SHelen Koike 	struct v4l2_subdev sd;
3533e74a422SLaurent Pinchart 	u32 regs_base;
354e6938cc1SHelen Koike 	enum rkisp1_stream_id id;
355e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
356e6938cc1SHelen Koike 	struct media_pad pads[RKISP1_RSZ_PAD_MAX];
357e6938cc1SHelen Koike 	struct v4l2_subdev_pad_config pad_cfg[RKISP1_RSZ_PAD_MAX];
358e6938cc1SHelen Koike 	const struct rkisp1_rsz_config *config;
359e6938cc1SHelen Koike 	enum v4l2_pixel_encoding pixel_enc;
360e6938cc1SHelen Koike 	struct mutex ops_lock; /* serialize the subdevice ops */
361e6938cc1SHelen Koike };
362e6938cc1SHelen Koike 
363e6938cc1SHelen Koike /*
364e6938cc1SHelen Koike  * struct rkisp1_debug - Values to be exposed on debugfs.
365e6938cc1SHelen Koike  *			 The parameters are counters of the number of times the
366e6938cc1SHelen Koike  *			 event occurred since the driver was loaded.
367e6938cc1SHelen Koike  *
368e6938cc1SHelen Koike  * @data_loss:			  loss of data occurred within a line, processing failure
369e6938cc1SHelen Koike  * @outform_size_error:		  size error is generated in outmux submodule
370e6938cc1SHelen Koike  * @img_stabilization_size_error: size error is generated in image stabilization submodule
371e6938cc1SHelen Koike  * @inform_size_err:		  size error is generated in inform submodule
372e6938cc1SHelen Koike  * @mipi_error:			  mipi error occurred
373e6938cc1SHelen Koike  * @stats_error:		  writing to the 'Interrupt clear register' did not clear
374e6938cc1SHelen Koike  *				  it in the register 'Masked interrupt status'
375e6938cc1SHelen Koike  * @stop_timeout:		  upon stream stop, the capture waits 1 second for the isr to stop
376e6938cc1SHelen Koike  *				  the stream. This param is incremented in case of timeout.
377e6938cc1SHelen Koike  * @frame_drop:			  a frame was ready but the buffer queue was empty so the frame
378e6938cc1SHelen Koike  *				  was not sent to userspace
379e6938cc1SHelen Koike  */
380e6938cc1SHelen Koike struct rkisp1_debug {
381e6938cc1SHelen Koike 	struct dentry *debugfs_dir;
382e6938cc1SHelen Koike 	unsigned long data_loss;
383e6938cc1SHelen Koike 	unsigned long outform_size_error;
384e6938cc1SHelen Koike 	unsigned long img_stabilization_size_error;
385e6938cc1SHelen Koike 	unsigned long inform_size_error;
386e6938cc1SHelen Koike 	unsigned long irq_delay;
387e6938cc1SHelen Koike 	unsigned long mipi_error;
388e6938cc1SHelen Koike 	unsigned long stats_error;
389e6938cc1SHelen Koike 	unsigned long stop_timeout[2];
390e6938cc1SHelen Koike 	unsigned long frame_drop[2];
391e6938cc1SHelen Koike };
392e6938cc1SHelen Koike 
393e6938cc1SHelen Koike /*
394e6938cc1SHelen Koike  * struct rkisp1_device - ISP platform device
395e6938cc1SHelen Koike  *
396e6938cc1SHelen Koike  * @base_addr:	   base register address
397e6938cc1SHelen Koike  * @irq:	   the irq number
398e6938cc1SHelen Koike  * @dev:	   a pointer to the struct device
399e6938cc1SHelen Koike  * @clk_size:	   number of clocks
400e6938cc1SHelen Koike  * @clks:	   array of clocks
401e6938cc1SHelen Koike  * @v4l2_dev:	   v4l2_device variable
402e6938cc1SHelen Koike  * @media_dev:	   media_device variable
403e6938cc1SHelen Koike  * @notifier:	   a notifier to register on the v4l2-async API to be notified on the sensor
404e6938cc1SHelen Koike  * @active_sensor: sensor in-use, set when streaming on
405e6938cc1SHelen Koike  * @isp:	   ISP sub-device
406e6938cc1SHelen Koike  * @resizer_devs:  resizer sub-devices
407e6938cc1SHelen Koike  * @capture_devs:  capture devices
408e6938cc1SHelen Koike  * @stats:	   ISP statistics metadata capture device
409e6938cc1SHelen Koike  * @params:	   ISP parameters metadata output device
410e6938cc1SHelen Koike  * @pipe:	   media pipeline
411e6938cc1SHelen Koike  * @stream_lock:   serializes {start/stop}_streaming callbacks between the capture devices.
412e6938cc1SHelen Koike  * @debug:	   debug params to be exposed on debugfs
4139125aee7SPaul Elder  * @info:	   version-specific ISP information
414e6938cc1SHelen Koike  */
415e6938cc1SHelen Koike struct rkisp1_device {
416e6938cc1SHelen Koike 	void __iomem *base_addr;
417e6938cc1SHelen Koike 	struct device *dev;
418e6938cc1SHelen Koike 	unsigned int clk_size;
419e6938cc1SHelen Koike 	struct clk_bulk_data clks[RKISP1_MAX_BUS_CLK];
420e6938cc1SHelen Koike 	struct v4l2_device v4l2_dev;
421e6938cc1SHelen Koike 	struct media_device media_dev;
422e6938cc1SHelen Koike 	struct v4l2_async_notifier notifier;
423e6938cc1SHelen Koike 	struct rkisp1_sensor_async *active_sensor;
424e6938cc1SHelen Koike 	struct rkisp1_isp isp;
425e6938cc1SHelen Koike 	struct rkisp1_resizer resizer_devs[2];
426e6938cc1SHelen Koike 	struct rkisp1_capture capture_devs[2];
427e6938cc1SHelen Koike 	struct rkisp1_stats stats;
428e6938cc1SHelen Koike 	struct rkisp1_params params;
429e6938cc1SHelen Koike 	struct media_pipeline pipe;
430e6938cc1SHelen Koike 	struct mutex stream_lock; /* serialize {start/stop}_streaming cb between capture devices */
431e6938cc1SHelen Koike 	struct rkisp1_debug debug;
4329125aee7SPaul Elder 	const struct rkisp1_info *info;
433e6938cc1SHelen Koike };
434e6938cc1SHelen Koike 
435e6938cc1SHelen Koike /*
4360f3c2ab2SPaul Elder  * struct rkisp1_mbus_info - ISP media bus info, Translates media bus code to hardware
437e6938cc1SHelen Koike  *			     format values
438e6938cc1SHelen Koike  *
439e6938cc1SHelen Koike  * @mbus_code: media bus code
440e6938cc1SHelen Koike  * @pixel_enc: pixel encoding
441e6938cc1SHelen Koike  * @mipi_dt:   mipi data type
442e6938cc1SHelen Koike  * @yuv_seq:   the order of the Y, Cb, Cr values
443e6938cc1SHelen Koike  * @bus_width: bus width
444e6938cc1SHelen Koike  * @bayer_pat: bayer pattern
445e6938cc1SHelen Koike  * @direction: a bitmask of the flags indicating on which pad the format is supported on
446e6938cc1SHelen Koike  */
4470f3c2ab2SPaul Elder struct rkisp1_mbus_info {
448e6938cc1SHelen Koike 	u32 mbus_code;
449e6938cc1SHelen Koike 	enum v4l2_pixel_encoding pixel_enc;
450e6938cc1SHelen Koike 	u32 mipi_dt;
451e6938cc1SHelen Koike 	u32 yuv_seq;
452e6938cc1SHelen Koike 	u8 bus_width;
453e6938cc1SHelen Koike 	enum rkisp1_fmt_raw_pat_type bayer_pat;
454e6938cc1SHelen Koike 	unsigned int direction;
455e6938cc1SHelen Koike };
456e6938cc1SHelen Koike 
457e6938cc1SHelen Koike static inline void
4580ef7dc30SLaurent Pinchart rkisp1_write(struct rkisp1_device *rkisp1, unsigned int addr, u32 val)
459e6938cc1SHelen Koike {
460e6938cc1SHelen Koike 	writel(val, rkisp1->base_addr + addr);
461e6938cc1SHelen Koike }
462e6938cc1SHelen Koike 
463e6938cc1SHelen Koike static inline u32 rkisp1_read(struct rkisp1_device *rkisp1, unsigned int addr)
464e6938cc1SHelen Koike {
465e6938cc1SHelen Koike 	return readl(rkisp1->base_addr + addr);
466e6938cc1SHelen Koike }
467e6938cc1SHelen Koike 
468e6938cc1SHelen Koike /*
469e6938cc1SHelen Koike  * rkisp1_cap_enum_mbus_codes - A helper function that return the i'th supported mbus code
470e6938cc1SHelen Koike  *				of the capture entity. This is used to enumerate the supported
471e6938cc1SHelen Koike  *				mbus codes on the source pad of the resizer.
472e6938cc1SHelen Koike  *
473e6938cc1SHelen Koike  * @cap:  the capture entity
474e6938cc1SHelen Koike  * @code: the mbus code, the function reads the code->index and fills the code->code
475e6938cc1SHelen Koike  */
476e6938cc1SHelen Koike int rkisp1_cap_enum_mbus_codes(struct rkisp1_capture *cap,
477e6938cc1SHelen Koike 			       struct v4l2_subdev_mbus_code_enum *code);
478e6938cc1SHelen Koike 
479e6938cc1SHelen Koike /*
4800f3c2ab2SPaul Elder  * rkisp1_mbus_info_get_by_index - Retrieve the ith supported mbus info
4810f3c2ab2SPaul Elder  *
4820f3c2ab2SPaul Elder  * @index: index of the mbus info to fetch
4830f3c2ab2SPaul Elder  */
4840f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_index(unsigned int index);
4850f3c2ab2SPaul Elder 
4860f3c2ab2SPaul Elder /*
487e6938cc1SHelen Koike  * rkisp1_sd_adjust_crop_rect - adjust a rectangle to fit into another rectangle.
488e6938cc1SHelen Koike  *
489e6938cc1SHelen Koike  * @crop:   rectangle to adjust.
490e6938cc1SHelen Koike  * @bounds: rectangle used as bounds.
491e6938cc1SHelen Koike  */
492e6938cc1SHelen Koike void rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop,
493e6938cc1SHelen Koike 				const struct v4l2_rect *bounds);
494e6938cc1SHelen Koike 
495e6938cc1SHelen Koike /*
496e6938cc1SHelen Koike  * rkisp1_sd_adjust_crop - adjust a rectangle to fit into media bus format
497e6938cc1SHelen Koike  *
498e6938cc1SHelen Koike  * @crop:   rectangle to adjust.
499e6938cc1SHelen Koike  * @bounds: media bus format used as bounds.
500e6938cc1SHelen Koike  */
501e6938cc1SHelen Koike void rkisp1_sd_adjust_crop(struct v4l2_rect *crop,
502e6938cc1SHelen Koike 			   const struct v4l2_mbus_framefmt *bounds);
503e6938cc1SHelen Koike 
504e6938cc1SHelen Koike /*
5050f3c2ab2SPaul Elder  * rkisp1_mbus_info_get_by_code - get the isp info of the media bus code
506e6938cc1SHelen Koike  *
507e6938cc1SHelen Koike  * @mbus_code: the media bus code
508e6938cc1SHelen Koike  */
5090f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_code(u32 mbus_code);
510e6938cc1SHelen Koike 
511e6938cc1SHelen Koike /* rkisp1_params_configure - configure the params when stream starts.
512e6938cc1SHelen Koike  *			     This function is called by the isp entity upon stream starts.
513e6938cc1SHelen Koike  *			     The function applies the initial configuration of the parameters.
514e6938cc1SHelen Koike  *
515e6938cc1SHelen Koike  * @params:	  pointer to rkisp1_params.
516e6938cc1SHelen Koike  * @bayer_pat:	  the bayer pattern on the isp video sink pad
517e6938cc1SHelen Koike  * @quantization: the quantization configured on the isp's src pad
518e6938cc1SHelen Koike  */
519e6938cc1SHelen Koike void rkisp1_params_configure(struct rkisp1_params *params,
520e6938cc1SHelen Koike 			     enum rkisp1_fmt_raw_pat_type bayer_pat,
521e6938cc1SHelen Koike 			     enum v4l2_quantization quantization);
522e6938cc1SHelen Koike 
523e6938cc1SHelen Koike /* rkisp1_params_disable - disable all parameters.
524e6938cc1SHelen Koike  *			   This function is called by the isp entity upon stream start
525e6938cc1SHelen Koike  *			   when capturing bayer format.
526e6938cc1SHelen Koike  *
527e6938cc1SHelen Koike  * @params: pointer to rkisp1_params.
528e6938cc1SHelen Koike  */
529e6938cc1SHelen Koike void rkisp1_params_disable(struct rkisp1_params *params);
530e6938cc1SHelen Koike 
531e6938cc1SHelen Koike /* irq handlers */
53208818e6aSHeiko Stuebner irqreturn_t rkisp1_isp_isr(int irq, void *ctx);
53308818e6aSHeiko Stuebner irqreturn_t rkisp1_mipi_isr(int irq, void *ctx);
53408818e6aSHeiko Stuebner irqreturn_t rkisp1_capture_isr(int irq, void *ctx);
535e6938cc1SHelen Koike void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris);
536e6938cc1SHelen Koike void rkisp1_params_isr(struct rkisp1_device *rkisp1);
537e6938cc1SHelen Koike 
538e6938cc1SHelen Koike /* register/unregisters functions of the entities */
539e6938cc1SHelen Koike int rkisp1_capture_devs_register(struct rkisp1_device *rkisp1);
540e6938cc1SHelen Koike void rkisp1_capture_devs_unregister(struct rkisp1_device *rkisp1);
541e6938cc1SHelen Koike 
542e6938cc1SHelen Koike int rkisp1_isp_register(struct rkisp1_device *rkisp1);
543e6938cc1SHelen Koike void rkisp1_isp_unregister(struct rkisp1_device *rkisp1);
544e6938cc1SHelen Koike 
545e6938cc1SHelen Koike int rkisp1_resizer_devs_register(struct rkisp1_device *rkisp1);
546e6938cc1SHelen Koike void rkisp1_resizer_devs_unregister(struct rkisp1_device *rkisp1);
547e6938cc1SHelen Koike 
548e6938cc1SHelen Koike int rkisp1_stats_register(struct rkisp1_device *rkisp1);
549e6938cc1SHelen Koike void rkisp1_stats_unregister(struct rkisp1_device *rkisp1);
550e6938cc1SHelen Koike 
551e6938cc1SHelen Koike int rkisp1_params_register(struct rkisp1_device *rkisp1);
552e6938cc1SHelen Koike void rkisp1_params_unregister(struct rkisp1_device *rkisp1);
553e6938cc1SHelen Koike 
554fd3608feSLaurent Pinchart #if IS_ENABLED(CONFIG_DEBUG_FS)
5558682037dSLaurent Pinchart void rkisp1_debug_init(struct rkisp1_device *rkisp1);
5568682037dSLaurent Pinchart void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1);
557fd3608feSLaurent Pinchart #else
558fd3608feSLaurent Pinchart static inline void rkisp1_debug_init(struct rkisp1_device *rkisp1)
559fd3608feSLaurent Pinchart {
560fd3608feSLaurent Pinchart }
561fd3608feSLaurent Pinchart static inline void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1)
562fd3608feSLaurent Pinchart {
563fd3608feSLaurent Pinchart }
564fd3608feSLaurent Pinchart #endif
5658682037dSLaurent Pinchart 
566e6938cc1SHelen Koike #endif /* _RKISP1_COMMON_H */
567