xref: /linux/drivers/media/platform/aspeed/aspeed-video.c (revision 0526b56cbc3c489642bd6a5fe4b718dea7ef0ee8)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 // Copyright 2020 IBM Corp.
3 // Copyright (c) 2019-2020 Intel Corporation
4 
5 #include <linux/atomic.h>
6 #include <linux/bitfield.h>
7 #include <linux/clk.h>
8 #include <linux/delay.h>
9 #include <linux/device.h>
10 #include <linux/dma-mapping.h>
11 #include <linux/interrupt.h>
12 #include <linux/jiffies.h>
13 #include <linux/module.h>
14 #include <linux/mutex.h>
15 #include <linux/of.h>
16 #include <linux/of_device.h>
17 #include <linux/of_irq.h>
18 #include <linux/of_reserved_mem.h>
19 #include <linux/platform_device.h>
20 #include <linux/sched.h>
21 #include <linux/spinlock.h>
22 #include <linux/string.h>
23 #include <linux/v4l2-controls.h>
24 #include <linux/videodev2.h>
25 #include <linux/wait.h>
26 #include <linux/workqueue.h>
27 #include <linux/debugfs.h>
28 #include <linux/ktime.h>
29 #include <media/v4l2-ctrls.h>
30 #include <media/v4l2-dev.h>
31 #include <media/v4l2-device.h>
32 #include <media/v4l2-dv-timings.h>
33 #include <media/v4l2-event.h>
34 #include <media/v4l2-ioctl.h>
35 #include <media/videobuf2-dma-contig.h>
36 #include <uapi/linux/aspeed-video.h>
37 
38 #define ASPEED_VIDEO_V4L2_MIN_BUF_REQ 3
39 
40 #define DEVICE_NAME			"aspeed-video"
41 
42 #define ASPEED_VIDEO_JPEG_NUM_QUALITIES	12
43 #define ASPEED_VIDEO_JPEG_HEADER_SIZE	10
44 #define ASPEED_VIDEO_JPEG_QUANT_SIZE	116
45 #define ASPEED_VIDEO_JPEG_DCT_SIZE	34
46 
47 #define MAX_FRAME_RATE			60
48 #define MAX_HEIGHT			1200
49 #define MAX_WIDTH			1920
50 #define MIN_HEIGHT			480
51 #define MIN_WIDTH			640
52 
53 #define NUM_POLARITY_CHECKS		10
54 #define INVALID_RESOLUTION_RETRIES	2
55 #define INVALID_RESOLUTION_DELAY	msecs_to_jiffies(250)
56 #define RESOLUTION_CHANGE_DELAY		msecs_to_jiffies(500)
57 #define MODE_DETECT_TIMEOUT		msecs_to_jiffies(500)
58 #define STOP_TIMEOUT			msecs_to_jiffies(1000)
59 #define DIRECT_FETCH_THRESHOLD		0x0c0000 /* 1024 * 768 */
60 
61 #define VE_MAX_SRC_BUFFER_SIZE		0x8ca000 /* 1920 * 1200, 32bpp */
62 #define VE_JPEG_HEADER_SIZE		0x006000 /* 512 * 12 * 4 */
63 #define VE_BCD_BUFF_SIZE		0x9000 /* (1920/8) * (1200/8) */
64 
65 #define VE_PROTECTION_KEY		0x000
66 #define  VE_PROTECTION_KEY_UNLOCK	0x1a038aa8
67 
68 #define VE_SEQ_CTRL			0x004
69 #define  VE_SEQ_CTRL_TRIG_MODE_DET	BIT(0)
70 #define  VE_SEQ_CTRL_TRIG_CAPTURE	BIT(1)
71 #define  VE_SEQ_CTRL_FORCE_IDLE		BIT(2)
72 #define  VE_SEQ_CTRL_MULT_FRAME		BIT(3)
73 #define  VE_SEQ_CTRL_TRIG_COMP		BIT(4)
74 #define  VE_SEQ_CTRL_AUTO_COMP		BIT(5)
75 #define  VE_SEQ_CTRL_EN_WATCHDOG	BIT(7)
76 #define  VE_SEQ_CTRL_YUV420		BIT(10)
77 #define  VE_SEQ_CTRL_COMP_FMT		GENMASK(11, 10)
78 #define  VE_SEQ_CTRL_HALT		BIT(12)
79 #define  VE_SEQ_CTRL_EN_WATCHDOG_COMP	BIT(14)
80 #define  VE_SEQ_CTRL_TRIG_JPG		BIT(15)
81 #define  VE_SEQ_CTRL_CAP_BUSY		BIT(16)
82 #define  VE_SEQ_CTRL_COMP_BUSY		BIT(18)
83 
84 #define AST2500_VE_SEQ_CTRL_JPEG_MODE	BIT(13)
85 #define AST2400_VE_SEQ_CTRL_JPEG_MODE	BIT(8)
86 
87 #define VE_CTRL				0x008
88 #define  VE_CTRL_HSYNC_POL		BIT(0)
89 #define  VE_CTRL_VSYNC_POL		BIT(1)
90 #define  VE_CTRL_SOURCE			BIT(2)
91 #define  VE_CTRL_INT_DE			BIT(4)
92 #define  VE_CTRL_DIRECT_FETCH		BIT(5)
93 #define  VE_CTRL_CAPTURE_FMT		GENMASK(7, 6)
94 #define  VE_CTRL_AUTO_OR_CURSOR		BIT(8)
95 #define  VE_CTRL_CLK_INVERSE		BIT(11)
96 #define  VE_CTRL_CLK_DELAY		GENMASK(11, 9)
97 #define  VE_CTRL_INTERLACE		BIT(14)
98 #define  VE_CTRL_HSYNC_POL_CTRL		BIT(15)
99 #define  VE_CTRL_FRC			GENMASK(23, 16)
100 
101 #define VE_TGS_0			0x00c
102 #define VE_TGS_1			0x010
103 #define  VE_TGS_FIRST			GENMASK(28, 16)
104 #define  VE_TGS_LAST			GENMASK(12, 0)
105 
106 #define VE_SCALING_FACTOR		0x014
107 #define VE_SCALING_FILTER0		0x018
108 #define VE_SCALING_FILTER1		0x01c
109 #define VE_SCALING_FILTER2		0x020
110 #define VE_SCALING_FILTER3		0x024
111 
112 #define VE_BCD_CTRL			0x02C
113 #define  VE_BCD_CTRL_EN_BCD		BIT(0)
114 #define  VE_BCD_CTRL_EN_ABCD		BIT(1)
115 #define  VE_BCD_CTRL_EN_CB		BIT(2)
116 #define  VE_BCD_CTRL_THR		GENMASK(23, 16)
117 #define  VE_BCD_CTRL_ABCD_THR		GENMASK(31, 24)
118 
119 #define VE_CAP_WINDOW			0x030
120 #define VE_COMP_WINDOW			0x034
121 #define VE_COMP_PROC_OFFSET		0x038
122 #define VE_COMP_OFFSET			0x03c
123 #define VE_JPEG_ADDR			0x040
124 #define VE_SRC0_ADDR			0x044
125 #define VE_SRC_SCANLINE_OFFSET		0x048
126 #define VE_SRC1_ADDR			0x04c
127 #define VE_BCD_ADDR			0x050
128 #define VE_COMP_ADDR			0x054
129 
130 #define VE_STREAM_BUF_SIZE		0x058
131 #define  VE_STREAM_BUF_SIZE_N_PACKETS	GENMASK(5, 3)
132 #define  VE_STREAM_BUF_SIZE_P_SIZE	GENMASK(2, 0)
133 
134 #define VE_COMP_CTRL			0x060
135 #define  VE_COMP_CTRL_VQ_DCT_ONLY	BIT(0)
136 #define  VE_COMP_CTRL_VQ_4COLOR		BIT(1)
137 #define  VE_COMP_CTRL_QUANTIZE		BIT(2)
138 #define  VE_COMP_CTRL_EN_BQ		BIT(4)
139 #define  VE_COMP_CTRL_EN_CRYPTO		BIT(5)
140 #define  VE_COMP_CTRL_DCT_CHR		GENMASK(10, 6)
141 #define  VE_COMP_CTRL_DCT_LUM		GENMASK(15, 11)
142 #define  VE_COMP_CTRL_EN_HQ		BIT(16)
143 #define  VE_COMP_CTRL_RSVD		BIT(19)
144 #define  VE_COMP_CTRL_ENCODE		GENMASK(21, 20)
145 #define  VE_COMP_CTRL_HQ_DCT_CHR	GENMASK(26, 22)
146 #define  VE_COMP_CTRL_HQ_DCT_LUM	GENMASK(31, 27)
147 
148 #define VE_CB_ADDR			0x06C
149 
150 #define AST2400_VE_COMP_SIZE_READ_BACK	0x078
151 #define AST2600_VE_COMP_SIZE_READ_BACK	0x084
152 
153 #define VE_SRC_LR_EDGE_DET		0x090
154 #define  VE_SRC_LR_EDGE_DET_LEFT	GENMASK(11, 0)
155 #define  VE_SRC_LR_EDGE_DET_NO_V	BIT(12)
156 #define  VE_SRC_LR_EDGE_DET_NO_H	BIT(13)
157 #define  VE_SRC_LR_EDGE_DET_NO_DISP	BIT(14)
158 #define  VE_SRC_LR_EDGE_DET_NO_CLK	BIT(15)
159 #define  VE_SRC_LR_EDGE_DET_RT		GENMASK(27, 16)
160 #define  VE_SRC_LR_EDGE_DET_INTERLACE	BIT(31)
161 
162 #define VE_SRC_TB_EDGE_DET		0x094
163 #define  VE_SRC_TB_EDGE_DET_TOP		GENMASK(12, 0)
164 #define  VE_SRC_TB_EDGE_DET_BOT		GENMASK(28, 16)
165 
166 #define VE_MODE_DETECT_STATUS		0x098
167 #define  VE_MODE_DETECT_H_PERIOD	GENMASK(11, 0)
168 #define  VE_MODE_DETECT_EXTSRC_ADC	BIT(12)
169 #define  VE_MODE_DETECT_H_STABLE	BIT(13)
170 #define  VE_MODE_DETECT_V_STABLE	BIT(14)
171 #define  VE_MODE_DETECT_V_LINES		GENMASK(27, 16)
172 #define  VE_MODE_DETECT_STATUS_VSYNC	BIT(28)
173 #define  VE_MODE_DETECT_STATUS_HSYNC	BIT(29)
174 #define  VE_MODE_DETECT_VSYNC_RDY	BIT(30)
175 #define  VE_MODE_DETECT_HSYNC_RDY	BIT(31)
176 
177 #define VE_SYNC_STATUS			0x09c
178 #define  VE_SYNC_STATUS_HSYNC		GENMASK(11, 0)
179 #define  VE_SYNC_STATUS_VSYNC		GENMASK(27, 16)
180 
181 #define VE_H_TOTAL_PIXELS		0x0A0
182 
183 #define VE_INTERRUPT_CTRL		0x304
184 #define VE_INTERRUPT_STATUS		0x308
185 #define  VE_INTERRUPT_MODE_DETECT_WD	BIT(0)
186 #define  VE_INTERRUPT_CAPTURE_COMPLETE	BIT(1)
187 #define  VE_INTERRUPT_COMP_READY	BIT(2)
188 #define  VE_INTERRUPT_COMP_COMPLETE	BIT(3)
189 #define  VE_INTERRUPT_MODE_DETECT	BIT(4)
190 #define  VE_INTERRUPT_FRAME_COMPLETE	BIT(5)
191 #define  VE_INTERRUPT_DECODE_ERR	BIT(6)
192 #define  VE_INTERRUPT_HALT_READY	BIT(8)
193 #define  VE_INTERRUPT_HANG_WD		BIT(9)
194 #define  VE_INTERRUPT_STREAM_DESC	BIT(10)
195 #define  VE_INTERRUPT_VSYNC_DESC	BIT(11)
196 
197 #define VE_MODE_DETECT			0x30c
198 #define  VE_MODE_DT_HOR_TOLER		GENMASK(31, 28)
199 #define  VE_MODE_DT_VER_TOLER		GENMASK(27, 24)
200 #define  VE_MODE_DT_HOR_STABLE		GENMASK(23, 20)
201 #define  VE_MODE_DT_VER_STABLE		GENMASK(19, 16)
202 #define  VE_MODE_DT_EDG_THROD		GENMASK(15, 8)
203 
204 #define VE_MEM_RESTRICT_START		0x310
205 #define VE_MEM_RESTRICT_END		0x314
206 
207 /*
208  * VIDEO_MODE_DETECT_DONE:	a flag raised if signal lock
209  * VIDEO_RES_CHANGE:		a flag raised if res_change work on-going
210  * VIDEO_RES_DETECT:		a flag raised if res. detection on-going
211  * VIDEO_STREAMING:		a flag raised if user requires stream-on
212  * VIDEO_FRAME_INPRG:		a flag raised if hw working on a frame
213  * VIDEO_STOPPED:		a flag raised if device release
214  * VIDEO_CLOCKS_ON:		a flag raised if clk is on
215  */
216 enum {
217 	VIDEO_MODE_DETECT_DONE,
218 	VIDEO_RES_CHANGE,
219 	VIDEO_RES_DETECT,
220 	VIDEO_STREAMING,
221 	VIDEO_FRAME_INPRG,
222 	VIDEO_STOPPED,
223 	VIDEO_CLOCKS_ON,
224 };
225 
226 enum aspeed_video_format {
227 	VIDEO_FMT_STANDARD = 0,
228 	VIDEO_FMT_ASPEED,
229 	VIDEO_FMT_MAX = VIDEO_FMT_ASPEED
230 };
231 
232 // for VE_CTRL_CAPTURE_FMT
233 enum aspeed_video_capture_format {
234 	VIDEO_CAP_FMT_YUV_STUDIO_SWING = 0,
235 	VIDEO_CAP_FMT_YUV_FULL_SWING,
236 	VIDEO_CAP_FMT_RGB,
237 	VIDEO_CAP_FMT_GRAY,
238 	VIDEO_CAP_FMT_MAX
239 };
240 
241 struct aspeed_video_addr {
242 	unsigned int size;
243 	dma_addr_t dma;
244 	void *virt;
245 };
246 
247 struct aspeed_video_buffer {
248 	struct vb2_v4l2_buffer vb;
249 	struct list_head link;
250 };
251 
252 struct aspeed_video_perf {
253 	ktime_t last_sample;
254 	u32 totaltime;
255 	u32 duration;
256 	u32 duration_min;
257 	u32 duration_max;
258 };
259 
260 #define to_aspeed_video_buffer(x) \
261 	container_of((x), struct aspeed_video_buffer, vb)
262 
263 /*
264  * struct aspeed_video - driver data
265  *
266  * res_work:		holds the delayed_work for res-detection if unlock
267  * buffers:		holds the list of buffer queued from user
268  * flags:		holds the state of video
269  * sequence:		holds the last number of frame completed
270  * max_compressed_size:	holds max compressed stream's size
271  * srcs:		holds the buffer information for srcs
272  * jpeg:		holds the buffer information for jpeg header
273  * bcd:			holds the buffer information for bcd work
274  * yuv420:		a flag raised if JPEG subsampling is 420
275  * format:		holds the video format
276  * hq_mode:		a flag raised if HQ is enabled. Only for VIDEO_FMT_ASPEED
277  * frame_rate:		holds the frame_rate
278  * jpeg_quality:	holds jpeq's quality (0~11)
279  * jpeg_hq_quality:	holds hq's quality (1~12) only if hq_mode enabled
280  * frame_bottom:	end position of video data in vertical direction
281  * frame_left:		start position of video data in horizontal direction
282  * frame_right:		end position of video data in horizontal direction
283  * frame_top:		start position of video data in vertical direction
284  * perf:		holds the statistics primary for debugfs
285  */
286 struct aspeed_video {
287 	void __iomem *base;
288 	struct clk *eclk;
289 	struct clk *vclk;
290 
291 	struct device *dev;
292 	struct v4l2_ctrl_handler ctrl_handler;
293 	struct v4l2_device v4l2_dev;
294 	struct v4l2_pix_format pix_fmt;
295 	struct v4l2_bt_timings active_timings;
296 	struct v4l2_bt_timings detected_timings;
297 	u32 v4l2_input_status;
298 	struct vb2_queue queue;
299 	struct video_device vdev;
300 	struct mutex video_lock;	/* v4l2 and videobuf2 lock */
301 
302 	u32 jpeg_mode;
303 	u32 comp_size_read;
304 
305 	wait_queue_head_t wait;
306 	spinlock_t lock;		/* buffer list lock */
307 	struct delayed_work res_work;
308 	struct list_head buffers;
309 	unsigned long flags;
310 	unsigned int sequence;
311 
312 	unsigned int max_compressed_size;
313 	struct aspeed_video_addr srcs[2];
314 	struct aspeed_video_addr jpeg;
315 	struct aspeed_video_addr bcd;
316 
317 	bool yuv420;
318 	enum aspeed_video_format format;
319 	bool hq_mode;
320 	unsigned int frame_rate;
321 	unsigned int jpeg_quality;
322 	unsigned int jpeg_hq_quality;
323 
324 	unsigned int frame_bottom;
325 	unsigned int frame_left;
326 	unsigned int frame_right;
327 	unsigned int frame_top;
328 
329 	struct aspeed_video_perf perf;
330 };
331 
332 #define to_aspeed_video(x) container_of((x), struct aspeed_video, v4l2_dev)
333 
334 struct aspeed_video_config {
335 	u32 jpeg_mode;
336 	u32 comp_size_read;
337 };
338 
339 static const struct aspeed_video_config ast2400_config = {
340 	.jpeg_mode = AST2400_VE_SEQ_CTRL_JPEG_MODE,
341 	.comp_size_read = AST2400_VE_COMP_SIZE_READ_BACK,
342 };
343 
344 static const struct aspeed_video_config ast2500_config = {
345 	.jpeg_mode = AST2500_VE_SEQ_CTRL_JPEG_MODE,
346 	.comp_size_read = AST2400_VE_COMP_SIZE_READ_BACK,
347 };
348 
349 static const struct aspeed_video_config ast2600_config = {
350 	.jpeg_mode = AST2500_VE_SEQ_CTRL_JPEG_MODE,
351 	.comp_size_read = AST2600_VE_COMP_SIZE_READ_BACK,
352 };
353 
354 static const u32 aspeed_video_jpeg_header[ASPEED_VIDEO_JPEG_HEADER_SIZE] = {
355 	0xe0ffd8ff, 0x464a1000, 0x01004649, 0x60000101, 0x00006000, 0x0f00feff,
356 	0x00002d05, 0x00000000, 0x00000000, 0x00dbff00
357 };
358 
359 static const u32 aspeed_video_jpeg_quant[ASPEED_VIDEO_JPEG_QUANT_SIZE] = {
360 	0x081100c0, 0x00000000, 0x00110103, 0x03011102, 0xc4ff0111, 0x00001f00,
361 	0x01010501, 0x01010101, 0x00000000, 0x00000000, 0x04030201, 0x08070605,
362 	0xff0b0a09, 0x10b500c4, 0x03010200, 0x03040203, 0x04040505, 0x7d010000,
363 	0x00030201, 0x12051104, 0x06413121, 0x07615113, 0x32147122, 0x08a19181,
364 	0xc1b14223, 0xf0d15215, 0x72623324, 0x160a0982, 0x1a191817, 0x28272625,
365 	0x35342a29, 0x39383736, 0x4544433a, 0x49484746, 0x5554534a, 0x59585756,
366 	0x6564635a, 0x69686766, 0x7574736a, 0x79787776, 0x8584837a, 0x89888786,
367 	0x9493928a, 0x98979695, 0xa3a29a99, 0xa7a6a5a4, 0xb2aaa9a8, 0xb6b5b4b3,
368 	0xbab9b8b7, 0xc5c4c3c2, 0xc9c8c7c6, 0xd4d3d2ca, 0xd8d7d6d5, 0xe2e1dad9,
369 	0xe6e5e4e3, 0xeae9e8e7, 0xf4f3f2f1, 0xf8f7f6f5, 0xc4fffaf9, 0x00011f00,
370 	0x01010103, 0x01010101, 0x00000101, 0x00000000, 0x04030201, 0x08070605,
371 	0xff0b0a09, 0x11b500c4, 0x02010200, 0x04030404, 0x04040507, 0x77020100,
372 	0x03020100, 0x21050411, 0x41120631, 0x71610751, 0x81322213, 0x91421408,
373 	0x09c1b1a1, 0xf0523323, 0xd1726215, 0x3424160a, 0x17f125e1, 0x261a1918,
374 	0x2a292827, 0x38373635, 0x44433a39, 0x48474645, 0x54534a49, 0x58575655,
375 	0x64635a59, 0x68676665, 0x74736a69, 0x78777675, 0x83827a79, 0x87868584,
376 	0x928a8988, 0x96959493, 0x9a999897, 0xa5a4a3a2, 0xa9a8a7a6, 0xb4b3b2aa,
377 	0xb8b7b6b5, 0xc3c2bab9, 0xc7c6c5c4, 0xd2cac9c8, 0xd6d5d4d3, 0xdad9d8d7,
378 	0xe5e4e3e2, 0xe9e8e7e6, 0xf4f3f2ea, 0xf8f7f6f5, 0xdafffaf9, 0x01030c00,
379 	0x03110200, 0x003f0011
380 };
381 
382 static const u32 aspeed_video_jpeg_dct[ASPEED_VIDEO_JPEG_NUM_QUALITIES]
383 				      [ASPEED_VIDEO_JPEG_DCT_SIZE] = {
384 	{ 0x0d140043, 0x0c0f110f, 0x11101114, 0x17141516, 0x1e20321e,
385 	  0x3d1e1b1b, 0x32242e2b, 0x4b4c3f48, 0x44463f47, 0x61735a50,
386 	  0x566c5550, 0x88644644, 0x7a766c65, 0x4d808280, 0x8c978d60,
387 	  0x7e73967d, 0xdbff7b80, 0x1f014300, 0x272d2121, 0x3030582d,
388 	  0x697bb958, 0xb8b9b97b, 0xb9b8a6a6, 0xb9b9b9b9, 0xb9b9b9b9,
389 	  0xb9b9b9b9, 0xb9b9b9b9, 0xb9b9b9b9, 0xb9b9b9b9, 0xb9b9b9b9,
390 	  0xb9b9b9b9, 0xb9b9b9b9, 0xb9b9b9b9, 0xffb9b9b9 },
391 	{ 0x0c110043, 0x0a0d0f0d, 0x0f0e0f11, 0x14111213, 0x1a1c2b1a,
392 	  0x351a1818, 0x2b1f2826, 0x4142373f, 0x3c3d373e, 0x55644e46,
393 	  0x4b5f4a46, 0x77573d3c, 0x6b675f58, 0x43707170, 0x7a847b54,
394 	  0x6e64836d, 0xdbff6c70, 0x1b014300, 0x22271d1d, 0x2a2a4c27,
395 	  0x5b6ba04c, 0xa0a0a06b, 0xa0a0a0a0, 0xa0a0a0a0, 0xa0a0a0a0,
396 	  0xa0a0a0a0, 0xa0a0a0a0, 0xa0a0a0a0, 0xa0a0a0a0, 0xa0a0a0a0,
397 	  0xa0a0a0a0, 0xa0a0a0a0, 0xa0a0a0a0, 0xffa0a0a0 },
398 	{ 0x090e0043, 0x090a0c0a, 0x0c0b0c0e, 0x110e0f10, 0x15172415,
399 	  0x2c151313, 0x241a211f, 0x36372e34, 0x31322e33, 0x4653413a,
400 	  0x3e4e3d3a, 0x62483231, 0x58564e49, 0x385d5e5d, 0x656d6645,
401 	  0x5b536c5a, 0xdbff595d, 0x16014300, 0x1c201818, 0x22223f20,
402 	  0x4b58853f, 0x85858558, 0x85858585, 0x85858585, 0x85858585,
403 	  0x85858585, 0x85858585, 0x85858585, 0x85858585, 0x85858585,
404 	  0x85858585, 0x85858585, 0x85858585, 0xff858585 },
405 	{ 0x070b0043, 0x07080a08, 0x0a090a0b, 0x0d0b0c0c, 0x11121c11,
406 	  0x23110f0f, 0x1c141a19, 0x2b2b2429, 0x27282428, 0x3842332e,
407 	  0x313e302e, 0x4e392827, 0x46443e3a, 0x2c4a4a4a, 0x50565137,
408 	  0x48425647, 0xdbff474a, 0x12014300, 0x161a1313, 0x1c1c331a,
409 	  0x3d486c33, 0x6c6c6c48, 0x6c6c6c6c, 0x6c6c6c6c, 0x6c6c6c6c,
410 	  0x6c6c6c6c, 0x6c6c6c6c, 0x6c6c6c6c, 0x6c6c6c6c, 0x6c6c6c6c,
411 	  0x6c6c6c6c, 0x6c6c6c6c, 0x6c6c6c6c, 0xff6c6c6c },
412 	{ 0x06090043, 0x05060706, 0x07070709, 0x0a09090a, 0x0d0e160d,
413 	  0x1b0d0c0c, 0x16101413, 0x21221c20, 0x1e1f1c20, 0x2b332824,
414 	  0x26302624, 0x3d2d1f1e, 0x3735302d, 0x22393a39, 0x3f443f2b,
415 	  0x38334338, 0xdbff3739, 0x0d014300, 0x11130e0e, 0x15152613,
416 	  0x2d355026, 0x50505035, 0x50505050, 0x50505050, 0x50505050,
417 	  0x50505050, 0x50505050, 0x50505050, 0x50505050, 0x50505050,
418 	  0x50505050, 0x50505050, 0x50505050, 0xff505050 },
419 	{ 0x04060043, 0x03040504, 0x05040506, 0x07060606, 0x09090f09,
420 	  0x12090808, 0x0f0a0d0d, 0x16161315, 0x14151315, 0x1d221b18,
421 	  0x19201918, 0x281e1514, 0x2423201e, 0x17262726, 0x2a2d2a1c,
422 	  0x25222d25, 0xdbff2526, 0x09014300, 0x0b0d0a0a, 0x0e0e1a0d,
423 	  0x1f25371a, 0x37373725, 0x37373737, 0x37373737, 0x37373737,
424 	  0x37373737, 0x37373737, 0x37373737, 0x37373737, 0x37373737,
425 	  0x37373737, 0x37373737, 0x37373737, 0xff373737 },
426 	{ 0x02030043, 0x01020202, 0x02020203, 0x03030303, 0x04040704,
427 	  0x09040404, 0x07050606, 0x0b0b090a, 0x0a0a090a, 0x0e110d0c,
428 	  0x0c100c0c, 0x140f0a0a, 0x1211100f, 0x0b131313, 0x1516150e,
429 	  0x12111612, 0xdbff1213, 0x04014300, 0x05060505, 0x07070d06,
430 	  0x0f121b0d, 0x1b1b1b12, 0x1b1b1b1b, 0x1b1b1b1b, 0x1b1b1b1b,
431 	  0x1b1b1b1b, 0x1b1b1b1b, 0x1b1b1b1b, 0x1b1b1b1b, 0x1b1b1b1b,
432 	  0x1b1b1b1b, 0x1b1b1b1b, 0x1b1b1b1b, 0xff1b1b1b },
433 	{ 0x01020043, 0x01010101, 0x01010102, 0x02020202, 0x03030503,
434 	  0x06030202, 0x05030404, 0x07070607, 0x06070607, 0x090b0908,
435 	  0x080a0808, 0x0d0a0706, 0x0c0b0a0a, 0x070c0d0c, 0x0e0f0e09,
436 	  0x0c0b0f0c, 0xdbff0c0c, 0x03014300, 0x03040303, 0x04040804,
437 	  0x0a0c1208, 0x1212120c, 0x12121212, 0x12121212, 0x12121212,
438 	  0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212,
439 	  0x12121212, 0x12121212, 0x12121212, 0xff121212 },
440 	{ 0x01020043, 0x01010101, 0x01010102, 0x02020202, 0x03030503,
441 	  0x06030202, 0x05030404, 0x07070607, 0x06070607, 0x090b0908,
442 	  0x080a0808, 0x0d0a0706, 0x0c0b0a0a, 0x070c0d0c, 0x0e0f0e09,
443 	  0x0c0b0f0c, 0xdbff0c0c, 0x02014300, 0x03030202, 0x04040703,
444 	  0x080a0f07, 0x0f0f0f0a, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f,
445 	  0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f,
446 	  0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0xff0f0f0f },
447 	{ 0x01010043, 0x01010101, 0x01010101, 0x01010101, 0x02020302,
448 	  0x04020202, 0x03020303, 0x05050405, 0x05050405, 0x07080606,
449 	  0x06080606, 0x0a070505, 0x09080807, 0x05090909, 0x0a0b0a07,
450 	  0x09080b09, 0xdbff0909, 0x02014300, 0x02030202, 0x03030503,
451 	  0x07080c05, 0x0c0c0c08, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c,
452 	  0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c,
453 	  0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xff0c0c0c },
454 	{ 0x01010043, 0x01010101, 0x01010101, 0x01010101, 0x01010201,
455 	  0x03010101, 0x02010202, 0x03030303, 0x03030303, 0x04050404,
456 	  0x04050404, 0x06050303, 0x06050505, 0x03060606, 0x07070704,
457 	  0x06050706, 0xdbff0606, 0x01014300, 0x01020101, 0x02020402,
458 	  0x05060904, 0x09090906, 0x09090909, 0x09090909, 0x09090909,
459 	  0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909,
460 	  0x09090909, 0x09090909, 0x09090909, 0xff090909 },
461 	{ 0x01010043, 0x01010101, 0x01010101, 0x01010101, 0x01010101,
462 	  0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x02020202,
463 	  0x02020202, 0x03020101, 0x03020202, 0x01030303, 0x03030302,
464 	  0x03020303, 0xdbff0403, 0x01014300, 0x01010101, 0x01010201,
465 	  0x03040602, 0x06060604, 0x06060606, 0x06060606, 0x06060606,
466 	  0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606,
467 	  0x06060606, 0x06060606, 0x06060606, 0xff060606 }
468 };
469 
470 static const struct v4l2_dv_timings_cap aspeed_video_timings_cap = {
471 	.type = V4L2_DV_BT_656_1120,
472 	.bt = {
473 		.min_width = MIN_WIDTH,
474 		.max_width = MAX_WIDTH,
475 		.min_height = MIN_HEIGHT,
476 		.max_height = MAX_HEIGHT,
477 		.min_pixelclock = 6574080, /* 640 x 480 x 24Hz */
478 		.max_pixelclock = 138240000, /* 1920 x 1200 x 60Hz */
479 		.standards = V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
480 			V4L2_DV_BT_STD_CVT | V4L2_DV_BT_STD_GTF,
481 		.capabilities = V4L2_DV_BT_CAP_PROGRESSIVE |
482 			V4L2_DV_BT_CAP_REDUCED_BLANKING |
483 			V4L2_DV_BT_CAP_CUSTOM,
484 	},
485 };
486 
487 static const char * const format_str[] = {"Standard JPEG",
488 	"Aspeed JPEG"};
489 
490 static unsigned int debug;
491 
492 static bool aspeed_video_alloc_buf(struct aspeed_video *video,
493 				   struct aspeed_video_addr *addr,
494 				   unsigned int size);
495 
496 static void aspeed_video_free_buf(struct aspeed_video *video,
497 				  struct aspeed_video_addr *addr);
498 
499 static void aspeed_video_init_jpeg_table(u32 *table, bool yuv420)
500 {
501 	int i;
502 	unsigned int base;
503 
504 	for (i = 0; i < ASPEED_VIDEO_JPEG_NUM_QUALITIES; i++) {
505 		base = 256 * i;	/* AST HW requires this header spacing */
506 		memcpy(&table[base], aspeed_video_jpeg_header,
507 		       sizeof(aspeed_video_jpeg_header));
508 
509 		base += ASPEED_VIDEO_JPEG_HEADER_SIZE;
510 		memcpy(&table[base], aspeed_video_jpeg_dct[i],
511 		       sizeof(aspeed_video_jpeg_dct[i]));
512 
513 		base += ASPEED_VIDEO_JPEG_DCT_SIZE;
514 		memcpy(&table[base], aspeed_video_jpeg_quant,
515 		       sizeof(aspeed_video_jpeg_quant));
516 
517 		if (yuv420)
518 			table[base + 2] = 0x00220103;
519 	}
520 }
521 
522 // just update jpeg dct table per 420/444
523 static void aspeed_video_update_jpeg_table(u32 *table, bool yuv420)
524 {
525 	int i;
526 	unsigned int base;
527 
528 	for (i = 0; i < ASPEED_VIDEO_JPEG_NUM_QUALITIES; i++) {
529 		base = 256 * i;	/* AST HW requires this header spacing */
530 		base += ASPEED_VIDEO_JPEG_HEADER_SIZE +
531 			ASPEED_VIDEO_JPEG_DCT_SIZE;
532 
533 		table[base + 2] = (yuv420) ? 0x00220103 : 0x00110103;
534 	}
535 }
536 
537 static void aspeed_video_update(struct aspeed_video *video, u32 reg, u32 clear,
538 				u32 bits)
539 {
540 	u32 t = readl(video->base + reg);
541 	u32 before = t;
542 
543 	t &= ~clear;
544 	t |= bits;
545 	writel(t, video->base + reg);
546 	v4l2_dbg(3, debug, &video->v4l2_dev, "update %03x[%08x -> %08x]\n",
547 		 reg, before, readl(video->base + reg));
548 }
549 
550 static u32 aspeed_video_read(struct aspeed_video *video, u32 reg)
551 {
552 	u32 t = readl(video->base + reg);
553 
554 	v4l2_dbg(3, debug, &video->v4l2_dev, "read %03x[%08x]\n", reg, t);
555 	return t;
556 }
557 
558 static void aspeed_video_write(struct aspeed_video *video, u32 reg, u32 val)
559 {
560 	writel(val, video->base + reg);
561 	v4l2_dbg(3, debug, &video->v4l2_dev, "write %03x[%08x]\n", reg,
562 		 readl(video->base + reg));
563 }
564 
565 static void update_perf(struct aspeed_video_perf *p)
566 {
567 	struct aspeed_video *v = container_of(p, struct aspeed_video,
568 					      perf);
569 
570 	p->duration =
571 		ktime_to_ms(ktime_sub(ktime_get(),  p->last_sample));
572 	p->totaltime += p->duration;
573 
574 	p->duration_max = max(p->duration, p->duration_max);
575 	p->duration_min = min(p->duration, p->duration_min);
576 	v4l2_dbg(2, debug, &v->v4l2_dev, "time consumed: %d ms\n",
577 		 p->duration);
578 }
579 
580 static int aspeed_video_start_frame(struct aspeed_video *video)
581 {
582 	dma_addr_t addr;
583 	unsigned long flags;
584 	struct aspeed_video_buffer *buf;
585 	u32 seq_ctrl = aspeed_video_read(video, VE_SEQ_CTRL);
586 	bool bcd_buf_need = (video->format != VIDEO_FMT_STANDARD);
587 
588 	if (video->v4l2_input_status) {
589 		v4l2_dbg(1, debug, &video->v4l2_dev, "No signal; don't start frame\n");
590 		return 0;
591 	}
592 
593 	if (!(seq_ctrl & VE_SEQ_CTRL_COMP_BUSY) ||
594 	    !(seq_ctrl & VE_SEQ_CTRL_CAP_BUSY)) {
595 		v4l2_dbg(1, debug, &video->v4l2_dev, "Engine busy; don't start frame\n");
596 		return -EBUSY;
597 	}
598 
599 	if (bcd_buf_need && !video->bcd.size) {
600 		if (!aspeed_video_alloc_buf(video, &video->bcd,
601 					    VE_BCD_BUFF_SIZE)) {
602 			dev_err(video->dev, "Failed to allocate BCD buffer\n");
603 			dev_err(video->dev, "don't start frame\n");
604 			return -ENOMEM;
605 		}
606 		aspeed_video_write(video, VE_BCD_ADDR, video->bcd.dma);
607 		v4l2_dbg(1, debug, &video->v4l2_dev, "bcd addr(%pad) size(%d)\n",
608 			 &video->bcd.dma, video->bcd.size);
609 	} else if (!bcd_buf_need && video->bcd.size) {
610 		aspeed_video_free_buf(video, &video->bcd);
611 	}
612 
613 	spin_lock_irqsave(&video->lock, flags);
614 	buf = list_first_entry_or_null(&video->buffers,
615 				       struct aspeed_video_buffer, link);
616 	if (!buf) {
617 		spin_unlock_irqrestore(&video->lock, flags);
618 		v4l2_dbg(1, debug, &video->v4l2_dev, "No buffers; don't start frame\n");
619 		return -EPROTO;
620 	}
621 
622 	set_bit(VIDEO_FRAME_INPRG, &video->flags);
623 	addr = vb2_dma_contig_plane_dma_addr(&buf->vb.vb2_buf, 0);
624 	spin_unlock_irqrestore(&video->lock, flags);
625 
626 	aspeed_video_write(video, VE_COMP_PROC_OFFSET, 0);
627 	aspeed_video_write(video, VE_COMP_OFFSET, 0);
628 	aspeed_video_write(video, VE_COMP_ADDR, addr);
629 
630 	aspeed_video_update(video, VE_INTERRUPT_CTRL, 0,
631 			    VE_INTERRUPT_COMP_COMPLETE);
632 
633 	video->perf.last_sample = ktime_get();
634 
635 	aspeed_video_update(video, VE_SEQ_CTRL, 0,
636 			    VE_SEQ_CTRL_TRIG_CAPTURE | VE_SEQ_CTRL_TRIG_COMP);
637 
638 	return 0;
639 }
640 
641 static void aspeed_video_enable_mode_detect(struct aspeed_video *video)
642 {
643 	/* Enable mode detect interrupts */
644 	aspeed_video_update(video, VE_INTERRUPT_CTRL, 0,
645 			    VE_INTERRUPT_MODE_DETECT);
646 
647 	/* Disable mode detect in order to re-trigger */
648 	aspeed_video_update(video, VE_SEQ_CTRL,
649 			    VE_SEQ_CTRL_TRIG_MODE_DET, 0);
650 
651 	/* Trigger mode detect */
652 	aspeed_video_update(video, VE_SEQ_CTRL, 0, VE_SEQ_CTRL_TRIG_MODE_DET);
653 }
654 
655 static void aspeed_video_off(struct aspeed_video *video)
656 {
657 	if (!test_bit(VIDEO_CLOCKS_ON, &video->flags))
658 		return;
659 
660 	/* Disable interrupts */
661 	aspeed_video_write(video, VE_INTERRUPT_CTRL, 0);
662 	aspeed_video_write(video, VE_INTERRUPT_STATUS, 0xffffffff);
663 
664 	/* Turn off the relevant clocks */
665 	clk_disable(video->eclk);
666 	clk_disable(video->vclk);
667 
668 	clear_bit(VIDEO_CLOCKS_ON, &video->flags);
669 }
670 
671 static void aspeed_video_on(struct aspeed_video *video)
672 {
673 	if (test_bit(VIDEO_CLOCKS_ON, &video->flags))
674 		return;
675 
676 	/* Turn on the relevant clocks */
677 	clk_enable(video->vclk);
678 	clk_enable(video->eclk);
679 
680 	set_bit(VIDEO_CLOCKS_ON, &video->flags);
681 }
682 
683 static void aspeed_video_bufs_done(struct aspeed_video *video,
684 				   enum vb2_buffer_state state)
685 {
686 	unsigned long flags;
687 	struct aspeed_video_buffer *buf;
688 
689 	spin_lock_irqsave(&video->lock, flags);
690 	list_for_each_entry(buf, &video->buffers, link)
691 		vb2_buffer_done(&buf->vb.vb2_buf, state);
692 	INIT_LIST_HEAD(&video->buffers);
693 	spin_unlock_irqrestore(&video->lock, flags);
694 }
695 
696 static void aspeed_video_irq_res_change(struct aspeed_video *video, ulong delay)
697 {
698 	v4l2_dbg(1, debug, &video->v4l2_dev, "Resolution changed; resetting\n");
699 
700 	set_bit(VIDEO_RES_CHANGE, &video->flags);
701 	clear_bit(VIDEO_FRAME_INPRG, &video->flags);
702 
703 	video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL;
704 
705 	aspeed_video_off(video);
706 	aspeed_video_bufs_done(video, VB2_BUF_STATE_ERROR);
707 
708 	schedule_delayed_work(&video->res_work, delay);
709 }
710 
711 static void aspeed_video_swap_src_buf(struct aspeed_video *v)
712 {
713 	if (v->format == VIDEO_FMT_STANDARD)
714 		return;
715 
716 	/* Reset bcd buffer to have a full frame update every 8 frames.  */
717 	if (IS_ALIGNED(v->sequence, 8))
718 		memset((u8 *)v->bcd.virt, 0x00, VE_BCD_BUFF_SIZE);
719 
720 	if (v->sequence & 0x01) {
721 		aspeed_video_write(v, VE_SRC0_ADDR, v->srcs[1].dma);
722 		aspeed_video_write(v, VE_SRC1_ADDR, v->srcs[0].dma);
723 	} else {
724 		aspeed_video_write(v, VE_SRC0_ADDR, v->srcs[0].dma);
725 		aspeed_video_write(v, VE_SRC1_ADDR, v->srcs[1].dma);
726 	}
727 }
728 
729 static irqreturn_t aspeed_video_irq(int irq, void *arg)
730 {
731 	struct aspeed_video *video = arg;
732 	u32 sts = aspeed_video_read(video, VE_INTERRUPT_STATUS);
733 
734 	/*
735 	 * Hardware sometimes asserts interrupts that we haven't actually
736 	 * enabled; ignore them if so.
737 	 */
738 	sts &= aspeed_video_read(video, VE_INTERRUPT_CTRL);
739 
740 	v4l2_dbg(2, debug, &video->v4l2_dev, "irq sts=%#x %s%s%s%s\n", sts,
741 		 sts & VE_INTERRUPT_MODE_DETECT_WD ? ", unlock" : "",
742 		 sts & VE_INTERRUPT_MODE_DETECT ? ", lock" : "",
743 		 sts & VE_INTERRUPT_CAPTURE_COMPLETE ? ", capture-done" : "",
744 		 sts & VE_INTERRUPT_COMP_COMPLETE ? ", comp-done" : "");
745 
746 	/*
747 	 * Resolution changed or signal was lost; reset the engine and
748 	 * re-initialize
749 	 */
750 	if (sts & VE_INTERRUPT_MODE_DETECT_WD) {
751 		aspeed_video_irq_res_change(video, 0);
752 		return IRQ_HANDLED;
753 	}
754 
755 	if (sts & VE_INTERRUPT_MODE_DETECT) {
756 		if (test_bit(VIDEO_RES_DETECT, &video->flags)) {
757 			aspeed_video_update(video, VE_INTERRUPT_CTRL,
758 					    VE_INTERRUPT_MODE_DETECT, 0);
759 			aspeed_video_write(video, VE_INTERRUPT_STATUS,
760 					   VE_INTERRUPT_MODE_DETECT);
761 			sts &= ~VE_INTERRUPT_MODE_DETECT;
762 			set_bit(VIDEO_MODE_DETECT_DONE, &video->flags);
763 			wake_up_interruptible_all(&video->wait);
764 		} else {
765 			/*
766 			 * Signal acquired while NOT doing resolution
767 			 * detection; reset the engine and re-initialize
768 			 */
769 			aspeed_video_irq_res_change(video,
770 						    RESOLUTION_CHANGE_DELAY);
771 			return IRQ_HANDLED;
772 		}
773 	}
774 
775 	if (sts & VE_INTERRUPT_COMP_COMPLETE) {
776 		struct aspeed_video_buffer *buf;
777 		bool empty = true;
778 		u32 frame_size = aspeed_video_read(video,
779 						   video->comp_size_read);
780 
781 		update_perf(&video->perf);
782 
783 		spin_lock(&video->lock);
784 		clear_bit(VIDEO_FRAME_INPRG, &video->flags);
785 		buf = list_first_entry_or_null(&video->buffers,
786 					       struct aspeed_video_buffer,
787 					       link);
788 		if (buf) {
789 			vb2_set_plane_payload(&buf->vb.vb2_buf, 0, frame_size);
790 
791 			/*
792 			 * aspeed_jpeg requires continuous update.
793 			 * On the contrary, standard jpeg can keep last buffer
794 			 * to always have the latest result.
795 			 */
796 			if (video->format == VIDEO_FMT_STANDARD &&
797 			    list_is_last(&buf->link, &video->buffers)) {
798 				empty = false;
799 				v4l2_dbg(1, debug, &video->v4l2_dev, "skip to keep last frame updated\n");
800 			} else {
801 				buf->vb.vb2_buf.timestamp = ktime_get_ns();
802 				buf->vb.sequence = video->sequence++;
803 				buf->vb.field = V4L2_FIELD_NONE;
804 				vb2_buffer_done(&buf->vb.vb2_buf,
805 						VB2_BUF_STATE_DONE);
806 				list_del(&buf->link);
807 				empty = list_empty(&video->buffers);
808 			}
809 		}
810 		spin_unlock(&video->lock);
811 
812 		aspeed_video_update(video, VE_SEQ_CTRL,
813 				    VE_SEQ_CTRL_TRIG_CAPTURE |
814 				    VE_SEQ_CTRL_FORCE_IDLE |
815 				    VE_SEQ_CTRL_TRIG_COMP, 0);
816 		aspeed_video_update(video, VE_INTERRUPT_CTRL,
817 				    VE_INTERRUPT_COMP_COMPLETE, 0);
818 		aspeed_video_write(video, VE_INTERRUPT_STATUS,
819 				   VE_INTERRUPT_COMP_COMPLETE);
820 		sts &= ~VE_INTERRUPT_COMP_COMPLETE;
821 
822 		aspeed_video_swap_src_buf(video);
823 
824 		if (test_bit(VIDEO_STREAMING, &video->flags) && !empty)
825 			aspeed_video_start_frame(video);
826 	}
827 
828 	return sts ? IRQ_NONE : IRQ_HANDLED;
829 }
830 
831 static void aspeed_video_check_and_set_polarity(struct aspeed_video *video)
832 {
833 	int i;
834 	int hsync_counter = 0;
835 	int vsync_counter = 0;
836 	u32 sts, ctrl;
837 
838 	for (i = 0; i < NUM_POLARITY_CHECKS; ++i) {
839 		sts = aspeed_video_read(video, VE_MODE_DETECT_STATUS);
840 		if (sts & VE_MODE_DETECT_STATUS_VSYNC)
841 			vsync_counter--;
842 		else
843 			vsync_counter++;
844 
845 		if (sts & VE_MODE_DETECT_STATUS_HSYNC)
846 			hsync_counter--;
847 		else
848 			hsync_counter++;
849 	}
850 
851 	ctrl = aspeed_video_read(video, VE_CTRL);
852 
853 	if (hsync_counter < 0) {
854 		ctrl |= VE_CTRL_HSYNC_POL;
855 		video->detected_timings.polarities &=
856 			~V4L2_DV_HSYNC_POS_POL;
857 	} else {
858 		ctrl &= ~VE_CTRL_HSYNC_POL;
859 		video->detected_timings.polarities |=
860 			V4L2_DV_HSYNC_POS_POL;
861 	}
862 
863 	if (vsync_counter < 0) {
864 		ctrl |= VE_CTRL_VSYNC_POL;
865 		video->detected_timings.polarities &=
866 			~V4L2_DV_VSYNC_POS_POL;
867 	} else {
868 		ctrl &= ~VE_CTRL_VSYNC_POL;
869 		video->detected_timings.polarities |=
870 			V4L2_DV_VSYNC_POS_POL;
871 	}
872 
873 	aspeed_video_write(video, VE_CTRL, ctrl);
874 }
875 
876 static bool aspeed_video_alloc_buf(struct aspeed_video *video,
877 				   struct aspeed_video_addr *addr,
878 				   unsigned int size)
879 {
880 	addr->virt = dma_alloc_coherent(video->dev, size, &addr->dma,
881 					GFP_KERNEL);
882 	if (!addr->virt)
883 		return false;
884 
885 	addr->size = size;
886 	return true;
887 }
888 
889 static void aspeed_video_free_buf(struct aspeed_video *video,
890 				  struct aspeed_video_addr *addr)
891 {
892 	dma_free_coherent(video->dev, addr->size, addr->virt, addr->dma);
893 	addr->size = 0;
894 	addr->dma = 0ULL;
895 	addr->virt = NULL;
896 }
897 
898 /*
899  * Get the minimum HW-supported compression buffer size for the frame size.
900  * Assume worst-case JPEG compression size is 1/8 raw size. This should be
901  * plenty even for maximum quality; any worse and the engine will simply return
902  * incomplete JPEGs.
903  */
904 static void aspeed_video_calc_compressed_size(struct aspeed_video *video,
905 					      unsigned int frame_size)
906 {
907 	int i, j;
908 	u32 compression_buffer_size_reg = 0;
909 	unsigned int size;
910 	const unsigned int num_compression_packets = 4;
911 	const unsigned int compression_packet_size = 1024;
912 	const unsigned int max_compressed_size = frame_size / 2; /* 4bpp / 8 */
913 
914 	video->max_compressed_size = UINT_MAX;
915 
916 	for (i = 0; i < 6; ++i) {
917 		for (j = 0; j < 8; ++j) {
918 			size = (num_compression_packets << i) *
919 				(compression_packet_size << j);
920 			if (size < max_compressed_size)
921 				continue;
922 
923 			if (size < video->max_compressed_size) {
924 				compression_buffer_size_reg = (i << 3) | j;
925 				video->max_compressed_size = size;
926 			}
927 		}
928 	}
929 
930 	aspeed_video_write(video, VE_STREAM_BUF_SIZE,
931 			   compression_buffer_size_reg);
932 
933 	v4l2_dbg(1, debug, &video->v4l2_dev, "Max compressed size: %#x\n",
934 		 video->max_compressed_size);
935 }
936 
937 /*
938  * Update v4l2_bt_timings per current status.
939  * frame_top/frame_bottom/frame_left/frame_right need to be ready.
940  *
941  * The following registers start counting from sync's rising edge:
942  * 1. VR090: frame edge's left and right
943  * 2. VR094: frame edge's top and bottom
944  * 3. VR09C: counting from sync's rising edge to falling edge
945  *
946  * [Vertical timing]
947  *             +--+     +-------------------+     +--+
948  *             |  |     |     v i d e o     |     |  |
949  *          +--+  +-----+                   +-----+  +---+
950  *        vsync+--+
951  *    frame_top+--------+
952  * frame_bottom+----------------------------+
953  *
954  *                   +-------------------+
955  *                   |     v i d e o     |
956  *       +--+  +-----+                   +-----+  +---+
957  *          |  |                               |  |
958  *          +--+                               +--+
959  *        vsync+-------------------------------+
960  *    frame_top+-----+
961  * frame_bottom+-------------------------+
962  *
963  * [Horizontal timing]
964  *             +--+     +-------------------+     +--+
965  *             |  |     |     v i d e o     |     |  |
966  *          +--+  +-----+                   +-----+  +---+
967  *        hsync+--+
968  *   frame_left+--------+
969  *  frame_right+----------------------------+
970  *
971  *                   +-------------------+
972  *                   |     v i d e o     |
973  *       +--+  +-----+                   +-----+  +---+
974  *          |  |                               |  |
975  *          +--+                               +--+
976  *        hsync+-------------------------------+
977  *   frame_left+-----+
978  *  frame_right+-------------------------+
979  *
980  * @v: the struct of aspeed_video
981  * @det: v4l2_bt_timings to be updated.
982  */
983 static void aspeed_video_get_timings(struct aspeed_video *v,
984 				     struct v4l2_bt_timings *det)
985 {
986 	u32 mds, sync, htotal, vtotal, vsync, hsync;
987 
988 	mds = aspeed_video_read(v, VE_MODE_DETECT_STATUS);
989 	sync = aspeed_video_read(v, VE_SYNC_STATUS);
990 	htotal = aspeed_video_read(v, VE_H_TOTAL_PIXELS);
991 	vtotal = FIELD_GET(VE_MODE_DETECT_V_LINES, mds);
992 	vsync = FIELD_GET(VE_SYNC_STATUS_VSYNC, sync);
993 	hsync = FIELD_GET(VE_SYNC_STATUS_HSYNC, sync);
994 
995 	/*
996 	 * This is a workaround for polarity detection.
997 	 * Because ast-soc counts sync from sync's rising edge, the reg value
998 	 * of sync would be larger than video's active area if negative.
999 	 */
1000 	if (vsync > det->height)
1001 		det->polarities &= ~V4L2_DV_VSYNC_POS_POL;
1002 	else
1003 		det->polarities |= V4L2_DV_VSYNC_POS_POL;
1004 	if (hsync > det->width)
1005 		det->polarities &= ~V4L2_DV_HSYNC_POS_POL;
1006 	else
1007 		det->polarities |= V4L2_DV_HSYNC_POS_POL;
1008 
1009 	if (det->polarities & V4L2_DV_VSYNC_POS_POL) {
1010 		det->vbackporch = v->frame_top - vsync;
1011 		det->vfrontporch = vtotal - v->frame_bottom;
1012 		det->vsync = vsync;
1013 	} else {
1014 		det->vbackporch = v->frame_top;
1015 		det->vfrontporch = vsync - v->frame_bottom;
1016 		det->vsync = vtotal - vsync;
1017 	}
1018 
1019 	if (det->polarities & V4L2_DV_HSYNC_POS_POL) {
1020 		det->hbackporch = v->frame_left - hsync;
1021 		det->hfrontporch = htotal - v->frame_right;
1022 		det->hsync = hsync;
1023 	} else {
1024 		det->hbackporch = v->frame_left;
1025 		det->hfrontporch = hsync - v->frame_right;
1026 		det->hsync = htotal - hsync;
1027 	}
1028 }
1029 
1030 #define res_check(v) test_and_clear_bit(VIDEO_MODE_DETECT_DONE, &(v)->flags)
1031 
1032 static void aspeed_video_get_resolution(struct aspeed_video *video)
1033 {
1034 	bool invalid_resolution = true;
1035 	int rc;
1036 	int tries = 0;
1037 	u32 mds;
1038 	u32 src_lr_edge;
1039 	u32 src_tb_edge;
1040 	struct v4l2_bt_timings *det = &video->detected_timings;
1041 
1042 	det->width = MIN_WIDTH;
1043 	det->height = MIN_HEIGHT;
1044 	video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL;
1045 	memset(&video->perf, 0, sizeof(video->perf));
1046 
1047 	do {
1048 		if (tries) {
1049 			set_current_state(TASK_INTERRUPTIBLE);
1050 			if (schedule_timeout(INVALID_RESOLUTION_DELAY))
1051 				return;
1052 		}
1053 
1054 		set_bit(VIDEO_RES_DETECT, &video->flags);
1055 		aspeed_video_update(video, VE_CTRL,
1056 				    VE_CTRL_VSYNC_POL | VE_CTRL_HSYNC_POL, 0);
1057 		aspeed_video_enable_mode_detect(video);
1058 
1059 		rc = wait_event_interruptible_timeout(video->wait,
1060 						      res_check(video),
1061 						      MODE_DETECT_TIMEOUT);
1062 		if (!rc) {
1063 			v4l2_dbg(1, debug, &video->v4l2_dev, "Timed out; first mode detect\n");
1064 			clear_bit(VIDEO_RES_DETECT, &video->flags);
1065 			return;
1066 		}
1067 
1068 		mds = aspeed_video_read(video, VE_MODE_DETECT_STATUS);
1069 		// try detection again if current signal isn't stable
1070 		if (!(mds & VE_MODE_DETECT_H_STABLE) ||
1071 		    !(mds & VE_MODE_DETECT_V_STABLE) ||
1072 		    (mds & VE_MODE_DETECT_EXTSRC_ADC))
1073 			continue;
1074 
1075 		aspeed_video_check_and_set_polarity(video);
1076 
1077 		aspeed_video_enable_mode_detect(video);
1078 
1079 		rc = wait_event_interruptible_timeout(video->wait,
1080 						      res_check(video),
1081 						      MODE_DETECT_TIMEOUT);
1082 		clear_bit(VIDEO_RES_DETECT, &video->flags);
1083 		if (!rc) {
1084 			v4l2_dbg(1, debug, &video->v4l2_dev, "Timed out; second mode detect\n");
1085 			return;
1086 		}
1087 
1088 		src_lr_edge = aspeed_video_read(video, VE_SRC_LR_EDGE_DET);
1089 		src_tb_edge = aspeed_video_read(video, VE_SRC_TB_EDGE_DET);
1090 
1091 		video->frame_bottom = FIELD_GET(VE_SRC_TB_EDGE_DET_BOT, src_tb_edge);
1092 		video->frame_top = FIELD_GET(VE_SRC_TB_EDGE_DET_TOP, src_tb_edge);
1093 
1094 		if (video->frame_top > video->frame_bottom)
1095 			continue;
1096 
1097 		video->frame_right = FIELD_GET(VE_SRC_LR_EDGE_DET_RT, src_lr_edge);
1098 		video->frame_left = FIELD_GET(VE_SRC_LR_EDGE_DET_LEFT, src_lr_edge);
1099 
1100 		if (video->frame_left > video->frame_right)
1101 			continue;
1102 
1103 		invalid_resolution = false;
1104 	} while (invalid_resolution && (tries++ < INVALID_RESOLUTION_RETRIES));
1105 
1106 	if (invalid_resolution) {
1107 		v4l2_dbg(1, debug, &video->v4l2_dev, "Invalid resolution detected\n");
1108 		return;
1109 	}
1110 
1111 	det->height = (video->frame_bottom - video->frame_top) + 1;
1112 	det->width = (video->frame_right - video->frame_left) + 1;
1113 	video->v4l2_input_status = 0;
1114 
1115 	aspeed_video_get_timings(video, det);
1116 
1117 	/*
1118 	 * Enable mode-detect watchdog, resolution-change watchdog and
1119 	 * automatic compression after frame capture.
1120 	 */
1121 	aspeed_video_update(video, VE_INTERRUPT_CTRL, 0,
1122 			    VE_INTERRUPT_MODE_DETECT_WD);
1123 	aspeed_video_update(video, VE_SEQ_CTRL, 0,
1124 			    VE_SEQ_CTRL_AUTO_COMP | VE_SEQ_CTRL_EN_WATCHDOG);
1125 
1126 	v4l2_dbg(1, debug, &video->v4l2_dev, "Got resolution: %dx%d\n",
1127 		 det->width, det->height);
1128 }
1129 
1130 static void aspeed_video_set_resolution(struct aspeed_video *video)
1131 {
1132 	struct v4l2_bt_timings *act = &video->active_timings;
1133 	unsigned int size = act->width * act->height;
1134 
1135 	/* Set capture/compression frame sizes */
1136 	aspeed_video_calc_compressed_size(video, size);
1137 
1138 	if (!IS_ALIGNED(act->width, 64)) {
1139 		/*
1140 		 * This is a workaround to fix a AST2500 silicon bug on A1 and
1141 		 * A2 revisions. Since it doesn't break capturing operation of
1142 		 * other revisions, use it for all revisions without checking
1143 		 * the revision ID. It picked new width which is a very next
1144 		 * 64-pixels aligned value to minimize memory bandwidth
1145 		 * and to get better access speed from video engine.
1146 		 */
1147 		u32 width = ALIGN(act->width, 64);
1148 
1149 		aspeed_video_write(video, VE_CAP_WINDOW, width << 16 | act->height);
1150 		size = width * act->height;
1151 	} else {
1152 		aspeed_video_write(video, VE_CAP_WINDOW,
1153 				   act->width << 16 | act->height);
1154 	}
1155 	aspeed_video_write(video, VE_COMP_WINDOW,
1156 			   act->width << 16 | act->height);
1157 	aspeed_video_write(video, VE_SRC_SCANLINE_OFFSET, act->width * 4);
1158 
1159 	/* Don't use direct mode below 1024 x 768 (irqs don't fire) */
1160 	if (size < DIRECT_FETCH_THRESHOLD) {
1161 		v4l2_dbg(1, debug, &video->v4l2_dev, "Capture: Sync Mode\n");
1162 		aspeed_video_write(video, VE_TGS_0,
1163 				   FIELD_PREP(VE_TGS_FIRST,
1164 					      video->frame_left - 1) |
1165 				   FIELD_PREP(VE_TGS_LAST,
1166 					      video->frame_right));
1167 		aspeed_video_write(video, VE_TGS_1,
1168 				   FIELD_PREP(VE_TGS_FIRST, video->frame_top) |
1169 				   FIELD_PREP(VE_TGS_LAST,
1170 					      video->frame_bottom + 1));
1171 		aspeed_video_update(video, VE_CTRL,
1172 				    VE_CTRL_INT_DE | VE_CTRL_DIRECT_FETCH,
1173 				    VE_CTRL_INT_DE);
1174 	} else {
1175 		v4l2_dbg(1, debug, &video->v4l2_dev, "Capture: Direct Mode\n");
1176 		aspeed_video_update(video, VE_CTRL,
1177 				    VE_CTRL_INT_DE | VE_CTRL_DIRECT_FETCH,
1178 				    VE_CTRL_DIRECT_FETCH);
1179 	}
1180 
1181 	size *= 4;
1182 
1183 	if (size != video->srcs[0].size) {
1184 		if (video->srcs[0].size)
1185 			aspeed_video_free_buf(video, &video->srcs[0]);
1186 		if (video->srcs[1].size)
1187 			aspeed_video_free_buf(video, &video->srcs[1]);
1188 
1189 		if (!aspeed_video_alloc_buf(video, &video->srcs[0], size))
1190 			goto err_mem;
1191 		if (!aspeed_video_alloc_buf(video, &video->srcs[1], size))
1192 			goto err_mem;
1193 
1194 		v4l2_dbg(1, debug, &video->v4l2_dev, "src buf0 addr(%pad) size(%d)\n",
1195 			 &video->srcs[0].dma, video->srcs[0].size);
1196 		v4l2_dbg(1, debug, &video->v4l2_dev, "src buf1 addr(%pad) size(%d)\n",
1197 			 &video->srcs[1].dma, video->srcs[1].size);
1198 		aspeed_video_write(video, VE_SRC0_ADDR, video->srcs[0].dma);
1199 		aspeed_video_write(video, VE_SRC1_ADDR, video->srcs[1].dma);
1200 	}
1201 
1202 	return;
1203 
1204 err_mem:
1205 	dev_err(video->dev, "Failed to allocate source buffers\n");
1206 
1207 	if (video->srcs[0].size)
1208 		aspeed_video_free_buf(video, &video->srcs[0]);
1209 }
1210 
1211 static void aspeed_video_update_regs(struct aspeed_video *video)
1212 {
1213 	u8 jpeg_hq_quality = clamp((int)video->jpeg_hq_quality - 1, 0,
1214 				   ASPEED_VIDEO_JPEG_NUM_QUALITIES - 1);
1215 	u32 comp_ctrl =	FIELD_PREP(VE_COMP_CTRL_DCT_LUM, video->jpeg_quality) |
1216 		FIELD_PREP(VE_COMP_CTRL_DCT_CHR, video->jpeg_quality | 0x10) |
1217 		FIELD_PREP(VE_COMP_CTRL_EN_HQ, video->hq_mode) |
1218 		FIELD_PREP(VE_COMP_CTRL_HQ_DCT_LUM, jpeg_hq_quality) |
1219 		FIELD_PREP(VE_COMP_CTRL_HQ_DCT_CHR, jpeg_hq_quality | 0x10);
1220 	u32 ctrl = 0;
1221 	u32 seq_ctrl = 0;
1222 
1223 	v4l2_dbg(1, debug, &video->v4l2_dev, "framerate(%d)\n",
1224 		 video->frame_rate);
1225 	v4l2_dbg(1, debug, &video->v4l2_dev, "jpeg format(%s) subsample(%s)\n",
1226 		 format_str[video->format],
1227 		 video->yuv420 ? "420" : "444");
1228 	v4l2_dbg(1, debug, &video->v4l2_dev, "compression quality(%d)\n",
1229 		 video->jpeg_quality);
1230 	v4l2_dbg(1, debug, &video->v4l2_dev, "hq_mode(%s) hq_quality(%d)\n",
1231 		 video->hq_mode ? "on" : "off", video->jpeg_hq_quality);
1232 
1233 	if (video->format == VIDEO_FMT_ASPEED)
1234 		aspeed_video_update(video, VE_BCD_CTRL, 0, VE_BCD_CTRL_EN_BCD);
1235 	else
1236 		aspeed_video_update(video, VE_BCD_CTRL, VE_BCD_CTRL_EN_BCD, 0);
1237 
1238 	if (video->frame_rate)
1239 		ctrl |= FIELD_PREP(VE_CTRL_FRC, video->frame_rate);
1240 
1241 	if (video->format == VIDEO_FMT_STANDARD) {
1242 		comp_ctrl &= ~FIELD_PREP(VE_COMP_CTRL_EN_HQ, video->hq_mode);
1243 		seq_ctrl |= video->jpeg_mode;
1244 	}
1245 
1246 	if (video->yuv420)
1247 		seq_ctrl |= VE_SEQ_CTRL_YUV420;
1248 
1249 	if (video->jpeg.virt)
1250 		aspeed_video_update_jpeg_table(video->jpeg.virt, video->yuv420);
1251 
1252 	/* Set control registers */
1253 	aspeed_video_update(video, VE_SEQ_CTRL,
1254 			    video->jpeg_mode | VE_SEQ_CTRL_YUV420,
1255 			    seq_ctrl);
1256 	aspeed_video_update(video, VE_CTRL, VE_CTRL_FRC, ctrl);
1257 	aspeed_video_update(video, VE_COMP_CTRL,
1258 			    VE_COMP_CTRL_DCT_LUM | VE_COMP_CTRL_DCT_CHR |
1259 			    VE_COMP_CTRL_EN_HQ | VE_COMP_CTRL_HQ_DCT_LUM |
1260 			    VE_COMP_CTRL_HQ_DCT_CHR | VE_COMP_CTRL_VQ_4COLOR |
1261 			    VE_COMP_CTRL_VQ_DCT_ONLY,
1262 			    comp_ctrl);
1263 }
1264 
1265 static void aspeed_video_init_regs(struct aspeed_video *video)
1266 {
1267 	u32 ctrl = VE_CTRL_AUTO_OR_CURSOR |
1268 		FIELD_PREP(VE_CTRL_CAPTURE_FMT, VIDEO_CAP_FMT_YUV_FULL_SWING);
1269 
1270 	/* Unlock VE registers */
1271 	aspeed_video_write(video, VE_PROTECTION_KEY, VE_PROTECTION_KEY_UNLOCK);
1272 
1273 	/* Disable interrupts */
1274 	aspeed_video_write(video, VE_INTERRUPT_CTRL, 0);
1275 	aspeed_video_write(video, VE_INTERRUPT_STATUS, 0xffffffff);
1276 
1277 	/* Clear the offset */
1278 	aspeed_video_write(video, VE_COMP_PROC_OFFSET, 0);
1279 	aspeed_video_write(video, VE_COMP_OFFSET, 0);
1280 
1281 	aspeed_video_write(video, VE_JPEG_ADDR, video->jpeg.dma);
1282 
1283 	/* Set control registers */
1284 	aspeed_video_write(video, VE_CTRL, ctrl);
1285 	aspeed_video_write(video, VE_COMP_CTRL, VE_COMP_CTRL_RSVD);
1286 
1287 	/* Don't downscale */
1288 	aspeed_video_write(video, VE_SCALING_FACTOR, 0x10001000);
1289 	aspeed_video_write(video, VE_SCALING_FILTER0, 0x00200000);
1290 	aspeed_video_write(video, VE_SCALING_FILTER1, 0x00200000);
1291 	aspeed_video_write(video, VE_SCALING_FILTER2, 0x00200000);
1292 	aspeed_video_write(video, VE_SCALING_FILTER3, 0x00200000);
1293 
1294 	/* Set mode detection defaults */
1295 	aspeed_video_write(video, VE_MODE_DETECT,
1296 			   FIELD_PREP(VE_MODE_DT_HOR_TOLER, 2) |
1297 			   FIELD_PREP(VE_MODE_DT_VER_TOLER, 2) |
1298 			   FIELD_PREP(VE_MODE_DT_HOR_STABLE, 6) |
1299 			   FIELD_PREP(VE_MODE_DT_VER_STABLE, 6) |
1300 			   FIELD_PREP(VE_MODE_DT_EDG_THROD, 0x65));
1301 
1302 	aspeed_video_write(video, VE_BCD_CTRL, 0);
1303 }
1304 
1305 static void aspeed_video_start(struct aspeed_video *video)
1306 {
1307 	aspeed_video_on(video);
1308 
1309 	aspeed_video_init_regs(video);
1310 
1311 	/* Resolution set to 640x480 if no signal found */
1312 	aspeed_video_get_resolution(video);
1313 
1314 	/* Set timings since the device is being opened for the first time */
1315 	video->active_timings = video->detected_timings;
1316 	aspeed_video_set_resolution(video);
1317 
1318 	video->pix_fmt.width = video->active_timings.width;
1319 	video->pix_fmt.height = video->active_timings.height;
1320 	video->pix_fmt.sizeimage = video->max_compressed_size;
1321 }
1322 
1323 static void aspeed_video_stop(struct aspeed_video *video)
1324 {
1325 	set_bit(VIDEO_STOPPED, &video->flags);
1326 	cancel_delayed_work_sync(&video->res_work);
1327 
1328 	aspeed_video_off(video);
1329 
1330 	if (video->srcs[0].size)
1331 		aspeed_video_free_buf(video, &video->srcs[0]);
1332 
1333 	if (video->srcs[1].size)
1334 		aspeed_video_free_buf(video, &video->srcs[1]);
1335 
1336 	if (video->bcd.size)
1337 		aspeed_video_free_buf(video, &video->bcd);
1338 
1339 	video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL;
1340 	video->flags = 0;
1341 }
1342 
1343 static int aspeed_video_querycap(struct file *file, void *fh,
1344 				 struct v4l2_capability *cap)
1345 {
1346 	strscpy(cap->driver, DEVICE_NAME, sizeof(cap->driver));
1347 	strscpy(cap->card, "Aspeed Video Engine", sizeof(cap->card));
1348 	snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s",
1349 		 DEVICE_NAME);
1350 
1351 	return 0;
1352 }
1353 
1354 static int aspeed_video_enum_format(struct file *file, void *fh,
1355 				    struct v4l2_fmtdesc *f)
1356 {
1357 	struct aspeed_video *video = video_drvdata(file);
1358 
1359 	if (f->index)
1360 		return -EINVAL;
1361 
1362 	f->pixelformat = video->pix_fmt.pixelformat;
1363 
1364 	return 0;
1365 }
1366 
1367 static int aspeed_video_get_format(struct file *file, void *fh,
1368 				   struct v4l2_format *f)
1369 {
1370 	struct aspeed_video *video = video_drvdata(file);
1371 
1372 	f->fmt.pix = video->pix_fmt;
1373 
1374 	return 0;
1375 }
1376 
1377 static int aspeed_video_set_format(struct file *file, void *fh,
1378 				   struct v4l2_format *f)
1379 {
1380 	struct aspeed_video *video = video_drvdata(file);
1381 
1382 	if (vb2_is_busy(&video->queue))
1383 		return -EBUSY;
1384 
1385 	switch (f->fmt.pix.pixelformat) {
1386 	case V4L2_PIX_FMT_JPEG:
1387 		video->format = VIDEO_FMT_STANDARD;
1388 		break;
1389 	case V4L2_PIX_FMT_AJPG:
1390 		video->format = VIDEO_FMT_ASPEED;
1391 		break;
1392 	default:
1393 		return -EINVAL;
1394 	}
1395 	video->pix_fmt.pixelformat = f->fmt.pix.pixelformat;
1396 
1397 	return 0;
1398 }
1399 
1400 static int aspeed_video_enum_input(struct file *file, void *fh,
1401 				   struct v4l2_input *inp)
1402 {
1403 	struct aspeed_video *video = video_drvdata(file);
1404 
1405 	if (inp->index)
1406 		return -EINVAL;
1407 
1408 	strscpy(inp->name, "Host VGA capture", sizeof(inp->name));
1409 	inp->type = V4L2_INPUT_TYPE_CAMERA;
1410 	inp->capabilities = V4L2_IN_CAP_DV_TIMINGS;
1411 	inp->status = video->v4l2_input_status;
1412 
1413 	return 0;
1414 }
1415 
1416 static int aspeed_video_get_input(struct file *file, void *fh, unsigned int *i)
1417 {
1418 	*i = 0;
1419 
1420 	return 0;
1421 }
1422 
1423 static int aspeed_video_set_input(struct file *file, void *fh, unsigned int i)
1424 {
1425 	if (i)
1426 		return -EINVAL;
1427 
1428 	return 0;
1429 }
1430 
1431 static int aspeed_video_get_parm(struct file *file, void *fh,
1432 				 struct v4l2_streamparm *a)
1433 {
1434 	struct aspeed_video *video = video_drvdata(file);
1435 
1436 	a->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
1437 	a->parm.capture.readbuffers = ASPEED_VIDEO_V4L2_MIN_BUF_REQ;
1438 	a->parm.capture.timeperframe.numerator = 1;
1439 	if (!video->frame_rate)
1440 		a->parm.capture.timeperframe.denominator = MAX_FRAME_RATE;
1441 	else
1442 		a->parm.capture.timeperframe.denominator = video->frame_rate;
1443 
1444 	return 0;
1445 }
1446 
1447 static int aspeed_video_set_parm(struct file *file, void *fh,
1448 				 struct v4l2_streamparm *a)
1449 {
1450 	unsigned int frame_rate = 0;
1451 	struct aspeed_video *video = video_drvdata(file);
1452 
1453 	a->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
1454 	a->parm.capture.readbuffers = ASPEED_VIDEO_V4L2_MIN_BUF_REQ;
1455 
1456 	if (a->parm.capture.timeperframe.numerator)
1457 		frame_rate = a->parm.capture.timeperframe.denominator /
1458 			a->parm.capture.timeperframe.numerator;
1459 
1460 	if (!frame_rate || frame_rate > MAX_FRAME_RATE) {
1461 		frame_rate = 0;
1462 		a->parm.capture.timeperframe.denominator = MAX_FRAME_RATE;
1463 		a->parm.capture.timeperframe.numerator = 1;
1464 	}
1465 
1466 	if (video->frame_rate != frame_rate) {
1467 		video->frame_rate = frame_rate;
1468 		aspeed_video_update(video, VE_CTRL, VE_CTRL_FRC,
1469 				    FIELD_PREP(VE_CTRL_FRC, frame_rate));
1470 	}
1471 
1472 	return 0;
1473 }
1474 
1475 static int aspeed_video_enum_framesizes(struct file *file, void *fh,
1476 					struct v4l2_frmsizeenum *fsize)
1477 {
1478 	struct aspeed_video *video = video_drvdata(file);
1479 
1480 	if (fsize->index)
1481 		return -EINVAL;
1482 
1483 	if (fsize->pixel_format != V4L2_PIX_FMT_JPEG)
1484 		return -EINVAL;
1485 
1486 	fsize->discrete.width = video->pix_fmt.width;
1487 	fsize->discrete.height = video->pix_fmt.height;
1488 	fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1489 
1490 	return 0;
1491 }
1492 
1493 static int aspeed_video_enum_frameintervals(struct file *file, void *fh,
1494 					    struct v4l2_frmivalenum *fival)
1495 {
1496 	struct aspeed_video *video = video_drvdata(file);
1497 
1498 	if (fival->index)
1499 		return -EINVAL;
1500 
1501 	if (fival->width != video->detected_timings.width ||
1502 	    fival->height != video->detected_timings.height)
1503 		return -EINVAL;
1504 
1505 	if (fival->pixel_format != V4L2_PIX_FMT_JPEG)
1506 		return -EINVAL;
1507 
1508 	fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS;
1509 
1510 	fival->stepwise.min.denominator = MAX_FRAME_RATE;
1511 	fival->stepwise.min.numerator = 1;
1512 	fival->stepwise.max.denominator = 1;
1513 	fival->stepwise.max.numerator = 1;
1514 	fival->stepwise.step = fival->stepwise.max;
1515 
1516 	return 0;
1517 }
1518 
1519 static int aspeed_video_set_dv_timings(struct file *file, void *fh,
1520 				       struct v4l2_dv_timings *timings)
1521 {
1522 	struct aspeed_video *video = video_drvdata(file);
1523 
1524 	if (timings->bt.width == video->active_timings.width &&
1525 	    timings->bt.height == video->active_timings.height)
1526 		return 0;
1527 
1528 	if (vb2_is_busy(&video->queue))
1529 		return -EBUSY;
1530 
1531 	video->active_timings = timings->bt;
1532 
1533 	aspeed_video_set_resolution(video);
1534 
1535 	video->pix_fmt.width = timings->bt.width;
1536 	video->pix_fmt.height = timings->bt.height;
1537 	video->pix_fmt.sizeimage = video->max_compressed_size;
1538 
1539 	timings->type = V4L2_DV_BT_656_1120;
1540 
1541 	v4l2_dbg(1, debug, &video->v4l2_dev, "set new timings(%dx%d)\n",
1542 		 timings->bt.width, timings->bt.height);
1543 
1544 	return 0;
1545 }
1546 
1547 static int aspeed_video_get_dv_timings(struct file *file, void *fh,
1548 				       struct v4l2_dv_timings *timings)
1549 {
1550 	struct aspeed_video *video = video_drvdata(file);
1551 
1552 	timings->type = V4L2_DV_BT_656_1120;
1553 	timings->bt = video->active_timings;
1554 
1555 	return 0;
1556 }
1557 
1558 static int aspeed_video_query_dv_timings(struct file *file, void *fh,
1559 					 struct v4l2_dv_timings *timings)
1560 {
1561 	int rc;
1562 	struct aspeed_video *video = video_drvdata(file);
1563 
1564 	/*
1565 	 * This blocks only if the driver is currently in the process of
1566 	 * detecting a new resolution; in the event of no signal or timeout
1567 	 * this function is woken up.
1568 	 */
1569 	if (file->f_flags & O_NONBLOCK) {
1570 		if (test_bit(VIDEO_RES_CHANGE, &video->flags))
1571 			return -EAGAIN;
1572 	} else {
1573 		rc = wait_event_interruptible(video->wait,
1574 					      !test_bit(VIDEO_RES_CHANGE,
1575 							&video->flags));
1576 		if (rc)
1577 			return -EINTR;
1578 	}
1579 
1580 	timings->type = V4L2_DV_BT_656_1120;
1581 	timings->bt = video->detected_timings;
1582 
1583 	return video->v4l2_input_status ? -ENOLINK : 0;
1584 }
1585 
1586 static int aspeed_video_enum_dv_timings(struct file *file, void *fh,
1587 					struct v4l2_enum_dv_timings *timings)
1588 {
1589 	return v4l2_enum_dv_timings_cap(timings, &aspeed_video_timings_cap,
1590 					NULL, NULL);
1591 }
1592 
1593 static int aspeed_video_dv_timings_cap(struct file *file, void *fh,
1594 				       struct v4l2_dv_timings_cap *cap)
1595 {
1596 	*cap = aspeed_video_timings_cap;
1597 
1598 	return 0;
1599 }
1600 
1601 static int aspeed_video_sub_event(struct v4l2_fh *fh,
1602 				  const struct v4l2_event_subscription *sub)
1603 {
1604 	switch (sub->type) {
1605 	case V4L2_EVENT_SOURCE_CHANGE:
1606 		return v4l2_src_change_event_subscribe(fh, sub);
1607 	}
1608 
1609 	return v4l2_ctrl_subscribe_event(fh, sub);
1610 }
1611 
1612 static const struct v4l2_ioctl_ops aspeed_video_ioctl_ops = {
1613 	.vidioc_querycap = aspeed_video_querycap,
1614 
1615 	.vidioc_enum_fmt_vid_cap = aspeed_video_enum_format,
1616 	.vidioc_g_fmt_vid_cap = aspeed_video_get_format,
1617 	.vidioc_s_fmt_vid_cap = aspeed_video_set_format,
1618 	.vidioc_try_fmt_vid_cap = aspeed_video_get_format,
1619 
1620 	.vidioc_reqbufs = vb2_ioctl_reqbufs,
1621 	.vidioc_querybuf = vb2_ioctl_querybuf,
1622 	.vidioc_qbuf = vb2_ioctl_qbuf,
1623 	.vidioc_expbuf = vb2_ioctl_expbuf,
1624 	.vidioc_dqbuf = vb2_ioctl_dqbuf,
1625 	.vidioc_create_bufs = vb2_ioctl_create_bufs,
1626 	.vidioc_prepare_buf = vb2_ioctl_prepare_buf,
1627 	.vidioc_streamon = vb2_ioctl_streamon,
1628 	.vidioc_streamoff = vb2_ioctl_streamoff,
1629 
1630 	.vidioc_enum_input = aspeed_video_enum_input,
1631 	.vidioc_g_input = aspeed_video_get_input,
1632 	.vidioc_s_input = aspeed_video_set_input,
1633 
1634 	.vidioc_g_parm = aspeed_video_get_parm,
1635 	.vidioc_s_parm = aspeed_video_set_parm,
1636 	.vidioc_enum_framesizes = aspeed_video_enum_framesizes,
1637 	.vidioc_enum_frameintervals = aspeed_video_enum_frameintervals,
1638 
1639 	.vidioc_s_dv_timings = aspeed_video_set_dv_timings,
1640 	.vidioc_g_dv_timings = aspeed_video_get_dv_timings,
1641 	.vidioc_query_dv_timings = aspeed_video_query_dv_timings,
1642 	.vidioc_enum_dv_timings = aspeed_video_enum_dv_timings,
1643 	.vidioc_dv_timings_cap = aspeed_video_dv_timings_cap,
1644 
1645 	.vidioc_subscribe_event = aspeed_video_sub_event,
1646 	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1647 };
1648 
1649 static int aspeed_video_set_ctrl(struct v4l2_ctrl *ctrl)
1650 {
1651 	struct aspeed_video *video = container_of(ctrl->handler,
1652 						  struct aspeed_video,
1653 						  ctrl_handler);
1654 
1655 	switch (ctrl->id) {
1656 	case V4L2_CID_JPEG_COMPRESSION_QUALITY:
1657 		video->jpeg_quality = ctrl->val;
1658 		if (test_bit(VIDEO_STREAMING, &video->flags))
1659 			aspeed_video_update_regs(video);
1660 		break;
1661 	case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
1662 		video->yuv420 = (ctrl->val == V4L2_JPEG_CHROMA_SUBSAMPLING_420);
1663 		if (test_bit(VIDEO_STREAMING, &video->flags))
1664 			aspeed_video_update_regs(video);
1665 		break;
1666 	case V4L2_CID_ASPEED_HQ_MODE:
1667 		video->hq_mode = ctrl->val;
1668 		if (test_bit(VIDEO_STREAMING, &video->flags))
1669 			aspeed_video_update_regs(video);
1670 		break;
1671 	case V4L2_CID_ASPEED_HQ_JPEG_QUALITY:
1672 		video->jpeg_hq_quality = ctrl->val;
1673 		if (test_bit(VIDEO_STREAMING, &video->flags))
1674 			aspeed_video_update_regs(video);
1675 		break;
1676 	default:
1677 		return -EINVAL;
1678 	}
1679 
1680 	return 0;
1681 }
1682 
1683 static const struct v4l2_ctrl_ops aspeed_video_ctrl_ops = {
1684 	.s_ctrl = aspeed_video_set_ctrl,
1685 };
1686 
1687 static const struct v4l2_ctrl_config aspeed_ctrl_HQ_mode = {
1688 	.ops = &aspeed_video_ctrl_ops,
1689 	.id = V4L2_CID_ASPEED_HQ_MODE,
1690 	.name = "Aspeed HQ Mode",
1691 	.type = V4L2_CTRL_TYPE_BOOLEAN,
1692 	.min = false,
1693 	.max = true,
1694 	.step = 1,
1695 	.def = false,
1696 };
1697 
1698 static const struct v4l2_ctrl_config aspeed_ctrl_HQ_jpeg_quality = {
1699 	.ops = &aspeed_video_ctrl_ops,
1700 	.id = V4L2_CID_ASPEED_HQ_JPEG_QUALITY,
1701 	.name = "Aspeed HQ Quality",
1702 	.type = V4L2_CTRL_TYPE_INTEGER,
1703 	.min = 1,
1704 	.max = ASPEED_VIDEO_JPEG_NUM_QUALITIES,
1705 	.step = 1,
1706 	.def = 1,
1707 };
1708 
1709 static void aspeed_video_resolution_work(struct work_struct *work)
1710 {
1711 	struct delayed_work *dwork = to_delayed_work(work);
1712 	struct aspeed_video *video = container_of(dwork, struct aspeed_video,
1713 						  res_work);
1714 
1715 	aspeed_video_on(video);
1716 
1717 	/* Exit early in case no clients remain */
1718 	if (test_bit(VIDEO_STOPPED, &video->flags))
1719 		goto done;
1720 
1721 	aspeed_video_init_regs(video);
1722 
1723 	aspeed_video_update_regs(video);
1724 
1725 	aspeed_video_get_resolution(video);
1726 
1727 	if (video->detected_timings.width != video->active_timings.width ||
1728 	    video->detected_timings.height != video->active_timings.height) {
1729 		static const struct v4l2_event ev = {
1730 			.type = V4L2_EVENT_SOURCE_CHANGE,
1731 			.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
1732 		};
1733 
1734 		v4l2_dbg(1, debug, &video->v4l2_dev, "fire source change event\n");
1735 		v4l2_event_queue(&video->vdev, &ev);
1736 	} else if (test_bit(VIDEO_STREAMING, &video->flags)) {
1737 		/* No resolution change so just restart streaming */
1738 		aspeed_video_start_frame(video);
1739 	}
1740 
1741 done:
1742 	clear_bit(VIDEO_RES_CHANGE, &video->flags);
1743 	wake_up_interruptible_all(&video->wait);
1744 }
1745 
1746 static int aspeed_video_open(struct file *file)
1747 {
1748 	int rc;
1749 	struct aspeed_video *video = video_drvdata(file);
1750 
1751 	mutex_lock(&video->video_lock);
1752 
1753 	rc = v4l2_fh_open(file);
1754 	if (rc) {
1755 		mutex_unlock(&video->video_lock);
1756 		return rc;
1757 	}
1758 
1759 	if (v4l2_fh_is_singular_file(file))
1760 		aspeed_video_start(video);
1761 
1762 	mutex_unlock(&video->video_lock);
1763 
1764 	return 0;
1765 }
1766 
1767 static int aspeed_video_release(struct file *file)
1768 {
1769 	int rc;
1770 	struct aspeed_video *video = video_drvdata(file);
1771 
1772 	mutex_lock(&video->video_lock);
1773 
1774 	if (v4l2_fh_is_singular_file(file))
1775 		aspeed_video_stop(video);
1776 
1777 	rc = _vb2_fop_release(file, NULL);
1778 
1779 	mutex_unlock(&video->video_lock);
1780 
1781 	return rc;
1782 }
1783 
1784 static const struct v4l2_file_operations aspeed_video_v4l2_fops = {
1785 	.owner = THIS_MODULE,
1786 	.read = vb2_fop_read,
1787 	.poll = vb2_fop_poll,
1788 	.unlocked_ioctl = video_ioctl2,
1789 	.mmap = vb2_fop_mmap,
1790 	.open = aspeed_video_open,
1791 	.release = aspeed_video_release,
1792 };
1793 
1794 static int aspeed_video_queue_setup(struct vb2_queue *q,
1795 				    unsigned int *num_buffers,
1796 				    unsigned int *num_planes,
1797 				    unsigned int sizes[],
1798 				    struct device *alloc_devs[])
1799 {
1800 	struct aspeed_video *video = vb2_get_drv_priv(q);
1801 
1802 	if (*num_planes) {
1803 		if (sizes[0] < video->max_compressed_size)
1804 			return -EINVAL;
1805 
1806 		return 0;
1807 	}
1808 
1809 	*num_planes = 1;
1810 	sizes[0] = video->max_compressed_size;
1811 
1812 	return 0;
1813 }
1814 
1815 static int aspeed_video_buf_prepare(struct vb2_buffer *vb)
1816 {
1817 	struct aspeed_video *video = vb2_get_drv_priv(vb->vb2_queue);
1818 
1819 	if (vb2_plane_size(vb, 0) < video->max_compressed_size)
1820 		return -EINVAL;
1821 
1822 	return 0;
1823 }
1824 
1825 static int aspeed_video_start_streaming(struct vb2_queue *q,
1826 					unsigned int count)
1827 {
1828 	int rc;
1829 	struct aspeed_video *video = vb2_get_drv_priv(q);
1830 
1831 	video->sequence = 0;
1832 	video->perf.duration_max = 0;
1833 	video->perf.duration_min = 0xffffffff;
1834 
1835 	aspeed_video_update_regs(video);
1836 
1837 	rc = aspeed_video_start_frame(video);
1838 	if (rc) {
1839 		aspeed_video_bufs_done(video, VB2_BUF_STATE_QUEUED);
1840 		return rc;
1841 	}
1842 
1843 	set_bit(VIDEO_STREAMING, &video->flags);
1844 	return 0;
1845 }
1846 
1847 static void aspeed_video_stop_streaming(struct vb2_queue *q)
1848 {
1849 	int rc;
1850 	struct aspeed_video *video = vb2_get_drv_priv(q);
1851 
1852 	clear_bit(VIDEO_STREAMING, &video->flags);
1853 
1854 	rc = wait_event_timeout(video->wait,
1855 				!test_bit(VIDEO_FRAME_INPRG, &video->flags),
1856 				STOP_TIMEOUT);
1857 	if (!rc) {
1858 		v4l2_dbg(1, debug, &video->v4l2_dev, "Timed out when stopping streaming\n");
1859 
1860 		/*
1861 		 * Need to force stop any DMA and try and get HW into a good
1862 		 * state for future calls to start streaming again.
1863 		 */
1864 		aspeed_video_off(video);
1865 		aspeed_video_on(video);
1866 
1867 		aspeed_video_init_regs(video);
1868 
1869 		aspeed_video_get_resolution(video);
1870 	}
1871 
1872 	aspeed_video_bufs_done(video, VB2_BUF_STATE_ERROR);
1873 }
1874 
1875 static void aspeed_video_buf_queue(struct vb2_buffer *vb)
1876 {
1877 	bool empty;
1878 	struct aspeed_video *video = vb2_get_drv_priv(vb->vb2_queue);
1879 	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1880 	struct aspeed_video_buffer *avb = to_aspeed_video_buffer(vbuf);
1881 	unsigned long flags;
1882 
1883 	spin_lock_irqsave(&video->lock, flags);
1884 	empty = list_empty(&video->buffers);
1885 	list_add_tail(&avb->link, &video->buffers);
1886 	spin_unlock_irqrestore(&video->lock, flags);
1887 
1888 	if (test_bit(VIDEO_STREAMING, &video->flags) &&
1889 	    !test_bit(VIDEO_FRAME_INPRG, &video->flags) && empty)
1890 		aspeed_video_start_frame(video);
1891 }
1892 
1893 static const struct vb2_ops aspeed_video_vb2_ops = {
1894 	.queue_setup = aspeed_video_queue_setup,
1895 	.wait_prepare = vb2_ops_wait_prepare,
1896 	.wait_finish = vb2_ops_wait_finish,
1897 	.buf_prepare = aspeed_video_buf_prepare,
1898 	.start_streaming = aspeed_video_start_streaming,
1899 	.stop_streaming = aspeed_video_stop_streaming,
1900 	.buf_queue =  aspeed_video_buf_queue,
1901 };
1902 
1903 #ifdef CONFIG_DEBUG_FS
1904 static int aspeed_video_debugfs_show(struct seq_file *s, void *data)
1905 {
1906 	struct aspeed_video *v = s->private;
1907 	u32 val08;
1908 
1909 	seq_puts(s, "\n");
1910 
1911 	seq_puts(s, "Capture:\n");
1912 	val08 = aspeed_video_read(v, VE_CTRL);
1913 	if (FIELD_GET(VE_CTRL_DIRECT_FETCH, val08)) {
1914 		seq_printf(s, "  %-20s:\tDirect fetch\n", "Mode");
1915 		seq_printf(s, "  %-20s:\t%s\n", "VGA bpp mode",
1916 			   FIELD_GET(VE_CTRL_INT_DE, val08) ? "16" : "32");
1917 	} else {
1918 		seq_printf(s, "  %-20s:\tSync\n", "Mode");
1919 		seq_printf(s, "  %-20s:\t%s\n", "Video source",
1920 			   FIELD_GET(VE_CTRL_SOURCE, val08) ?
1921 			   "external" : "internal");
1922 		seq_printf(s, "  %-20s:\t%s\n", "DE source",
1923 			   FIELD_GET(VE_CTRL_INT_DE, val08) ?
1924 			   "internal" : "external");
1925 		seq_printf(s, "  %-20s:\t%s\n", "Cursor overlay",
1926 			   FIELD_GET(VE_CTRL_AUTO_OR_CURSOR, val08) ?
1927 			   "Without" : "With");
1928 	}
1929 
1930 	seq_printf(s, "  %-20s:\t%s\n", "Signal",
1931 		   v->v4l2_input_status ? "Unlock" : "Lock");
1932 	seq_printf(s, "  %-20s:\t%d\n", "Width", v->pix_fmt.width);
1933 	seq_printf(s, "  %-20s:\t%d\n", "Height", v->pix_fmt.height);
1934 	seq_printf(s, "  %-20s:\t%d\n", "FRC", v->frame_rate);
1935 
1936 	seq_puts(s, "\n");
1937 
1938 	seq_puts(s, "Compression:\n");
1939 	seq_printf(s, "  %-20s:\t%s\n", "Format", format_str[v->format]);
1940 	seq_printf(s, "  %-20s:\t%s\n", "Subsampling",
1941 		   v->yuv420 ? "420" : "444");
1942 	seq_printf(s, "  %-20s:\t%d\n", "Quality", v->jpeg_quality);
1943 	if (v->format == VIDEO_FMT_ASPEED) {
1944 		seq_printf(s, "  %-20s:\t%s\n", "HQ Mode",
1945 			   v->hq_mode ? "on" : "off");
1946 		seq_printf(s, "  %-20s:\t%d\n", "HQ Quality",
1947 			   v->hq_mode ? v->jpeg_hq_quality : 0);
1948 	}
1949 
1950 	seq_puts(s, "\n");
1951 
1952 	seq_puts(s, "Performance:\n");
1953 	seq_printf(s, "  %-20s:\t%d\n", "Frame#", v->sequence);
1954 	seq_printf(s, "  %-20s:\n", "Frame Duration(ms)");
1955 	seq_printf(s, "    %-18s:\t%d\n", "Now", v->perf.duration);
1956 	seq_printf(s, "    %-18s:\t%d\n", "Min", v->perf.duration_min);
1957 	seq_printf(s, "    %-18s:\t%d\n", "Max", v->perf.duration_max);
1958 	seq_printf(s, "  %-20s:\t%d\n", "FPS",
1959 		   (v->perf.totaltime && v->sequence) ?
1960 		   1000 / (v->perf.totaltime / v->sequence) : 0);
1961 
1962 	return 0;
1963 }
1964 DEFINE_SHOW_ATTRIBUTE(aspeed_video_debugfs);
1965 
1966 static struct dentry *debugfs_entry;
1967 
1968 static void aspeed_video_debugfs_remove(struct aspeed_video *video)
1969 {
1970 	debugfs_remove_recursive(debugfs_entry);
1971 	debugfs_entry = NULL;
1972 }
1973 
1974 static int aspeed_video_debugfs_create(struct aspeed_video *video)
1975 {
1976 	debugfs_entry = debugfs_create_file(DEVICE_NAME, 0444, NULL,
1977 					    video,
1978 					    &aspeed_video_debugfs_fops);
1979 	if (!debugfs_entry)
1980 		aspeed_video_debugfs_remove(video);
1981 
1982 	return !debugfs_entry ? -EIO : 0;
1983 }
1984 #else
1985 static void aspeed_video_debugfs_remove(struct aspeed_video *video) { }
1986 static int aspeed_video_debugfs_create(struct aspeed_video *video)
1987 {
1988 	return 0;
1989 }
1990 #endif /* CONFIG_DEBUG_FS */
1991 
1992 static int aspeed_video_setup_video(struct aspeed_video *video)
1993 {
1994 	const u64 mask = ~(BIT(V4L2_JPEG_CHROMA_SUBSAMPLING_444) |
1995 			   BIT(V4L2_JPEG_CHROMA_SUBSAMPLING_420));
1996 	struct v4l2_device *v4l2_dev = &video->v4l2_dev;
1997 	struct vb2_queue *vbq = &video->queue;
1998 	struct video_device *vdev = &video->vdev;
1999 	struct v4l2_ctrl_handler *hdl = &video->ctrl_handler;
2000 	int rc;
2001 
2002 	video->pix_fmt.pixelformat = V4L2_PIX_FMT_JPEG;
2003 	video->pix_fmt.field = V4L2_FIELD_NONE;
2004 	video->pix_fmt.colorspace = V4L2_COLORSPACE_SRGB;
2005 	video->pix_fmt.quantization = V4L2_QUANTIZATION_FULL_RANGE;
2006 	video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL;
2007 
2008 	rc = v4l2_device_register(video->dev, v4l2_dev);
2009 	if (rc) {
2010 		dev_err(video->dev, "Failed to register v4l2 device\n");
2011 		return rc;
2012 	}
2013 
2014 	v4l2_ctrl_handler_init(hdl, 4);
2015 	v4l2_ctrl_new_std(hdl, &aspeed_video_ctrl_ops,
2016 			  V4L2_CID_JPEG_COMPRESSION_QUALITY, 0,
2017 			  ASPEED_VIDEO_JPEG_NUM_QUALITIES - 1, 1, 0);
2018 	v4l2_ctrl_new_std_menu(hdl, &aspeed_video_ctrl_ops,
2019 			       V4L2_CID_JPEG_CHROMA_SUBSAMPLING,
2020 			       V4L2_JPEG_CHROMA_SUBSAMPLING_420, mask,
2021 			       V4L2_JPEG_CHROMA_SUBSAMPLING_444);
2022 	v4l2_ctrl_new_custom(hdl, &aspeed_ctrl_HQ_mode, NULL);
2023 	v4l2_ctrl_new_custom(hdl, &aspeed_ctrl_HQ_jpeg_quality, NULL);
2024 
2025 	rc = hdl->error;
2026 	if (rc) {
2027 		v4l2_ctrl_handler_free(&video->ctrl_handler);
2028 		v4l2_device_unregister(v4l2_dev);
2029 
2030 		dev_err(video->dev, "Failed to init controls: %d\n", rc);
2031 		return rc;
2032 	}
2033 
2034 	v4l2_dev->ctrl_handler = hdl;
2035 
2036 	vbq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2037 	vbq->io_modes = VB2_MMAP | VB2_READ | VB2_DMABUF;
2038 	vbq->dev = v4l2_dev->dev;
2039 	vbq->lock = &video->video_lock;
2040 	vbq->ops = &aspeed_video_vb2_ops;
2041 	vbq->mem_ops = &vb2_dma_contig_memops;
2042 	vbq->drv_priv = video;
2043 	vbq->buf_struct_size = sizeof(struct aspeed_video_buffer);
2044 	vbq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
2045 	vbq->min_buffers_needed = ASPEED_VIDEO_V4L2_MIN_BUF_REQ;
2046 
2047 	rc = vb2_queue_init(vbq);
2048 	if (rc) {
2049 		v4l2_ctrl_handler_free(&video->ctrl_handler);
2050 		v4l2_device_unregister(v4l2_dev);
2051 
2052 		dev_err(video->dev, "Failed to init vb2 queue\n");
2053 		return rc;
2054 	}
2055 
2056 	vdev->queue = vbq;
2057 	vdev->fops = &aspeed_video_v4l2_fops;
2058 	vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
2059 		V4L2_CAP_STREAMING;
2060 	vdev->v4l2_dev = v4l2_dev;
2061 	strscpy(vdev->name, DEVICE_NAME, sizeof(vdev->name));
2062 	vdev->vfl_type = VFL_TYPE_VIDEO;
2063 	vdev->vfl_dir = VFL_DIR_RX;
2064 	vdev->release = video_device_release_empty;
2065 	vdev->ioctl_ops = &aspeed_video_ioctl_ops;
2066 	vdev->lock = &video->video_lock;
2067 
2068 	video_set_drvdata(vdev, video);
2069 	rc = video_register_device(vdev, VFL_TYPE_VIDEO, 0);
2070 	if (rc) {
2071 		v4l2_ctrl_handler_free(&video->ctrl_handler);
2072 		v4l2_device_unregister(v4l2_dev);
2073 
2074 		dev_err(video->dev, "Failed to register video device\n");
2075 		return rc;
2076 	}
2077 
2078 	return 0;
2079 }
2080 
2081 static int aspeed_video_init(struct aspeed_video *video)
2082 {
2083 	int irq;
2084 	int rc;
2085 	struct device *dev = video->dev;
2086 
2087 	irq = irq_of_parse_and_map(dev->of_node, 0);
2088 	if (!irq) {
2089 		dev_err(dev, "Unable to find IRQ\n");
2090 		return -ENODEV;
2091 	}
2092 
2093 	rc = devm_request_threaded_irq(dev, irq, NULL, aspeed_video_irq,
2094 				       IRQF_ONESHOT, DEVICE_NAME, video);
2095 	if (rc < 0) {
2096 		dev_err(dev, "Unable to request IRQ %d\n", irq);
2097 		return rc;
2098 	}
2099 	dev_info(video->dev, "irq %d\n", irq);
2100 
2101 	video->eclk = devm_clk_get(dev, "eclk");
2102 	if (IS_ERR(video->eclk)) {
2103 		dev_err(dev, "Unable to get ECLK\n");
2104 		return PTR_ERR(video->eclk);
2105 	}
2106 
2107 	rc = clk_prepare(video->eclk);
2108 	if (rc)
2109 		return rc;
2110 
2111 	video->vclk = devm_clk_get(dev, "vclk");
2112 	if (IS_ERR(video->vclk)) {
2113 		dev_err(dev, "Unable to get VCLK\n");
2114 		rc = PTR_ERR(video->vclk);
2115 		goto err_unprepare_eclk;
2116 	}
2117 
2118 	rc = clk_prepare(video->vclk);
2119 	if (rc)
2120 		goto err_unprepare_eclk;
2121 
2122 	of_reserved_mem_device_init(dev);
2123 
2124 	rc = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
2125 	if (rc) {
2126 		dev_err(dev, "Failed to set DMA mask\n");
2127 		goto err_release_reserved_mem;
2128 	}
2129 
2130 	if (!aspeed_video_alloc_buf(video, &video->jpeg,
2131 				    VE_JPEG_HEADER_SIZE)) {
2132 		dev_err(dev, "Failed to allocate DMA for JPEG header\n");
2133 		rc = -ENOMEM;
2134 		goto err_release_reserved_mem;
2135 	}
2136 	dev_info(video->dev, "alloc mem size(%d) at %pad for jpeg header\n",
2137 		 VE_JPEG_HEADER_SIZE, &video->jpeg.dma);
2138 
2139 	aspeed_video_init_jpeg_table(video->jpeg.virt, video->yuv420);
2140 
2141 	return 0;
2142 
2143 err_release_reserved_mem:
2144 	of_reserved_mem_device_release(dev);
2145 	clk_unprepare(video->vclk);
2146 err_unprepare_eclk:
2147 	clk_unprepare(video->eclk);
2148 
2149 	return rc;
2150 }
2151 
2152 static const struct of_device_id aspeed_video_of_match[] = {
2153 	{ .compatible = "aspeed,ast2400-video-engine", .data = &ast2400_config },
2154 	{ .compatible = "aspeed,ast2500-video-engine", .data = &ast2500_config },
2155 	{ .compatible = "aspeed,ast2600-video-engine", .data = &ast2600_config },
2156 	{}
2157 };
2158 MODULE_DEVICE_TABLE(of, aspeed_video_of_match);
2159 
2160 static int aspeed_video_probe(struct platform_device *pdev)
2161 {
2162 	const struct aspeed_video_config *config;
2163 	struct aspeed_video *video;
2164 	int rc;
2165 
2166 	video = devm_kzalloc(&pdev->dev, sizeof(*video), GFP_KERNEL);
2167 	if (!video)
2168 		return -ENOMEM;
2169 
2170 	video->base = devm_platform_ioremap_resource(pdev, 0);
2171 	if (IS_ERR(video->base))
2172 		return PTR_ERR(video->base);
2173 
2174 	config = of_device_get_match_data(&pdev->dev);
2175 	if (!config)
2176 		return -ENODEV;
2177 
2178 	video->jpeg_mode = config->jpeg_mode;
2179 	video->comp_size_read = config->comp_size_read;
2180 
2181 	video->frame_rate = 30;
2182 	video->jpeg_hq_quality = 1;
2183 	video->dev = &pdev->dev;
2184 	spin_lock_init(&video->lock);
2185 	mutex_init(&video->video_lock);
2186 	init_waitqueue_head(&video->wait);
2187 	INIT_DELAYED_WORK(&video->res_work, aspeed_video_resolution_work);
2188 	INIT_LIST_HEAD(&video->buffers);
2189 
2190 	rc = aspeed_video_init(video);
2191 	if (rc)
2192 		return rc;
2193 
2194 	rc = aspeed_video_setup_video(video);
2195 	if (rc) {
2196 		aspeed_video_free_buf(video, &video->jpeg);
2197 		clk_unprepare(video->vclk);
2198 		clk_unprepare(video->eclk);
2199 		return rc;
2200 	}
2201 
2202 	rc = aspeed_video_debugfs_create(video);
2203 	if (rc)
2204 		dev_err(video->dev, "debugfs create failed\n");
2205 
2206 	return 0;
2207 }
2208 
2209 static void aspeed_video_remove(struct platform_device *pdev)
2210 {
2211 	struct device *dev = &pdev->dev;
2212 	struct v4l2_device *v4l2_dev = dev_get_drvdata(dev);
2213 	struct aspeed_video *video = to_aspeed_video(v4l2_dev);
2214 
2215 	aspeed_video_off(video);
2216 
2217 	aspeed_video_debugfs_remove(video);
2218 
2219 	clk_unprepare(video->vclk);
2220 	clk_unprepare(video->eclk);
2221 
2222 	vb2_video_unregister_device(&video->vdev);
2223 
2224 	v4l2_ctrl_handler_free(&video->ctrl_handler);
2225 
2226 	v4l2_device_unregister(v4l2_dev);
2227 
2228 	aspeed_video_free_buf(video, &video->jpeg);
2229 
2230 	of_reserved_mem_device_release(dev);
2231 }
2232 
2233 static struct platform_driver aspeed_video_driver = {
2234 	.driver = {
2235 		.name = DEVICE_NAME,
2236 		.of_match_table = aspeed_video_of_match,
2237 	},
2238 	.probe = aspeed_video_probe,
2239 	.remove_new = aspeed_video_remove,
2240 };
2241 
2242 module_platform_driver(aspeed_video_driver);
2243 
2244 module_param(debug, int, 0644);
2245 MODULE_PARM_DESC(debug, "Debug level (0=off,1=info,2=debug,3=reg ops)");
2246 
2247 MODULE_DESCRIPTION("ASPEED Video Engine Driver");
2248 MODULE_AUTHOR("Eddie James");
2249 MODULE_LICENSE("GPL v2");
2250