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 
64e28e80cdSTomi Valkeinen /* IRQ lines */
65e28e80cdSTomi Valkeinen enum rkisp1_irq_line {
66e28e80cdSTomi Valkeinen 	RKISP1_IRQ_ISP = 0,
67e28e80cdSTomi Valkeinen 	RKISP1_IRQ_MI,
68e28e80cdSTomi Valkeinen 	RKISP1_IRQ_MIPI,
69e28e80cdSTomi Valkeinen 	RKISP1_NUM_IRQS,
70e28e80cdSTomi Valkeinen };
71e28e80cdSTomi Valkeinen 
72e6938cc1SHelen Koike /* enum for the resizer pads */
73e6938cc1SHelen Koike enum rkisp1_rsz_pad {
74e6938cc1SHelen Koike 	RKISP1_RSZ_PAD_SINK,
75e6938cc1SHelen Koike 	RKISP1_RSZ_PAD_SRC,
76e6938cc1SHelen Koike 	RKISP1_RSZ_PAD_MAX
77e6938cc1SHelen Koike };
78e6938cc1SHelen Koike 
79b298f059SPaul Elder /* enum for the csi receiver pads */
80b298f059SPaul Elder enum rkisp1_csi_pad {
81b298f059SPaul Elder 	RKISP1_CSI_PAD_SINK,
82b298f059SPaul Elder 	RKISP1_CSI_PAD_SRC,
83b298f059SPaul Elder 	RKISP1_CSI_PAD_NUM
84b298f059SPaul Elder };
85b298f059SPaul Elder 
86e6938cc1SHelen Koike /* enum for the capture id */
87e6938cc1SHelen Koike enum rkisp1_stream_id {
88e6938cc1SHelen Koike 	RKISP1_MAINPATH,
89e6938cc1SHelen Koike 	RKISP1_SELFPATH,
90e6938cc1SHelen Koike };
91e6938cc1SHelen Koike 
92e6938cc1SHelen Koike /* bayer patterns */
93e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type {
94e6938cc1SHelen Koike 	RKISP1_RAW_RGGB = 0,
95e6938cc1SHelen Koike 	RKISP1_RAW_GRBG,
96e6938cc1SHelen Koike 	RKISP1_RAW_GBRG,
97e6938cc1SHelen Koike 	RKISP1_RAW_BGGR,
98e6938cc1SHelen Koike };
99e6938cc1SHelen Koike 
100e6938cc1SHelen Koike /* enum for the isp pads */
101e6938cc1SHelen Koike enum rkisp1_isp_pad {
102e6938cc1SHelen Koike 	RKISP1_ISP_PAD_SINK_VIDEO,
103e6938cc1SHelen Koike 	RKISP1_ISP_PAD_SINK_PARAMS,
104e6938cc1SHelen Koike 	RKISP1_ISP_PAD_SOURCE_VIDEO,
105e6938cc1SHelen Koike 	RKISP1_ISP_PAD_SOURCE_STATS,
106e6938cc1SHelen Koike 	RKISP1_ISP_PAD_MAX
107e6938cc1SHelen Koike };
108e6938cc1SHelen Koike 
109e6938cc1SHelen Koike /*
110f1b8f171SLaurent Pinchart  * enum rkisp1_feature - ISP features
111f1b8f171SLaurent Pinchart  *
112f1b8f171SLaurent Pinchart  * @RKISP1_FEATURE_MIPI_CSI2: The ISP has an internal MIPI CSI-2 receiver
113f1b8f171SLaurent Pinchart  *
114f1b8f171SLaurent Pinchart  * The ISP features are stored in a bitmask in &rkisp1_info.features and allow
115f1b8f171SLaurent Pinchart  * the driver to implement support for features present in some ISP versions
116f1b8f171SLaurent Pinchart  * only.
117f1b8f171SLaurent Pinchart  */
118f1b8f171SLaurent Pinchart enum rkisp1_feature {
119f1b8f171SLaurent Pinchart 	RKISP1_FEATURE_MIPI_CSI2 = BIT(0),
120f1b8f171SLaurent Pinchart };
121f1b8f171SLaurent Pinchart 
122f1b8f171SLaurent Pinchart /*
1239125aee7SPaul Elder  * struct rkisp1_info - Model-specific ISP Information
1249125aee7SPaul Elder  *
1259125aee7SPaul Elder  * @clks: array of ISP clock names
1269125aee7SPaul Elder  * @clk_size: number of entries in the @clks array
1279125aee7SPaul Elder  * @isrs: array of ISP interrupt descriptors
1289125aee7SPaul Elder  * @isr_size: number of entries in the @isrs array
1299125aee7SPaul Elder  * @isp_ver: ISP version
130f1b8f171SLaurent Pinchart  * @features: bitmask of rkisp1_feature features implemented by the ISP
1319125aee7SPaul Elder  *
1329125aee7SPaul Elder  * This structure contains information about the ISP specific to a particular
1339125aee7SPaul Elder  * ISP model, version, or integration in a particular SoC.
1349125aee7SPaul Elder  */
1359125aee7SPaul Elder struct rkisp1_info {
1369125aee7SPaul Elder 	const char * const *clks;
1379125aee7SPaul Elder 	unsigned int clk_size;
1389125aee7SPaul Elder 	const struct rkisp1_isr_data *isrs;
1399125aee7SPaul Elder 	unsigned int isr_size;
1409125aee7SPaul Elder 	enum rkisp1_cif_isp_version isp_ver;
141f1b8f171SLaurent Pinchart 	unsigned int features;
1429125aee7SPaul Elder };
1439125aee7SPaul Elder 
1449125aee7SPaul Elder /*
145e6938cc1SHelen Koike  * struct rkisp1_sensor_async - A container for the v4l2_async_subdev to add to the notifier
146e6938cc1SHelen Koike  *				of the v4l2-async API
147e6938cc1SHelen Koike  *
148e6938cc1SHelen Koike  * @asd:		async_subdev variable for the sensor
149bc374e17SLaurent Pinchart  * @index:		index of the sensor (counting sensor found in DT)
150b0b8ab68SLaurent Pinchart  * @source_ep:		fwnode for the sensor source endpoint
151e6938cc1SHelen Koike  * @lanes:		number of lanes
152e6938cc1SHelen Koike  * @mbus_type:		type of bus (currently only CSI2 is supported)
153e6938cc1SHelen Koike  * @mbus_flags:		media bus (V4L2_MBUS_*) flags
154e6938cc1SHelen Koike  * @sd:			a pointer to v4l2_subdev struct of the sensor
155e6938cc1SHelen Koike  * @pixel_rate_ctrl:	pixel rate of the sensor, used to initialize the phy
156f42f4558SPaul Elder  * @port:		port number (0: MIPI, 1: Parallel)
157e6938cc1SHelen Koike  */
158e6938cc1SHelen Koike struct rkisp1_sensor_async {
159adb2dcd5SSakari Ailus 	struct v4l2_async_connection asd;
160bc374e17SLaurent Pinchart 	unsigned int index;
161b0b8ab68SLaurent Pinchart 	struct fwnode_handle *source_ep;
162e6938cc1SHelen Koike 	unsigned int lanes;
163e6938cc1SHelen Koike 	enum v4l2_mbus_type mbus_type;
164e6938cc1SHelen Koike 	unsigned int mbus_flags;
165e6938cc1SHelen Koike 	struct v4l2_subdev *sd;
166e6938cc1SHelen Koike 	struct v4l2_ctrl *pixel_rate_ctrl;
167f42f4558SPaul Elder 	unsigned int port;
1688082e2f4SPaul Elder };
1698082e2f4SPaul Elder 
1708082e2f4SPaul Elder /*
1718082e2f4SPaul Elder  * struct rkisp1_csi - CSI receiver subdev
1728082e2f4SPaul Elder  *
1738082e2f4SPaul Elder  * @rkisp1: pointer to the rkisp1 device
1748082e2f4SPaul Elder  * @dphy: a pointer to the phy
1758082e2f4SPaul Elder  * @is_dphy_errctrl_disabled: if dphy errctrl is disabled (avoid endless interrupt)
176b298f059SPaul Elder  * @sd: v4l2_subdev variable
177b298f059SPaul Elder  * @pads: media pads
178b298f059SPaul Elder  * @pad_cfg: configurations for the pads
179b298f059SPaul Elder  * @sink_fmt: input format
180b298f059SPaul Elder  * @lock: protects pad_cfg and sink_fmt
181b298f059SPaul Elder  * @source: source in-use, set when starting streaming
1828082e2f4SPaul Elder  */
1838082e2f4SPaul Elder struct rkisp1_csi {
1848082e2f4SPaul Elder 	struct rkisp1_device *rkisp1;
185e6938cc1SHelen Koike 	struct phy *dphy;
1868082e2f4SPaul Elder 	bool is_dphy_errctrl_disabled;
187b298f059SPaul Elder 	struct v4l2_subdev sd;
188b298f059SPaul Elder 	struct media_pad pads[RKISP1_CSI_PAD_NUM];
189b298f059SPaul Elder 	struct v4l2_subdev_pad_config pad_cfg[RKISP1_CSI_PAD_NUM];
190b298f059SPaul Elder 	const struct rkisp1_mbus_info *sink_fmt;
191b298f059SPaul Elder 	struct mutex lock;
192b298f059SPaul Elder 	struct v4l2_subdev *source;
193e6938cc1SHelen Koike };
194e6938cc1SHelen Koike 
195e6938cc1SHelen Koike /*
196e6938cc1SHelen Koike  * struct rkisp1_isp - ISP subdev entity
197e6938cc1SHelen Koike  *
198e6938cc1SHelen Koike  * @sd:				v4l2_subdev variable
199e6938cc1SHelen Koike  * @rkisp1:			pointer to rkisp1_device
200e6938cc1SHelen Koike  * @pads:			media pads
201e6938cc1SHelen Koike  * @pad_cfg:			pads configurations
202e6938cc1SHelen Koike  * @sink_fmt:			input format
203e6938cc1SHelen Koike  * @src_fmt:			output format
204e6938cc1SHelen Koike  * @ops_lock:			ops serialization
205e6938cc1SHelen Koike  * @frame_sequence:		used to synchronize frame_id between video devices.
206e6938cc1SHelen Koike  */
207e6938cc1SHelen Koike struct rkisp1_isp {
208e6938cc1SHelen Koike 	struct v4l2_subdev sd;
209fd130bc6SLaurent Pinchart 	struct rkisp1_device *rkisp1;
210e6938cc1SHelen Koike 	struct media_pad pads[RKISP1_ISP_PAD_MAX];
211e6938cc1SHelen Koike 	struct v4l2_subdev_pad_config pad_cfg[RKISP1_ISP_PAD_MAX];
2120f3c2ab2SPaul Elder 	const struct rkisp1_mbus_info *sink_fmt;
2130f3c2ab2SPaul Elder 	const struct rkisp1_mbus_info *src_fmt;
214e6938cc1SHelen Koike 	struct mutex ops_lock; /* serialize the subdevice ops */
215e6938cc1SHelen Koike 	__u32 frame_sequence;
216e6938cc1SHelen Koike };
217e6938cc1SHelen Koike 
218e6938cc1SHelen Koike /*
219e6938cc1SHelen Koike  * struct rkisp1_vdev_node - Container for the video nodes: params, stats, mainpath, selfpath
220e6938cc1SHelen Koike  *
221e6938cc1SHelen Koike  * @buf_queue:	queue of buffers
222e6938cc1SHelen Koike  * @vlock:	lock of the video node
223e6938cc1SHelen Koike  * @vdev:	video node
224e6938cc1SHelen Koike  * @pad:	media pad
225e6938cc1SHelen Koike  */
226e6938cc1SHelen Koike struct rkisp1_vdev_node {
227e6938cc1SHelen Koike 	struct vb2_queue buf_queue;
228e6938cc1SHelen Koike 	struct mutex vlock; /* ioctl serialization mutex */
229e6938cc1SHelen Koike 	struct video_device vdev;
230e6938cc1SHelen Koike 	struct media_pad pad;
231e6938cc1SHelen Koike };
232e6938cc1SHelen Koike 
233e6938cc1SHelen Koike /*
234e6938cc1SHelen Koike  * struct rkisp1_buffer - A container for the vb2 buffers used by the video devices:
235e6938cc1SHelen Koike  *			  params, stats, mainpath, selfpath
236e6938cc1SHelen Koike  *
237e6938cc1SHelen Koike  * @vb:		vb2 buffer
238e6938cc1SHelen Koike  * @queue:	entry of the buffer in the queue
239e6938cc1SHelen Koike  * @buff_addr:	dma addresses of each plane, used only by the capture devices: selfpath, mainpath
240e6938cc1SHelen Koike  */
241e6938cc1SHelen Koike struct rkisp1_buffer {
242e6938cc1SHelen Koike 	struct vb2_v4l2_buffer vb;
243e6938cc1SHelen Koike 	struct list_head queue;
244e6938cc1SHelen Koike 	u32 buff_addr[VIDEO_MAX_PLANES];
245e6938cc1SHelen Koike };
246e6938cc1SHelen Koike 
247e6938cc1SHelen Koike /*
248e6938cc1SHelen Koike  * struct rkisp1_dummy_buffer - A buffer to write the next frame to in case
249e6938cc1SHelen Koike  *				there are no vb2 buffers available.
250e6938cc1SHelen Koike  *
251e6938cc1SHelen Koike  * @vaddr:	return value of call to dma_alloc_attrs.
252e6938cc1SHelen Koike  * @dma_addr:	dma address of the buffer.
253e6938cc1SHelen Koike  * @size:	size of the buffer.
254e6938cc1SHelen Koike  */
255e6938cc1SHelen Koike struct rkisp1_dummy_buffer {
256e6938cc1SHelen Koike 	void *vaddr;
257e6938cc1SHelen Koike 	dma_addr_t dma_addr;
258e6938cc1SHelen Koike 	u32 size;
259e6938cc1SHelen Koike };
260e6938cc1SHelen Koike 
261e6938cc1SHelen Koike struct rkisp1_device;
262e6938cc1SHelen Koike 
263e6938cc1SHelen Koike /*
264e6938cc1SHelen Koike  * struct rkisp1_capture - ISP capture video device
265e6938cc1SHelen Koike  *
266e6938cc1SHelen Koike  * @vnode:	  video node
267e6938cc1SHelen Koike  * @rkisp1:	  pointer to rkisp1_device
268e6938cc1SHelen Koike  * @id:		  id of the capture, one of RKISP1_SELFPATH, RKISP1_MAINPATH
269e6938cc1SHelen Koike  * @ops:	  list of callbacks to configure the capture device.
270e6938cc1SHelen Koike  * @config:	  a pointer to the list of registers to configure the capture format.
271e6938cc1SHelen Koike  * @is_streaming: device is streaming
272e6938cc1SHelen Koike  * @is_stopping:  stop_streaming callback was called and the device is in the process of
273e6938cc1SHelen Koike  *		  stopping the streaming.
274e6938cc1SHelen Koike  * @done:	  when stop_streaming callback is called, the device waits for the next irq
275e6938cc1SHelen Koike  *		  handler to stop the streaming by waiting on the 'done' wait queue.
276e6938cc1SHelen Koike  *		  If the irq handler is not called, the stream is stopped by the callback
277e6938cc1SHelen Koike  *		  after timeout.
278e6938cc1SHelen Koike  * @sp_y_stride:  the selfpath allows to configure a y stride that is longer than the image width.
279e6938cc1SHelen Koike  * @buf.lock:	  lock to protect buf.queue
280e6938cc1SHelen Koike  * @buf.queue:	  queued buffer list
281e6938cc1SHelen Koike  * @buf.dummy:	  dummy space to store dropped data
282e6938cc1SHelen Koike  *
283e6938cc1SHelen Koike  * rkisp1 uses shadow registers, so it needs two buffers at a time
284e6938cc1SHelen Koike  * @buf.curr:	  the buffer used for current frame
285e6938cc1SHelen Koike  * @buf.next:	  the buffer used for next frame
286e6938cc1SHelen Koike  * @pix.cfg:	  pixel configuration
287e6938cc1SHelen Koike  * @pix.info:	  a pointer to the v4l2_format_info of the pixel format
288e6938cc1SHelen Koike  * @pix.fmt:	  buffer format
289e6938cc1SHelen Koike  */
290e6938cc1SHelen Koike struct rkisp1_capture {
291e6938cc1SHelen Koike 	struct rkisp1_vdev_node vnode;
292e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
293e6938cc1SHelen Koike 	enum rkisp1_stream_id id;
294a109073bSRikard Falkeborn 	const struct rkisp1_capture_ops *ops;
295e6938cc1SHelen Koike 	const struct rkisp1_capture_config *config;
296e6938cc1SHelen Koike 	bool is_streaming;
297e6938cc1SHelen Koike 	bool is_stopping;
298e6938cc1SHelen Koike 	wait_queue_head_t done;
299e6938cc1SHelen Koike 	unsigned int sp_y_stride;
300e6938cc1SHelen Koike 	struct {
301e6938cc1SHelen Koike 		/* protects queue, curr and next */
302e6938cc1SHelen Koike 		spinlock_t lock;
303e6938cc1SHelen Koike 		struct list_head queue;
304e6938cc1SHelen Koike 		struct rkisp1_dummy_buffer dummy;
305e6938cc1SHelen Koike 		struct rkisp1_buffer *curr;
306e6938cc1SHelen Koike 		struct rkisp1_buffer *next;
307e6938cc1SHelen Koike 	} buf;
308e6938cc1SHelen Koike 	struct {
309e6938cc1SHelen Koike 		const struct rkisp1_capture_fmt_cfg *cfg;
310e6938cc1SHelen Koike 		const struct v4l2_format_info *info;
311e6938cc1SHelen Koike 		struct v4l2_pix_format_mplane fmt;
312e6938cc1SHelen Koike 	} pix;
313e6938cc1SHelen Koike };
314e6938cc1SHelen Koike 
315962fb140SHeiko Stuebner struct rkisp1_stats;
316962fb140SHeiko Stuebner struct rkisp1_stats_ops {
317962fb140SHeiko Stuebner 	void (*get_awb_meas)(struct rkisp1_stats *stats,
318962fb140SHeiko Stuebner 			     struct rkisp1_stat_buffer *pbuf);
319962fb140SHeiko Stuebner 	void (*get_aec_meas)(struct rkisp1_stats *stats,
320962fb140SHeiko Stuebner 			     struct rkisp1_stat_buffer *pbuf);
321962fb140SHeiko Stuebner 	void (*get_hst_meas)(struct rkisp1_stats *stats,
322962fb140SHeiko Stuebner 			     struct rkisp1_stat_buffer *pbuf);
323962fb140SHeiko Stuebner };
324962fb140SHeiko Stuebner 
325e6938cc1SHelen Koike /*
326e6938cc1SHelen Koike  * struct rkisp1_stats - ISP Statistics device
327e6938cc1SHelen Koike  *
328e6938cc1SHelen Koike  * @vnode:	  video node
329e6938cc1SHelen Koike  * @rkisp1:	  pointer to the rkisp1 device
330e6938cc1SHelen Koike  * @lock:	  locks the buffer list 'stat'
331e6938cc1SHelen Koike  * @stat:	  queue of rkisp1_buffer
332e6938cc1SHelen Koike  * @vdev_fmt:	  v4l2_format of the metadata format
333e6938cc1SHelen Koike  */
334e6938cc1SHelen Koike struct rkisp1_stats {
335e6938cc1SHelen Koike 	struct rkisp1_vdev_node vnode;
336e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
337962fb140SHeiko Stuebner 	const struct rkisp1_stats_ops *ops;
338e6938cc1SHelen Koike 
339e6938cc1SHelen Koike 	spinlock_t lock; /* locks the buffers list 'stats' */
340e6938cc1SHelen Koike 	struct list_head stat;
341e6938cc1SHelen Koike 	struct v4l2_format vdev_fmt;
342e6938cc1SHelen Koike };
343e6938cc1SHelen Koike 
3445e8d9d72SHeiko Stuebner struct rkisp1_params;
3455e8d9d72SHeiko Stuebner struct rkisp1_params_ops {
3465e8d9d72SHeiko Stuebner 	void (*lsc_matrix_config)(struct rkisp1_params *params,
3475e8d9d72SHeiko Stuebner 				  const struct rkisp1_cif_isp_lsc_config *pconfig);
3485e8d9d72SHeiko Stuebner 	void (*goc_config)(struct rkisp1_params *params,
3495e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_goc_config *arg);
3505e8d9d72SHeiko Stuebner 	void (*awb_meas_config)(struct rkisp1_params *params,
3515e8d9d72SHeiko Stuebner 				const struct rkisp1_cif_isp_awb_meas_config *arg);
3525e8d9d72SHeiko Stuebner 	void (*awb_meas_enable)(struct rkisp1_params *params,
3535e8d9d72SHeiko Stuebner 				const struct rkisp1_cif_isp_awb_meas_config *arg,
3545e8d9d72SHeiko Stuebner 				bool en);
3555e8d9d72SHeiko Stuebner 	void (*awb_gain_config)(struct rkisp1_params *params,
3565e8d9d72SHeiko Stuebner 				const struct rkisp1_cif_isp_awb_gain_config *arg);
3575e8d9d72SHeiko Stuebner 	void (*aec_config)(struct rkisp1_params *params,
3585e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_aec_config *arg);
3595e8d9d72SHeiko Stuebner 	void (*hst_config)(struct rkisp1_params *params,
3605e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_hst_config *arg);
3615e8d9d72SHeiko Stuebner 	void (*hst_enable)(struct rkisp1_params *params,
3625e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_hst_config *arg, bool en);
3635e8d9d72SHeiko Stuebner 	void (*afm_config)(struct rkisp1_params *params,
3645e8d9d72SHeiko Stuebner 			   const struct rkisp1_cif_isp_afc_config *arg);
3655e8d9d72SHeiko Stuebner };
3665e8d9d72SHeiko Stuebner 
367e6938cc1SHelen Koike /*
368e6938cc1SHelen Koike  * struct rkisp1_params - ISP input parameters device
369e6938cc1SHelen Koike  *
370e6938cc1SHelen Koike  * @vnode:		video node
371e6938cc1SHelen Koike  * @rkisp1:		pointer to the rkisp1 device
3725e8d9d72SHeiko Stuebner  * @ops:		pointer to the variant-specific operations
373e6938cc1SHelen Koike  * @config_lock:	locks the buffer list 'params'
374e6938cc1SHelen Koike  * @params:		queue of rkisp1_buffer
375e6938cc1SHelen Koike  * @vdev_fmt:		v4l2_format of the metadata format
376e6938cc1SHelen Koike  * @quantization:	the quantization configured on the isp's src pad
377e6938cc1SHelen Koike  * @raw_type:		the bayer pattern on the isp video sink pad
378e6938cc1SHelen Koike  */
379e6938cc1SHelen Koike struct rkisp1_params {
380e6938cc1SHelen Koike 	struct rkisp1_vdev_node vnode;
381e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
3825e8d9d72SHeiko Stuebner 	const struct rkisp1_params_ops *ops;
383e6938cc1SHelen Koike 
384e6938cc1SHelen Koike 	spinlock_t config_lock; /* locks the buffers list 'params' */
385e6938cc1SHelen Koike 	struct list_head params;
386e6938cc1SHelen Koike 	struct v4l2_format vdev_fmt;
387e6938cc1SHelen Koike 
388e6938cc1SHelen Koike 	enum v4l2_quantization quantization;
389f7aa2d23SLaurent Pinchart 	enum v4l2_ycbcr_encoding ycbcr_encoding;
390e6938cc1SHelen Koike 	enum rkisp1_fmt_raw_pat_type raw_type;
391e6938cc1SHelen Koike };
392e6938cc1SHelen Koike 
393e6938cc1SHelen Koike /*
394e6938cc1SHelen Koike  * struct rkisp1_resizer - Resizer subdev
395e6938cc1SHelen Koike  *
396e6938cc1SHelen Koike  * @sd:	       v4l2_subdev variable
3973e74a422SLaurent Pinchart  * @regs_base: base register address offset
398e6938cc1SHelen Koike  * @id:	       id of the resizer, one of RKISP1_SELFPATH, RKISP1_MAINPATH
399e6938cc1SHelen Koike  * @rkisp1:    pointer to the rkisp1 device
400e6938cc1SHelen Koike  * @pads:      media pads
401e6938cc1SHelen Koike  * @pad_cfg:   configurations for the pads
402e6938cc1SHelen Koike  * @config:    the set of registers to configure the resizer
403e6938cc1SHelen Koike  * @pixel_enc: pixel encoding of the resizer
404e6938cc1SHelen Koike  * @ops_lock:  a lock for the subdev ops
405e6938cc1SHelen Koike  */
406e6938cc1SHelen Koike struct rkisp1_resizer {
407e6938cc1SHelen Koike 	struct v4l2_subdev sd;
4083e74a422SLaurent Pinchart 	u32 regs_base;
409e6938cc1SHelen Koike 	enum rkisp1_stream_id id;
410e6938cc1SHelen Koike 	struct rkisp1_device *rkisp1;
411e6938cc1SHelen Koike 	struct media_pad pads[RKISP1_RSZ_PAD_MAX];
412e6938cc1SHelen Koike 	struct v4l2_subdev_pad_config pad_cfg[RKISP1_RSZ_PAD_MAX];
413e6938cc1SHelen Koike 	const struct rkisp1_rsz_config *config;
414e6938cc1SHelen Koike 	enum v4l2_pixel_encoding pixel_enc;
415e6938cc1SHelen Koike 	struct mutex ops_lock; /* serialize the subdevice ops */
416e6938cc1SHelen Koike };
417e6938cc1SHelen Koike 
418e6938cc1SHelen Koike /*
419e6938cc1SHelen Koike  * struct rkisp1_debug - Values to be exposed on debugfs.
420e6938cc1SHelen Koike  *			 The parameters are counters of the number of times the
421e6938cc1SHelen Koike  *			 event occurred since the driver was loaded.
422e6938cc1SHelen Koike  *
423e6938cc1SHelen Koike  * @data_loss:			  loss of data occurred within a line, processing failure
424e6938cc1SHelen Koike  * @outform_size_error:		  size error is generated in outmux submodule
425e6938cc1SHelen Koike  * @img_stabilization_size_error: size error is generated in image stabilization submodule
426e6938cc1SHelen Koike  * @inform_size_err:		  size error is generated in inform submodule
427e6938cc1SHelen Koike  * @mipi_error:			  mipi error occurred
428e6938cc1SHelen Koike  * @stats_error:		  writing to the 'Interrupt clear register' did not clear
429e6938cc1SHelen Koike  *				  it in the register 'Masked interrupt status'
430e6938cc1SHelen Koike  * @stop_timeout:		  upon stream stop, the capture waits 1 second for the isr to stop
431e6938cc1SHelen Koike  *				  the stream. This param is incremented in case of timeout.
432e6938cc1SHelen Koike  * @frame_drop:			  a frame was ready but the buffer queue was empty so the frame
433e6938cc1SHelen Koike  *				  was not sent to userspace
434e6938cc1SHelen Koike  */
435e6938cc1SHelen Koike struct rkisp1_debug {
436e6938cc1SHelen Koike 	struct dentry *debugfs_dir;
437e6938cc1SHelen Koike 	unsigned long data_loss;
438e6938cc1SHelen Koike 	unsigned long outform_size_error;
439e6938cc1SHelen Koike 	unsigned long img_stabilization_size_error;
440e6938cc1SHelen Koike 	unsigned long inform_size_error;
441e6938cc1SHelen Koike 	unsigned long irq_delay;
442e6938cc1SHelen Koike 	unsigned long mipi_error;
443e6938cc1SHelen Koike 	unsigned long stats_error;
444e6938cc1SHelen Koike 	unsigned long stop_timeout[2];
445e6938cc1SHelen Koike 	unsigned long frame_drop[2];
446e6938cc1SHelen Koike };
447e6938cc1SHelen Koike 
448e6938cc1SHelen Koike /*
449e6938cc1SHelen Koike  * struct rkisp1_device - ISP platform device
450e6938cc1SHelen Koike  *
451e6938cc1SHelen Koike  * @base_addr:	   base register address
452e6938cc1SHelen Koike  * @dev:	   a pointer to the struct device
453e6938cc1SHelen Koike  * @clk_size:	   number of clocks
454e6938cc1SHelen Koike  * @clks:	   array of clocks
455e6938cc1SHelen Koike  * @v4l2_dev:	   v4l2_device variable
456e6938cc1SHelen Koike  * @media_dev:	   media_device variable
457e6938cc1SHelen Koike  * @notifier:	   a notifier to register on the v4l2-async API to be notified on the sensor
458745ba74aSLaurent Pinchart  * @source:        source subdev in-use, set when starting streaming
4598082e2f4SPaul Elder  * @csi:	   internal CSI-2 receiver
460e6938cc1SHelen Koike  * @isp:	   ISP sub-device
461e6938cc1SHelen Koike  * @resizer_devs:  resizer sub-devices
462e6938cc1SHelen Koike  * @capture_devs:  capture devices
463e6938cc1SHelen Koike  * @stats:	   ISP statistics metadata capture device
464e6938cc1SHelen Koike  * @params:	   ISP parameters metadata output device
465e6938cc1SHelen Koike  * @pipe:	   media pipeline
466e6938cc1SHelen Koike  * @stream_lock:   serializes {start/stop}_streaming callbacks between the capture devices.
467e6938cc1SHelen Koike  * @debug:	   debug params to be exposed on debugfs
4689125aee7SPaul Elder  * @info:	   version-specific ISP information
469e28e80cdSTomi Valkeinen  * @irqs:          IRQ line numbers
470*b39b4d20STomi Valkeinen  * @irqs_enabled:  the hardware is enabled and can cause interrupts
471e6938cc1SHelen Koike  */
472e6938cc1SHelen Koike struct rkisp1_device {
473e6938cc1SHelen Koike 	void __iomem *base_addr;
474e6938cc1SHelen Koike 	struct device *dev;
475e6938cc1SHelen Koike 	unsigned int clk_size;
476e6938cc1SHelen Koike 	struct clk_bulk_data clks[RKISP1_MAX_BUS_CLK];
477e6938cc1SHelen Koike 	struct v4l2_device v4l2_dev;
478e6938cc1SHelen Koike 	struct media_device media_dev;
479e6938cc1SHelen Koike 	struct v4l2_async_notifier notifier;
480745ba74aSLaurent Pinchart 	struct v4l2_subdev *source;
4818082e2f4SPaul Elder 	struct rkisp1_csi csi;
482e6938cc1SHelen Koike 	struct rkisp1_isp isp;
483e6938cc1SHelen Koike 	struct rkisp1_resizer resizer_devs[2];
484e6938cc1SHelen Koike 	struct rkisp1_capture capture_devs[2];
485e6938cc1SHelen Koike 	struct rkisp1_stats stats;
486e6938cc1SHelen Koike 	struct rkisp1_params params;
487e6938cc1SHelen Koike 	struct media_pipeline pipe;
488e6938cc1SHelen Koike 	struct mutex stream_lock; /* serialize {start/stop}_streaming cb between capture devices */
489e6938cc1SHelen Koike 	struct rkisp1_debug debug;
4909125aee7SPaul Elder 	const struct rkisp1_info *info;
491e28e80cdSTomi Valkeinen 	int irqs[RKISP1_NUM_IRQS];
492*b39b4d20STomi Valkeinen 	bool irqs_enabled;
493e6938cc1SHelen Koike };
494e6938cc1SHelen Koike 
495e6938cc1SHelen Koike /*
4960f3c2ab2SPaul Elder  * struct rkisp1_mbus_info - ISP media bus info, Translates media bus code to hardware
497e6938cc1SHelen Koike  *			     format values
498e6938cc1SHelen Koike  *
499e6938cc1SHelen Koike  * @mbus_code: media bus code
500e6938cc1SHelen Koike  * @pixel_enc: pixel encoding
501e6938cc1SHelen Koike  * @mipi_dt:   mipi data type
502e6938cc1SHelen Koike  * @yuv_seq:   the order of the Y, Cb, Cr values
503e6938cc1SHelen Koike  * @bus_width: bus width
504e6938cc1SHelen Koike  * @bayer_pat: bayer pattern
505e6938cc1SHelen Koike  * @direction: a bitmask of the flags indicating on which pad the format is supported on
506e6938cc1SHelen Koike  */
5070f3c2ab2SPaul Elder struct rkisp1_mbus_info {
508e6938cc1SHelen Koike 	u32 mbus_code;
509e6938cc1SHelen Koike 	enum v4l2_pixel_encoding pixel_enc;
510e6938cc1SHelen Koike 	u32 mipi_dt;
511e6938cc1SHelen Koike 	u32 yuv_seq;
512e6938cc1SHelen Koike 	u8 bus_width;
513e6938cc1SHelen Koike 	enum rkisp1_fmt_raw_pat_type bayer_pat;
514e6938cc1SHelen Koike 	unsigned int direction;
515e6938cc1SHelen Koike };
516e6938cc1SHelen Koike 
517e6938cc1SHelen Koike static inline void
rkisp1_write(struct rkisp1_device * rkisp1,unsigned int addr,u32 val)5180ef7dc30SLaurent Pinchart rkisp1_write(struct rkisp1_device *rkisp1, unsigned int addr, u32 val)
519e6938cc1SHelen Koike {
520e6938cc1SHelen Koike 	writel(val, rkisp1->base_addr + addr);
521e6938cc1SHelen Koike }
522e6938cc1SHelen Koike 
rkisp1_read(struct rkisp1_device * rkisp1,unsigned int addr)523e6938cc1SHelen Koike static inline u32 rkisp1_read(struct rkisp1_device *rkisp1, unsigned int addr)
524e6938cc1SHelen Koike {
525e6938cc1SHelen Koike 	return readl(rkisp1->base_addr + addr);
526e6938cc1SHelen Koike }
527e6938cc1SHelen Koike 
528e6938cc1SHelen Koike /*
529e6938cc1SHelen Koike  * rkisp1_cap_enum_mbus_codes - A helper function that return the i'th supported mbus code
530e6938cc1SHelen Koike  *				of the capture entity. This is used to enumerate the supported
531e6938cc1SHelen Koike  *				mbus codes on the source pad of the resizer.
532e6938cc1SHelen Koike  *
533e6938cc1SHelen Koike  * @cap:  the capture entity
534e6938cc1SHelen Koike  * @code: the mbus code, the function reads the code->index and fills the code->code
535e6938cc1SHelen Koike  */
536e6938cc1SHelen Koike int rkisp1_cap_enum_mbus_codes(struct rkisp1_capture *cap,
537e6938cc1SHelen Koike 			       struct v4l2_subdev_mbus_code_enum *code);
538e6938cc1SHelen Koike 
539e6938cc1SHelen Koike /*
5400f3c2ab2SPaul Elder  * rkisp1_mbus_info_get_by_index - Retrieve the ith supported mbus info
5410f3c2ab2SPaul Elder  *
5420f3c2ab2SPaul Elder  * @index: index of the mbus info to fetch
5430f3c2ab2SPaul Elder  */
5440f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_index(unsigned int index);
5450f3c2ab2SPaul Elder 
5460f3c2ab2SPaul Elder /*
547e6938cc1SHelen Koike  * rkisp1_sd_adjust_crop_rect - adjust a rectangle to fit into another rectangle.
548e6938cc1SHelen Koike  *
549e6938cc1SHelen Koike  * @crop:   rectangle to adjust.
550e6938cc1SHelen Koike  * @bounds: rectangle used as bounds.
551e6938cc1SHelen Koike  */
552e6938cc1SHelen Koike void rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop,
553e6938cc1SHelen Koike 				const struct v4l2_rect *bounds);
554e6938cc1SHelen Koike 
555e6938cc1SHelen Koike /*
556e6938cc1SHelen Koike  * rkisp1_sd_adjust_crop - adjust a rectangle to fit into media bus format
557e6938cc1SHelen Koike  *
558e6938cc1SHelen Koike  * @crop:   rectangle to adjust.
559e6938cc1SHelen Koike  * @bounds: media bus format used as bounds.
560e6938cc1SHelen Koike  */
561e6938cc1SHelen Koike void rkisp1_sd_adjust_crop(struct v4l2_rect *crop,
562e6938cc1SHelen Koike 			   const struct v4l2_mbus_framefmt *bounds);
563e6938cc1SHelen Koike 
564e6938cc1SHelen Koike /*
5650f3c2ab2SPaul Elder  * rkisp1_mbus_info_get_by_code - get the isp info of the media bus code
566e6938cc1SHelen Koike  *
567e6938cc1SHelen Koike  * @mbus_code: the media bus code
568e6938cc1SHelen Koike  */
5690f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_code(u32 mbus_code);
570e6938cc1SHelen Koike 
5714b07e2b8SLaurent Pinchart /*
5724b07e2b8SLaurent Pinchart  * rkisp1_params_pre_configure - Configure the params before stream start
573e6938cc1SHelen Koike  *
5744b07e2b8SLaurent Pinchart  * @params:	  pointer to rkisp1_params
575e6938cc1SHelen Koike  * @bayer_pat:	  the bayer pattern on the isp video sink pad
576e6938cc1SHelen Koike  * @quantization: the quantization configured on the isp's src pad
577f7aa2d23SLaurent Pinchart  * @ycbcr_encoding: the ycbcr_encoding configured on the isp's src pad
5784b07e2b8SLaurent Pinchart  *
5794b07e2b8SLaurent Pinchart  * This function is called by the ISP entity just before the ISP gets started.
5804b07e2b8SLaurent Pinchart  * It applies the initial ISP parameters from the first params buffer, but
5814b07e2b8SLaurent Pinchart  * skips LSC as it needs to be configured after the ISP is started.
582e6938cc1SHelen Koike  */
5834b07e2b8SLaurent Pinchart void rkisp1_params_pre_configure(struct rkisp1_params *params,
584e6938cc1SHelen Koike 				 enum rkisp1_fmt_raw_pat_type bayer_pat,
585f7aa2d23SLaurent Pinchart 				 enum v4l2_quantization quantization,
586f7aa2d23SLaurent Pinchart 				 enum v4l2_ycbcr_encoding ycbcr_encoding);
587e6938cc1SHelen Koike 
5884b07e2b8SLaurent Pinchart /*
5894b07e2b8SLaurent Pinchart  * rkisp1_params_post_configure - Configure the params after stream start
5904b07e2b8SLaurent Pinchart  *
5914b07e2b8SLaurent Pinchart  * @params:	  pointer to rkisp1_params
5924b07e2b8SLaurent Pinchart  *
5934b07e2b8SLaurent Pinchart  * This function is called by the ISP entity just after the ISP gets started.
5944b07e2b8SLaurent Pinchart  * It applies the initial ISP LSC parameters from the first params buffer.
5954b07e2b8SLaurent Pinchart  */
5964b07e2b8SLaurent Pinchart void rkisp1_params_post_configure(struct rkisp1_params *params);
5974b07e2b8SLaurent Pinchart 
598e6938cc1SHelen Koike /* rkisp1_params_disable - disable all parameters.
599e6938cc1SHelen Koike  *			   This function is called by the isp entity upon stream start
600e6938cc1SHelen Koike  *			   when capturing bayer format.
601e6938cc1SHelen Koike  *
602e6938cc1SHelen Koike  * @params: pointer to rkisp1_params.
603e6938cc1SHelen Koike  */
604e6938cc1SHelen Koike void rkisp1_params_disable(struct rkisp1_params *params);
605e6938cc1SHelen Koike 
606e6938cc1SHelen Koike /* irq handlers */
60708818e6aSHeiko Stuebner irqreturn_t rkisp1_isp_isr(int irq, void *ctx);
6080c0b9f9cSLaurent Pinchart irqreturn_t rkisp1_csi_isr(int irq, void *ctx);
60908818e6aSHeiko Stuebner irqreturn_t rkisp1_capture_isr(int irq, void *ctx);
610e6938cc1SHelen Koike void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris);
611e6938cc1SHelen Koike void rkisp1_params_isr(struct rkisp1_device *rkisp1);
612e6938cc1SHelen Koike 
613e6938cc1SHelen Koike /* register/unregisters functions of the entities */
614e6938cc1SHelen Koike int rkisp1_capture_devs_register(struct rkisp1_device *rkisp1);
615e6938cc1SHelen Koike void rkisp1_capture_devs_unregister(struct rkisp1_device *rkisp1);
616e6938cc1SHelen Koike 
617e6938cc1SHelen Koike int rkisp1_isp_register(struct rkisp1_device *rkisp1);
618e6938cc1SHelen Koike void rkisp1_isp_unregister(struct rkisp1_device *rkisp1);
619e6938cc1SHelen Koike 
620e6938cc1SHelen Koike int rkisp1_resizer_devs_register(struct rkisp1_device *rkisp1);
621e6938cc1SHelen Koike void rkisp1_resizer_devs_unregister(struct rkisp1_device *rkisp1);
622e6938cc1SHelen Koike 
623e6938cc1SHelen Koike int rkisp1_stats_register(struct rkisp1_device *rkisp1);
624e6938cc1SHelen Koike void rkisp1_stats_unregister(struct rkisp1_device *rkisp1);
625e6938cc1SHelen Koike 
626e6938cc1SHelen Koike int rkisp1_params_register(struct rkisp1_device *rkisp1);
627e6938cc1SHelen Koike void rkisp1_params_unregister(struct rkisp1_device *rkisp1);
628e6938cc1SHelen Koike 
629fd3608feSLaurent Pinchart #if IS_ENABLED(CONFIG_DEBUG_FS)
6308682037dSLaurent Pinchart void rkisp1_debug_init(struct rkisp1_device *rkisp1);
6318682037dSLaurent Pinchart void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1);
632fd3608feSLaurent Pinchart #else
rkisp1_debug_init(struct rkisp1_device * rkisp1)633fd3608feSLaurent Pinchart static inline void rkisp1_debug_init(struct rkisp1_device *rkisp1)
634fd3608feSLaurent Pinchart {
635fd3608feSLaurent Pinchart }
rkisp1_debug_cleanup(struct rkisp1_device * rkisp1)636fd3608feSLaurent Pinchart static inline void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1)
637fd3608feSLaurent Pinchart {
638fd3608feSLaurent Pinchart }
639fd3608feSLaurent Pinchart #endif
6408682037dSLaurent Pinchart 
641e6938cc1SHelen Koike #endif /* _RKISP1_COMMON_H */
642