1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing)
4  * Author: Yong Deng <yong.deng@magewell.com>
5  * Copyright 2021-2022 Bootlin
6  * Author: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
7  */
8 
9 #ifndef _SUN6I_CAPTURE_H_
10 #define _SUN6I_CAPTURE_H_
11 
12 #include <media/v4l2-device.h>
13 
14 #define SUN6I_CSI_CAPTURE_NAME	"sun6i-csi-capture"
15 
16 #define SUN6I_CSI_CAPTURE_WIDTH_MIN	32
17 #define SUN6I_CSI_CAPTURE_WIDTH_MAX	4800
18 #define SUN6I_CSI_CAPTURE_HEIGHT_MIN	32
19 #define SUN6I_CSI_CAPTURE_HEIGHT_MAX	4800
20 
21 struct sun6i_csi_device;
22 
23 struct sun6i_csi_capture_format {
24 	u32	pixelformat;
25 	u8	output_format_field;
26 	u8	output_format_frame;
27 	bool	input_yuv_seq_invert;
28 	bool	input_format_raw;
29 	u32	hsize_len_factor;
30 };
31 
32 struct sun6i_csi_capture_format_match {
33 	u32	pixelformat;
34 	u32	mbus_code;
35 };
36 
37 #undef current
38 struct sun6i_csi_capture_state {
39 	struct list_head		queue;
40 	spinlock_t			lock; /* Queue and buffers lock. */
41 
42 	struct sun6i_csi_buffer		*pending;
43 	struct sun6i_csi_buffer		*current;
44 	struct sun6i_csi_buffer		*complete;
45 
46 	unsigned int			sequence;
47 	bool				streaming;
48 	bool				setup;
49 };
50 
51 struct sun6i_csi_capture {
52 	struct sun6i_csi_capture_state	state;
53 
54 	struct video_device		video_dev;
55 	struct vb2_queue		queue;
56 	struct mutex			lock; /* Queue lock. */
57 	struct media_pad		pad;
58 
59 	struct v4l2_format		format;
60 };
61 
62 /* Helpers */
63 
64 void sun6i_csi_capture_dimensions(struct sun6i_csi_device *csi_dev,
65 				  unsigned int *width, unsigned int *height);
66 void sun6i_csi_capture_format(struct sun6i_csi_device *csi_dev,
67 			      u32 *pixelformat, u32 *field);
68 
69 /* Format */
70 
71 const
72 struct sun6i_csi_capture_format *sun6i_csi_capture_format_find(u32 pixelformat);
73 
74 /* Capture */
75 
76 void sun6i_csi_capture_configure(struct sun6i_csi_device *csi_dev);
77 void sun6i_csi_capture_state_update(struct sun6i_csi_device *csi_dev);
78 
79 /* State */
80 
81 void sun6i_csi_capture_sync(struct sun6i_csi_device *csi_dev);
82 void sun6i_csi_capture_frame_done(struct sun6i_csi_device *csi_dev);
83 
84 /* Capture */
85 
86 int sun6i_csi_capture_setup(struct sun6i_csi_device *csi_dev);
87 void sun6i_csi_capture_cleanup(struct sun6i_csi_device *csi_dev);
88 
89 #endif
90