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)
120b0b8ab68SLaurent 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  */
127e6938cc1SHelen Koike struct rkisp1_sensor_async {
128e6938cc1SHelen Koike 	struct v4l2_async_subdev asd;
129bc374e17SLaurent Pinchart 	unsigned int index;
130b0b8ab68SLaurent Pinchart 	struct fwnode_handle *source_ep;
131e6938cc1SHelen Koike 	unsigned int lanes;
132e6938cc1SHelen Koike 	enum v4l2_mbus_type mbus_type;
133e6938cc1SHelen Koike 	unsigned int mbus_flags;
134e6938cc1SHelen Koike 	struct v4l2_subdev *sd;
135e6938cc1SHelen Koike 	struct v4l2_ctrl *pixel_rate_ctrl;
136*8082e2f4SPaul Elder };
137*8082e2f4SPaul Elder 
138*8082e2f4SPaul Elder /*
139*8082e2f4SPaul Elder  * struct rkisp1_csi - CSI receiver subdev
140*8082e2f4SPaul Elder  *
141*8082e2f4SPaul Elder  * @rkisp1: pointer to the rkisp1 device
142*8082e2f4SPaul Elder  * @dphy: a pointer to the phy
143*8082e2f4SPaul Elder  * @is_dphy_errctrl_disabled: if dphy errctrl is disabled (avoid endless interrupt)
144*8082e2f4SPaul Elder  */
145*8082e2f4SPaul Elder struct rkisp1_csi {
146*8082e2f4SPaul Elder 	struct rkisp1_device *rkisp1;
147e6938cc1SHelen Koike 	struct phy *dphy;
148*8082e2f4SPaul Elder 	bool is_dphy_errctrl_disabled;
149e6938cc1SHelen Koike };
150e6938cc1SHelen Koike 
151e6938cc1SHelen Koike /*
152e6938cc1SHelen Koike  * struct rkisp1_isp - ISP subdev entity
153e6938cc1SHelen Koike  *
154e6938cc1SHelen Koike  * @sd:				v4l2_subdev variable
155e6938cc1SHelen Koike  * @rkisp1:			pointer to rkisp1_device
156e6938cc1SHelen Koike  * @pads:			media pads
157e6938cc1SHelen Koike  * @pad_cfg:			pads configurations
158e6938cc1SHelen Koike  * @sink_fmt:			input format
159e6938cc1SHelen Koike  * @src_fmt:			output format
160e6938cc1SHelen Koike  * @ops_lock:			ops serialization
161e6938cc1SHelen Koike  * @frame_sequence:		used to synchronize frame_id between video devices.
162e6938cc1SHelen Koike  */
163e6938cc1SHelen Koike struct rkisp1_isp {
164e6938cc1SHelen Koike 	struct v4l2_subdev sd;
165e6938cc1SHelen Koike 	struct media_pad pads[RKISP1_ISP_PAD_MAX];
166e6938cc1SHelen Koike 	struct v4l2_subdev_pad_config pad_cfg[RKISP1_ISP_PAD_MAX];
1670f3c2ab2SPaul Elder 	const struct rkisp1_mbus_info *sink_fmt;
1680f3c2ab2SPaul Elder 	const struct rkisp1_mbus_info *src_fmt;
169e6938cc1SHelen Koike 	struct mutex ops_lock; /* serialize the subdevice ops */
170e6938cc1SHelen Koike 	__u32 frame_sequence;
171e6938cc1SHelen Koike };
172e6938cc1SHelen Koike 
173e6938cc1SHelen Koike /*
174e6938cc1SHelen Koike  * struct rkisp1_vdev_node - Container for the video nodes: params, stats, mainpath, selfpath
175e6938cc1SHelen Koike  *
176e6938cc1SHelen Koike  * @buf_queue:	queue of buffers
177e6938cc1SHelen Koike  * @vlock:	lock of the video node
178e6938cc1SHelen Koike  * @vdev:	video node
179e6938cc1SHelen Koike  * @pad:	media pad
180e6938cc1SHelen Koike  */
181e6938cc1SHelen Koike struct rkisp1_vdev_node {
182e6938cc1SHelen Koike 	struct vb2_queue buf_queue;
183e6938cc1SHelen Koike 	struct mutex vlock; /* ioctl serialization mutex */
184e6938cc1SHelen Koike 	struct video_device vdev;
185e6938cc1SHelen Koike 	struct media_pad pad;
186e6938cc1SHelen Koike };
187e6938cc1SHelen Koike 
188e6938cc1SHelen Koike /*
189e6938cc1SHelen Koike  * struct rkisp1_buffer - A container for the vb2 buffers used by the video devices:
190e6938cc1SHelen Koike  *			  params, stats, mainpath, selfpath
191e6938cc1SHelen Koike  *
192e6938cc1SHelen Koike  * @vb:		vb2 buffer
193e6938cc1SHelen Koike  * @queue:	entry of the buffer in the queue
194e6938cc1SHelen Koike  * @buff_addr:	dma addresses of each plane, used only by the capture devices: selfpath, mainpath
195e6938cc1SHelen Koike  */
196e6938cc1SHelen Koike struct rkisp1_buffer {
197e6938cc1SHelen Koike 	struct vb2_v4l2_buffer vb;
198e6938cc1SHelen Koike 	struct list_head queue;
199e6938cc1SHelen Koike 	u32 buff_addr[VIDEO_MAX_PLANES];
200e6938cc1SHelen Koike };
201e6938cc1SHelen Koike 
202e6938cc1SHelen Koike /*
203e6938cc1SHelen Koike  * struct rkisp1_dummy_buffer - A buffer to write the next frame to in case
204e6938cc1SHelen Koike  *				there are no vb2 buffers available.
205e6938cc1SHelen Koike  *
206e6938cc1SHelen Koike  * @vaddr:	return value of call to dma_alloc_attrs.
207e6938cc1SHelen Koike  * @dma_addr:	dma address of the buffer.
208e6938cc1SHelen Koike  * @size:	size of the buffer.
209e6938cc1SHelen Koike  */
210e6938cc1SHelen Koike struct rkisp1_dummy_buffer {
211e6938cc1SHelen Koike 	void *vaddr;
212e6938cc1SHelen Koike 	dma_addr_t dma_addr;
213e6938cc1SHelen Koike 	u32 size;
214e6938cc1SHelen Koike };
215e6938cc1SHelen Koike 
216e6938cc1SHelen Koike struct rkisp1_device;
217e6938cc1SHelen Koike 
218e6938cc1SHelen Koike /*
219e6938cc1SHelen Koike  * struct rkisp1_capture - ISP capture video device
220e6938cc1SHelen Koike  *
221e6938cc1SHelen Koike  * @vnode:	  video node
222e6938cc1SHelen Koike  * @rkisp1:	  pointer to rkisp1_device
223e6938cc1SHelen Koike  * @id:		  id of the capture, one of RKISP1_SELFPATH, RKISP1_MAINPATH
224e6938cc1SHelen Koike  * @ops:	  list of callbacks to configure the capture device.
225e6938cc1SHelen Koike  * @config:	  a pointer to the list of registers to configure the capture format.
226e6938cc1SHelen Koike  * @is_streaming: device is streaming
227e6938cc1SHelen Koike  * @is_stopping:  stop_streaming callback was called and the device is in the process of
228e6938cc1SHelen Koike  *		  stopping the streaming.
229e6938cc1SHelen Koike  * @done:	  when stop_streaming callback is called, the device waits for the next irq
230e6938cc1SHelen Koike  *		  handler to stop the streaming by waiting on the 'done' wait queue.
231e6938cc1SHelen Koike  *		  If the irq handler is not called, the stream is stopped by the callback
232e6938cc1SHelen Koike  *		  after timeout.
233e6938cc1SHelen Koike  * @sp_y_stride:  the selfpath allows to configure a y stride that is longer than the image width.
234e6938cc1SHelen Koike  * @buf.lock:	  lock to protect buf.queue
235e6938cc1SHelen Koike  * @buf.queue:	  queued buffer list
236e6938cc1SHelen Koike  * @buf.dummy:	  dummy space to store dropped data
237e6938cc1SHelen Koike  *
238e6938cc1SHelen Koike  * rkisp1 uses shadow registers, so it needs two buffers at a time
239e6938cc1SHelen Koike  * @buf.curr:	  the buffer used for current frame
240e6938cc1SHelen Koike  * @buf.next:	  the buffer used for next frame
241e6938cc1SHelen Koike  * @pix.cfg:	  pixel configuration
242e6938cc1SHelen Koike  * @pix.info:	  a pointer to the v4l2_format_info of the pixel format
243e6938cc1SHelen Koike  * @pix.fmt:	  buffer format
244e6938cc1SHelen Koike  */
245e6938cc1SHelen Koike struct rkisp1_capture {
246e6938cc1SHelen Koike 	struct rkisp1_vdev_node vnode;
247e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
248e6938cc1SHelen Koike 	enum rkisp1_stream_id id;
249a109073bSRikard Falkeborn 	const struct rkisp1_capture_ops *ops;
250e6938cc1SHelen Koike 	const struct rkisp1_capture_config *config;
251e6938cc1SHelen Koike 	bool is_streaming;
252e6938cc1SHelen Koike 	bool is_stopping;
253e6938cc1SHelen Koike 	wait_queue_head_t done;
254e6938cc1SHelen Koike 	unsigned int sp_y_stride;
255e6938cc1SHelen Koike 	struct {
256e6938cc1SHelen Koike 		/* protects queue, curr and next */
257e6938cc1SHelen Koike 		spinlock_t lock;
258e6938cc1SHelen Koike 		struct list_head queue;
259e6938cc1SHelen Koike 		struct rkisp1_dummy_buffer dummy;
260e6938cc1SHelen Koike 		struct rkisp1_buffer *curr;
261e6938cc1SHelen Koike 		struct rkisp1_buffer *next;
262e6938cc1SHelen Koike 	} buf;
263e6938cc1SHelen Koike 	struct {
264e6938cc1SHelen Koike 		const struct rkisp1_capture_fmt_cfg *cfg;
265e6938cc1SHelen Koike 		const struct v4l2_format_info *info;
266e6938cc1SHelen Koike 		struct v4l2_pix_format_mplane fmt;
267e6938cc1SHelen Koike 	} pix;
268e6938cc1SHelen Koike };
269e6938cc1SHelen Koike 
270962fb140SHeiko Stuebner struct rkisp1_stats;
271962fb140SHeiko Stuebner struct rkisp1_stats_ops {
272962fb140SHeiko Stuebner 	void (*get_awb_meas)(struct rkisp1_stats *stats,
273962fb140SHeiko Stuebner 			     struct rkisp1_stat_buffer *pbuf);
274962fb140SHeiko Stuebner 	void (*get_aec_meas)(struct rkisp1_stats *stats,
275962fb140SHeiko Stuebner 			     struct rkisp1_stat_buffer *pbuf);
276962fb140SHeiko Stuebner 	void (*get_hst_meas)(struct rkisp1_stats *stats,
277962fb140SHeiko Stuebner 			     struct rkisp1_stat_buffer *pbuf);
278962fb140SHeiko Stuebner };
279962fb140SHeiko Stuebner 
280e6938cc1SHelen Koike /*
281e6938cc1SHelen Koike  * struct rkisp1_stats - ISP Statistics device
282e6938cc1SHelen Koike  *
283e6938cc1SHelen Koike  * @vnode:	  video node
284e6938cc1SHelen Koike  * @rkisp1:	  pointer to the rkisp1 device
285e6938cc1SHelen Koike  * @lock:	  locks the buffer list 'stat'
286e6938cc1SHelen Koike  * @stat:	  queue of rkisp1_buffer
287e6938cc1SHelen Koike  * @vdev_fmt:	  v4l2_format of the metadata format
288e6938cc1SHelen Koike  */
289e6938cc1SHelen Koike struct rkisp1_stats {
290e6938cc1SHelen Koike 	struct rkisp1_vdev_node vnode;
291e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
292962fb140SHeiko Stuebner 	const struct rkisp1_stats_ops *ops;
293e6938cc1SHelen Koike 
294e6938cc1SHelen Koike 	spinlock_t lock; /* locks the buffers list 'stats' */
295e6938cc1SHelen Koike 	struct list_head stat;
296e6938cc1SHelen Koike 	struct v4l2_format vdev_fmt;
297e6938cc1SHelen Koike };
298e6938cc1SHelen Koike 
2995e8d9d72SHeiko Stuebner struct rkisp1_params;
3005e8d9d72SHeiko Stuebner struct rkisp1_params_ops {
3015e8d9d72SHeiko Stuebner 	void (*lsc_matrix_config)(struct rkisp1_params *params,
3025e8d9d72SHeiko Stuebner 				  const struct rkisp1_cif_isp_lsc_config *pconfig);
3035e8d9d72SHeiko Stuebner 	void (*goc_config)(struct rkisp1_params *params,
3045e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_goc_config *arg);
3055e8d9d72SHeiko Stuebner 	void (*awb_meas_config)(struct rkisp1_params *params,
3065e8d9d72SHeiko Stuebner 				const struct rkisp1_cif_isp_awb_meas_config *arg);
3075e8d9d72SHeiko Stuebner 	void (*awb_meas_enable)(struct rkisp1_params *params,
3085e8d9d72SHeiko Stuebner 				const struct rkisp1_cif_isp_awb_meas_config *arg,
3095e8d9d72SHeiko Stuebner 				bool en);
3105e8d9d72SHeiko Stuebner 	void (*awb_gain_config)(struct rkisp1_params *params,
3115e8d9d72SHeiko Stuebner 				const struct rkisp1_cif_isp_awb_gain_config *arg);
3125e8d9d72SHeiko Stuebner 	void (*aec_config)(struct rkisp1_params *params,
3135e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_aec_config *arg);
3145e8d9d72SHeiko Stuebner 	void (*hst_config)(struct rkisp1_params *params,
3155e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_hst_config *arg);
3165e8d9d72SHeiko Stuebner 	void (*hst_enable)(struct rkisp1_params *params,
3175e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_hst_config *arg, bool en);
3185e8d9d72SHeiko Stuebner 	void (*afm_config)(struct rkisp1_params *params,
3195e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_afc_config *arg);
3205e8d9d72SHeiko Stuebner };
3215e8d9d72SHeiko Stuebner 
322e6938cc1SHelen Koike /*
323e6938cc1SHelen Koike  * struct rkisp1_params - ISP input parameters device
324e6938cc1SHelen Koike  *
325e6938cc1SHelen Koike  * @vnode:		video node
326e6938cc1SHelen Koike  * @rkisp1:		pointer to the rkisp1 device
3275e8d9d72SHeiko Stuebner  * @ops:		pointer to the variant-specific operations
328e6938cc1SHelen Koike  * @config_lock:	locks the buffer list 'params'
329e6938cc1SHelen Koike  * @params:		queue of rkisp1_buffer
330e6938cc1SHelen Koike  * @vdev_fmt:		v4l2_format of the metadata format
331e6938cc1SHelen Koike  * @quantization:	the quantization configured on the isp's src pad
332e6938cc1SHelen Koike  * @raw_type:		the bayer pattern on the isp video sink pad
333e6938cc1SHelen Koike  */
334e6938cc1SHelen Koike struct rkisp1_params {
335e6938cc1SHelen Koike 	struct rkisp1_vdev_node vnode;
336e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
3375e8d9d72SHeiko Stuebner 	const struct rkisp1_params_ops *ops;
338e6938cc1SHelen Koike 
339e6938cc1SHelen Koike 	spinlock_t config_lock; /* locks the buffers list 'params' */
340e6938cc1SHelen Koike 	struct list_head params;
341e6938cc1SHelen Koike 	struct v4l2_format vdev_fmt;
342e6938cc1SHelen Koike 
343e6938cc1SHelen Koike 	enum v4l2_quantization quantization;
344e6938cc1SHelen Koike 	enum rkisp1_fmt_raw_pat_type raw_type;
345e6938cc1SHelen Koike };
346e6938cc1SHelen Koike 
347e6938cc1SHelen Koike /*
348e6938cc1SHelen Koike  * struct rkisp1_resizer - Resizer subdev
349e6938cc1SHelen Koike  *
350e6938cc1SHelen Koike  * @sd:	       v4l2_subdev variable
3513e74a422SLaurent Pinchart  * @regs_base: base register address offset
352e6938cc1SHelen Koike  * @id:	       id of the resizer, one of RKISP1_SELFPATH, RKISP1_MAINPATH
353e6938cc1SHelen Koike  * @rkisp1:    pointer to the rkisp1 device
354e6938cc1SHelen Koike  * @pads:      media pads
355e6938cc1SHelen Koike  * @pad_cfg:   configurations for the pads
356e6938cc1SHelen Koike  * @config:    the set of registers to configure the resizer
357e6938cc1SHelen Koike  * @pixel_enc: pixel encoding of the resizer
358e6938cc1SHelen Koike  * @ops_lock:  a lock for the subdev ops
359e6938cc1SHelen Koike  */
360e6938cc1SHelen Koike struct rkisp1_resizer {
361e6938cc1SHelen Koike 	struct v4l2_subdev sd;
3623e74a422SLaurent Pinchart 	u32 regs_base;
363e6938cc1SHelen Koike 	enum rkisp1_stream_id id;
364e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
365e6938cc1SHelen Koike 	struct media_pad pads[RKISP1_RSZ_PAD_MAX];
366e6938cc1SHelen Koike 	struct v4l2_subdev_pad_config pad_cfg[RKISP1_RSZ_PAD_MAX];
367e6938cc1SHelen Koike 	const struct rkisp1_rsz_config *config;
368e6938cc1SHelen Koike 	enum v4l2_pixel_encoding pixel_enc;
369e6938cc1SHelen Koike 	struct mutex ops_lock; /* serialize the subdevice ops */
370e6938cc1SHelen Koike };
371e6938cc1SHelen Koike 
372e6938cc1SHelen Koike /*
373e6938cc1SHelen Koike  * struct rkisp1_debug - Values to be exposed on debugfs.
374e6938cc1SHelen Koike  *			 The parameters are counters of the number of times the
375e6938cc1SHelen Koike  *			 event occurred since the driver was loaded.
376e6938cc1SHelen Koike  *
377e6938cc1SHelen Koike  * @data_loss:			  loss of data occurred within a line, processing failure
378e6938cc1SHelen Koike  * @outform_size_error:		  size error is generated in outmux submodule
379e6938cc1SHelen Koike  * @img_stabilization_size_error: size error is generated in image stabilization submodule
380e6938cc1SHelen Koike  * @inform_size_err:		  size error is generated in inform submodule
381e6938cc1SHelen Koike  * @mipi_error:			  mipi error occurred
382e6938cc1SHelen Koike  * @stats_error:		  writing to the 'Interrupt clear register' did not clear
383e6938cc1SHelen Koike  *				  it in the register 'Masked interrupt status'
384e6938cc1SHelen Koike  * @stop_timeout:		  upon stream stop, the capture waits 1 second for the isr to stop
385e6938cc1SHelen Koike  *				  the stream. This param is incremented in case of timeout.
386e6938cc1SHelen Koike  * @frame_drop:			  a frame was ready but the buffer queue was empty so the frame
387e6938cc1SHelen Koike  *				  was not sent to userspace
388e6938cc1SHelen Koike  */
389e6938cc1SHelen Koike struct rkisp1_debug {
390e6938cc1SHelen Koike 	struct dentry *debugfs_dir;
391e6938cc1SHelen Koike 	unsigned long data_loss;
392e6938cc1SHelen Koike 	unsigned long outform_size_error;
393e6938cc1SHelen Koike 	unsigned long img_stabilization_size_error;
394e6938cc1SHelen Koike 	unsigned long inform_size_error;
395e6938cc1SHelen Koike 	unsigned long irq_delay;
396e6938cc1SHelen Koike 	unsigned long mipi_error;
397e6938cc1SHelen Koike 	unsigned long stats_error;
398e6938cc1SHelen Koike 	unsigned long stop_timeout[2];
399e6938cc1SHelen Koike 	unsigned long frame_drop[2];
400e6938cc1SHelen Koike };
401e6938cc1SHelen Koike 
402e6938cc1SHelen Koike /*
403e6938cc1SHelen Koike  * struct rkisp1_device - ISP platform device
404e6938cc1SHelen Koike  *
405e6938cc1SHelen Koike  * @base_addr:	   base register address
406e6938cc1SHelen Koike  * @irq:	   the irq number
407e6938cc1SHelen Koike  * @dev:	   a pointer to the struct device
408e6938cc1SHelen Koike  * @clk_size:	   number of clocks
409e6938cc1SHelen Koike  * @clks:	   array of clocks
410e6938cc1SHelen Koike  * @v4l2_dev:	   v4l2_device variable
411e6938cc1SHelen Koike  * @media_dev:	   media_device variable
412e6938cc1SHelen Koike  * @notifier:	   a notifier to register on the v4l2-async API to be notified on the sensor
413e6938cc1SHelen Koike  * @active_sensor: sensor in-use, set when streaming on
414*8082e2f4SPaul Elder  * @csi:	   internal CSI-2 receiver
415e6938cc1SHelen Koike  * @isp:	   ISP sub-device
416e6938cc1SHelen Koike  * @resizer_devs:  resizer sub-devices
417e6938cc1SHelen Koike  * @capture_devs:  capture devices
418e6938cc1SHelen Koike  * @stats:	   ISP statistics metadata capture device
419e6938cc1SHelen Koike  * @params:	   ISP parameters metadata output device
420e6938cc1SHelen Koike  * @pipe:	   media pipeline
421e6938cc1SHelen Koike  * @stream_lock:   serializes {start/stop}_streaming callbacks between the capture devices.
422e6938cc1SHelen Koike  * @debug:	   debug params to be exposed on debugfs
4239125aee7SPaul Elder  * @info:	   version-specific ISP information
424e6938cc1SHelen Koike  */
425e6938cc1SHelen Koike struct rkisp1_device {
426e6938cc1SHelen Koike 	void __iomem *base_addr;
427e6938cc1SHelen Koike 	struct device *dev;
428e6938cc1SHelen Koike 	unsigned int clk_size;
429e6938cc1SHelen Koike 	struct clk_bulk_data clks[RKISP1_MAX_BUS_CLK];
430e6938cc1SHelen Koike 	struct v4l2_device v4l2_dev;
431e6938cc1SHelen Koike 	struct media_device media_dev;
432e6938cc1SHelen Koike 	struct v4l2_async_notifier notifier;
433e6938cc1SHelen Koike 	struct rkisp1_sensor_async *active_sensor;
434*8082e2f4SPaul Elder 	struct rkisp1_csi csi;
435e6938cc1SHelen Koike 	struct rkisp1_isp isp;
436e6938cc1SHelen Koike 	struct rkisp1_resizer resizer_devs[2];
437e6938cc1SHelen Koike 	struct rkisp1_capture capture_devs[2];
438e6938cc1SHelen Koike 	struct rkisp1_stats stats;
439e6938cc1SHelen Koike 	struct rkisp1_params params;
440e6938cc1SHelen Koike 	struct media_pipeline pipe;
441e6938cc1SHelen Koike 	struct mutex stream_lock; /* serialize {start/stop}_streaming cb between capture devices */
442e6938cc1SHelen Koike 	struct rkisp1_debug debug;
4439125aee7SPaul Elder 	const struct rkisp1_info *info;
444e6938cc1SHelen Koike };
445e6938cc1SHelen Koike 
446e6938cc1SHelen Koike /*
4470f3c2ab2SPaul Elder  * struct rkisp1_mbus_info - ISP media bus info, Translates media bus code to hardware
448e6938cc1SHelen Koike  *			     format values
449e6938cc1SHelen Koike  *
450e6938cc1SHelen Koike  * @mbus_code: media bus code
451e6938cc1SHelen Koike  * @pixel_enc: pixel encoding
452e6938cc1SHelen Koike  * @mipi_dt:   mipi data type
453e6938cc1SHelen Koike  * @yuv_seq:   the order of the Y, Cb, Cr values
454e6938cc1SHelen Koike  * @bus_width: bus width
455e6938cc1SHelen Koike  * @bayer_pat: bayer pattern
456e6938cc1SHelen Koike  * @direction: a bitmask of the flags indicating on which pad the format is supported on
457e6938cc1SHelen Koike  */
4580f3c2ab2SPaul Elder struct rkisp1_mbus_info {
459e6938cc1SHelen Koike 	u32 mbus_code;
460e6938cc1SHelen Koike 	enum v4l2_pixel_encoding pixel_enc;
461e6938cc1SHelen Koike 	u32 mipi_dt;
462e6938cc1SHelen Koike 	u32 yuv_seq;
463e6938cc1SHelen Koike 	u8 bus_width;
464e6938cc1SHelen Koike 	enum rkisp1_fmt_raw_pat_type bayer_pat;
465e6938cc1SHelen Koike 	unsigned int direction;
466e6938cc1SHelen Koike };
467e6938cc1SHelen Koike 
468e6938cc1SHelen Koike static inline void
4690ef7dc30SLaurent Pinchart rkisp1_write(struct rkisp1_device *rkisp1, unsigned int addr, u32 val)
470e6938cc1SHelen Koike {
471e6938cc1SHelen Koike 	writel(val, rkisp1->base_addr + addr);
472e6938cc1SHelen Koike }
473e6938cc1SHelen Koike 
474e6938cc1SHelen Koike static inline u32 rkisp1_read(struct rkisp1_device *rkisp1, unsigned int addr)
475e6938cc1SHelen Koike {
476e6938cc1SHelen Koike 	return readl(rkisp1->base_addr + addr);
477e6938cc1SHelen Koike }
478e6938cc1SHelen Koike 
479e6938cc1SHelen Koike /*
480e6938cc1SHelen Koike  * rkisp1_cap_enum_mbus_codes - A helper function that return the i'th supported mbus code
481e6938cc1SHelen Koike  *				of the capture entity. This is used to enumerate the supported
482e6938cc1SHelen Koike  *				mbus codes on the source pad of the resizer.
483e6938cc1SHelen Koike  *
484e6938cc1SHelen Koike  * @cap:  the capture entity
485e6938cc1SHelen Koike  * @code: the mbus code, the function reads the code->index and fills the code->code
486e6938cc1SHelen Koike  */
487e6938cc1SHelen Koike int rkisp1_cap_enum_mbus_codes(struct rkisp1_capture *cap,
488e6938cc1SHelen Koike 			       struct v4l2_subdev_mbus_code_enum *code);
489e6938cc1SHelen Koike 
490e6938cc1SHelen Koike /*
4910f3c2ab2SPaul Elder  * rkisp1_mbus_info_get_by_index - Retrieve the ith supported mbus info
4920f3c2ab2SPaul Elder  *
4930f3c2ab2SPaul Elder  * @index: index of the mbus info to fetch
4940f3c2ab2SPaul Elder  */
4950f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_index(unsigned int index);
4960f3c2ab2SPaul Elder 
4970f3c2ab2SPaul Elder /*
498e6938cc1SHelen Koike  * rkisp1_sd_adjust_crop_rect - adjust a rectangle to fit into another rectangle.
499e6938cc1SHelen Koike  *
500e6938cc1SHelen Koike  * @crop:   rectangle to adjust.
501e6938cc1SHelen Koike  * @bounds: rectangle used as bounds.
502e6938cc1SHelen Koike  */
503e6938cc1SHelen Koike void rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop,
504e6938cc1SHelen Koike 				const struct v4l2_rect *bounds);
505e6938cc1SHelen Koike 
506e6938cc1SHelen Koike /*
507e6938cc1SHelen Koike  * rkisp1_sd_adjust_crop - adjust a rectangle to fit into media bus format
508e6938cc1SHelen Koike  *
509e6938cc1SHelen Koike  * @crop:   rectangle to adjust.
510e6938cc1SHelen Koike  * @bounds: media bus format used as bounds.
511e6938cc1SHelen Koike  */
512e6938cc1SHelen Koike void rkisp1_sd_adjust_crop(struct v4l2_rect *crop,
513e6938cc1SHelen Koike 			   const struct v4l2_mbus_framefmt *bounds);
514e6938cc1SHelen Koike 
515e6938cc1SHelen Koike /*
5160f3c2ab2SPaul Elder  * rkisp1_mbus_info_get_by_code - get the isp info of the media bus code
517e6938cc1SHelen Koike  *
518e6938cc1SHelen Koike  * @mbus_code: the media bus code
519e6938cc1SHelen Koike  */
5200f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_code(u32 mbus_code);
521e6938cc1SHelen Koike 
522e6938cc1SHelen Koike /* rkisp1_params_configure - configure the params when stream starts.
523e6938cc1SHelen Koike  *			     This function is called by the isp entity upon stream starts.
524e6938cc1SHelen Koike  *			     The function applies the initial configuration of the parameters.
525e6938cc1SHelen Koike  *
526e6938cc1SHelen Koike  * @params:	  pointer to rkisp1_params.
527e6938cc1SHelen Koike  * @bayer_pat:	  the bayer pattern on the isp video sink pad
528e6938cc1SHelen Koike  * @quantization: the quantization configured on the isp's src pad
529e6938cc1SHelen Koike  */
530e6938cc1SHelen Koike void rkisp1_params_configure(struct rkisp1_params *params,
531e6938cc1SHelen Koike 			     enum rkisp1_fmt_raw_pat_type bayer_pat,
532e6938cc1SHelen Koike 			     enum v4l2_quantization quantization);
533e6938cc1SHelen Koike 
534e6938cc1SHelen Koike /* rkisp1_params_disable - disable all parameters.
535e6938cc1SHelen Koike  *			   This function is called by the isp entity upon stream start
536e6938cc1SHelen Koike  *			   when capturing bayer format.
537e6938cc1SHelen Koike  *
538e6938cc1SHelen Koike  * @params: pointer to rkisp1_params.
539e6938cc1SHelen Koike  */
540e6938cc1SHelen Koike void rkisp1_params_disable(struct rkisp1_params *params);
541e6938cc1SHelen Koike 
542e6938cc1SHelen Koike /* irq handlers */
54308818e6aSHeiko Stuebner irqreturn_t rkisp1_isp_isr(int irq, void *ctx);
54408818e6aSHeiko Stuebner irqreturn_t rkisp1_mipi_isr(int irq, void *ctx);
54508818e6aSHeiko Stuebner irqreturn_t rkisp1_capture_isr(int irq, void *ctx);
546e6938cc1SHelen Koike void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris);
547e6938cc1SHelen Koike void rkisp1_params_isr(struct rkisp1_device *rkisp1);
548e6938cc1SHelen Koike 
549e6938cc1SHelen Koike /* register/unregisters functions of the entities */
550e6938cc1SHelen Koike int rkisp1_capture_devs_register(struct rkisp1_device *rkisp1);
551e6938cc1SHelen Koike void rkisp1_capture_devs_unregister(struct rkisp1_device *rkisp1);
552e6938cc1SHelen Koike 
553e6938cc1SHelen Koike int rkisp1_isp_register(struct rkisp1_device *rkisp1);
554e6938cc1SHelen Koike void rkisp1_isp_unregister(struct rkisp1_device *rkisp1);
555e6938cc1SHelen Koike 
556e6938cc1SHelen Koike int rkisp1_resizer_devs_register(struct rkisp1_device *rkisp1);
557e6938cc1SHelen Koike void rkisp1_resizer_devs_unregister(struct rkisp1_device *rkisp1);
558e6938cc1SHelen Koike 
559e6938cc1SHelen Koike int rkisp1_stats_register(struct rkisp1_device *rkisp1);
560e6938cc1SHelen Koike void rkisp1_stats_unregister(struct rkisp1_device *rkisp1);
561e6938cc1SHelen Koike 
562e6938cc1SHelen Koike int rkisp1_params_register(struct rkisp1_device *rkisp1);
563e6938cc1SHelen Koike void rkisp1_params_unregister(struct rkisp1_device *rkisp1);
564e6938cc1SHelen Koike 
565fd3608feSLaurent Pinchart #if IS_ENABLED(CONFIG_DEBUG_FS)
5668682037dSLaurent Pinchart void rkisp1_debug_init(struct rkisp1_device *rkisp1);
5678682037dSLaurent Pinchart void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1);
568fd3608feSLaurent Pinchart #else
569fd3608feSLaurent Pinchart static inline void rkisp1_debug_init(struct rkisp1_device *rkisp1)
570fd3608feSLaurent Pinchart {
571fd3608feSLaurent Pinchart }
572fd3608feSLaurent Pinchart static inline void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1)
573fd3608feSLaurent Pinchart {
574fd3608feSLaurent Pinchart }
575fd3608feSLaurent Pinchart #endif
5768682037dSLaurent Pinchart 
577e6938cc1SHelen Koike #endif /* _RKISP1_COMMON_H */
578