1 // SPDX-License-Identifier: GPL-2.0+
2 
3 #include <linux/atomic.h>
4 #include <linux/bitfield.h>
5 #include <linux/clk.h>
6 #include <linux/delay.h>
7 #include <linux/device.h>
8 #include <linux/dma-mapping.h>
9 #include <linux/interrupt.h>
10 #include <linux/jiffies.h>
11 #include <linux/module.h>
12 #include <linux/mutex.h>
13 #include <linux/of.h>
14 #include <linux/of_irq.h>
15 #include <linux/of_reserved_mem.h>
16 #include <linux/platform_device.h>
17 #include <linux/sched.h>
18 #include <linux/spinlock.h>
19 #include <linux/string.h>
20 #include <linux/v4l2-controls.h>
21 #include <linux/videodev2.h>
22 #include <linux/wait.h>
23 #include <linux/workqueue.h>
24 #include <media/v4l2-ctrls.h>
25 #include <media/v4l2-dev.h>
26 #include <media/v4l2-device.h>
27 #include <media/v4l2-dv-timings.h>
28 #include <media/v4l2-event.h>
29 #include <media/v4l2-ioctl.h>
30 #include <media/videobuf2-dma-contig.h>
31 
32 #define DEVICE_NAME			"aspeed-video"
33 
34 #define ASPEED_VIDEO_JPEG_NUM_QUALITIES	12
35 #define ASPEED_VIDEO_JPEG_HEADER_SIZE	10
36 #define ASPEED_VIDEO_JPEG_QUANT_SIZE	116
37 #define ASPEED_VIDEO_JPEG_DCT_SIZE	34
38 
39 #define MAX_FRAME_RATE			60
40 #define MAX_HEIGHT			1200
41 #define MAX_WIDTH			1920
42 #define MIN_HEIGHT			480
43 #define MIN_WIDTH			640
44 
45 #define NUM_POLARITY_CHECKS		10
46 #define INVALID_RESOLUTION_RETRIES	2
47 #define INVALID_RESOLUTION_DELAY	msecs_to_jiffies(250)
48 #define RESOLUTION_CHANGE_DELAY		msecs_to_jiffies(500)
49 #define MODE_DETECT_TIMEOUT		msecs_to_jiffies(500)
50 #define STOP_TIMEOUT			msecs_to_jiffies(1000)
51 #define DIRECT_FETCH_THRESHOLD		0x0c0000 /* 1024 * 768 */
52 
53 #define VE_MAX_SRC_BUFFER_SIZE		0x8ca000 /* 1920 * 1200, 32bpp */
54 #define VE_JPEG_HEADER_SIZE		0x006000 /* 512 * 12 * 4 */
55 
56 #define VE_PROTECTION_KEY		0x000
57 #define  VE_PROTECTION_KEY_UNLOCK	0x1a038aa8
58 
59 #define VE_SEQ_CTRL			0x004
60 #define  VE_SEQ_CTRL_TRIG_MODE_DET	BIT(0)
61 #define  VE_SEQ_CTRL_TRIG_CAPTURE	BIT(1)
62 #define  VE_SEQ_CTRL_FORCE_IDLE		BIT(2)
63 #define  VE_SEQ_CTRL_MULT_FRAME		BIT(3)
64 #define  VE_SEQ_CTRL_TRIG_COMP		BIT(4)
65 #define  VE_SEQ_CTRL_AUTO_COMP		BIT(5)
66 #define  VE_SEQ_CTRL_EN_WATCHDOG	BIT(7)
67 #define  VE_SEQ_CTRL_YUV420		BIT(10)
68 #define  VE_SEQ_CTRL_COMP_FMT		GENMASK(11, 10)
69 #define  VE_SEQ_CTRL_HALT		BIT(12)
70 #define  VE_SEQ_CTRL_EN_WATCHDOG_COMP	BIT(14)
71 #define  VE_SEQ_CTRL_TRIG_JPG		BIT(15)
72 #define  VE_SEQ_CTRL_CAP_BUSY		BIT(16)
73 #define  VE_SEQ_CTRL_COMP_BUSY		BIT(18)
74 
75 #ifdef CONFIG_MACH_ASPEED_G5
76 #define  VE_SEQ_CTRL_JPEG_MODE		BIT(13)	/* AST2500 */
77 #else
78 #define  VE_SEQ_CTRL_JPEG_MODE		BIT(8)	/* AST2400 */
79 #endif /* CONFIG_MACH_ASPEED_G5 */
80 
81 #define VE_CTRL				0x008
82 #define  VE_CTRL_HSYNC_POL		BIT(0)
83 #define  VE_CTRL_VSYNC_POL		BIT(1)
84 #define  VE_CTRL_SOURCE			BIT(2)
85 #define  VE_CTRL_INT_DE			BIT(4)
86 #define  VE_CTRL_DIRECT_FETCH		BIT(5)
87 #define  VE_CTRL_YUV			BIT(6)
88 #define  VE_CTRL_RGB			BIT(7)
89 #define  VE_CTRL_CAPTURE_FMT		GENMASK(7, 6)
90 #define  VE_CTRL_AUTO_OR_CURSOR		BIT(8)
91 #define  VE_CTRL_CLK_INVERSE		BIT(11)
92 #define  VE_CTRL_CLK_DELAY		GENMASK(11, 9)
93 #define  VE_CTRL_INTERLACE		BIT(14)
94 #define  VE_CTRL_HSYNC_POL_CTRL		BIT(15)
95 #define  VE_CTRL_FRC			GENMASK(23, 16)
96 
97 #define VE_TGS_0			0x00c
98 #define VE_TGS_1			0x010
99 #define  VE_TGS_FIRST			GENMASK(28, 16)
100 #define  VE_TGS_LAST			GENMASK(12, 0)
101 
102 #define VE_SCALING_FACTOR		0x014
103 #define VE_SCALING_FILTER0		0x018
104 #define VE_SCALING_FILTER1		0x01c
105 #define VE_SCALING_FILTER2		0x020
106 #define VE_SCALING_FILTER3		0x024
107 
108 #define VE_CAP_WINDOW			0x030
109 #define VE_COMP_WINDOW			0x034
110 #define VE_COMP_PROC_OFFSET		0x038
111 #define VE_COMP_OFFSET			0x03c
112 #define VE_JPEG_ADDR			0x040
113 #define VE_SRC0_ADDR			0x044
114 #define VE_SRC_SCANLINE_OFFSET		0x048
115 #define VE_SRC1_ADDR			0x04c
116 #define VE_COMP_ADDR			0x054
117 
118 #define VE_STREAM_BUF_SIZE		0x058
119 #define  VE_STREAM_BUF_SIZE_N_PACKETS	GENMASK(5, 3)
120 #define  VE_STREAM_BUF_SIZE_P_SIZE	GENMASK(2, 0)
121 
122 #define VE_COMP_CTRL			0x060
123 #define  VE_COMP_CTRL_VQ_DCT_ONLY	BIT(0)
124 #define  VE_COMP_CTRL_VQ_4COLOR		BIT(1)
125 #define  VE_COMP_CTRL_QUANTIZE		BIT(2)
126 #define  VE_COMP_CTRL_EN_BQ		BIT(4)
127 #define  VE_COMP_CTRL_EN_CRYPTO		BIT(5)
128 #define  VE_COMP_CTRL_DCT_CHR		GENMASK(10, 6)
129 #define  VE_COMP_CTRL_DCT_LUM		GENMASK(15, 11)
130 #define  VE_COMP_CTRL_EN_HQ		BIT(16)
131 #define  VE_COMP_CTRL_RSVD		BIT(19)
132 #define  VE_COMP_CTRL_ENCODE		GENMASK(21, 20)
133 #define  VE_COMP_CTRL_HQ_DCT_CHR	GENMASK(26, 22)
134 #define  VE_COMP_CTRL_HQ_DCT_LUM	GENMASK(31, 27)
135 
136 #define VE_OFFSET_COMP_STREAM		0x078
137 
138 #define VE_SRC_LR_EDGE_DET		0x090
139 #define  VE_SRC_LR_EDGE_DET_LEFT	GENMASK(11, 0)
140 #define  VE_SRC_LR_EDGE_DET_NO_V	BIT(12)
141 #define  VE_SRC_LR_EDGE_DET_NO_H	BIT(13)
142 #define  VE_SRC_LR_EDGE_DET_NO_DISP	BIT(14)
143 #define  VE_SRC_LR_EDGE_DET_NO_CLK	BIT(15)
144 #define  VE_SRC_LR_EDGE_DET_RT_SHF	16
145 #define  VE_SRC_LR_EDGE_DET_RT		GENMASK(27, VE_SRC_LR_EDGE_DET_RT_SHF)
146 #define  VE_SRC_LR_EDGE_DET_INTERLACE	BIT(31)
147 
148 #define VE_SRC_TB_EDGE_DET		0x094
149 #define  VE_SRC_TB_EDGE_DET_TOP		GENMASK(12, 0)
150 #define  VE_SRC_TB_EDGE_DET_BOT_SHF	16
151 #define  VE_SRC_TB_EDGE_DET_BOT		GENMASK(28, VE_SRC_TB_EDGE_DET_BOT_SHF)
152 
153 #define VE_MODE_DETECT_STATUS		0x098
154 #define  VE_MODE_DETECT_H_PIXELS	GENMASK(11, 0)
155 #define  VE_MODE_DETECT_V_LINES_SHF	16
156 #define  VE_MODE_DETECT_V_LINES		GENMASK(27, VE_MODE_DETECT_V_LINES_SHF)
157 #define  VE_MODE_DETECT_STATUS_VSYNC	BIT(28)
158 #define  VE_MODE_DETECT_STATUS_HSYNC	BIT(29)
159 
160 #define VE_SYNC_STATUS			0x09c
161 #define  VE_SYNC_STATUS_HSYNC		GENMASK(11, 0)
162 #define  VE_SYNC_STATUS_VSYNC_SHF	16
163 #define  VE_SYNC_STATUS_VSYNC		GENMASK(27, VE_SYNC_STATUS_VSYNC_SHF)
164 
165 #define VE_INTERRUPT_CTRL		0x304
166 #define VE_INTERRUPT_STATUS		0x308
167 #define  VE_INTERRUPT_MODE_DETECT_WD	BIT(0)
168 #define  VE_INTERRUPT_CAPTURE_COMPLETE	BIT(1)
169 #define  VE_INTERRUPT_COMP_READY	BIT(2)
170 #define  VE_INTERRUPT_COMP_COMPLETE	BIT(3)
171 #define  VE_INTERRUPT_MODE_DETECT	BIT(4)
172 #define  VE_INTERRUPT_FRAME_COMPLETE	BIT(5)
173 #define  VE_INTERRUPT_DECODE_ERR	BIT(6)
174 #define  VE_INTERRUPT_HALT_READY	BIT(8)
175 #define  VE_INTERRUPT_HANG_WD		BIT(9)
176 #define  VE_INTERRUPT_STREAM_DESC	BIT(10)
177 #define  VE_INTERRUPT_VSYNC_DESC	BIT(11)
178 
179 #define VE_MODE_DETECT			0x30c
180 #define VE_MEM_RESTRICT_START		0x310
181 #define VE_MEM_RESTRICT_END		0x314
182 
183 enum {
184 	VIDEO_MODE_DETECT_DONE,
185 	VIDEO_RES_CHANGE,
186 	VIDEO_RES_DETECT,
187 	VIDEO_STREAMING,
188 	VIDEO_FRAME_INPRG,
189 	VIDEO_STOPPED,
190 	VIDEO_CLOCKS_ON,
191 };
192 
193 struct aspeed_video_addr {
194 	unsigned int size;
195 	dma_addr_t dma;
196 	void *virt;
197 };
198 
199 struct aspeed_video_buffer {
200 	struct vb2_v4l2_buffer vb;
201 	struct list_head link;
202 };
203 
204 #define to_aspeed_video_buffer(x) \
205 	container_of((x), struct aspeed_video_buffer, vb)
206 
207 struct aspeed_video {
208 	void __iomem *base;
209 	struct clk *eclk;
210 	struct clk *vclk;
211 
212 	struct device *dev;
213 	struct v4l2_ctrl_handler ctrl_handler;
214 	struct v4l2_device v4l2_dev;
215 	struct v4l2_pix_format pix_fmt;
216 	struct v4l2_bt_timings active_timings;
217 	struct v4l2_bt_timings detected_timings;
218 	u32 v4l2_input_status;
219 	struct vb2_queue queue;
220 	struct video_device vdev;
221 	struct mutex video_lock;	/* v4l2 and videobuf2 lock */
222 
223 	wait_queue_head_t wait;
224 	spinlock_t lock;		/* buffer list lock */
225 	struct delayed_work res_work;
226 	struct list_head buffers;
227 	unsigned long flags;
228 	unsigned int sequence;
229 
230 	unsigned int max_compressed_size;
231 	struct aspeed_video_addr srcs[2];
232 	struct aspeed_video_addr jpeg;
233 
234 	bool yuv420;
235 	unsigned int frame_rate;
236 	unsigned int jpeg_quality;
237 
238 	unsigned int frame_bottom;
239 	unsigned int frame_left;
240 	unsigned int frame_right;
241 	unsigned int frame_top;
242 };
243 
244 #define to_aspeed_video(x) container_of((x), struct aspeed_video, v4l2_dev)
245 
246 static const u32 aspeed_video_jpeg_header[ASPEED_VIDEO_JPEG_HEADER_SIZE] = {
247 	0xe0ffd8ff, 0x464a1000, 0x01004649, 0x60000101, 0x00006000, 0x0f00feff,
248 	0x00002d05, 0x00000000, 0x00000000, 0x00dbff00
249 };
250 
251 static const u32 aspeed_video_jpeg_quant[ASPEED_VIDEO_JPEG_QUANT_SIZE] = {
252 	0x081100c0, 0x00000000, 0x00110103, 0x03011102, 0xc4ff0111, 0x00001f00,
253 	0x01010501, 0x01010101, 0x00000000, 0x00000000, 0x04030201, 0x08070605,
254 	0xff0b0a09, 0x10b500c4, 0x03010200, 0x03040203, 0x04040505, 0x7d010000,
255 	0x00030201, 0x12051104, 0x06413121, 0x07615113, 0x32147122, 0x08a19181,
256 	0xc1b14223, 0xf0d15215, 0x72623324, 0x160a0982, 0x1a191817, 0x28272625,
257 	0x35342a29, 0x39383736, 0x4544433a, 0x49484746, 0x5554534a, 0x59585756,
258 	0x6564635a, 0x69686766, 0x7574736a, 0x79787776, 0x8584837a, 0x89888786,
259 	0x9493928a, 0x98979695, 0xa3a29a99, 0xa7a6a5a4, 0xb2aaa9a8, 0xb6b5b4b3,
260 	0xbab9b8b7, 0xc5c4c3c2, 0xc9c8c7c6, 0xd4d3d2ca, 0xd8d7d6d5, 0xe2e1dad9,
261 	0xe6e5e4e3, 0xeae9e8e7, 0xf4f3f2f1, 0xf8f7f6f5, 0xc4fffaf9, 0x00011f00,
262 	0x01010103, 0x01010101, 0x00000101, 0x00000000, 0x04030201, 0x08070605,
263 	0xff0b0a09, 0x11b500c4, 0x02010200, 0x04030404, 0x04040507, 0x77020100,
264 	0x03020100, 0x21050411, 0x41120631, 0x71610751, 0x81322213, 0x91421408,
265 	0x09c1b1a1, 0xf0523323, 0xd1726215, 0x3424160a, 0x17f125e1, 0x261a1918,
266 	0x2a292827, 0x38373635, 0x44433a39, 0x48474645, 0x54534a49, 0x58575655,
267 	0x64635a59, 0x68676665, 0x74736a69, 0x78777675, 0x83827a79, 0x87868584,
268 	0x928a8988, 0x96959493, 0x9a999897, 0xa5a4a3a2, 0xa9a8a7a6, 0xb4b3b2aa,
269 	0xb8b7b6b5, 0xc3c2bab9, 0xc7c6c5c4, 0xd2cac9c8, 0xd6d5d4d3, 0xdad9d8d7,
270 	0xe5e4e3e2, 0xe9e8e7e6, 0xf4f3f2ea, 0xf8f7f6f5, 0xdafffaf9, 0x01030c00,
271 	0x03110200, 0x003f0011
272 };
273 
274 static const u32 aspeed_video_jpeg_dct[ASPEED_VIDEO_JPEG_NUM_QUALITIES]
275 				      [ASPEED_VIDEO_JPEG_DCT_SIZE] = {
276 	{ 0x0d140043, 0x0c0f110f, 0x11101114, 0x17141516, 0x1e20321e,
277 	  0x3d1e1b1b, 0x32242e2b, 0x4b4c3f48, 0x44463f47, 0x61735a50,
278 	  0x566c5550, 0x88644644, 0x7a766c65, 0x4d808280, 0x8c978d60,
279 	  0x7e73967d, 0xdbff7b80, 0x1f014300, 0x272d2121, 0x3030582d,
280 	  0x697bb958, 0xb8b9b97b, 0xb9b8a6a6, 0xb9b9b9b9, 0xb9b9b9b9,
281 	  0xb9b9b9b9, 0xb9b9b9b9, 0xb9b9b9b9, 0xb9b9b9b9, 0xb9b9b9b9,
282 	  0xb9b9b9b9, 0xb9b9b9b9, 0xb9b9b9b9, 0xffb9b9b9 },
283 	{ 0x0c110043, 0x0a0d0f0d, 0x0f0e0f11, 0x14111213, 0x1a1c2b1a,
284 	  0x351a1818, 0x2b1f2826, 0x4142373f, 0x3c3d373e, 0x55644e46,
285 	  0x4b5f4a46, 0x77573d3c, 0x6b675f58, 0x43707170, 0x7a847b54,
286 	  0x6e64836d, 0xdbff6c70, 0x1b014300, 0x22271d1d, 0x2a2a4c27,
287 	  0x5b6ba04c, 0xa0a0a06b, 0xa0a0a0a0, 0xa0a0a0a0, 0xa0a0a0a0,
288 	  0xa0a0a0a0, 0xa0a0a0a0, 0xa0a0a0a0, 0xa0a0a0a0, 0xa0a0a0a0,
289 	  0xa0a0a0a0, 0xa0a0a0a0, 0xa0a0a0a0, 0xffa0a0a0 },
290 	{ 0x090e0043, 0x090a0c0a, 0x0c0b0c0e, 0x110e0f10, 0x15172415,
291 	  0x2c151313, 0x241a211f, 0x36372e34, 0x31322e33, 0x4653413a,
292 	  0x3e4e3d3a, 0x62483231, 0x58564e49, 0x385d5e5d, 0x656d6645,
293 	  0x5b536c5a, 0xdbff595d, 0x16014300, 0x1c201818, 0x22223f20,
294 	  0x4b58853f, 0x85858558, 0x85858585, 0x85858585, 0x85858585,
295 	  0x85858585, 0x85858585, 0x85858585, 0x85858585, 0x85858585,
296 	  0x85858585, 0x85858585, 0x85858585, 0xff858585 },
297 	{ 0x070b0043, 0x07080a08, 0x0a090a0b, 0x0d0b0c0c, 0x11121c11,
298 	  0x23110f0f, 0x1c141a19, 0x2b2b2429, 0x27282428, 0x3842332e,
299 	  0x313e302e, 0x4e392827, 0x46443e3a, 0x2c4a4a4a, 0x50565137,
300 	  0x48425647, 0xdbff474a, 0x12014300, 0x161a1313, 0x1c1c331a,
301 	  0x3d486c33, 0x6c6c6c48, 0x6c6c6c6c, 0x6c6c6c6c, 0x6c6c6c6c,
302 	  0x6c6c6c6c, 0x6c6c6c6c, 0x6c6c6c6c, 0x6c6c6c6c, 0x6c6c6c6c,
303 	  0x6c6c6c6c, 0x6c6c6c6c, 0x6c6c6c6c, 0xff6c6c6c },
304 	{ 0x06090043, 0x05060706, 0x07070709, 0x0a09090a, 0x0d0e160d,
305 	  0x1b0d0c0c, 0x16101413, 0x21221c20, 0x1e1f1c20, 0x2b332824,
306 	  0x26302624, 0x3d2d1f1e, 0x3735302d, 0x22393a39, 0x3f443f2b,
307 	  0x38334338, 0xdbff3739, 0x0d014300, 0x11130e0e, 0x15152613,
308 	  0x2d355026, 0x50505035, 0x50505050, 0x50505050, 0x50505050,
309 	  0x50505050, 0x50505050, 0x50505050, 0x50505050, 0x50505050,
310 	  0x50505050, 0x50505050, 0x50505050, 0xff505050 },
311 	{ 0x04060043, 0x03040504, 0x05040506, 0x07060606, 0x09090f09,
312 	  0x12090808, 0x0f0a0d0d, 0x16161315, 0x14151315, 0x1d221b18,
313 	  0x19201918, 0x281e1514, 0x2423201e, 0x17262726, 0x2a2d2a1c,
314 	  0x25222d25, 0xdbff2526, 0x09014300, 0x0b0d0a0a, 0x0e0e1a0d,
315 	  0x1f25371a, 0x37373725, 0x37373737, 0x37373737, 0x37373737,
316 	  0x37373737, 0x37373737, 0x37373737, 0x37373737, 0x37373737,
317 	  0x37373737, 0x37373737, 0x37373737, 0xff373737 },
318 	{ 0x02030043, 0x01020202, 0x02020203, 0x03030303, 0x04040704,
319 	  0x09040404, 0x07050606, 0x0b0b090a, 0x0a0a090a, 0x0e110d0c,
320 	  0x0c100c0c, 0x140f0a0a, 0x1211100f, 0x0b131313, 0x1516150e,
321 	  0x12111612, 0xdbff1213, 0x04014300, 0x05060505, 0x07070d06,
322 	  0x0f121b0d, 0x1b1b1b12, 0x1b1b1b1b, 0x1b1b1b1b, 0x1b1b1b1b,
323 	  0x1b1b1b1b, 0x1b1b1b1b, 0x1b1b1b1b, 0x1b1b1b1b, 0x1b1b1b1b,
324 	  0x1b1b1b1b, 0x1b1b1b1b, 0x1b1b1b1b, 0xff1b1b1b },
325 	{ 0x01020043, 0x01010101, 0x01010102, 0x02020202, 0x03030503,
326 	  0x06030202, 0x05030404, 0x07070607, 0x06070607, 0x090b0908,
327 	  0x080a0808, 0x0d0a0706, 0x0c0b0a0a, 0x070c0d0c, 0x0e0f0e09,
328 	  0x0c0b0f0c, 0xdbff0c0c, 0x03014300, 0x03040303, 0x04040804,
329 	  0x0a0c1208, 0x1212120c, 0x12121212, 0x12121212, 0x12121212,
330 	  0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212,
331 	  0x12121212, 0x12121212, 0x12121212, 0xff121212 },
332 	{ 0x01020043, 0x01010101, 0x01010102, 0x02020202, 0x03030503,
333 	  0x06030202, 0x05030404, 0x07070607, 0x06070607, 0x090b0908,
334 	  0x080a0808, 0x0d0a0706, 0x0c0b0a0a, 0x070c0d0c, 0x0e0f0e09,
335 	  0x0c0b0f0c, 0xdbff0c0c, 0x02014300, 0x03030202, 0x04040703,
336 	  0x080a0f07, 0x0f0f0f0a, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f,
337 	  0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f,
338 	  0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0xff0f0f0f },
339 	{ 0x01010043, 0x01010101, 0x01010101, 0x01010101, 0x02020302,
340 	  0x04020202, 0x03020303, 0x05050405, 0x05050405, 0x07080606,
341 	  0x06080606, 0x0a070505, 0x09080807, 0x05090909, 0x0a0b0a07,
342 	  0x09080b09, 0xdbff0909, 0x02014300, 0x02030202, 0x03030503,
343 	  0x07080c05, 0x0c0c0c08, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c,
344 	  0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c,
345 	  0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xff0c0c0c },
346 	{ 0x01010043, 0x01010101, 0x01010101, 0x01010101, 0x01010201,
347 	  0x03010101, 0x02010202, 0x03030303, 0x03030303, 0x04050404,
348 	  0x04050404, 0x06050303, 0x06050505, 0x03060606, 0x07070704,
349 	  0x06050706, 0xdbff0606, 0x01014300, 0x01020101, 0x02020402,
350 	  0x05060904, 0x09090906, 0x09090909, 0x09090909, 0x09090909,
351 	  0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909,
352 	  0x09090909, 0x09090909, 0x09090909, 0xff090909 },
353 	{ 0x01010043, 0x01010101, 0x01010101, 0x01010101, 0x01010101,
354 	  0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x02020202,
355 	  0x02020202, 0x03020101, 0x03020202, 0x01030303, 0x03030302,
356 	  0x03020303, 0xdbff0403, 0x01014300, 0x01010101, 0x01010201,
357 	  0x03040602, 0x06060604, 0x06060606, 0x06060606, 0x06060606,
358 	  0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606,
359 	  0x06060606, 0x06060606, 0x06060606, 0xff060606 }
360 };
361 
362 static const struct v4l2_dv_timings_cap aspeed_video_timings_cap = {
363 	.type = V4L2_DV_BT_656_1120,
364 	.bt = {
365 		.min_width = MIN_WIDTH,
366 		.max_width = MAX_WIDTH,
367 		.min_height = MIN_HEIGHT,
368 		.max_height = MAX_HEIGHT,
369 		.min_pixelclock = 6574080, /* 640 x 480 x 24Hz */
370 		.max_pixelclock = 138240000, /* 1920 x 1200 x 60Hz */
371 		.standards = V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
372 			V4L2_DV_BT_STD_CVT | V4L2_DV_BT_STD_GTF,
373 		.capabilities = V4L2_DV_BT_CAP_PROGRESSIVE |
374 			V4L2_DV_BT_CAP_REDUCED_BLANKING |
375 			V4L2_DV_BT_CAP_CUSTOM,
376 	},
377 };
378 
aspeed_video_init_jpeg_table(u32 * table,bool yuv420)379 static void aspeed_video_init_jpeg_table(u32 *table, bool yuv420)
380 {
381 	int i;
382 	unsigned int base;
383 
384 	for (i = 0; i < ASPEED_VIDEO_JPEG_NUM_QUALITIES; i++) {
385 		base = 256 * i;	/* AST HW requires this header spacing */
386 		memcpy(&table[base], aspeed_video_jpeg_header,
387 		       sizeof(aspeed_video_jpeg_header));
388 
389 		base += ASPEED_VIDEO_JPEG_HEADER_SIZE;
390 		memcpy(&table[base], aspeed_video_jpeg_dct[i],
391 		       sizeof(aspeed_video_jpeg_dct[i]));
392 
393 		base += ASPEED_VIDEO_JPEG_DCT_SIZE;
394 		memcpy(&table[base], aspeed_video_jpeg_quant,
395 		       sizeof(aspeed_video_jpeg_quant));
396 
397 		if (yuv420)
398 			table[base + 2] = 0x00220103;
399 	}
400 }
401 
aspeed_video_update(struct aspeed_video * video,u32 reg,u32 clear,u32 bits)402 static void aspeed_video_update(struct aspeed_video *video, u32 reg, u32 clear,
403 				u32 bits)
404 {
405 	u32 t = readl(video->base + reg);
406 	u32 before = t;
407 
408 	t &= ~clear;
409 	t |= bits;
410 	writel(t, video->base + reg);
411 	dev_dbg(video->dev, "update %03x[%08x -> %08x]\n", reg, before,
412 		readl(video->base + reg));
413 }
414 
aspeed_video_read(struct aspeed_video * video,u32 reg)415 static u32 aspeed_video_read(struct aspeed_video *video, u32 reg)
416 {
417 	u32 t = readl(video->base + reg);
418 
419 	dev_dbg(video->dev, "read %03x[%08x]\n", reg, t);
420 	return t;
421 }
422 
aspeed_video_write(struct aspeed_video * video,u32 reg,u32 val)423 static void aspeed_video_write(struct aspeed_video *video, u32 reg, u32 val)
424 {
425 	writel(val, video->base + reg);
426 	dev_dbg(video->dev, "write %03x[%08x]\n", reg,
427 		readl(video->base + reg));
428 }
429 
aspeed_video_start_frame(struct aspeed_video * video)430 static int aspeed_video_start_frame(struct aspeed_video *video)
431 {
432 	dma_addr_t addr;
433 	unsigned long flags;
434 	struct aspeed_video_buffer *buf;
435 	u32 seq_ctrl = aspeed_video_read(video, VE_SEQ_CTRL);
436 
437 	if (video->v4l2_input_status) {
438 		dev_dbg(video->dev, "No signal; don't start frame\n");
439 		return 0;
440 	}
441 
442 	if (!(seq_ctrl & VE_SEQ_CTRL_COMP_BUSY) ||
443 	    !(seq_ctrl & VE_SEQ_CTRL_CAP_BUSY)) {
444 		dev_dbg(video->dev, "Engine busy; don't start frame\n");
445 		return -EBUSY;
446 	}
447 
448 	spin_lock_irqsave(&video->lock, flags);
449 	buf = list_first_entry_or_null(&video->buffers,
450 				       struct aspeed_video_buffer, link);
451 	if (!buf) {
452 		spin_unlock_irqrestore(&video->lock, flags);
453 		dev_dbg(video->dev, "No buffers; don't start frame\n");
454 		return -EPROTO;
455 	}
456 
457 	set_bit(VIDEO_FRAME_INPRG, &video->flags);
458 	addr = vb2_dma_contig_plane_dma_addr(&buf->vb.vb2_buf, 0);
459 	spin_unlock_irqrestore(&video->lock, flags);
460 
461 	aspeed_video_write(video, VE_COMP_PROC_OFFSET, 0);
462 	aspeed_video_write(video, VE_COMP_OFFSET, 0);
463 	aspeed_video_write(video, VE_COMP_ADDR, addr);
464 
465 	aspeed_video_update(video, VE_INTERRUPT_CTRL, 0,
466 			    VE_INTERRUPT_COMP_COMPLETE);
467 
468 	aspeed_video_update(video, VE_SEQ_CTRL, 0,
469 			    VE_SEQ_CTRL_TRIG_CAPTURE | VE_SEQ_CTRL_TRIG_COMP);
470 
471 	return 0;
472 }
473 
aspeed_video_enable_mode_detect(struct aspeed_video * video)474 static void aspeed_video_enable_mode_detect(struct aspeed_video *video)
475 {
476 	/* Enable mode detect interrupts */
477 	aspeed_video_update(video, VE_INTERRUPT_CTRL, 0,
478 			    VE_INTERRUPT_MODE_DETECT);
479 
480 	/* Trigger mode detect */
481 	aspeed_video_update(video, VE_SEQ_CTRL, 0, VE_SEQ_CTRL_TRIG_MODE_DET);
482 }
483 
aspeed_video_off(struct aspeed_video * video)484 static void aspeed_video_off(struct aspeed_video *video)
485 {
486 	if (!test_bit(VIDEO_CLOCKS_ON, &video->flags))
487 		return;
488 
489 	/* Disable interrupts */
490 	aspeed_video_write(video, VE_INTERRUPT_CTRL, 0);
491 	aspeed_video_write(video, VE_INTERRUPT_STATUS, 0xffffffff);
492 
493 	/* Turn off the relevant clocks */
494 	clk_disable(video->vclk);
495 	clk_disable(video->eclk);
496 
497 	clear_bit(VIDEO_CLOCKS_ON, &video->flags);
498 }
499 
aspeed_video_on(struct aspeed_video * video)500 static void aspeed_video_on(struct aspeed_video *video)
501 {
502 	if (test_bit(VIDEO_CLOCKS_ON, &video->flags))
503 		return;
504 
505 	/* Turn on the relevant clocks */
506 	clk_enable(video->eclk);
507 	clk_enable(video->vclk);
508 
509 	set_bit(VIDEO_CLOCKS_ON, &video->flags);
510 }
511 
aspeed_video_bufs_done(struct aspeed_video * video,enum vb2_buffer_state state)512 static void aspeed_video_bufs_done(struct aspeed_video *video,
513 				   enum vb2_buffer_state state)
514 {
515 	unsigned long flags;
516 	struct aspeed_video_buffer *buf;
517 
518 	spin_lock_irqsave(&video->lock, flags);
519 	list_for_each_entry(buf, &video->buffers, link)
520 		vb2_buffer_done(&buf->vb.vb2_buf, state);
521 	INIT_LIST_HEAD(&video->buffers);
522 	spin_unlock_irqrestore(&video->lock, flags);
523 }
524 
aspeed_video_irq_res_change(struct aspeed_video * video,ulong delay)525 static void aspeed_video_irq_res_change(struct aspeed_video *video, ulong delay)
526 {
527 	dev_dbg(video->dev, "Resolution changed; resetting\n");
528 
529 	set_bit(VIDEO_RES_CHANGE, &video->flags);
530 	clear_bit(VIDEO_FRAME_INPRG, &video->flags);
531 
532 	aspeed_video_off(video);
533 	aspeed_video_bufs_done(video, VB2_BUF_STATE_ERROR);
534 
535 	schedule_delayed_work(&video->res_work, delay);
536 }
537 
aspeed_video_irq(int irq,void * arg)538 static irqreturn_t aspeed_video_irq(int irq, void *arg)
539 {
540 	struct aspeed_video *video = arg;
541 	u32 sts = aspeed_video_read(video, VE_INTERRUPT_STATUS);
542 
543 	/*
544 	 * Resolution changed or signal was lost; reset the engine and
545 	 * re-initialize
546 	 */
547 	if (sts & VE_INTERRUPT_MODE_DETECT_WD) {
548 		aspeed_video_irq_res_change(video, 0);
549 		return IRQ_HANDLED;
550 	}
551 
552 	if (sts & VE_INTERRUPT_MODE_DETECT) {
553 		if (test_bit(VIDEO_RES_DETECT, &video->flags)) {
554 			aspeed_video_update(video, VE_INTERRUPT_CTRL,
555 					    VE_INTERRUPT_MODE_DETECT, 0);
556 			aspeed_video_write(video, VE_INTERRUPT_STATUS,
557 					   VE_INTERRUPT_MODE_DETECT);
558 			sts &= ~VE_INTERRUPT_MODE_DETECT;
559 			set_bit(VIDEO_MODE_DETECT_DONE, &video->flags);
560 			wake_up_interruptible_all(&video->wait);
561 		} else {
562 			/*
563 			 * Signal acquired while NOT doing resolution
564 			 * detection; reset the engine and re-initialize
565 			 */
566 			aspeed_video_irq_res_change(video,
567 						    RESOLUTION_CHANGE_DELAY);
568 			return IRQ_HANDLED;
569 		}
570 	}
571 
572 	if (sts & VE_INTERRUPT_COMP_COMPLETE) {
573 		struct aspeed_video_buffer *buf;
574 		u32 frame_size = aspeed_video_read(video,
575 						   VE_OFFSET_COMP_STREAM);
576 
577 		spin_lock(&video->lock);
578 		clear_bit(VIDEO_FRAME_INPRG, &video->flags);
579 		buf = list_first_entry_or_null(&video->buffers,
580 					       struct aspeed_video_buffer,
581 					       link);
582 		if (buf) {
583 			vb2_set_plane_payload(&buf->vb.vb2_buf, 0, frame_size);
584 
585 			if (!list_is_last(&buf->link, &video->buffers)) {
586 				buf->vb.vb2_buf.timestamp = ktime_get_ns();
587 				buf->vb.sequence = video->sequence++;
588 				buf->vb.field = V4L2_FIELD_NONE;
589 				vb2_buffer_done(&buf->vb.vb2_buf,
590 						VB2_BUF_STATE_DONE);
591 				list_del(&buf->link);
592 			}
593 		}
594 		spin_unlock(&video->lock);
595 
596 		aspeed_video_update(video, VE_SEQ_CTRL,
597 				    VE_SEQ_CTRL_TRIG_CAPTURE |
598 				    VE_SEQ_CTRL_FORCE_IDLE |
599 				    VE_SEQ_CTRL_TRIG_COMP, 0);
600 		aspeed_video_update(video, VE_INTERRUPT_CTRL,
601 				    VE_INTERRUPT_COMP_COMPLETE, 0);
602 		aspeed_video_write(video, VE_INTERRUPT_STATUS,
603 				   VE_INTERRUPT_COMP_COMPLETE);
604 		sts &= ~VE_INTERRUPT_COMP_COMPLETE;
605 		if (test_bit(VIDEO_STREAMING, &video->flags) && buf)
606 			aspeed_video_start_frame(video);
607 	}
608 
609 	return sts ? IRQ_NONE : IRQ_HANDLED;
610 }
611 
aspeed_video_check_and_set_polarity(struct aspeed_video * video)612 static void aspeed_video_check_and_set_polarity(struct aspeed_video *video)
613 {
614 	int i;
615 	int hsync_counter = 0;
616 	int vsync_counter = 0;
617 	u32 sts;
618 
619 	for (i = 0; i < NUM_POLARITY_CHECKS; ++i) {
620 		sts = aspeed_video_read(video, VE_MODE_DETECT_STATUS);
621 		if (sts & VE_MODE_DETECT_STATUS_VSYNC)
622 			vsync_counter--;
623 		else
624 			vsync_counter++;
625 
626 		if (sts & VE_MODE_DETECT_STATUS_HSYNC)
627 			hsync_counter--;
628 		else
629 			hsync_counter++;
630 	}
631 
632 	if (hsync_counter < 0 || vsync_counter < 0) {
633 		u32 ctrl = 0;
634 
635 		if (hsync_counter < 0) {
636 			ctrl = VE_CTRL_HSYNC_POL;
637 			video->detected_timings.polarities &=
638 				~V4L2_DV_HSYNC_POS_POL;
639 		} else {
640 			video->detected_timings.polarities |=
641 				V4L2_DV_HSYNC_POS_POL;
642 		}
643 
644 		if (vsync_counter < 0) {
645 			ctrl = VE_CTRL_VSYNC_POL;
646 			video->detected_timings.polarities &=
647 				~V4L2_DV_VSYNC_POS_POL;
648 		} else {
649 			video->detected_timings.polarities |=
650 				V4L2_DV_VSYNC_POS_POL;
651 		}
652 
653 		if (ctrl)
654 			aspeed_video_update(video, VE_CTRL, 0, ctrl);
655 	}
656 }
657 
aspeed_video_alloc_buf(struct aspeed_video * video,struct aspeed_video_addr * addr,unsigned int size)658 static bool aspeed_video_alloc_buf(struct aspeed_video *video,
659 				   struct aspeed_video_addr *addr,
660 				   unsigned int size)
661 {
662 	addr->virt = dma_alloc_coherent(video->dev, size, &addr->dma,
663 					GFP_KERNEL);
664 	if (!addr->virt)
665 		return false;
666 
667 	addr->size = size;
668 	return true;
669 }
670 
aspeed_video_free_buf(struct aspeed_video * video,struct aspeed_video_addr * addr)671 static void aspeed_video_free_buf(struct aspeed_video *video,
672 				  struct aspeed_video_addr *addr)
673 {
674 	dma_free_coherent(video->dev, addr->size, addr->virt, addr->dma);
675 	addr->size = 0;
676 	addr->dma = 0ULL;
677 	addr->virt = NULL;
678 }
679 
680 /*
681  * Get the minimum HW-supported compression buffer size for the frame size.
682  * Assume worst-case JPEG compression size is 1/8 raw size. This should be
683  * plenty even for maximum quality; any worse and the engine will simply return
684  * incomplete JPEGs.
685  */
aspeed_video_calc_compressed_size(struct aspeed_video * video,unsigned int frame_size)686 static void aspeed_video_calc_compressed_size(struct aspeed_video *video,
687 					      unsigned int frame_size)
688 {
689 	int i, j;
690 	u32 compression_buffer_size_reg = 0;
691 	unsigned int size;
692 	const unsigned int num_compression_packets = 4;
693 	const unsigned int compression_packet_size = 1024;
694 	const unsigned int max_compressed_size = frame_size / 2; /* 4bpp / 8 */
695 
696 	video->max_compressed_size = UINT_MAX;
697 
698 	for (i = 0; i < 6; ++i) {
699 		for (j = 0; j < 8; ++j) {
700 			size = (num_compression_packets << i) *
701 				(compression_packet_size << j);
702 			if (size < max_compressed_size)
703 				continue;
704 
705 			if (size < video->max_compressed_size) {
706 				compression_buffer_size_reg = (i << 3) | j;
707 				video->max_compressed_size = size;
708 			}
709 		}
710 	}
711 
712 	aspeed_video_write(video, VE_STREAM_BUF_SIZE,
713 			   compression_buffer_size_reg);
714 
715 	dev_dbg(video->dev, "Max compressed size: %x\n",
716 		video->max_compressed_size);
717 }
718 
719 #define res_check(v) test_and_clear_bit(VIDEO_MODE_DETECT_DONE, &(v)->flags)
720 
aspeed_video_get_resolution(struct aspeed_video * video)721 static void aspeed_video_get_resolution(struct aspeed_video *video)
722 {
723 	bool invalid_resolution = true;
724 	int rc;
725 	int tries = 0;
726 	u32 mds;
727 	u32 src_lr_edge;
728 	u32 src_tb_edge;
729 	u32 sync;
730 	struct v4l2_bt_timings *det = &video->detected_timings;
731 
732 	det->width = MIN_WIDTH;
733 	det->height = MIN_HEIGHT;
734 	video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL;
735 
736 	do {
737 		if (tries) {
738 			set_current_state(TASK_INTERRUPTIBLE);
739 			if (schedule_timeout(INVALID_RESOLUTION_DELAY))
740 				return;
741 		}
742 
743 		set_bit(VIDEO_RES_DETECT, &video->flags);
744 		aspeed_video_enable_mode_detect(video);
745 
746 		rc = wait_event_interruptible_timeout(video->wait,
747 						      res_check(video),
748 						      MODE_DETECT_TIMEOUT);
749 		if (!rc) {
750 			dev_dbg(video->dev, "Timed out; first mode detect\n");
751 			clear_bit(VIDEO_RES_DETECT, &video->flags);
752 			return;
753 		}
754 
755 		/* Disable mode detect in order to re-trigger */
756 		aspeed_video_update(video, VE_SEQ_CTRL,
757 				    VE_SEQ_CTRL_TRIG_MODE_DET, 0);
758 
759 		aspeed_video_check_and_set_polarity(video);
760 
761 		aspeed_video_enable_mode_detect(video);
762 
763 		rc = wait_event_interruptible_timeout(video->wait,
764 						      res_check(video),
765 						      MODE_DETECT_TIMEOUT);
766 		clear_bit(VIDEO_RES_DETECT, &video->flags);
767 		if (!rc) {
768 			dev_dbg(video->dev, "Timed out; second mode detect\n");
769 			return;
770 		}
771 
772 		src_lr_edge = aspeed_video_read(video, VE_SRC_LR_EDGE_DET);
773 		src_tb_edge = aspeed_video_read(video, VE_SRC_TB_EDGE_DET);
774 		mds = aspeed_video_read(video, VE_MODE_DETECT_STATUS);
775 		sync = aspeed_video_read(video, VE_SYNC_STATUS);
776 
777 		video->frame_bottom = (src_tb_edge & VE_SRC_TB_EDGE_DET_BOT) >>
778 			VE_SRC_TB_EDGE_DET_BOT_SHF;
779 		video->frame_top = src_tb_edge & VE_SRC_TB_EDGE_DET_TOP;
780 		det->vfrontporch = video->frame_top;
781 		det->vbackporch = ((mds & VE_MODE_DETECT_V_LINES) >>
782 			VE_MODE_DETECT_V_LINES_SHF) - video->frame_bottom;
783 		det->vsync = (sync & VE_SYNC_STATUS_VSYNC) >>
784 			VE_SYNC_STATUS_VSYNC_SHF;
785 		if (video->frame_top > video->frame_bottom)
786 			continue;
787 
788 		video->frame_right = (src_lr_edge & VE_SRC_LR_EDGE_DET_RT) >>
789 			VE_SRC_LR_EDGE_DET_RT_SHF;
790 		video->frame_left = src_lr_edge & VE_SRC_LR_EDGE_DET_LEFT;
791 		det->hfrontporch = video->frame_left;
792 		det->hbackporch = (mds & VE_MODE_DETECT_H_PIXELS) -
793 			video->frame_right;
794 		det->hsync = sync & VE_SYNC_STATUS_HSYNC;
795 		if (video->frame_left > video->frame_right)
796 			continue;
797 
798 		invalid_resolution = false;
799 	} while (invalid_resolution && (tries++ < INVALID_RESOLUTION_RETRIES));
800 
801 	if (invalid_resolution) {
802 		dev_dbg(video->dev, "Invalid resolution detected\n");
803 		return;
804 	}
805 
806 	det->height = (video->frame_bottom - video->frame_top) + 1;
807 	det->width = (video->frame_right - video->frame_left) + 1;
808 	video->v4l2_input_status = 0;
809 
810 	/*
811 	 * Enable mode-detect watchdog, resolution-change watchdog and
812 	 * automatic compression after frame capture.
813 	 */
814 	aspeed_video_update(video, VE_INTERRUPT_CTRL, 0,
815 			    VE_INTERRUPT_MODE_DETECT_WD);
816 	aspeed_video_update(video, VE_SEQ_CTRL, 0,
817 			    VE_SEQ_CTRL_AUTO_COMP | VE_SEQ_CTRL_EN_WATCHDOG);
818 
819 	dev_dbg(video->dev, "Got resolution: %dx%d\n", det->width,
820 		det->height);
821 }
822 
aspeed_video_set_resolution(struct aspeed_video * video)823 static void aspeed_video_set_resolution(struct aspeed_video *video)
824 {
825 	struct v4l2_bt_timings *act = &video->active_timings;
826 	unsigned int size = act->width * act->height;
827 
828 	/* Set capture/compression frame sizes */
829 	aspeed_video_calc_compressed_size(video, size);
830 
831 	if (video->active_timings.width == 1680) {
832 		/*
833 		 * This is a workaround to fix a silicon bug on A1 and A2
834 		 * revisions. Since it doesn't break capturing operation of
835 		 * other revisions, use it for all revisions without checking
836 		 * the revision ID. It picked 1728 which is a very next
837 		 * 64-pixels aligned value to 1680 to minimize memory bandwidth
838 		 * and to get better access speed from video engine.
839 		 */
840 		aspeed_video_write(video, VE_CAP_WINDOW,
841 				   1728 << 16 | act->height);
842 		size += (1728 - 1680) * video->active_timings.height;
843 	} else {
844 		aspeed_video_write(video, VE_CAP_WINDOW,
845 				   act->width << 16 | act->height);
846 	}
847 	aspeed_video_write(video, VE_COMP_WINDOW,
848 			   act->width << 16 | act->height);
849 	aspeed_video_write(video, VE_SRC_SCANLINE_OFFSET, act->width * 4);
850 
851 	/* Don't use direct mode below 1024 x 768 (irqs don't fire) */
852 	if (size < DIRECT_FETCH_THRESHOLD) {
853 		aspeed_video_write(video, VE_TGS_0,
854 				   FIELD_PREP(VE_TGS_FIRST,
855 					      video->frame_left - 1) |
856 				   FIELD_PREP(VE_TGS_LAST,
857 					      video->frame_right));
858 		aspeed_video_write(video, VE_TGS_1,
859 				   FIELD_PREP(VE_TGS_FIRST, video->frame_top) |
860 				   FIELD_PREP(VE_TGS_LAST,
861 					      video->frame_bottom + 1));
862 		aspeed_video_update(video, VE_CTRL, 0, VE_CTRL_INT_DE);
863 	} else {
864 		aspeed_video_update(video, VE_CTRL, 0, VE_CTRL_DIRECT_FETCH);
865 	}
866 
867 	size *= 4;
868 
869 	if (size != video->srcs[0].size) {
870 		if (video->srcs[0].size)
871 			aspeed_video_free_buf(video, &video->srcs[0]);
872 		if (video->srcs[1].size)
873 			aspeed_video_free_buf(video, &video->srcs[1]);
874 
875 		if (!aspeed_video_alloc_buf(video, &video->srcs[0], size))
876 			goto err_mem;
877 		if (!aspeed_video_alloc_buf(video, &video->srcs[1], size))
878 			goto err_mem;
879 
880 		aspeed_video_write(video, VE_SRC0_ADDR, video->srcs[0].dma);
881 		aspeed_video_write(video, VE_SRC1_ADDR, video->srcs[1].dma);
882 	}
883 
884 	return;
885 
886 err_mem:
887 	dev_err(video->dev, "Failed to allocate source buffers\n");
888 
889 	if (video->srcs[0].size)
890 		aspeed_video_free_buf(video, &video->srcs[0]);
891 }
892 
aspeed_video_init_regs(struct aspeed_video * video)893 static void aspeed_video_init_regs(struct aspeed_video *video)
894 {
895 	u32 comp_ctrl = VE_COMP_CTRL_RSVD |
896 		FIELD_PREP(VE_COMP_CTRL_DCT_LUM, video->jpeg_quality) |
897 		FIELD_PREP(VE_COMP_CTRL_DCT_CHR, video->jpeg_quality | 0x10);
898 	u32 ctrl = VE_CTRL_AUTO_OR_CURSOR;
899 	u32 seq_ctrl = VE_SEQ_CTRL_JPEG_MODE;
900 
901 	if (video->frame_rate)
902 		ctrl |= FIELD_PREP(VE_CTRL_FRC, video->frame_rate);
903 
904 	if (video->yuv420)
905 		seq_ctrl |= VE_SEQ_CTRL_YUV420;
906 
907 	/* Unlock VE registers */
908 	aspeed_video_write(video, VE_PROTECTION_KEY, VE_PROTECTION_KEY_UNLOCK);
909 
910 	/* Disable interrupts */
911 	aspeed_video_write(video, VE_INTERRUPT_CTRL, 0);
912 	aspeed_video_write(video, VE_INTERRUPT_STATUS, 0xffffffff);
913 
914 	/* Clear the offset */
915 	aspeed_video_write(video, VE_COMP_PROC_OFFSET, 0);
916 	aspeed_video_write(video, VE_COMP_OFFSET, 0);
917 
918 	aspeed_video_write(video, VE_JPEG_ADDR, video->jpeg.dma);
919 
920 	/* Set control registers */
921 	aspeed_video_write(video, VE_SEQ_CTRL, seq_ctrl);
922 	aspeed_video_write(video, VE_CTRL, ctrl);
923 	aspeed_video_write(video, VE_COMP_CTRL, comp_ctrl);
924 
925 	/* Don't downscale */
926 	aspeed_video_write(video, VE_SCALING_FACTOR, 0x10001000);
927 	aspeed_video_write(video, VE_SCALING_FILTER0, 0x00200000);
928 	aspeed_video_write(video, VE_SCALING_FILTER1, 0x00200000);
929 	aspeed_video_write(video, VE_SCALING_FILTER2, 0x00200000);
930 	aspeed_video_write(video, VE_SCALING_FILTER3, 0x00200000);
931 
932 	/* Set mode detection defaults */
933 	aspeed_video_write(video, VE_MODE_DETECT, 0x22666500);
934 }
935 
aspeed_video_start(struct aspeed_video * video)936 static void aspeed_video_start(struct aspeed_video *video)
937 {
938 	aspeed_video_on(video);
939 
940 	aspeed_video_init_regs(video);
941 
942 	/* Resolution set to 640x480 if no signal found */
943 	aspeed_video_get_resolution(video);
944 
945 	/* Set timings since the device is being opened for the first time */
946 	video->active_timings = video->detected_timings;
947 	aspeed_video_set_resolution(video);
948 
949 	video->pix_fmt.width = video->active_timings.width;
950 	video->pix_fmt.height = video->active_timings.height;
951 	video->pix_fmt.sizeimage = video->max_compressed_size;
952 }
953 
aspeed_video_stop(struct aspeed_video * video)954 static void aspeed_video_stop(struct aspeed_video *video)
955 {
956 	set_bit(VIDEO_STOPPED, &video->flags);
957 	cancel_delayed_work_sync(&video->res_work);
958 
959 	aspeed_video_off(video);
960 
961 	if (video->srcs[0].size)
962 		aspeed_video_free_buf(video, &video->srcs[0]);
963 
964 	if (video->srcs[1].size)
965 		aspeed_video_free_buf(video, &video->srcs[1]);
966 
967 	video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL;
968 	video->flags = 0;
969 }
970 
aspeed_video_querycap(struct file * file,void * fh,struct v4l2_capability * cap)971 static int aspeed_video_querycap(struct file *file, void *fh,
972 				 struct v4l2_capability *cap)
973 {
974 	strscpy(cap->driver, DEVICE_NAME, sizeof(cap->driver));
975 	strscpy(cap->card, "Aspeed Video Engine", sizeof(cap->card));
976 	snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s",
977 		 DEVICE_NAME);
978 
979 	return 0;
980 }
981 
aspeed_video_enum_format(struct file * file,void * fh,struct v4l2_fmtdesc * f)982 static int aspeed_video_enum_format(struct file *file, void *fh,
983 				    struct v4l2_fmtdesc *f)
984 {
985 	if (f->index)
986 		return -EINVAL;
987 
988 	f->pixelformat = V4L2_PIX_FMT_JPEG;
989 
990 	return 0;
991 }
992 
aspeed_video_get_format(struct file * file,void * fh,struct v4l2_format * f)993 static int aspeed_video_get_format(struct file *file, void *fh,
994 				   struct v4l2_format *f)
995 {
996 	struct aspeed_video *video = video_drvdata(file);
997 
998 	f->fmt.pix = video->pix_fmt;
999 
1000 	return 0;
1001 }
1002 
aspeed_video_enum_input(struct file * file,void * fh,struct v4l2_input * inp)1003 static int aspeed_video_enum_input(struct file *file, void *fh,
1004 				   struct v4l2_input *inp)
1005 {
1006 	struct aspeed_video *video = video_drvdata(file);
1007 
1008 	if (inp->index)
1009 		return -EINVAL;
1010 
1011 	strscpy(inp->name, "Host VGA capture", sizeof(inp->name));
1012 	inp->type = V4L2_INPUT_TYPE_CAMERA;
1013 	inp->capabilities = V4L2_IN_CAP_DV_TIMINGS;
1014 	inp->status = video->v4l2_input_status;
1015 
1016 	return 0;
1017 }
1018 
aspeed_video_get_input(struct file * file,void * fh,unsigned int * i)1019 static int aspeed_video_get_input(struct file *file, void *fh, unsigned int *i)
1020 {
1021 	*i = 0;
1022 
1023 	return 0;
1024 }
1025 
aspeed_video_set_input(struct file * file,void * fh,unsigned int i)1026 static int aspeed_video_set_input(struct file *file, void *fh, unsigned int i)
1027 {
1028 	if (i)
1029 		return -EINVAL;
1030 
1031 	return 0;
1032 }
1033 
aspeed_video_get_parm(struct file * file,void * fh,struct v4l2_streamparm * a)1034 static int aspeed_video_get_parm(struct file *file, void *fh,
1035 				 struct v4l2_streamparm *a)
1036 {
1037 	struct aspeed_video *video = video_drvdata(file);
1038 
1039 	a->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
1040 	a->parm.capture.readbuffers = 3;
1041 	a->parm.capture.timeperframe.numerator = 1;
1042 	if (!video->frame_rate)
1043 		a->parm.capture.timeperframe.denominator = MAX_FRAME_RATE;
1044 	else
1045 		a->parm.capture.timeperframe.denominator = video->frame_rate;
1046 
1047 	return 0;
1048 }
1049 
aspeed_video_set_parm(struct file * file,void * fh,struct v4l2_streamparm * a)1050 static int aspeed_video_set_parm(struct file *file, void *fh,
1051 				 struct v4l2_streamparm *a)
1052 {
1053 	unsigned int frame_rate = 0;
1054 	struct aspeed_video *video = video_drvdata(file);
1055 
1056 	a->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
1057 	a->parm.capture.readbuffers = 3;
1058 
1059 	if (a->parm.capture.timeperframe.numerator)
1060 		frame_rate = a->parm.capture.timeperframe.denominator /
1061 			a->parm.capture.timeperframe.numerator;
1062 
1063 	if (!frame_rate || frame_rate > MAX_FRAME_RATE) {
1064 		frame_rate = 0;
1065 		a->parm.capture.timeperframe.denominator = MAX_FRAME_RATE;
1066 		a->parm.capture.timeperframe.numerator = 1;
1067 	}
1068 
1069 	if (video->frame_rate != frame_rate) {
1070 		video->frame_rate = frame_rate;
1071 		aspeed_video_update(video, VE_CTRL, VE_CTRL_FRC,
1072 				    FIELD_PREP(VE_CTRL_FRC, frame_rate));
1073 	}
1074 
1075 	return 0;
1076 }
1077 
aspeed_video_enum_framesizes(struct file * file,void * fh,struct v4l2_frmsizeenum * fsize)1078 static int aspeed_video_enum_framesizes(struct file *file, void *fh,
1079 					struct v4l2_frmsizeenum *fsize)
1080 {
1081 	struct aspeed_video *video = video_drvdata(file);
1082 
1083 	if (fsize->index)
1084 		return -EINVAL;
1085 
1086 	if (fsize->pixel_format != V4L2_PIX_FMT_JPEG)
1087 		return -EINVAL;
1088 
1089 	fsize->discrete.width = video->pix_fmt.width;
1090 	fsize->discrete.height = video->pix_fmt.height;
1091 	fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1092 
1093 	return 0;
1094 }
1095 
aspeed_video_enum_frameintervals(struct file * file,void * fh,struct v4l2_frmivalenum * fival)1096 static int aspeed_video_enum_frameintervals(struct file *file, void *fh,
1097 					    struct v4l2_frmivalenum *fival)
1098 {
1099 	struct aspeed_video *video = video_drvdata(file);
1100 
1101 	if (fival->index)
1102 		return -EINVAL;
1103 
1104 	if (fival->width != video->detected_timings.width ||
1105 	    fival->height != video->detected_timings.height)
1106 		return -EINVAL;
1107 
1108 	if (fival->pixel_format != V4L2_PIX_FMT_JPEG)
1109 		return -EINVAL;
1110 
1111 	fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS;
1112 
1113 	fival->stepwise.min.denominator = MAX_FRAME_RATE;
1114 	fival->stepwise.min.numerator = 1;
1115 	fival->stepwise.max.denominator = 1;
1116 	fival->stepwise.max.numerator = 1;
1117 	fival->stepwise.step = fival->stepwise.max;
1118 
1119 	return 0;
1120 }
1121 
aspeed_video_set_dv_timings(struct file * file,void * fh,struct v4l2_dv_timings * timings)1122 static int aspeed_video_set_dv_timings(struct file *file, void *fh,
1123 				       struct v4l2_dv_timings *timings)
1124 {
1125 	struct aspeed_video *video = video_drvdata(file);
1126 
1127 	if (timings->bt.width == video->active_timings.width &&
1128 	    timings->bt.height == video->active_timings.height)
1129 		return 0;
1130 
1131 	if (vb2_is_busy(&video->queue))
1132 		return -EBUSY;
1133 
1134 	video->active_timings = timings->bt;
1135 
1136 	aspeed_video_set_resolution(video);
1137 
1138 	video->pix_fmt.width = timings->bt.width;
1139 	video->pix_fmt.height = timings->bt.height;
1140 	video->pix_fmt.sizeimage = video->max_compressed_size;
1141 
1142 	timings->type = V4L2_DV_BT_656_1120;
1143 
1144 	return 0;
1145 }
1146 
aspeed_video_get_dv_timings(struct file * file,void * fh,struct v4l2_dv_timings * timings)1147 static int aspeed_video_get_dv_timings(struct file *file, void *fh,
1148 				       struct v4l2_dv_timings *timings)
1149 {
1150 	struct aspeed_video *video = video_drvdata(file);
1151 
1152 	timings->type = V4L2_DV_BT_656_1120;
1153 	timings->bt = video->active_timings;
1154 
1155 	return 0;
1156 }
1157 
aspeed_video_query_dv_timings(struct file * file,void * fh,struct v4l2_dv_timings * timings)1158 static int aspeed_video_query_dv_timings(struct file *file, void *fh,
1159 					 struct v4l2_dv_timings *timings)
1160 {
1161 	int rc;
1162 	struct aspeed_video *video = video_drvdata(file);
1163 
1164 	/*
1165 	 * This blocks only if the driver is currently in the process of
1166 	 * detecting a new resolution; in the event of no signal or timeout
1167 	 * this function is woken up.
1168 	 */
1169 	if (file->f_flags & O_NONBLOCK) {
1170 		if (test_bit(VIDEO_RES_CHANGE, &video->flags))
1171 			return -EAGAIN;
1172 	} else {
1173 		rc = wait_event_interruptible(video->wait,
1174 					      !test_bit(VIDEO_RES_CHANGE,
1175 							&video->flags));
1176 		if (rc)
1177 			return -EINTR;
1178 	}
1179 
1180 	timings->type = V4L2_DV_BT_656_1120;
1181 	timings->bt = video->detected_timings;
1182 
1183 	return video->v4l2_input_status ? -ENOLINK : 0;
1184 }
1185 
aspeed_video_enum_dv_timings(struct file * file,void * fh,struct v4l2_enum_dv_timings * timings)1186 static int aspeed_video_enum_dv_timings(struct file *file, void *fh,
1187 					struct v4l2_enum_dv_timings *timings)
1188 {
1189 	return v4l2_enum_dv_timings_cap(timings, &aspeed_video_timings_cap,
1190 					NULL, NULL);
1191 }
1192 
aspeed_video_dv_timings_cap(struct file * file,void * fh,struct v4l2_dv_timings_cap * cap)1193 static int aspeed_video_dv_timings_cap(struct file *file, void *fh,
1194 				       struct v4l2_dv_timings_cap *cap)
1195 {
1196 	*cap = aspeed_video_timings_cap;
1197 
1198 	return 0;
1199 }
1200 
aspeed_video_sub_event(struct v4l2_fh * fh,const struct v4l2_event_subscription * sub)1201 static int aspeed_video_sub_event(struct v4l2_fh *fh,
1202 				  const struct v4l2_event_subscription *sub)
1203 {
1204 	switch (sub->type) {
1205 	case V4L2_EVENT_SOURCE_CHANGE:
1206 		return v4l2_src_change_event_subscribe(fh, sub);
1207 	}
1208 
1209 	return v4l2_ctrl_subscribe_event(fh, sub);
1210 }
1211 
1212 static const struct v4l2_ioctl_ops aspeed_video_ioctl_ops = {
1213 	.vidioc_querycap = aspeed_video_querycap,
1214 
1215 	.vidioc_enum_fmt_vid_cap = aspeed_video_enum_format,
1216 	.vidioc_g_fmt_vid_cap = aspeed_video_get_format,
1217 	.vidioc_s_fmt_vid_cap = aspeed_video_get_format,
1218 	.vidioc_try_fmt_vid_cap = aspeed_video_get_format,
1219 
1220 	.vidioc_reqbufs = vb2_ioctl_reqbufs,
1221 	.vidioc_querybuf = vb2_ioctl_querybuf,
1222 	.vidioc_qbuf = vb2_ioctl_qbuf,
1223 	.vidioc_expbuf = vb2_ioctl_expbuf,
1224 	.vidioc_dqbuf = vb2_ioctl_dqbuf,
1225 	.vidioc_create_bufs = vb2_ioctl_create_bufs,
1226 	.vidioc_prepare_buf = vb2_ioctl_prepare_buf,
1227 	.vidioc_streamon = vb2_ioctl_streamon,
1228 	.vidioc_streamoff = vb2_ioctl_streamoff,
1229 
1230 	.vidioc_enum_input = aspeed_video_enum_input,
1231 	.vidioc_g_input = aspeed_video_get_input,
1232 	.vidioc_s_input = aspeed_video_set_input,
1233 
1234 	.vidioc_g_parm = aspeed_video_get_parm,
1235 	.vidioc_s_parm = aspeed_video_set_parm,
1236 	.vidioc_enum_framesizes = aspeed_video_enum_framesizes,
1237 	.vidioc_enum_frameintervals = aspeed_video_enum_frameintervals,
1238 
1239 	.vidioc_s_dv_timings = aspeed_video_set_dv_timings,
1240 	.vidioc_g_dv_timings = aspeed_video_get_dv_timings,
1241 	.vidioc_query_dv_timings = aspeed_video_query_dv_timings,
1242 	.vidioc_enum_dv_timings = aspeed_video_enum_dv_timings,
1243 	.vidioc_dv_timings_cap = aspeed_video_dv_timings_cap,
1244 
1245 	.vidioc_subscribe_event = aspeed_video_sub_event,
1246 	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1247 };
1248 
aspeed_video_update_jpeg_quality(struct aspeed_video * video)1249 static void aspeed_video_update_jpeg_quality(struct aspeed_video *video)
1250 {
1251 	u32 comp_ctrl = FIELD_PREP(VE_COMP_CTRL_DCT_LUM, video->jpeg_quality) |
1252 		FIELD_PREP(VE_COMP_CTRL_DCT_CHR, video->jpeg_quality | 0x10);
1253 
1254 	aspeed_video_update(video, VE_COMP_CTRL,
1255 			    VE_COMP_CTRL_DCT_LUM | VE_COMP_CTRL_DCT_CHR,
1256 			    comp_ctrl);
1257 }
1258 
aspeed_video_update_subsampling(struct aspeed_video * video)1259 static void aspeed_video_update_subsampling(struct aspeed_video *video)
1260 {
1261 	if (video->jpeg.virt)
1262 		aspeed_video_init_jpeg_table(video->jpeg.virt, video->yuv420);
1263 
1264 	if (video->yuv420)
1265 		aspeed_video_update(video, VE_SEQ_CTRL, 0, VE_SEQ_CTRL_YUV420);
1266 	else
1267 		aspeed_video_update(video, VE_SEQ_CTRL, VE_SEQ_CTRL_YUV420, 0);
1268 }
1269 
aspeed_video_set_ctrl(struct v4l2_ctrl * ctrl)1270 static int aspeed_video_set_ctrl(struct v4l2_ctrl *ctrl)
1271 {
1272 	struct aspeed_video *video = container_of(ctrl->handler,
1273 						  struct aspeed_video,
1274 						  ctrl_handler);
1275 
1276 	switch (ctrl->id) {
1277 	case V4L2_CID_JPEG_COMPRESSION_QUALITY:
1278 		video->jpeg_quality = ctrl->val;
1279 		aspeed_video_update_jpeg_quality(video);
1280 		break;
1281 	case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
1282 		if (ctrl->val == V4L2_JPEG_CHROMA_SUBSAMPLING_420) {
1283 			video->yuv420 = true;
1284 			aspeed_video_update_subsampling(video);
1285 		} else {
1286 			video->yuv420 = false;
1287 			aspeed_video_update_subsampling(video);
1288 		}
1289 		break;
1290 	default:
1291 		return -EINVAL;
1292 	}
1293 
1294 	return 0;
1295 }
1296 
1297 static const struct v4l2_ctrl_ops aspeed_video_ctrl_ops = {
1298 	.s_ctrl = aspeed_video_set_ctrl,
1299 };
1300 
aspeed_video_resolution_work(struct work_struct * work)1301 static void aspeed_video_resolution_work(struct work_struct *work)
1302 {
1303 	struct delayed_work *dwork = to_delayed_work(work);
1304 	struct aspeed_video *video = container_of(dwork, struct aspeed_video,
1305 						  res_work);
1306 	u32 input_status = video->v4l2_input_status;
1307 
1308 	aspeed_video_on(video);
1309 
1310 	/* Exit early in case no clients remain */
1311 	if (test_bit(VIDEO_STOPPED, &video->flags))
1312 		goto done;
1313 
1314 	aspeed_video_init_regs(video);
1315 
1316 	aspeed_video_get_resolution(video);
1317 
1318 	if (video->detected_timings.width != video->active_timings.width ||
1319 	    video->detected_timings.height != video->active_timings.height ||
1320 	    input_status != video->v4l2_input_status) {
1321 		static const struct v4l2_event ev = {
1322 			.type = V4L2_EVENT_SOURCE_CHANGE,
1323 			.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
1324 		};
1325 
1326 		v4l2_event_queue(&video->vdev, &ev);
1327 	} else if (test_bit(VIDEO_STREAMING, &video->flags)) {
1328 		/* No resolution change so just restart streaming */
1329 		aspeed_video_start_frame(video);
1330 	}
1331 
1332 done:
1333 	clear_bit(VIDEO_RES_CHANGE, &video->flags);
1334 	wake_up_interruptible_all(&video->wait);
1335 }
1336 
aspeed_video_open(struct file * file)1337 static int aspeed_video_open(struct file *file)
1338 {
1339 	int rc;
1340 	struct aspeed_video *video = video_drvdata(file);
1341 
1342 	mutex_lock(&video->video_lock);
1343 
1344 	rc = v4l2_fh_open(file);
1345 	if (rc) {
1346 		mutex_unlock(&video->video_lock);
1347 		return rc;
1348 	}
1349 
1350 	if (v4l2_fh_is_singular_file(file))
1351 		aspeed_video_start(video);
1352 
1353 	mutex_unlock(&video->video_lock);
1354 
1355 	return 0;
1356 }
1357 
aspeed_video_release(struct file * file)1358 static int aspeed_video_release(struct file *file)
1359 {
1360 	int rc;
1361 	struct aspeed_video *video = video_drvdata(file);
1362 
1363 	mutex_lock(&video->video_lock);
1364 
1365 	if (v4l2_fh_is_singular_file(file))
1366 		aspeed_video_stop(video);
1367 
1368 	rc = _vb2_fop_release(file, NULL);
1369 
1370 	mutex_unlock(&video->video_lock);
1371 
1372 	return rc;
1373 }
1374 
1375 static const struct v4l2_file_operations aspeed_video_v4l2_fops = {
1376 	.owner = THIS_MODULE,
1377 	.read = vb2_fop_read,
1378 	.poll = vb2_fop_poll,
1379 	.unlocked_ioctl = video_ioctl2,
1380 	.mmap = vb2_fop_mmap,
1381 	.open = aspeed_video_open,
1382 	.release = aspeed_video_release,
1383 };
1384 
aspeed_video_queue_setup(struct vb2_queue * q,unsigned int * num_buffers,unsigned int * num_planes,unsigned int sizes[],struct device * alloc_devs[])1385 static int aspeed_video_queue_setup(struct vb2_queue *q,
1386 				    unsigned int *num_buffers,
1387 				    unsigned int *num_planes,
1388 				    unsigned int sizes[],
1389 				    struct device *alloc_devs[])
1390 {
1391 	struct aspeed_video *video = vb2_get_drv_priv(q);
1392 
1393 	if (*num_planes) {
1394 		if (sizes[0] < video->max_compressed_size)
1395 			return -EINVAL;
1396 
1397 		return 0;
1398 	}
1399 
1400 	*num_planes = 1;
1401 	sizes[0] = video->max_compressed_size;
1402 
1403 	return 0;
1404 }
1405 
aspeed_video_buf_prepare(struct vb2_buffer * vb)1406 static int aspeed_video_buf_prepare(struct vb2_buffer *vb)
1407 {
1408 	struct aspeed_video *video = vb2_get_drv_priv(vb->vb2_queue);
1409 
1410 	if (vb2_plane_size(vb, 0) < video->max_compressed_size)
1411 		return -EINVAL;
1412 
1413 	return 0;
1414 }
1415 
aspeed_video_start_streaming(struct vb2_queue * q,unsigned int count)1416 static int aspeed_video_start_streaming(struct vb2_queue *q,
1417 					unsigned int count)
1418 {
1419 	int rc;
1420 	struct aspeed_video *video = vb2_get_drv_priv(q);
1421 
1422 	video->sequence = 0;
1423 
1424 	rc = aspeed_video_start_frame(video);
1425 	if (rc) {
1426 		aspeed_video_bufs_done(video, VB2_BUF_STATE_QUEUED);
1427 		return rc;
1428 	}
1429 
1430 	set_bit(VIDEO_STREAMING, &video->flags);
1431 	return 0;
1432 }
1433 
aspeed_video_stop_streaming(struct vb2_queue * q)1434 static void aspeed_video_stop_streaming(struct vb2_queue *q)
1435 {
1436 	int rc;
1437 	struct aspeed_video *video = vb2_get_drv_priv(q);
1438 
1439 	clear_bit(VIDEO_STREAMING, &video->flags);
1440 
1441 	rc = wait_event_timeout(video->wait,
1442 				!test_bit(VIDEO_FRAME_INPRG, &video->flags),
1443 				STOP_TIMEOUT);
1444 	if (!rc) {
1445 		dev_dbg(video->dev, "Timed out when stopping streaming\n");
1446 
1447 		/*
1448 		 * Need to force stop any DMA and try and get HW into a good
1449 		 * state for future calls to start streaming again.
1450 		 */
1451 		aspeed_video_off(video);
1452 		aspeed_video_on(video);
1453 
1454 		aspeed_video_init_regs(video);
1455 
1456 		aspeed_video_get_resolution(video);
1457 	}
1458 
1459 	aspeed_video_bufs_done(video, VB2_BUF_STATE_ERROR);
1460 }
1461 
aspeed_video_buf_queue(struct vb2_buffer * vb)1462 static void aspeed_video_buf_queue(struct vb2_buffer *vb)
1463 {
1464 	bool empty;
1465 	struct aspeed_video *video = vb2_get_drv_priv(vb->vb2_queue);
1466 	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1467 	struct aspeed_video_buffer *avb = to_aspeed_video_buffer(vbuf);
1468 	unsigned long flags;
1469 
1470 	spin_lock_irqsave(&video->lock, flags);
1471 	empty = list_empty(&video->buffers);
1472 	list_add_tail(&avb->link, &video->buffers);
1473 	spin_unlock_irqrestore(&video->lock, flags);
1474 
1475 	if (test_bit(VIDEO_STREAMING, &video->flags) &&
1476 	    !test_bit(VIDEO_FRAME_INPRG, &video->flags) && empty)
1477 		aspeed_video_start_frame(video);
1478 }
1479 
1480 static const struct vb2_ops aspeed_video_vb2_ops = {
1481 	.queue_setup = aspeed_video_queue_setup,
1482 	.wait_prepare = vb2_ops_wait_prepare,
1483 	.wait_finish = vb2_ops_wait_finish,
1484 	.buf_prepare = aspeed_video_buf_prepare,
1485 	.start_streaming = aspeed_video_start_streaming,
1486 	.stop_streaming = aspeed_video_stop_streaming,
1487 	.buf_queue =  aspeed_video_buf_queue,
1488 };
1489 
aspeed_video_setup_video(struct aspeed_video * video)1490 static int aspeed_video_setup_video(struct aspeed_video *video)
1491 {
1492 	const u64 mask = ~(BIT(V4L2_JPEG_CHROMA_SUBSAMPLING_444) |
1493 			   BIT(V4L2_JPEG_CHROMA_SUBSAMPLING_420));
1494 	struct v4l2_device *v4l2_dev = &video->v4l2_dev;
1495 	struct vb2_queue *vbq = &video->queue;
1496 	struct video_device *vdev = &video->vdev;
1497 	int rc;
1498 
1499 	video->pix_fmt.pixelformat = V4L2_PIX_FMT_JPEG;
1500 	video->pix_fmt.field = V4L2_FIELD_NONE;
1501 	video->pix_fmt.colorspace = V4L2_COLORSPACE_SRGB;
1502 	video->pix_fmt.quantization = V4L2_QUANTIZATION_FULL_RANGE;
1503 	video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL;
1504 
1505 	rc = v4l2_device_register(video->dev, v4l2_dev);
1506 	if (rc) {
1507 		dev_err(video->dev, "Failed to register v4l2 device\n");
1508 		return rc;
1509 	}
1510 
1511 	v4l2_ctrl_handler_init(&video->ctrl_handler, 2);
1512 	v4l2_ctrl_new_std(&video->ctrl_handler, &aspeed_video_ctrl_ops,
1513 			  V4L2_CID_JPEG_COMPRESSION_QUALITY, 0,
1514 			  ASPEED_VIDEO_JPEG_NUM_QUALITIES - 1, 1, 0);
1515 	v4l2_ctrl_new_std_menu(&video->ctrl_handler, &aspeed_video_ctrl_ops,
1516 			       V4L2_CID_JPEG_CHROMA_SUBSAMPLING,
1517 			       V4L2_JPEG_CHROMA_SUBSAMPLING_420, mask,
1518 			       V4L2_JPEG_CHROMA_SUBSAMPLING_444);
1519 
1520 	if (video->ctrl_handler.error) {
1521 		v4l2_ctrl_handler_free(&video->ctrl_handler);
1522 		v4l2_device_unregister(v4l2_dev);
1523 
1524 		dev_err(video->dev, "Failed to init controls: %d\n",
1525 			video->ctrl_handler.error);
1526 		return rc;
1527 	}
1528 
1529 	v4l2_dev->ctrl_handler = &video->ctrl_handler;
1530 
1531 	vbq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1532 	vbq->io_modes = VB2_MMAP | VB2_READ | VB2_DMABUF;
1533 	vbq->dev = v4l2_dev->dev;
1534 	vbq->lock = &video->video_lock;
1535 	vbq->ops = &aspeed_video_vb2_ops;
1536 	vbq->mem_ops = &vb2_dma_contig_memops;
1537 	vbq->drv_priv = video;
1538 	vbq->buf_struct_size = sizeof(struct aspeed_video_buffer);
1539 	vbq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1540 	vbq->min_buffers_needed = 3;
1541 
1542 	rc = vb2_queue_init(vbq);
1543 	if (rc) {
1544 		v4l2_ctrl_handler_free(&video->ctrl_handler);
1545 		v4l2_device_unregister(v4l2_dev);
1546 
1547 		dev_err(video->dev, "Failed to init vb2 queue\n");
1548 		return rc;
1549 	}
1550 
1551 	vdev->queue = vbq;
1552 	vdev->fops = &aspeed_video_v4l2_fops;
1553 	vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
1554 		V4L2_CAP_STREAMING;
1555 	vdev->v4l2_dev = v4l2_dev;
1556 	strscpy(vdev->name, DEVICE_NAME, sizeof(vdev->name));
1557 	vdev->vfl_type = VFL_TYPE_GRABBER;
1558 	vdev->vfl_dir = VFL_DIR_RX;
1559 	vdev->release = video_device_release_empty;
1560 	vdev->ioctl_ops = &aspeed_video_ioctl_ops;
1561 	vdev->lock = &video->video_lock;
1562 
1563 	video_set_drvdata(vdev, video);
1564 	rc = video_register_device(vdev, VFL_TYPE_GRABBER, 0);
1565 	if (rc) {
1566 		vb2_queue_release(vbq);
1567 		v4l2_ctrl_handler_free(&video->ctrl_handler);
1568 		v4l2_device_unregister(v4l2_dev);
1569 
1570 		dev_err(video->dev, "Failed to register video device\n");
1571 		return rc;
1572 	}
1573 
1574 	return 0;
1575 }
1576 
aspeed_video_init(struct aspeed_video * video)1577 static int aspeed_video_init(struct aspeed_video *video)
1578 {
1579 	int irq;
1580 	int rc;
1581 	struct device *dev = video->dev;
1582 
1583 	irq = irq_of_parse_and_map(dev->of_node, 0);
1584 	if (!irq) {
1585 		dev_err(dev, "Unable to find IRQ\n");
1586 		return -ENODEV;
1587 	}
1588 
1589 	rc = devm_request_threaded_irq(dev, irq, NULL, aspeed_video_irq,
1590 				       IRQF_ONESHOT, DEVICE_NAME, video);
1591 	if (rc < 0) {
1592 		dev_err(dev, "Unable to request IRQ %d\n", irq);
1593 		return rc;
1594 	}
1595 
1596 	video->eclk = devm_clk_get(dev, "eclk");
1597 	if (IS_ERR(video->eclk)) {
1598 		dev_err(dev, "Unable to get ECLK\n");
1599 		return PTR_ERR(video->eclk);
1600 	}
1601 
1602 	rc = clk_prepare(video->eclk);
1603 	if (rc)
1604 		return rc;
1605 
1606 	video->vclk = devm_clk_get(dev, "vclk");
1607 	if (IS_ERR(video->vclk)) {
1608 		dev_err(dev, "Unable to get VCLK\n");
1609 		rc = PTR_ERR(video->vclk);
1610 		goto err_unprepare_eclk;
1611 	}
1612 
1613 	rc = clk_prepare(video->vclk);
1614 	if (rc)
1615 		goto err_unprepare_eclk;
1616 
1617 	of_reserved_mem_device_init(dev);
1618 
1619 	rc = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
1620 	if (rc) {
1621 		dev_err(dev, "Failed to set DMA mask\n");
1622 		goto err_release_reserved_mem;
1623 	}
1624 
1625 	if (!aspeed_video_alloc_buf(video, &video->jpeg,
1626 				    VE_JPEG_HEADER_SIZE)) {
1627 		dev_err(dev, "Failed to allocate DMA for JPEG header\n");
1628 		rc = -ENOMEM;
1629 		goto err_release_reserved_mem;
1630 	}
1631 
1632 	aspeed_video_init_jpeg_table(video->jpeg.virt, video->yuv420);
1633 
1634 	return 0;
1635 
1636 err_release_reserved_mem:
1637 	of_reserved_mem_device_release(dev);
1638 	clk_unprepare(video->vclk);
1639 err_unprepare_eclk:
1640 	clk_unprepare(video->eclk);
1641 
1642 	return rc;
1643 }
1644 
aspeed_video_probe(struct platform_device * pdev)1645 static int aspeed_video_probe(struct platform_device *pdev)
1646 {
1647 	int rc;
1648 	struct resource *res;
1649 	struct aspeed_video *video = kzalloc(sizeof(*video), GFP_KERNEL);
1650 
1651 	if (!video)
1652 		return -ENOMEM;
1653 
1654 	video->frame_rate = 30;
1655 	video->dev = &pdev->dev;
1656 	spin_lock_init(&video->lock);
1657 	mutex_init(&video->video_lock);
1658 	init_waitqueue_head(&video->wait);
1659 	INIT_DELAYED_WORK(&video->res_work, aspeed_video_resolution_work);
1660 	INIT_LIST_HEAD(&video->buffers);
1661 
1662 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1663 
1664 	video->base = devm_ioremap_resource(video->dev, res);
1665 
1666 	if (IS_ERR(video->base))
1667 		return PTR_ERR(video->base);
1668 
1669 	rc = aspeed_video_init(video);
1670 	if (rc)
1671 		return rc;
1672 
1673 	rc = aspeed_video_setup_video(video);
1674 	if (rc)
1675 		return rc;
1676 
1677 	return 0;
1678 }
1679 
aspeed_video_remove(struct platform_device * pdev)1680 static int aspeed_video_remove(struct platform_device *pdev)
1681 {
1682 	struct device *dev = &pdev->dev;
1683 	struct v4l2_device *v4l2_dev = dev_get_drvdata(dev);
1684 	struct aspeed_video *video = to_aspeed_video(v4l2_dev);
1685 
1686 	aspeed_video_off(video);
1687 
1688 	clk_unprepare(video->vclk);
1689 	clk_unprepare(video->eclk);
1690 
1691 	video_unregister_device(&video->vdev);
1692 
1693 	vb2_queue_release(&video->queue);
1694 
1695 	v4l2_ctrl_handler_free(&video->ctrl_handler);
1696 
1697 	v4l2_device_unregister(v4l2_dev);
1698 
1699 	dma_free_coherent(video->dev, VE_JPEG_HEADER_SIZE, video->jpeg.virt,
1700 			  video->jpeg.dma);
1701 
1702 	of_reserved_mem_device_release(dev);
1703 
1704 	return 0;
1705 }
1706 
1707 static const struct of_device_id aspeed_video_of_match[] = {
1708 	{ .compatible = "aspeed,ast2400-video-engine" },
1709 	{ .compatible = "aspeed,ast2500-video-engine" },
1710 	{}
1711 };
1712 MODULE_DEVICE_TABLE(of, aspeed_video_of_match);
1713 
1714 static struct platform_driver aspeed_video_driver = {
1715 	.driver = {
1716 		.name = DEVICE_NAME,
1717 		.of_match_table = aspeed_video_of_match,
1718 	},
1719 	.probe = aspeed_video_probe,
1720 	.remove = aspeed_video_remove,
1721 };
1722 
1723 module_platform_driver(aspeed_video_driver);
1724 
1725 MODULE_DESCRIPTION("ASPEED Video Engine Driver");
1726 MODULE_AUTHOR("Eddie James");
1727 MODULE_LICENSE("GPL v2");
1728