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