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 
71b298f059SPaul Elder /* enum for the csi receiver pads */
72b298f059SPaul Elder enum rkisp1_csi_pad {
73b298f059SPaul Elder 	RKISP1_CSI_PAD_SINK,
74b298f059SPaul Elder 	RKISP1_CSI_PAD_SRC,
75b298f059SPaul Elder 	RKISP1_CSI_PAD_NUM
76b298f059SPaul Elder };
77b298f059SPaul Elder 
78e6938cc1SHelen Koike /* enum for the capture id */
79e6938cc1SHelen Koike enum rkisp1_stream_id {
80e6938cc1SHelen Koike 	RKISP1_MAINPATH,
81e6938cc1SHelen Koike 	RKISP1_SELFPATH,
82e6938cc1SHelen Koike };
83e6938cc1SHelen Koike 
84e6938cc1SHelen Koike /* bayer patterns */
85e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type {
86e6938cc1SHelen Koike 	RKISP1_RAW_RGGB = 0,
87e6938cc1SHelen Koike 	RKISP1_RAW_GRBG,
88e6938cc1SHelen Koike 	RKISP1_RAW_GBRG,
89e6938cc1SHelen Koike 	RKISP1_RAW_BGGR,
90e6938cc1SHelen Koike };
91e6938cc1SHelen Koike 
92e6938cc1SHelen Koike /* enum for the isp pads */
93e6938cc1SHelen Koike enum rkisp1_isp_pad {
94e6938cc1SHelen Koike 	RKISP1_ISP_PAD_SINK_VIDEO,
95e6938cc1SHelen Koike 	RKISP1_ISP_PAD_SINK_PARAMS,
96e6938cc1SHelen Koike 	RKISP1_ISP_PAD_SOURCE_VIDEO,
97e6938cc1SHelen Koike 	RKISP1_ISP_PAD_SOURCE_STATS,
98e6938cc1SHelen Koike 	RKISP1_ISP_PAD_MAX
99e6938cc1SHelen Koike };
100e6938cc1SHelen Koike 
101e6938cc1SHelen Koike /*
102f1b8f171SLaurent Pinchart  * enum rkisp1_feature - ISP features
103f1b8f171SLaurent Pinchart  *
104f1b8f171SLaurent Pinchart  * @RKISP1_FEATURE_MIPI_CSI2: The ISP has an internal MIPI CSI-2 receiver
105f1b8f171SLaurent Pinchart  *
106f1b8f171SLaurent Pinchart  * The ISP features are stored in a bitmask in &rkisp1_info.features and allow
107f1b8f171SLaurent Pinchart  * the driver to implement support for features present in some ISP versions
108f1b8f171SLaurent Pinchart  * only.
109f1b8f171SLaurent Pinchart  */
110f1b8f171SLaurent Pinchart enum rkisp1_feature {
111f1b8f171SLaurent Pinchart 	RKISP1_FEATURE_MIPI_CSI2 = BIT(0),
112f1b8f171SLaurent Pinchart };
113f1b8f171SLaurent Pinchart 
114f1b8f171SLaurent Pinchart /*
1159125aee7SPaul Elder  * struct rkisp1_info - Model-specific ISP Information
1169125aee7SPaul Elder  *
1179125aee7SPaul Elder  * @clks: array of ISP clock names
1189125aee7SPaul Elder  * @clk_size: number of entries in the @clks array
1199125aee7SPaul Elder  * @isrs: array of ISP interrupt descriptors
1209125aee7SPaul Elder  * @isr_size: number of entries in the @isrs array
1219125aee7SPaul Elder  * @isp_ver: ISP version
122f1b8f171SLaurent Pinchart  * @features: bitmask of rkisp1_feature features implemented by the ISP
1239125aee7SPaul Elder  *
1249125aee7SPaul Elder  * This structure contains information about the ISP specific to a particular
1259125aee7SPaul Elder  * ISP model, version, or integration in a particular SoC.
1269125aee7SPaul Elder  */
1279125aee7SPaul Elder struct rkisp1_info {
1289125aee7SPaul Elder 	const char * const *clks;
1299125aee7SPaul Elder 	unsigned int clk_size;
1309125aee7SPaul Elder 	const struct rkisp1_isr_data *isrs;
1319125aee7SPaul Elder 	unsigned int isr_size;
1329125aee7SPaul Elder 	enum rkisp1_cif_isp_version isp_ver;
133f1b8f171SLaurent Pinchart 	unsigned int features;
1349125aee7SPaul Elder };
1359125aee7SPaul Elder 
1369125aee7SPaul Elder /*
137e6938cc1SHelen Koike  * struct rkisp1_sensor_async - A container for the v4l2_async_subdev to add to the notifier
138e6938cc1SHelen Koike  *				of the v4l2-async API
139e6938cc1SHelen Koike  *
140e6938cc1SHelen Koike  * @asd:		async_subdev variable for the sensor
141bc374e17SLaurent Pinchart  * @index:		index of the sensor (counting sensor found in DT)
142b0b8ab68SLaurent Pinchart  * @source_ep:		fwnode for the sensor source endpoint
143e6938cc1SHelen Koike  * @lanes:		number of lanes
144e6938cc1SHelen Koike  * @mbus_type:		type of bus (currently only CSI2 is supported)
145e6938cc1SHelen Koike  * @mbus_flags:		media bus (V4L2_MBUS_*) flags
146e6938cc1SHelen Koike  * @sd:			a pointer to v4l2_subdev struct of the sensor
147e6938cc1SHelen Koike  * @pixel_rate_ctrl:	pixel rate of the sensor, used to initialize the phy
148f42f4558SPaul Elder  * @port:		port number (0: MIPI, 1: Parallel)
149e6938cc1SHelen Koike  */
150e6938cc1SHelen Koike struct rkisp1_sensor_async {
151*adb2dcd5SSakari Ailus 	struct v4l2_async_connection asd;
152bc374e17SLaurent Pinchart 	unsigned int index;
153b0b8ab68SLaurent Pinchart 	struct fwnode_handle *source_ep;
154e6938cc1SHelen Koike 	unsigned int lanes;
155e6938cc1SHelen Koike 	enum v4l2_mbus_type mbus_type;
156e6938cc1SHelen Koike 	unsigned int mbus_flags;
157e6938cc1SHelen Koike 	struct v4l2_subdev *sd;
158e6938cc1SHelen Koike 	struct v4l2_ctrl *pixel_rate_ctrl;
159f42f4558SPaul Elder 	unsigned int port;
1608082e2f4SPaul Elder };
1618082e2f4SPaul Elder 
1628082e2f4SPaul Elder /*
1638082e2f4SPaul Elder  * struct rkisp1_csi - CSI receiver subdev
1648082e2f4SPaul Elder  *
1658082e2f4SPaul Elder  * @rkisp1: pointer to the rkisp1 device
1668082e2f4SPaul Elder  * @dphy: a pointer to the phy
1678082e2f4SPaul Elder  * @is_dphy_errctrl_disabled: if dphy errctrl is disabled (avoid endless interrupt)
168b298f059SPaul Elder  * @sd: v4l2_subdev variable
169b298f059SPaul Elder  * @pads: media pads
170b298f059SPaul Elder  * @pad_cfg: configurations for the pads
171b298f059SPaul Elder  * @sink_fmt: input format
172b298f059SPaul Elder  * @lock: protects pad_cfg and sink_fmt
173b298f059SPaul Elder  * @source: source in-use, set when starting streaming
1748082e2f4SPaul Elder  */
1758082e2f4SPaul Elder struct rkisp1_csi {
1768082e2f4SPaul Elder 	struct rkisp1_device *rkisp1;
177e6938cc1SHelen Koike 	struct phy *dphy;
1788082e2f4SPaul Elder 	bool is_dphy_errctrl_disabled;
179b298f059SPaul Elder 	struct v4l2_subdev sd;
180b298f059SPaul Elder 	struct media_pad pads[RKISP1_CSI_PAD_NUM];
181b298f059SPaul Elder 	struct v4l2_subdev_pad_config pad_cfg[RKISP1_CSI_PAD_NUM];
182b298f059SPaul Elder 	const struct rkisp1_mbus_info *sink_fmt;
183b298f059SPaul Elder 	struct mutex lock;
184b298f059SPaul Elder 	struct v4l2_subdev *source;
185e6938cc1SHelen Koike };
186e6938cc1SHelen Koike 
187e6938cc1SHelen Koike /*
188e6938cc1SHelen Koike  * struct rkisp1_isp - ISP subdev entity
189e6938cc1SHelen Koike  *
190e6938cc1SHelen Koike  * @sd:				v4l2_subdev variable
191e6938cc1SHelen Koike  * @rkisp1:			pointer to rkisp1_device
192e6938cc1SHelen Koike  * @pads:			media pads
193e6938cc1SHelen Koike  * @pad_cfg:			pads configurations
194e6938cc1SHelen Koike  * @sink_fmt:			input format
195e6938cc1SHelen Koike  * @src_fmt:			output format
196e6938cc1SHelen Koike  * @ops_lock:			ops serialization
197e6938cc1SHelen Koike  * @frame_sequence:		used to synchronize frame_id between video devices.
198e6938cc1SHelen Koike  */
199e6938cc1SHelen Koike struct rkisp1_isp {
200e6938cc1SHelen Koike 	struct v4l2_subdev sd;
201fd130bc6SLaurent Pinchart 	struct rkisp1_device *rkisp1;
202e6938cc1SHelen Koike 	struct media_pad pads[RKISP1_ISP_PAD_MAX];
203e6938cc1SHelen Koike 	struct v4l2_subdev_pad_config pad_cfg[RKISP1_ISP_PAD_MAX];
2040f3c2ab2SPaul Elder 	const struct rkisp1_mbus_info *sink_fmt;
2050f3c2ab2SPaul Elder 	const struct rkisp1_mbus_info *src_fmt;
206e6938cc1SHelen Koike 	struct mutex ops_lock; /* serialize the subdevice ops */
207e6938cc1SHelen Koike 	__u32 frame_sequence;
208e6938cc1SHelen Koike };
209e6938cc1SHelen Koike 
210e6938cc1SHelen Koike /*
211e6938cc1SHelen Koike  * struct rkisp1_vdev_node - Container for the video nodes: params, stats, mainpath, selfpath
212e6938cc1SHelen Koike  *
213e6938cc1SHelen Koike  * @buf_queue:	queue of buffers
214e6938cc1SHelen Koike  * @vlock:	lock of the video node
215e6938cc1SHelen Koike  * @vdev:	video node
216e6938cc1SHelen Koike  * @pad:	media pad
217e6938cc1SHelen Koike  */
218e6938cc1SHelen Koike struct rkisp1_vdev_node {
219e6938cc1SHelen Koike 	struct vb2_queue buf_queue;
220e6938cc1SHelen Koike 	struct mutex vlock; /* ioctl serialization mutex */
221e6938cc1SHelen Koike 	struct video_device vdev;
222e6938cc1SHelen Koike 	struct media_pad pad;
223e6938cc1SHelen Koike };
224e6938cc1SHelen Koike 
225e6938cc1SHelen Koike /*
226e6938cc1SHelen Koike  * struct rkisp1_buffer - A container for the vb2 buffers used by the video devices:
227e6938cc1SHelen Koike  *			  params, stats, mainpath, selfpath
228e6938cc1SHelen Koike  *
229e6938cc1SHelen Koike  * @vb:		vb2 buffer
230e6938cc1SHelen Koike  * @queue:	entry of the buffer in the queue
231e6938cc1SHelen Koike  * @buff_addr:	dma addresses of each plane, used only by the capture devices: selfpath, mainpath
232e6938cc1SHelen Koike  */
233e6938cc1SHelen Koike struct rkisp1_buffer {
234e6938cc1SHelen Koike 	struct vb2_v4l2_buffer vb;
235e6938cc1SHelen Koike 	struct list_head queue;
236e6938cc1SHelen Koike 	u32 buff_addr[VIDEO_MAX_PLANES];
237e6938cc1SHelen Koike };
238e6938cc1SHelen Koike 
239e6938cc1SHelen Koike /*
240e6938cc1SHelen Koike  * struct rkisp1_dummy_buffer - A buffer to write the next frame to in case
241e6938cc1SHelen Koike  *				there are no vb2 buffers available.
242e6938cc1SHelen Koike  *
243e6938cc1SHelen Koike  * @vaddr:	return value of call to dma_alloc_attrs.
244e6938cc1SHelen Koike  * @dma_addr:	dma address of the buffer.
245e6938cc1SHelen Koike  * @size:	size of the buffer.
246e6938cc1SHelen Koike  */
247e6938cc1SHelen Koike struct rkisp1_dummy_buffer {
248e6938cc1SHelen Koike 	void *vaddr;
249e6938cc1SHelen Koike 	dma_addr_t dma_addr;
250e6938cc1SHelen Koike 	u32 size;
251e6938cc1SHelen Koike };
252e6938cc1SHelen Koike 
253e6938cc1SHelen Koike struct rkisp1_device;
254e6938cc1SHelen Koike 
255e6938cc1SHelen Koike /*
256e6938cc1SHelen Koike  * struct rkisp1_capture - ISP capture video device
257e6938cc1SHelen Koike  *
258e6938cc1SHelen Koike  * @vnode:	  video node
259e6938cc1SHelen Koike  * @rkisp1:	  pointer to rkisp1_device
260e6938cc1SHelen Koike  * @id:		  id of the capture, one of RKISP1_SELFPATH, RKISP1_MAINPATH
261e6938cc1SHelen Koike  * @ops:	  list of callbacks to configure the capture device.
262e6938cc1SHelen Koike  * @config:	  a pointer to the list of registers to configure the capture format.
263e6938cc1SHelen Koike  * @is_streaming: device is streaming
264e6938cc1SHelen Koike  * @is_stopping:  stop_streaming callback was called and the device is in the process of
265e6938cc1SHelen Koike  *		  stopping the streaming.
266e6938cc1SHelen Koike  * @done:	  when stop_streaming callback is called, the device waits for the next irq
267e6938cc1SHelen Koike  *		  handler to stop the streaming by waiting on the 'done' wait queue.
268e6938cc1SHelen Koike  *		  If the irq handler is not called, the stream is stopped by the callback
269e6938cc1SHelen Koike  *		  after timeout.
270e6938cc1SHelen Koike  * @sp_y_stride:  the selfpath allows to configure a y stride that is longer than the image width.
271e6938cc1SHelen Koike  * @buf.lock:	  lock to protect buf.queue
272e6938cc1SHelen Koike  * @buf.queue:	  queued buffer list
273e6938cc1SHelen Koike  * @buf.dummy:	  dummy space to store dropped data
274e6938cc1SHelen Koike  *
275e6938cc1SHelen Koike  * rkisp1 uses shadow registers, so it needs two buffers at a time
276e6938cc1SHelen Koike  * @buf.curr:	  the buffer used for current frame
277e6938cc1SHelen Koike  * @buf.next:	  the buffer used for next frame
278e6938cc1SHelen Koike  * @pix.cfg:	  pixel configuration
279e6938cc1SHelen Koike  * @pix.info:	  a pointer to the v4l2_format_info of the pixel format
280e6938cc1SHelen Koike  * @pix.fmt:	  buffer format
281e6938cc1SHelen Koike  */
282e6938cc1SHelen Koike struct rkisp1_capture {
283e6938cc1SHelen Koike 	struct rkisp1_vdev_node vnode;
284e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
285e6938cc1SHelen Koike 	enum rkisp1_stream_id id;
286a109073bSRikard Falkeborn 	const struct rkisp1_capture_ops *ops;
287e6938cc1SHelen Koike 	const struct rkisp1_capture_config *config;
288e6938cc1SHelen Koike 	bool is_streaming;
289e6938cc1SHelen Koike 	bool is_stopping;
290e6938cc1SHelen Koike 	wait_queue_head_t done;
291e6938cc1SHelen Koike 	unsigned int sp_y_stride;
292e6938cc1SHelen Koike 	struct {
293e6938cc1SHelen Koike 		/* protects queue, curr and next */
294e6938cc1SHelen Koike 		spinlock_t lock;
295e6938cc1SHelen Koike 		struct list_head queue;
296e6938cc1SHelen Koike 		struct rkisp1_dummy_buffer dummy;
297e6938cc1SHelen Koike 		struct rkisp1_buffer *curr;
298e6938cc1SHelen Koike 		struct rkisp1_buffer *next;
299e6938cc1SHelen Koike 	} buf;
300e6938cc1SHelen Koike 	struct {
301e6938cc1SHelen Koike 		const struct rkisp1_capture_fmt_cfg *cfg;
302e6938cc1SHelen Koike 		const struct v4l2_format_info *info;
303e6938cc1SHelen Koike 		struct v4l2_pix_format_mplane fmt;
304e6938cc1SHelen Koike 	} pix;
305e6938cc1SHelen Koike };
306e6938cc1SHelen Koike 
307962fb140SHeiko Stuebner struct rkisp1_stats;
308962fb140SHeiko Stuebner struct rkisp1_stats_ops {
309962fb140SHeiko Stuebner 	void (*get_awb_meas)(struct rkisp1_stats *stats,
310962fb140SHeiko Stuebner 			     struct rkisp1_stat_buffer *pbuf);
311962fb140SHeiko Stuebner 	void (*get_aec_meas)(struct rkisp1_stats *stats,
312962fb140SHeiko Stuebner 			     struct rkisp1_stat_buffer *pbuf);
313962fb140SHeiko Stuebner 	void (*get_hst_meas)(struct rkisp1_stats *stats,
314962fb140SHeiko Stuebner 			     struct rkisp1_stat_buffer *pbuf);
315962fb140SHeiko Stuebner };
316962fb140SHeiko Stuebner 
317e6938cc1SHelen Koike /*
318e6938cc1SHelen Koike  * struct rkisp1_stats - ISP Statistics device
319e6938cc1SHelen Koike  *
320e6938cc1SHelen Koike  * @vnode:	  video node
321e6938cc1SHelen Koike  * @rkisp1:	  pointer to the rkisp1 device
322e6938cc1SHelen Koike  * @lock:	  locks the buffer list 'stat'
323e6938cc1SHelen Koike  * @stat:	  queue of rkisp1_buffer
324e6938cc1SHelen Koike  * @vdev_fmt:	  v4l2_format of the metadata format
325e6938cc1SHelen Koike  */
326e6938cc1SHelen Koike struct rkisp1_stats {
327e6938cc1SHelen Koike 	struct rkisp1_vdev_node vnode;
328e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
329962fb140SHeiko Stuebner 	const struct rkisp1_stats_ops *ops;
330e6938cc1SHelen Koike 
331e6938cc1SHelen Koike 	spinlock_t lock; /* locks the buffers list 'stats' */
332e6938cc1SHelen Koike 	struct list_head stat;
333e6938cc1SHelen Koike 	struct v4l2_format vdev_fmt;
334e6938cc1SHelen Koike };
335e6938cc1SHelen Koike 
3365e8d9d72SHeiko Stuebner struct rkisp1_params;
3375e8d9d72SHeiko Stuebner struct rkisp1_params_ops {
3385e8d9d72SHeiko Stuebner 	void (*lsc_matrix_config)(struct rkisp1_params *params,
3395e8d9d72SHeiko Stuebner 				  const struct rkisp1_cif_isp_lsc_config *pconfig);
3405e8d9d72SHeiko Stuebner 	void (*goc_config)(struct rkisp1_params *params,
3415e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_goc_config *arg);
3425e8d9d72SHeiko Stuebner 	void (*awb_meas_config)(struct rkisp1_params *params,
3435e8d9d72SHeiko Stuebner 				const struct rkisp1_cif_isp_awb_meas_config *arg);
3445e8d9d72SHeiko Stuebner 	void (*awb_meas_enable)(struct rkisp1_params *params,
3455e8d9d72SHeiko Stuebner 				const struct rkisp1_cif_isp_awb_meas_config *arg,
3465e8d9d72SHeiko Stuebner 				bool en);
3475e8d9d72SHeiko Stuebner 	void (*awb_gain_config)(struct rkisp1_params *params,
3485e8d9d72SHeiko Stuebner 				const struct rkisp1_cif_isp_awb_gain_config *arg);
3495e8d9d72SHeiko Stuebner 	void (*aec_config)(struct rkisp1_params *params,
3505e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_aec_config *arg);
3515e8d9d72SHeiko Stuebner 	void (*hst_config)(struct rkisp1_params *params,
3525e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_hst_config *arg);
3535e8d9d72SHeiko Stuebner 	void (*hst_enable)(struct rkisp1_params *params,
3545e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_hst_config *arg, bool en);
3555e8d9d72SHeiko Stuebner 	void (*afm_config)(struct rkisp1_params *params,
3565e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_afc_config *arg);
3575e8d9d72SHeiko Stuebner };
3585e8d9d72SHeiko Stuebner 
359e6938cc1SHelen Koike /*
360e6938cc1SHelen Koike  * struct rkisp1_params - ISP input parameters device
361e6938cc1SHelen Koike  *
362e6938cc1SHelen Koike  * @vnode:		video node
363e6938cc1SHelen Koike  * @rkisp1:		pointer to the rkisp1 device
3645e8d9d72SHeiko Stuebner  * @ops:		pointer to the variant-specific operations
365e6938cc1SHelen Koike  * @config_lock:	locks the buffer list 'params'
366e6938cc1SHelen Koike  * @params:		queue of rkisp1_buffer
367e6938cc1SHelen Koike  * @vdev_fmt:		v4l2_format of the metadata format
368e6938cc1SHelen Koike  * @quantization:	the quantization configured on the isp's src pad
369e6938cc1SHelen Koike  * @raw_type:		the bayer pattern on the isp video sink pad
370e6938cc1SHelen Koike  */
371e6938cc1SHelen Koike struct rkisp1_params {
372e6938cc1SHelen Koike 	struct rkisp1_vdev_node vnode;
373e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
3745e8d9d72SHeiko Stuebner 	const struct rkisp1_params_ops *ops;
375e6938cc1SHelen Koike 
376e6938cc1SHelen Koike 	spinlock_t config_lock; /* locks the buffers list 'params' */
377e6938cc1SHelen Koike 	struct list_head params;
378e6938cc1SHelen Koike 	struct v4l2_format vdev_fmt;
379e6938cc1SHelen Koike 
380e6938cc1SHelen Koike 	enum v4l2_quantization quantization;
381f7aa2d23SLaurent Pinchart 	enum v4l2_ycbcr_encoding ycbcr_encoding;
382e6938cc1SHelen Koike 	enum rkisp1_fmt_raw_pat_type raw_type;
383e6938cc1SHelen Koike };
384e6938cc1SHelen Koike 
385e6938cc1SHelen Koike /*
386e6938cc1SHelen Koike  * struct rkisp1_resizer - Resizer subdev
387e6938cc1SHelen Koike  *
388e6938cc1SHelen Koike  * @sd:	       v4l2_subdev variable
3893e74a422SLaurent Pinchart  * @regs_base: base register address offset
390e6938cc1SHelen Koike  * @id:	       id of the resizer, one of RKISP1_SELFPATH, RKISP1_MAINPATH
391e6938cc1SHelen Koike  * @rkisp1:    pointer to the rkisp1 device
392e6938cc1SHelen Koike  * @pads:      media pads
393e6938cc1SHelen Koike  * @pad_cfg:   configurations for the pads
394e6938cc1SHelen Koike  * @config:    the set of registers to configure the resizer
395e6938cc1SHelen Koike  * @pixel_enc: pixel encoding of the resizer
396e6938cc1SHelen Koike  * @ops_lock:  a lock for the subdev ops
397e6938cc1SHelen Koike  */
398e6938cc1SHelen Koike struct rkisp1_resizer {
399e6938cc1SHelen Koike 	struct v4l2_subdev sd;
4003e74a422SLaurent Pinchart 	u32 regs_base;
401e6938cc1SHelen Koike 	enum rkisp1_stream_id id;
402e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
403e6938cc1SHelen Koike 	struct media_pad pads[RKISP1_RSZ_PAD_MAX];
404e6938cc1SHelen Koike 	struct v4l2_subdev_pad_config pad_cfg[RKISP1_RSZ_PAD_MAX];
405e6938cc1SHelen Koike 	const struct rkisp1_rsz_config *config;
406e6938cc1SHelen Koike 	enum v4l2_pixel_encoding pixel_enc;
407e6938cc1SHelen Koike 	struct mutex ops_lock; /* serialize the subdevice ops */
408e6938cc1SHelen Koike };
409e6938cc1SHelen Koike 
410e6938cc1SHelen Koike /*
411e6938cc1SHelen Koike  * struct rkisp1_debug - Values to be exposed on debugfs.
412e6938cc1SHelen Koike  *			 The parameters are counters of the number of times the
413e6938cc1SHelen Koike  *			 event occurred since the driver was loaded.
414e6938cc1SHelen Koike  *
415e6938cc1SHelen Koike  * @data_loss:			  loss of data occurred within a line, processing failure
416e6938cc1SHelen Koike  * @outform_size_error:		  size error is generated in outmux submodule
417e6938cc1SHelen Koike  * @img_stabilization_size_error: size error is generated in image stabilization submodule
418e6938cc1SHelen Koike  * @inform_size_err:		  size error is generated in inform submodule
419e6938cc1SHelen Koike  * @mipi_error:			  mipi error occurred
420e6938cc1SHelen Koike  * @stats_error:		  writing to the 'Interrupt clear register' did not clear
421e6938cc1SHelen Koike  *				  it in the register 'Masked interrupt status'
422e6938cc1SHelen Koike  * @stop_timeout:		  upon stream stop, the capture waits 1 second for the isr to stop
423e6938cc1SHelen Koike  *				  the stream. This param is incremented in case of timeout.
424e6938cc1SHelen Koike  * @frame_drop:			  a frame was ready but the buffer queue was empty so the frame
425e6938cc1SHelen Koike  *				  was not sent to userspace
426e6938cc1SHelen Koike  */
427e6938cc1SHelen Koike struct rkisp1_debug {
428e6938cc1SHelen Koike 	struct dentry *debugfs_dir;
429e6938cc1SHelen Koike 	unsigned long data_loss;
430e6938cc1SHelen Koike 	unsigned long outform_size_error;
431e6938cc1SHelen Koike 	unsigned long img_stabilization_size_error;
432e6938cc1SHelen Koike 	unsigned long inform_size_error;
433e6938cc1SHelen Koike 	unsigned long irq_delay;
434e6938cc1SHelen Koike 	unsigned long mipi_error;
435e6938cc1SHelen Koike 	unsigned long stats_error;
436e6938cc1SHelen Koike 	unsigned long stop_timeout[2];
437e6938cc1SHelen Koike 	unsigned long frame_drop[2];
438e6938cc1SHelen Koike };
439e6938cc1SHelen Koike 
440e6938cc1SHelen Koike /*
441e6938cc1SHelen Koike  * struct rkisp1_device - ISP platform device
442e6938cc1SHelen Koike  *
443e6938cc1SHelen Koike  * @base_addr:	   base register address
444e6938cc1SHelen Koike  * @irq:	   the irq number
445e6938cc1SHelen Koike  * @dev:	   a pointer to the struct device
446e6938cc1SHelen Koike  * @clk_size:	   number of clocks
447e6938cc1SHelen Koike  * @clks:	   array of clocks
448e6938cc1SHelen Koike  * @v4l2_dev:	   v4l2_device variable
449e6938cc1SHelen Koike  * @media_dev:	   media_device variable
450e6938cc1SHelen Koike  * @notifier:	   a notifier to register on the v4l2-async API to be notified on the sensor
451745ba74aSLaurent Pinchart  * @source:        source subdev in-use, set when starting streaming
4528082e2f4SPaul Elder  * @csi:	   internal CSI-2 receiver
453e6938cc1SHelen Koike  * @isp:	   ISP sub-device
454e6938cc1SHelen Koike  * @resizer_devs:  resizer sub-devices
455e6938cc1SHelen Koike  * @capture_devs:  capture devices
456e6938cc1SHelen Koike  * @stats:	   ISP statistics metadata capture device
457e6938cc1SHelen Koike  * @params:	   ISP parameters metadata output device
458e6938cc1SHelen Koike  * @pipe:	   media pipeline
459e6938cc1SHelen Koike  * @stream_lock:   serializes {start/stop}_streaming callbacks between the capture devices.
460e6938cc1SHelen Koike  * @debug:	   debug params to be exposed on debugfs
4619125aee7SPaul Elder  * @info:	   version-specific ISP information
462e6938cc1SHelen Koike  */
463e6938cc1SHelen Koike struct rkisp1_device {
464e6938cc1SHelen Koike 	void __iomem *base_addr;
465e6938cc1SHelen Koike 	struct device *dev;
466e6938cc1SHelen Koike 	unsigned int clk_size;
467e6938cc1SHelen Koike 	struct clk_bulk_data clks[RKISP1_MAX_BUS_CLK];
468e6938cc1SHelen Koike 	struct v4l2_device v4l2_dev;
469e6938cc1SHelen Koike 	struct media_device media_dev;
470e6938cc1SHelen Koike 	struct v4l2_async_notifier notifier;
471745ba74aSLaurent Pinchart 	struct v4l2_subdev *source;
4728082e2f4SPaul Elder 	struct rkisp1_csi csi;
473e6938cc1SHelen Koike 	struct rkisp1_isp isp;
474e6938cc1SHelen Koike 	struct rkisp1_resizer resizer_devs[2];
475e6938cc1SHelen Koike 	struct rkisp1_capture capture_devs[2];
476e6938cc1SHelen Koike 	struct rkisp1_stats stats;
477e6938cc1SHelen Koike 	struct rkisp1_params params;
478e6938cc1SHelen Koike 	struct media_pipeline pipe;
479e6938cc1SHelen Koike 	struct mutex stream_lock; /* serialize {start/stop}_streaming cb between capture devices */
480e6938cc1SHelen Koike 	struct rkisp1_debug debug;
4819125aee7SPaul Elder 	const struct rkisp1_info *info;
482e6938cc1SHelen Koike };
483e6938cc1SHelen Koike 
484e6938cc1SHelen Koike /*
4850f3c2ab2SPaul Elder  * struct rkisp1_mbus_info - ISP media bus info, Translates media bus code to hardware
486e6938cc1SHelen Koike  *			     format values
487e6938cc1SHelen Koike  *
488e6938cc1SHelen Koike  * @mbus_code: media bus code
489e6938cc1SHelen Koike  * @pixel_enc: pixel encoding
490e6938cc1SHelen Koike  * @mipi_dt:   mipi data type
491e6938cc1SHelen Koike  * @yuv_seq:   the order of the Y, Cb, Cr values
492e6938cc1SHelen Koike  * @bus_width: bus width
493e6938cc1SHelen Koike  * @bayer_pat: bayer pattern
494e6938cc1SHelen Koike  * @direction: a bitmask of the flags indicating on which pad the format is supported on
495e6938cc1SHelen Koike  */
4960f3c2ab2SPaul Elder struct rkisp1_mbus_info {
497e6938cc1SHelen Koike 	u32 mbus_code;
498e6938cc1SHelen Koike 	enum v4l2_pixel_encoding pixel_enc;
499e6938cc1SHelen Koike 	u32 mipi_dt;
500e6938cc1SHelen Koike 	u32 yuv_seq;
501e6938cc1SHelen Koike 	u8 bus_width;
502e6938cc1SHelen Koike 	enum rkisp1_fmt_raw_pat_type bayer_pat;
503e6938cc1SHelen Koike 	unsigned int direction;
504e6938cc1SHelen Koike };
505e6938cc1SHelen Koike 
506e6938cc1SHelen Koike static inline void
5070ef7dc30SLaurent Pinchart rkisp1_write(struct rkisp1_device *rkisp1, unsigned int addr, u32 val)
508e6938cc1SHelen Koike {
509e6938cc1SHelen Koike 	writel(val, rkisp1->base_addr + addr);
510e6938cc1SHelen Koike }
511e6938cc1SHelen Koike 
512e6938cc1SHelen Koike static inline u32 rkisp1_read(struct rkisp1_device *rkisp1, unsigned int addr)
513e6938cc1SHelen Koike {
514e6938cc1SHelen Koike 	return readl(rkisp1->base_addr + addr);
515e6938cc1SHelen Koike }
516e6938cc1SHelen Koike 
517e6938cc1SHelen Koike /*
518e6938cc1SHelen Koike  * rkisp1_cap_enum_mbus_codes - A helper function that return the i'th supported mbus code
519e6938cc1SHelen Koike  *				of the capture entity. This is used to enumerate the supported
520e6938cc1SHelen Koike  *				mbus codes on the source pad of the resizer.
521e6938cc1SHelen Koike  *
522e6938cc1SHelen Koike  * @cap:  the capture entity
523e6938cc1SHelen Koike  * @code: the mbus code, the function reads the code->index and fills the code->code
524e6938cc1SHelen Koike  */
525e6938cc1SHelen Koike int rkisp1_cap_enum_mbus_codes(struct rkisp1_capture *cap,
526e6938cc1SHelen Koike 			       struct v4l2_subdev_mbus_code_enum *code);
527e6938cc1SHelen Koike 
528e6938cc1SHelen Koike /*
5290f3c2ab2SPaul Elder  * rkisp1_mbus_info_get_by_index - Retrieve the ith supported mbus info
5300f3c2ab2SPaul Elder  *
5310f3c2ab2SPaul Elder  * @index: index of the mbus info to fetch
5320f3c2ab2SPaul Elder  */
5330f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_index(unsigned int index);
5340f3c2ab2SPaul Elder 
5350f3c2ab2SPaul Elder /*
536e6938cc1SHelen Koike  * rkisp1_sd_adjust_crop_rect - adjust a rectangle to fit into another rectangle.
537e6938cc1SHelen Koike  *
538e6938cc1SHelen Koike  * @crop:   rectangle to adjust.
539e6938cc1SHelen Koike  * @bounds: rectangle used as bounds.
540e6938cc1SHelen Koike  */
541e6938cc1SHelen Koike void rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop,
542e6938cc1SHelen Koike 				const struct v4l2_rect *bounds);
543e6938cc1SHelen Koike 
544e6938cc1SHelen Koike /*
545e6938cc1SHelen Koike  * rkisp1_sd_adjust_crop - adjust a rectangle to fit into media bus format
546e6938cc1SHelen Koike  *
547e6938cc1SHelen Koike  * @crop:   rectangle to adjust.
548e6938cc1SHelen Koike  * @bounds: media bus format used as bounds.
549e6938cc1SHelen Koike  */
550e6938cc1SHelen Koike void rkisp1_sd_adjust_crop(struct v4l2_rect *crop,
551e6938cc1SHelen Koike 			   const struct v4l2_mbus_framefmt *bounds);
552e6938cc1SHelen Koike 
553e6938cc1SHelen Koike /*
5540f3c2ab2SPaul Elder  * rkisp1_mbus_info_get_by_code - get the isp info of the media bus code
555e6938cc1SHelen Koike  *
556e6938cc1SHelen Koike  * @mbus_code: the media bus code
557e6938cc1SHelen Koike  */
5580f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_code(u32 mbus_code);
559e6938cc1SHelen Koike 
5604b07e2b8SLaurent Pinchart /*
5614b07e2b8SLaurent Pinchart  * rkisp1_params_pre_configure - Configure the params before stream start
562e6938cc1SHelen Koike  *
5634b07e2b8SLaurent Pinchart  * @params:	  pointer to rkisp1_params
564e6938cc1SHelen Koike  * @bayer_pat:	  the bayer pattern on the isp video sink pad
565e6938cc1SHelen Koike  * @quantization: the quantization configured on the isp's src pad
566f7aa2d23SLaurent Pinchart  * @ycbcr_encoding: the ycbcr_encoding configured on the isp's src pad
5674b07e2b8SLaurent Pinchart  *
5684b07e2b8SLaurent Pinchart  * This function is called by the ISP entity just before the ISP gets started.
5694b07e2b8SLaurent Pinchart  * It applies the initial ISP parameters from the first params buffer, but
5704b07e2b8SLaurent Pinchart  * skips LSC as it needs to be configured after the ISP is started.
571e6938cc1SHelen Koike  */
5724b07e2b8SLaurent Pinchart void rkisp1_params_pre_configure(struct rkisp1_params *params,
573e6938cc1SHelen Koike 				 enum rkisp1_fmt_raw_pat_type bayer_pat,
574f7aa2d23SLaurent Pinchart 				 enum v4l2_quantization quantization,
575f7aa2d23SLaurent Pinchart 				 enum v4l2_ycbcr_encoding ycbcr_encoding);
576e6938cc1SHelen Koike 
5774b07e2b8SLaurent Pinchart /*
5784b07e2b8SLaurent Pinchart  * rkisp1_params_post_configure - Configure the params after stream start
5794b07e2b8SLaurent Pinchart  *
5804b07e2b8SLaurent Pinchart  * @params:	  pointer to rkisp1_params
5814b07e2b8SLaurent Pinchart  *
5824b07e2b8SLaurent Pinchart  * This function is called by the ISP entity just after the ISP gets started.
5834b07e2b8SLaurent Pinchart  * It applies the initial ISP LSC parameters from the first params buffer.
5844b07e2b8SLaurent Pinchart  */
5854b07e2b8SLaurent Pinchart void rkisp1_params_post_configure(struct rkisp1_params *params);
5864b07e2b8SLaurent Pinchart 
587e6938cc1SHelen Koike /* rkisp1_params_disable - disable all parameters.
588e6938cc1SHelen Koike  *			   This function is called by the isp entity upon stream start
589e6938cc1SHelen Koike  *			   when capturing bayer format.
590e6938cc1SHelen Koike  *
591e6938cc1SHelen Koike  * @params: pointer to rkisp1_params.
592e6938cc1SHelen Koike  */
593e6938cc1SHelen Koike void rkisp1_params_disable(struct rkisp1_params *params);
594e6938cc1SHelen Koike 
595e6938cc1SHelen Koike /* irq handlers */
59608818e6aSHeiko Stuebner irqreturn_t rkisp1_isp_isr(int irq, void *ctx);
5970c0b9f9cSLaurent Pinchart irqreturn_t rkisp1_csi_isr(int irq, void *ctx);
59808818e6aSHeiko Stuebner irqreturn_t rkisp1_capture_isr(int irq, void *ctx);
599e6938cc1SHelen Koike void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris);
600e6938cc1SHelen Koike void rkisp1_params_isr(struct rkisp1_device *rkisp1);
601e6938cc1SHelen Koike 
602e6938cc1SHelen Koike /* register/unregisters functions of the entities */
603e6938cc1SHelen Koike int rkisp1_capture_devs_register(struct rkisp1_device *rkisp1);
604e6938cc1SHelen Koike void rkisp1_capture_devs_unregister(struct rkisp1_device *rkisp1);
605e6938cc1SHelen Koike 
606e6938cc1SHelen Koike int rkisp1_isp_register(struct rkisp1_device *rkisp1);
607e6938cc1SHelen Koike void rkisp1_isp_unregister(struct rkisp1_device *rkisp1);
608e6938cc1SHelen Koike 
609e6938cc1SHelen Koike int rkisp1_resizer_devs_register(struct rkisp1_device *rkisp1);
610e6938cc1SHelen Koike void rkisp1_resizer_devs_unregister(struct rkisp1_device *rkisp1);
611e6938cc1SHelen Koike 
612e6938cc1SHelen Koike int rkisp1_stats_register(struct rkisp1_device *rkisp1);
613e6938cc1SHelen Koike void rkisp1_stats_unregister(struct rkisp1_device *rkisp1);
614e6938cc1SHelen Koike 
615e6938cc1SHelen Koike int rkisp1_params_register(struct rkisp1_device *rkisp1);
616e6938cc1SHelen Koike void rkisp1_params_unregister(struct rkisp1_device *rkisp1);
617e6938cc1SHelen Koike 
618fd3608feSLaurent Pinchart #if IS_ENABLED(CONFIG_DEBUG_FS)
6198682037dSLaurent Pinchart void rkisp1_debug_init(struct rkisp1_device *rkisp1);
6208682037dSLaurent Pinchart void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1);
621fd3608feSLaurent Pinchart #else
622fd3608feSLaurent Pinchart static inline void rkisp1_debug_init(struct rkisp1_device *rkisp1)
623fd3608feSLaurent Pinchart {
624fd3608feSLaurent Pinchart }
625fd3608feSLaurent Pinchart static inline void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1)
626fd3608feSLaurent Pinchart {
627fd3608feSLaurent Pinchart }
628fd3608feSLaurent Pinchart #endif
6298682037dSLaurent Pinchart 
630e6938cc1SHelen Koike #endif /* _RKISP1_COMMON_H */
631