]> Git Repo - linux.git/blob - drivers/media/platform/renesas/rcar_fdp1.c
net: bgmac: Fix return value check for fixed_phy_register()
[linux.git] / drivers / media / platform / renesas / rcar_fdp1.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Renesas R-Car Fine Display Processor
4  *
5  * Video format converter and frame deinterlacer device.
6  *
7  * Author: Kieran Bingham, <[email protected]>
8  * Copyright (c) 2016 Renesas Electronics Corporation.
9  *
10  * This code is developed and inspired from the vim2m, rcar_jpu,
11  * m2m-deinterlace, and vsp1 drivers.
12  */
13
14 #include <linux/clk.h>
15 #include <linux/delay.h>
16 #include <linux/dma-mapping.h>
17 #include <linux/fs.h>
18 #include <linux/interrupt.h>
19 #include <linux/module.h>
20 #include <linux/of.h>
21 #include <linux/of_device.h>
22 #include <linux/platform_device.h>
23 #include <linux/pm_runtime.h>
24 #include <linux/sched.h>
25 #include <linux/slab.h>
26 #include <linux/timer.h>
27 #include <media/rcar-fcp.h>
28 #include <media/v4l2-ctrls.h>
29 #include <media/v4l2-device.h>
30 #include <media/v4l2-event.h>
31 #include <media/v4l2-ioctl.h>
32 #include <media/v4l2-mem2mem.h>
33 #include <media/videobuf2-dma-contig.h>
34
35 static unsigned int debug;
36 module_param(debug, uint, 0644);
37 MODULE_PARM_DESC(debug, "activate debug info");
38
39 /* Minimum and maximum frame width/height */
40 #define FDP1_MIN_W              80U
41 #define FDP1_MIN_H              80U
42
43 #define FDP1_MAX_W              3840U
44 #define FDP1_MAX_H              2160U
45
46 #define FDP1_MAX_PLANES         3U
47 #define FDP1_MAX_STRIDE         8190U
48
49 /* Flags that indicate a format can be used for capture/output */
50 #define FDP1_CAPTURE            BIT(0)
51 #define FDP1_OUTPUT             BIT(1)
52
53 #define DRIVER_NAME             "rcar_fdp1"
54
55 /* Number of Job's to have available on the processing queue */
56 #define FDP1_NUMBER_JOBS 8
57
58 #define dprintk(fdp1, fmt, arg...) \
59         v4l2_dbg(1, debug, &fdp1->v4l2_dev, "%s: " fmt, __func__, ## arg)
60
61 /*
62  * FDP1 registers and bits
63  */
64
65 /* FDP1 start register - Imm */
66 #define FD1_CTL_CMD                     0x0000
67 #define FD1_CTL_CMD_STRCMD              BIT(0)
68
69 /* Sync generator register - Imm */
70 #define FD1_CTL_SGCMD                   0x0004
71 #define FD1_CTL_SGCMD_SGEN              BIT(0)
72
73 /* Register set end register - Imm */
74 #define FD1_CTL_REGEND                  0x0008
75 #define FD1_CTL_REGEND_REGEND           BIT(0)
76
77 /* Channel activation register - Vupdt */
78 #define FD1_CTL_CHACT                   0x000c
79 #define FD1_CTL_CHACT_SMW               BIT(9)
80 #define FD1_CTL_CHACT_WR                BIT(8)
81 #define FD1_CTL_CHACT_SMR               BIT(3)
82 #define FD1_CTL_CHACT_RD2               BIT(2)
83 #define FD1_CTL_CHACT_RD1               BIT(1)
84 #define FD1_CTL_CHACT_RD0               BIT(0)
85
86 /* Operation Mode Register - Vupdt */
87 #define FD1_CTL_OPMODE                  0x0010
88 #define FD1_CTL_OPMODE_PRG              BIT(4)
89 #define FD1_CTL_OPMODE_VIMD_INTERRUPT   (0 << 0)
90 #define FD1_CTL_OPMODE_VIMD_BESTEFFORT  (1 << 0)
91 #define FD1_CTL_OPMODE_VIMD_NOINTERRUPT (2 << 0)
92
93 #define FD1_CTL_VPERIOD                 0x0014
94 #define FD1_CTL_CLKCTRL                 0x0018
95 #define FD1_CTL_CLKCTRL_CSTP_N          BIT(0)
96
97 /* Software reset register */
98 #define FD1_CTL_SRESET                  0x001c
99 #define FD1_CTL_SRESET_SRST             BIT(0)
100
101 /* Control status register (V-update-status) */
102 #define FD1_CTL_STATUS                  0x0024
103 #define FD1_CTL_STATUS_VINT_CNT_MASK    GENMASK(31, 16)
104 #define FD1_CTL_STATUS_VINT_CNT_SHIFT   16
105 #define FD1_CTL_STATUS_SGREGSET         BIT(10)
106 #define FD1_CTL_STATUS_SGVERR           BIT(9)
107 #define FD1_CTL_STATUS_SGFREND          BIT(8)
108 #define FD1_CTL_STATUS_BSY              BIT(0)
109
110 #define FD1_CTL_VCYCLE_STAT             0x0028
111
112 /* Interrupt enable register */
113 #define FD1_CTL_IRQENB                  0x0038
114 /* Interrupt status register */
115 #define FD1_CTL_IRQSTA                  0x003c
116 /* Interrupt control register */
117 #define FD1_CTL_IRQFSET                 0x0040
118
119 /* Common IRQ Bit settings */
120 #define FD1_CTL_IRQ_VERE                BIT(16)
121 #define FD1_CTL_IRQ_VINTE               BIT(4)
122 #define FD1_CTL_IRQ_FREE                BIT(0)
123 #define FD1_CTL_IRQ_MASK                (FD1_CTL_IRQ_VERE | \
124                                          FD1_CTL_IRQ_VINTE | \
125                                          FD1_CTL_IRQ_FREE)
126
127 /* RPF */
128 #define FD1_RPF_SIZE                    0x0060
129 #define FD1_RPF_SIZE_MASK               GENMASK(12, 0)
130 #define FD1_RPF_SIZE_H_SHIFT            16
131 #define FD1_RPF_SIZE_V_SHIFT            0
132
133 #define FD1_RPF_FORMAT                  0x0064
134 #define FD1_RPF_FORMAT_CIPM             BIT(16)
135 #define FD1_RPF_FORMAT_RSPYCS           BIT(13)
136 #define FD1_RPF_FORMAT_RSPUVS           BIT(12)
137 #define FD1_RPF_FORMAT_CF               BIT(8)
138
139 #define FD1_RPF_PSTRIDE                 0x0068
140 #define FD1_RPF_PSTRIDE_Y_SHIFT         16
141 #define FD1_RPF_PSTRIDE_C_SHIFT         0
142
143 /* RPF0 Source Component Y Address register */
144 #define FD1_RPF0_ADDR_Y                 0x006c
145
146 /* RPF1 Current Picture Registers */
147 #define FD1_RPF1_ADDR_Y                 0x0078
148 #define FD1_RPF1_ADDR_C0                0x007c
149 #define FD1_RPF1_ADDR_C1                0x0080
150
151 /* RPF2 next picture register */
152 #define FD1_RPF2_ADDR_Y                 0x0084
153
154 #define FD1_RPF_SMSK_ADDR               0x0090
155 #define FD1_RPF_SWAP                    0x0094
156
157 /* WPF */
158 #define FD1_WPF_FORMAT                  0x00c0
159 #define FD1_WPF_FORMAT_PDV_SHIFT        24
160 #define FD1_WPF_FORMAT_FCNL             BIT(20)
161 #define FD1_WPF_FORMAT_WSPYCS           BIT(15)
162 #define FD1_WPF_FORMAT_WSPUVS           BIT(14)
163 #define FD1_WPF_FORMAT_WRTM_601_16      (0 << 9)
164 #define FD1_WPF_FORMAT_WRTM_601_0       (1 << 9)
165 #define FD1_WPF_FORMAT_WRTM_709_16      (2 << 9)
166 #define FD1_WPF_FORMAT_CSC              BIT(8)
167
168 #define FD1_WPF_RNDCTL                  0x00c4
169 #define FD1_WPF_RNDCTL_CBRM             BIT(28)
170 #define FD1_WPF_RNDCTL_CLMD_NOCLIP      (0 << 12)
171 #define FD1_WPF_RNDCTL_CLMD_CLIP_16_235 (1 << 12)
172 #define FD1_WPF_RNDCTL_CLMD_CLIP_1_254  (2 << 12)
173
174 #define FD1_WPF_PSTRIDE                 0x00c8
175 #define FD1_WPF_PSTRIDE_Y_SHIFT         16
176 #define FD1_WPF_PSTRIDE_C_SHIFT         0
177
178 /* WPF Destination picture */
179 #define FD1_WPF_ADDR_Y                  0x00cc
180 #define FD1_WPF_ADDR_C0                 0x00d0
181 #define FD1_WPF_ADDR_C1                 0x00d4
182 #define FD1_WPF_SWAP                    0x00d8
183 #define FD1_WPF_SWAP_OSWAP_SHIFT        0
184 #define FD1_WPF_SWAP_SSWAP_SHIFT        4
185
186 /* WPF/RPF Common */
187 #define FD1_RWPF_SWAP_BYTE              BIT(0)
188 #define FD1_RWPF_SWAP_WORD              BIT(1)
189 #define FD1_RWPF_SWAP_LWRD              BIT(2)
190 #define FD1_RWPF_SWAP_LLWD              BIT(3)
191
192 /* IPC */
193 #define FD1_IPC_MODE                    0x0100
194 #define FD1_IPC_MODE_DLI                BIT(8)
195 #define FD1_IPC_MODE_DIM_ADAPT2D3D      (0 << 0)
196 #define FD1_IPC_MODE_DIM_FIXED2D        (1 << 0)
197 #define FD1_IPC_MODE_DIM_FIXED3D        (2 << 0)
198 #define FD1_IPC_MODE_DIM_PREVFIELD      (3 << 0)
199 #define FD1_IPC_MODE_DIM_NEXTFIELD      (4 << 0)
200
201 #define FD1_IPC_SMSK_THRESH             0x0104
202 #define FD1_IPC_SMSK_THRESH_CONST       0x00010002
203
204 #define FD1_IPC_COMB_DET                0x0108
205 #define FD1_IPC_COMB_DET_CONST          0x00200040
206
207 #define FD1_IPC_MOTDEC                  0x010c
208 #define FD1_IPC_MOTDEC_CONST            0x00008020
209
210 /* DLI registers */
211 #define FD1_IPC_DLI_BLEND               0x0120
212 #define FD1_IPC_DLI_BLEND_CONST         0x0080ff02
213
214 #define FD1_IPC_DLI_HGAIN               0x0124
215 #define FD1_IPC_DLI_HGAIN_CONST         0x001000ff
216
217 #define FD1_IPC_DLI_SPRS                0x0128
218 #define FD1_IPC_DLI_SPRS_CONST          0x009004ff
219
220 #define FD1_IPC_DLI_ANGLE               0x012c
221 #define FD1_IPC_DLI_ANGLE_CONST         0x0004080c
222
223 #define FD1_IPC_DLI_ISOPIX0             0x0130
224 #define FD1_IPC_DLI_ISOPIX0_CONST       0xff10ff10
225
226 #define FD1_IPC_DLI_ISOPIX1             0x0134
227 #define FD1_IPC_DLI_ISOPIX1_CONST       0x0000ff10
228
229 /* Sensor registers */
230 #define FD1_IPC_SENSOR_TH0              0x0140
231 #define FD1_IPC_SENSOR_TH0_CONST        0x20208080
232
233 #define FD1_IPC_SENSOR_TH1              0x0144
234 #define FD1_IPC_SENSOR_TH1_CONST        0
235
236 #define FD1_IPC_SENSOR_CTL0             0x0170
237 #define FD1_IPC_SENSOR_CTL0_CONST       0x00002201
238
239 #define FD1_IPC_SENSOR_CTL1             0x0174
240 #define FD1_IPC_SENSOR_CTL1_CONST       0
241
242 #define FD1_IPC_SENSOR_CTL2             0x0178
243 #define FD1_IPC_SENSOR_CTL2_X_SHIFT     16
244 #define FD1_IPC_SENSOR_CTL2_Y_SHIFT     0
245
246 #define FD1_IPC_SENSOR_CTL3             0x017c
247 #define FD1_IPC_SENSOR_CTL3_0_SHIFT     16
248 #define FD1_IPC_SENSOR_CTL3_1_SHIFT     0
249
250 /* Line memory pixel number register */
251 #define FD1_IPC_LMEM                    0x01e0
252 #define FD1_IPC_LMEM_LINEAR             1024
253 #define FD1_IPC_LMEM_TILE               960
254
255 /* Internal Data (HW Version) */
256 #define FD1_IP_INTDATA                  0x0800
257 /* R-Car Gen2 HW manual says zero, but actual value matches R-Car H3 ES1.x */
258 #define FD1_IP_GEN2                     0x02010101
259 #define FD1_IP_M3W                      0x02010202
260 #define FD1_IP_H3                       0x02010203
261 #define FD1_IP_M3N                      0x02010204
262 #define FD1_IP_E3                       0x02010205
263
264 /* LUTs */
265 #define FD1_LUT_DIF_ADJ                 0x1000
266 #define FD1_LUT_SAD_ADJ                 0x1400
267 #define FD1_LUT_BLD_GAIN                0x1800
268 #define FD1_LUT_DIF_GAIN                0x1c00
269 #define FD1_LUT_MDET                    0x2000
270
271 /**
272  * struct fdp1_fmt - The FDP1 internal format data
273  * @fourcc: the fourcc code, to match the V4L2 API
274  * @bpp: bits per pixel per plane
275  * @num_planes: number of planes
276  * @hsub: horizontal subsampling factor
277  * @vsub: vertical subsampling factor
278  * @fmt: 7-bit format code for the fdp1 hardware
279  * @swap_yc: the Y and C components are swapped (Y comes before C)
280  * @swap_uv: the U and V components are swapped (V comes before U)
281  * @swap: swap register control
282  * @types: types of queue this format is applicable to
283  */
284 struct fdp1_fmt {
285         u32     fourcc;
286         u8      bpp[3];
287         u8      num_planes;
288         u8      hsub;
289         u8      vsub;
290         u8      fmt;
291         bool    swap_yc;
292         bool    swap_uv;
293         u8      swap;
294         u8      types;
295 };
296
297 static const struct fdp1_fmt fdp1_formats[] = {
298         /* RGB formats are only supported by the Write Pixel Formatter */
299
300         { V4L2_PIX_FMT_RGB332, { 8, 0, 0 }, 1, 1, 1, 0x00, false, false,
301           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
302           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
303           FDP1_CAPTURE },
304         { V4L2_PIX_FMT_XRGB444, { 16, 0, 0 }, 1, 1, 1, 0x01, false, false,
305           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
306           FD1_RWPF_SWAP_WORD,
307           FDP1_CAPTURE },
308         { V4L2_PIX_FMT_XRGB555, { 16, 0, 0 }, 1, 1, 1, 0x04, false, false,
309           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
310           FD1_RWPF_SWAP_WORD,
311           FDP1_CAPTURE },
312         { V4L2_PIX_FMT_RGB565, { 16, 0, 0 }, 1, 1, 1, 0x06, false, false,
313           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
314           FD1_RWPF_SWAP_WORD,
315           FDP1_CAPTURE },
316         { V4L2_PIX_FMT_ABGR32, { 32, 0, 0 }, 1, 1, 1, 0x13, false, false,
317           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD,
318           FDP1_CAPTURE },
319         { V4L2_PIX_FMT_XBGR32, { 32, 0, 0 }, 1, 1, 1, 0x13, false, false,
320           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD,
321           FDP1_CAPTURE },
322         { V4L2_PIX_FMT_ARGB32, { 32, 0, 0 }, 1, 1, 1, 0x13, false, false,
323           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
324           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
325           FDP1_CAPTURE },
326         { V4L2_PIX_FMT_XRGB32, { 32, 0, 0 }, 1, 1, 1, 0x13, false, false,
327           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
328           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
329           FDP1_CAPTURE },
330         { V4L2_PIX_FMT_RGB24, { 24, 0, 0 }, 1, 1, 1, 0x15, false, false,
331           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
332           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
333           FDP1_CAPTURE },
334         { V4L2_PIX_FMT_BGR24, { 24, 0, 0 }, 1, 1, 1, 0x18, false, false,
335           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
336           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
337           FDP1_CAPTURE },
338         { V4L2_PIX_FMT_ARGB444, { 16, 0, 0 }, 1, 1, 1, 0x19, false, false,
339           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
340           FD1_RWPF_SWAP_WORD,
341           FDP1_CAPTURE },
342         { V4L2_PIX_FMT_ARGB555, { 16, 0, 0 }, 1, 1, 1, 0x1b, false, false,
343           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
344           FD1_RWPF_SWAP_WORD,
345           FDP1_CAPTURE },
346
347         /* YUV Formats are supported by Read and Write Pixel Formatters */
348
349         { V4L2_PIX_FMT_NV16M, { 8, 16, 0 }, 2, 2, 1, 0x41, false, false,
350           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
351           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
352           FDP1_CAPTURE | FDP1_OUTPUT },
353         { V4L2_PIX_FMT_NV61M, { 8, 16, 0 }, 2, 2, 1, 0x41, false, true,
354           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
355           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
356           FDP1_CAPTURE | FDP1_OUTPUT },
357         { V4L2_PIX_FMT_NV12M, { 8, 16, 0 }, 2, 2, 2, 0x42, false, false,
358           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
359           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
360           FDP1_CAPTURE | FDP1_OUTPUT },
361         { V4L2_PIX_FMT_NV21M, { 8, 16, 0 }, 2, 2, 2, 0x42, false, true,
362           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
363           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
364           FDP1_CAPTURE | FDP1_OUTPUT },
365         { V4L2_PIX_FMT_UYVY, { 16, 0, 0 }, 1, 2, 1, 0x47, false, false,
366           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
367           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
368           FDP1_CAPTURE | FDP1_OUTPUT },
369         { V4L2_PIX_FMT_VYUY, { 16, 0, 0 }, 1, 2, 1, 0x47, false, true,
370           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
371           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
372           FDP1_CAPTURE | FDP1_OUTPUT },
373         { V4L2_PIX_FMT_YUYV, { 16, 0, 0 }, 1, 2, 1, 0x47, true, false,
374           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
375           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
376           FDP1_CAPTURE | FDP1_OUTPUT },
377         { V4L2_PIX_FMT_YVYU, { 16, 0, 0 }, 1, 2, 1, 0x47, true, true,
378           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
379           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
380           FDP1_CAPTURE | FDP1_OUTPUT },
381         { V4L2_PIX_FMT_YUV444M, { 8, 8, 8 }, 3, 1, 1, 0x4a, false, false,
382           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
383           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
384           FDP1_CAPTURE | FDP1_OUTPUT },
385         { V4L2_PIX_FMT_YVU444M, { 8, 8, 8 }, 3, 1, 1, 0x4a, false, true,
386           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
387           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
388           FDP1_CAPTURE | FDP1_OUTPUT },
389         { V4L2_PIX_FMT_YUV422M, { 8, 8, 8 }, 3, 2, 1, 0x4b, false, false,
390           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
391           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
392           FDP1_CAPTURE | FDP1_OUTPUT },
393         { V4L2_PIX_FMT_YVU422M, { 8, 8, 8 }, 3, 2, 1, 0x4b, false, true,
394           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
395           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
396           FDP1_CAPTURE | FDP1_OUTPUT },
397         { V4L2_PIX_FMT_YUV420M, { 8, 8, 8 }, 3, 2, 2, 0x4c, false, false,
398           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
399           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
400           FDP1_CAPTURE | FDP1_OUTPUT },
401         { V4L2_PIX_FMT_YVU420M, { 8, 8, 8 }, 3, 2, 2, 0x4c, false, true,
402           FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
403           FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
404           FDP1_CAPTURE | FDP1_OUTPUT },
405 };
406
407 static int fdp1_fmt_is_rgb(const struct fdp1_fmt *fmt)
408 {
409         return fmt->fmt <= 0x1b; /* Last RGB code */
410 }
411
412 /*
413  * FDP1 Lookup tables range from 0...255 only
414  *
415  * Each table must be less than 256 entries, and all tables
416  * are padded out to 256 entries by duplicating the last value.
417  */
418 static const u8 fdp1_diff_adj[] = {
419         0x00, 0x24, 0x43, 0x5e, 0x76, 0x8c, 0x9e, 0xaf,
420         0xbd, 0xc9, 0xd4, 0xdd, 0xe4, 0xea, 0xef, 0xf3,
421         0xf6, 0xf9, 0xfb, 0xfc, 0xfd, 0xfe, 0xfe, 0xff,
422 };
423
424 static const u8 fdp1_sad_adj[] = {
425         0x00, 0x24, 0x43, 0x5e, 0x76, 0x8c, 0x9e, 0xaf,
426         0xbd, 0xc9, 0xd4, 0xdd, 0xe4, 0xea, 0xef, 0xf3,
427         0xf6, 0xf9, 0xfb, 0xfc, 0xfd, 0xfe, 0xfe, 0xff,
428 };
429
430 static const u8 fdp1_bld_gain[] = {
431         0x80,
432 };
433
434 static const u8 fdp1_dif_gain[] = {
435         0x80,
436 };
437
438 static const u8 fdp1_mdet[] = {
439         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
440         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
441         0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
442         0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
443         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
444         0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
445         0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
446         0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
447         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
448         0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
449         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
450         0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
451         0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
452         0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
453         0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
454         0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
455         0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
456         0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
457         0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
458         0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
459         0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
460         0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
461         0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
462         0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
463         0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
464         0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
465         0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
466         0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
467         0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
468         0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
469         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
470         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
471 };
472
473 /* Per-queue, driver-specific private data */
474 struct fdp1_q_data {
475         const struct fdp1_fmt           *fmt;
476         struct v4l2_pix_format_mplane   format;
477
478         unsigned int                    vsize;
479         unsigned int                    stride_y;
480         unsigned int                    stride_c;
481 };
482
483 static const struct fdp1_fmt *fdp1_find_format(u32 pixelformat)
484 {
485         const struct fdp1_fmt *fmt;
486         unsigned int i;
487
488         for (i = 0; i < ARRAY_SIZE(fdp1_formats); i++) {
489                 fmt = &fdp1_formats[i];
490                 if (fmt->fourcc == pixelformat)
491                         return fmt;
492         }
493
494         return NULL;
495 }
496
497 enum fdp1_deint_mode {
498         FDP1_PROGRESSIVE = 0, /* Must be zero when !deinterlacing */
499         FDP1_ADAPT2D3D,
500         FDP1_FIXED2D,
501         FDP1_FIXED3D,
502         FDP1_PREVFIELD,
503         FDP1_NEXTFIELD,
504 };
505
506 #define FDP1_DEINT_MODE_USES_NEXT(mode) \
507         (mode == FDP1_ADAPT2D3D || \
508          mode == FDP1_FIXED3D   || \
509          mode == FDP1_NEXTFIELD)
510
511 #define FDP1_DEINT_MODE_USES_PREV(mode) \
512         (mode == FDP1_ADAPT2D3D || \
513          mode == FDP1_FIXED3D   || \
514          mode == FDP1_PREVFIELD)
515
516 /*
517  * FDP1 operates on potentially 3 fields, which are tracked
518  * from the VB buffers using this context structure.
519  * Will always be a field or a full frame, never two fields.
520  */
521 struct fdp1_field_buffer {
522         struct vb2_v4l2_buffer          *vb;
523         dma_addr_t                      addrs[3];
524
525         /* Should be NONE:TOP:BOTTOM only */
526         enum v4l2_field                 field;
527
528         /* Flag to indicate this is the last field in the vb */
529         bool                            last_field;
530
531         /* Buffer queue lists */
532         struct list_head                list;
533 };
534
535 struct fdp1_buffer {
536         struct v4l2_m2m_buffer          m2m_buf;
537         struct fdp1_field_buffer        fields[2];
538         unsigned int                    num_fields;
539 };
540
541 static inline struct fdp1_buffer *to_fdp1_buffer(struct vb2_v4l2_buffer *vb)
542 {
543         return container_of(vb, struct fdp1_buffer, m2m_buf.vb);
544 }
545
546 struct fdp1_job {
547         struct fdp1_field_buffer        *previous;
548         struct fdp1_field_buffer        *active;
549         struct fdp1_field_buffer        *next;
550         struct fdp1_field_buffer        *dst;
551
552         /* A job can only be on one list at a time */
553         struct list_head                list;
554 };
555
556 struct fdp1_dev {
557         struct v4l2_device              v4l2_dev;
558         struct video_device             vfd;
559
560         struct mutex                    dev_mutex;
561         spinlock_t                      irqlock;
562         spinlock_t                      device_process_lock;
563
564         void __iomem                    *regs;
565         unsigned int                    irq;
566         struct device                   *dev;
567
568         /* Job Queues */
569         struct fdp1_job                 jobs[FDP1_NUMBER_JOBS];
570         struct list_head                free_job_list;
571         struct list_head                queued_job_list;
572         struct list_head                hw_job_list;
573
574         unsigned int                    clk_rate;
575
576         struct rcar_fcp_device          *fcp;
577         struct v4l2_m2m_dev             *m2m_dev;
578 };
579
580 struct fdp1_ctx {
581         struct v4l2_fh                  fh;
582         struct fdp1_dev                 *fdp1;
583
584         struct v4l2_ctrl_handler        hdl;
585         unsigned int                    sequence;
586
587         /* Processed buffers in this transaction */
588         u8                              num_processed;
589
590         /* Transaction length (i.e. how many buffers per transaction) */
591         u32                             translen;
592
593         /* Abort requested by m2m */
594         int                             aborting;
595
596         /* Deinterlace processing mode */
597         enum fdp1_deint_mode            deint_mode;
598
599         /*
600          * Adaptive 2D/3D mode uses a shared mask
601          * This is allocated at streamon, if the ADAPT2D3D mode
602          * is requested
603          */
604         unsigned int                    smsk_size;
605         dma_addr_t                      smsk_addr[2];
606         void                            *smsk_cpu;
607
608         /* Capture pipeline, can specify an alpha value
609          * for supported formats. 0-255 only
610          */
611         unsigned char                   alpha;
612
613         /* Source and destination queue data */
614         struct fdp1_q_data              out_q; /* HW Source */
615         struct fdp1_q_data              cap_q; /* HW Destination */
616
617         /*
618          * Field Queues
619          * Interlaced fields are used on 3 occasions, and tracked in this list.
620          *
621          * V4L2 Buffers are tracked inside the fdp1_buffer
622          * and released when the last 'field' completes
623          */
624         struct list_head                fields_queue;
625         unsigned int                    buffers_queued;
626
627         /*
628          * For de-interlacing we need to track our previous buffer
629          * while preparing our job lists.
630          */
631         struct fdp1_field_buffer        *previous;
632 };
633
634 static inline struct fdp1_ctx *fh_to_ctx(struct v4l2_fh *fh)
635 {
636         return container_of(fh, struct fdp1_ctx, fh);
637 }
638
639 static struct fdp1_q_data *get_q_data(struct fdp1_ctx *ctx,
640                                          enum v4l2_buf_type type)
641 {
642         if (V4L2_TYPE_IS_OUTPUT(type))
643                 return &ctx->out_q;
644         else
645                 return &ctx->cap_q;
646 }
647
648 /*
649  * list_remove_job: Take the first item off the specified job list
650  *
651  * Returns: pointer to a job, or NULL if the list is empty.
652  */
653 static struct fdp1_job *list_remove_job(struct fdp1_dev *fdp1,
654                                          struct list_head *list)
655 {
656         struct fdp1_job *job;
657         unsigned long flags;
658
659         spin_lock_irqsave(&fdp1->irqlock, flags);
660         job = list_first_entry_or_null(list, struct fdp1_job, list);
661         if (job)
662                 list_del(&job->list);
663         spin_unlock_irqrestore(&fdp1->irqlock, flags);
664
665         return job;
666 }
667
668 /*
669  * list_add_job: Add a job to the specified job list
670  *
671  * Returns: void - always succeeds
672  */
673 static void list_add_job(struct fdp1_dev *fdp1,
674                          struct list_head *list,
675                          struct fdp1_job *job)
676 {
677         unsigned long flags;
678
679         spin_lock_irqsave(&fdp1->irqlock, flags);
680         list_add_tail(&job->list, list);
681         spin_unlock_irqrestore(&fdp1->irqlock, flags);
682 }
683
684 static struct fdp1_job *fdp1_job_alloc(struct fdp1_dev *fdp1)
685 {
686         return list_remove_job(fdp1, &fdp1->free_job_list);
687 }
688
689 static void fdp1_job_free(struct fdp1_dev *fdp1, struct fdp1_job *job)
690 {
691         /* Ensure that all residue from previous jobs is gone */
692         memset(job, 0, sizeof(struct fdp1_job));
693
694         list_add_job(fdp1, &fdp1->free_job_list, job);
695 }
696
697 static void queue_job(struct fdp1_dev *fdp1, struct fdp1_job *job)
698 {
699         list_add_job(fdp1, &fdp1->queued_job_list, job);
700 }
701
702 static struct fdp1_job *get_queued_job(struct fdp1_dev *fdp1)
703 {
704         return list_remove_job(fdp1, &fdp1->queued_job_list);
705 }
706
707 static void queue_hw_job(struct fdp1_dev *fdp1, struct fdp1_job *job)
708 {
709         list_add_job(fdp1, &fdp1->hw_job_list, job);
710 }
711
712 static struct fdp1_job *get_hw_queued_job(struct fdp1_dev *fdp1)
713 {
714         return list_remove_job(fdp1, &fdp1->hw_job_list);
715 }
716
717 /*
718  * Buffer lists handling
719  */
720 static void fdp1_field_complete(struct fdp1_ctx *ctx,
721                                 struct fdp1_field_buffer *fbuf)
722 {
723         /* job->previous may be on the first field */
724         if (!fbuf)
725                 return;
726
727         if (fbuf->last_field)
728                 v4l2_m2m_buf_done(fbuf->vb, VB2_BUF_STATE_DONE);
729 }
730
731 static void fdp1_queue_field(struct fdp1_ctx *ctx,
732                              struct fdp1_field_buffer *fbuf)
733 {
734         unsigned long flags;
735
736         spin_lock_irqsave(&ctx->fdp1->irqlock, flags);
737         list_add_tail(&fbuf->list, &ctx->fields_queue);
738         spin_unlock_irqrestore(&ctx->fdp1->irqlock, flags);
739
740         ctx->buffers_queued++;
741 }
742
743 static struct fdp1_field_buffer *fdp1_dequeue_field(struct fdp1_ctx *ctx)
744 {
745         struct fdp1_field_buffer *fbuf;
746         unsigned long flags;
747
748         ctx->buffers_queued--;
749
750         spin_lock_irqsave(&ctx->fdp1->irqlock, flags);
751         fbuf = list_first_entry_or_null(&ctx->fields_queue,
752                                         struct fdp1_field_buffer, list);
753         if (fbuf)
754                 list_del(&fbuf->list);
755         spin_unlock_irqrestore(&ctx->fdp1->irqlock, flags);
756
757         return fbuf;
758 }
759
760 /*
761  * Return the next field in the queue - or NULL,
762  * without removing the item from the list
763  */
764 static struct fdp1_field_buffer *fdp1_peek_queued_field(struct fdp1_ctx *ctx)
765 {
766         struct fdp1_field_buffer *fbuf;
767         unsigned long flags;
768
769         spin_lock_irqsave(&ctx->fdp1->irqlock, flags);
770         fbuf = list_first_entry_or_null(&ctx->fields_queue,
771                                         struct fdp1_field_buffer, list);
772         spin_unlock_irqrestore(&ctx->fdp1->irqlock, flags);
773
774         return fbuf;
775 }
776
777 static u32 fdp1_read(struct fdp1_dev *fdp1, unsigned int reg)
778 {
779         u32 value = ioread32(fdp1->regs + reg);
780
781         if (debug >= 2)
782                 dprintk(fdp1, "Read 0x%08x from 0x%04x\n", value, reg);
783
784         return value;
785 }
786
787 static void fdp1_write(struct fdp1_dev *fdp1, u32 val, unsigned int reg)
788 {
789         if (debug >= 2)
790                 dprintk(fdp1, "Write 0x%08x to 0x%04x\n", val, reg);
791
792         iowrite32(val, fdp1->regs + reg);
793 }
794
795 /* IPC registers are to be programmed with constant values */
796 static void fdp1_set_ipc_dli(struct fdp1_ctx *ctx)
797 {
798         struct fdp1_dev *fdp1 = ctx->fdp1;
799
800         fdp1_write(fdp1, FD1_IPC_SMSK_THRESH_CONST,     FD1_IPC_SMSK_THRESH);
801         fdp1_write(fdp1, FD1_IPC_COMB_DET_CONST,        FD1_IPC_COMB_DET);
802         fdp1_write(fdp1, FD1_IPC_MOTDEC_CONST,  FD1_IPC_MOTDEC);
803
804         fdp1_write(fdp1, FD1_IPC_DLI_BLEND_CONST,       FD1_IPC_DLI_BLEND);
805         fdp1_write(fdp1, FD1_IPC_DLI_HGAIN_CONST,       FD1_IPC_DLI_HGAIN);
806         fdp1_write(fdp1, FD1_IPC_DLI_SPRS_CONST,        FD1_IPC_DLI_SPRS);
807         fdp1_write(fdp1, FD1_IPC_DLI_ANGLE_CONST,       FD1_IPC_DLI_ANGLE);
808         fdp1_write(fdp1, FD1_IPC_DLI_ISOPIX0_CONST,     FD1_IPC_DLI_ISOPIX0);
809         fdp1_write(fdp1, FD1_IPC_DLI_ISOPIX1_CONST,     FD1_IPC_DLI_ISOPIX1);
810 }
811
812
813 static void fdp1_set_ipc_sensor(struct fdp1_ctx *ctx)
814 {
815         struct fdp1_dev *fdp1 = ctx->fdp1;
816         struct fdp1_q_data *src_q_data = &ctx->out_q;
817         unsigned int x0, x1;
818         unsigned int hsize = src_q_data->format.width;
819         unsigned int vsize = src_q_data->format.height;
820
821         x0 = hsize / 3;
822         x1 = 2 * hsize / 3;
823
824         fdp1_write(fdp1, FD1_IPC_SENSOR_TH0_CONST, FD1_IPC_SENSOR_TH0);
825         fdp1_write(fdp1, FD1_IPC_SENSOR_TH1_CONST, FD1_IPC_SENSOR_TH1);
826         fdp1_write(fdp1, FD1_IPC_SENSOR_CTL0_CONST, FD1_IPC_SENSOR_CTL0);
827         fdp1_write(fdp1, FD1_IPC_SENSOR_CTL1_CONST, FD1_IPC_SENSOR_CTL1);
828
829         fdp1_write(fdp1, ((hsize - 1) << FD1_IPC_SENSOR_CTL2_X_SHIFT) |
830                          ((vsize - 1) << FD1_IPC_SENSOR_CTL2_Y_SHIFT),
831                          FD1_IPC_SENSOR_CTL2);
832
833         fdp1_write(fdp1, (x0 << FD1_IPC_SENSOR_CTL3_0_SHIFT) |
834                          (x1 << FD1_IPC_SENSOR_CTL3_1_SHIFT),
835                          FD1_IPC_SENSOR_CTL3);
836 }
837
838 /*
839  * fdp1_write_lut: Write a padded LUT to the hw
840  *
841  * FDP1 uses constant data for de-interlacing processing,
842  * with large tables. These hardware tables are all 256 bytes
843  * long, however they often contain repeated data at the end.
844  *
845  * The last byte of the table is written to all remaining entries.
846  */
847 static void fdp1_write_lut(struct fdp1_dev *fdp1, const u8 *lut,
848                            unsigned int len, unsigned int base)
849 {
850         unsigned int i;
851         u8 pad;
852
853         /* Tables larger than the hw are clipped */
854         len = min(len, 256u);
855
856         for (i = 0; i < len; i++)
857                 fdp1_write(fdp1, lut[i], base + (i*4));
858
859         /* Tables are padded with the last entry */
860         pad = lut[i-1];
861
862         for (; i < 256; i++)
863                 fdp1_write(fdp1, pad, base + (i*4));
864 }
865
866 static void fdp1_set_lut(struct fdp1_dev *fdp1)
867 {
868         fdp1_write_lut(fdp1, fdp1_diff_adj, ARRAY_SIZE(fdp1_diff_adj),
869                         FD1_LUT_DIF_ADJ);
870         fdp1_write_lut(fdp1, fdp1_sad_adj,  ARRAY_SIZE(fdp1_sad_adj),
871                         FD1_LUT_SAD_ADJ);
872         fdp1_write_lut(fdp1, fdp1_bld_gain, ARRAY_SIZE(fdp1_bld_gain),
873                         FD1_LUT_BLD_GAIN);
874         fdp1_write_lut(fdp1, fdp1_dif_gain, ARRAY_SIZE(fdp1_dif_gain),
875                         FD1_LUT_DIF_GAIN);
876         fdp1_write_lut(fdp1, fdp1_mdet, ARRAY_SIZE(fdp1_mdet),
877                         FD1_LUT_MDET);
878 }
879
880 static void fdp1_configure_rpf(struct fdp1_ctx *ctx,
881                                struct fdp1_job *job)
882 {
883         struct fdp1_dev *fdp1 = ctx->fdp1;
884         u32 picture_size;
885         u32 pstride;
886         u32 format;
887         u32 smsk_addr;
888
889         struct fdp1_q_data *q_data = &ctx->out_q;
890
891         /* Picture size is common to Source and Destination frames */
892         picture_size = (q_data->format.width << FD1_RPF_SIZE_H_SHIFT)
893                      | (q_data->vsize << FD1_RPF_SIZE_V_SHIFT);
894
895         /* Strides */
896         pstride = q_data->stride_y << FD1_RPF_PSTRIDE_Y_SHIFT;
897         if (q_data->format.num_planes > 1)
898                 pstride |= q_data->stride_c << FD1_RPF_PSTRIDE_C_SHIFT;
899
900         /* Format control */
901         format = q_data->fmt->fmt;
902         if (q_data->fmt->swap_yc)
903                 format |= FD1_RPF_FORMAT_RSPYCS;
904
905         if (q_data->fmt->swap_uv)
906                 format |= FD1_RPF_FORMAT_RSPUVS;
907
908         if (job->active->field == V4L2_FIELD_BOTTOM) {
909                 format |= FD1_RPF_FORMAT_CF; /* Set for Bottom field */
910                 smsk_addr = ctx->smsk_addr[0];
911         } else {
912                 smsk_addr = ctx->smsk_addr[1];
913         }
914
915         /* Deint mode is non-zero when deinterlacing */
916         if (ctx->deint_mode)
917                 format |= FD1_RPF_FORMAT_CIPM;
918
919         fdp1_write(fdp1, format, FD1_RPF_FORMAT);
920         fdp1_write(fdp1, q_data->fmt->swap, FD1_RPF_SWAP);
921         fdp1_write(fdp1, picture_size, FD1_RPF_SIZE);
922         fdp1_write(fdp1, pstride, FD1_RPF_PSTRIDE);
923         fdp1_write(fdp1, smsk_addr, FD1_RPF_SMSK_ADDR);
924
925         /* Previous Field Channel (CH0) */
926         if (job->previous)
927                 fdp1_write(fdp1, job->previous->addrs[0], FD1_RPF0_ADDR_Y);
928
929         /* Current Field Channel (CH1) */
930         fdp1_write(fdp1, job->active->addrs[0], FD1_RPF1_ADDR_Y);
931         fdp1_write(fdp1, job->active->addrs[1], FD1_RPF1_ADDR_C0);
932         fdp1_write(fdp1, job->active->addrs[2], FD1_RPF1_ADDR_C1);
933
934         /* Next Field  Channel (CH2) */
935         if (job->next)
936                 fdp1_write(fdp1, job->next->addrs[0], FD1_RPF2_ADDR_Y);
937 }
938
939 static void fdp1_configure_wpf(struct fdp1_ctx *ctx,
940                                struct fdp1_job *job)
941 {
942         struct fdp1_dev *fdp1 = ctx->fdp1;
943         struct fdp1_q_data *src_q_data = &ctx->out_q;
944         struct fdp1_q_data *q_data = &ctx->cap_q;
945         u32 pstride;
946         u32 format;
947         u32 swap;
948         u32 rndctl;
949
950         pstride = q_data->format.plane_fmt[0].bytesperline
951                 << FD1_WPF_PSTRIDE_Y_SHIFT;
952
953         if (q_data->format.num_planes > 1)
954                 pstride |= q_data->format.plane_fmt[1].bytesperline
955                         << FD1_WPF_PSTRIDE_C_SHIFT;
956
957         format = q_data->fmt->fmt; /* Output Format Code */
958
959         if (q_data->fmt->swap_yc)
960                 format |= FD1_WPF_FORMAT_WSPYCS;
961
962         if (q_data->fmt->swap_uv)
963                 format |= FD1_WPF_FORMAT_WSPUVS;
964
965         if (fdp1_fmt_is_rgb(q_data->fmt)) {
966                 /* Enable Colour Space conversion */
967                 format |= FD1_WPF_FORMAT_CSC;
968
969                 /* Set WRTM */
970                 if (src_q_data->format.ycbcr_enc == V4L2_YCBCR_ENC_709)
971                         format |= FD1_WPF_FORMAT_WRTM_709_16;
972                 else if (src_q_data->format.quantization ==
973                                 V4L2_QUANTIZATION_FULL_RANGE)
974                         format |= FD1_WPF_FORMAT_WRTM_601_0;
975                 else
976                         format |= FD1_WPF_FORMAT_WRTM_601_16;
977         }
978
979         /* Set an alpha value into the Pad Value */
980         format |= ctx->alpha << FD1_WPF_FORMAT_PDV_SHIFT;
981
982         /* Determine picture rounding and clipping */
983         rndctl = FD1_WPF_RNDCTL_CBRM; /* Rounding Off */
984         rndctl |= FD1_WPF_RNDCTL_CLMD_NOCLIP;
985
986         /* WPF Swap needs both ISWAP and OSWAP setting */
987         swap = q_data->fmt->swap << FD1_WPF_SWAP_OSWAP_SHIFT;
988         swap |= src_q_data->fmt->swap << FD1_WPF_SWAP_SSWAP_SHIFT;
989
990         fdp1_write(fdp1, format, FD1_WPF_FORMAT);
991         fdp1_write(fdp1, rndctl, FD1_WPF_RNDCTL);
992         fdp1_write(fdp1, swap, FD1_WPF_SWAP);
993         fdp1_write(fdp1, pstride, FD1_WPF_PSTRIDE);
994
995         fdp1_write(fdp1, job->dst->addrs[0], FD1_WPF_ADDR_Y);
996         fdp1_write(fdp1, job->dst->addrs[1], FD1_WPF_ADDR_C0);
997         fdp1_write(fdp1, job->dst->addrs[2], FD1_WPF_ADDR_C1);
998 }
999
1000 static void fdp1_configure_deint_mode(struct fdp1_ctx *ctx,
1001                                       struct fdp1_job *job)
1002 {
1003         struct fdp1_dev *fdp1 = ctx->fdp1;
1004         u32 opmode = FD1_CTL_OPMODE_VIMD_NOINTERRUPT;
1005         u32 ipcmode = FD1_IPC_MODE_DLI; /* Always set */
1006         u32 channels = FD1_CTL_CHACT_WR | FD1_CTL_CHACT_RD1; /* Always on */
1007
1008         /* De-interlacing Mode */
1009         switch (ctx->deint_mode) {
1010         default:
1011         case FDP1_PROGRESSIVE:
1012                 dprintk(fdp1, "Progressive Mode\n");
1013                 opmode |= FD1_CTL_OPMODE_PRG;
1014                 ipcmode |= FD1_IPC_MODE_DIM_FIXED2D;
1015                 break;
1016         case FDP1_ADAPT2D3D:
1017                 dprintk(fdp1, "Adapt2D3D Mode\n");
1018                 if (ctx->sequence == 0 || ctx->aborting)
1019                         ipcmode |= FD1_IPC_MODE_DIM_FIXED2D;
1020                 else
1021                         ipcmode |= FD1_IPC_MODE_DIM_ADAPT2D3D;
1022
1023                 if (ctx->sequence > 1) {
1024                         channels |= FD1_CTL_CHACT_SMW;
1025                         channels |= FD1_CTL_CHACT_RD0 | FD1_CTL_CHACT_RD2;
1026                 }
1027
1028                 if (ctx->sequence > 2)
1029                         channels |= FD1_CTL_CHACT_SMR;
1030
1031                 break;
1032         case FDP1_FIXED3D:
1033                 dprintk(fdp1, "Fixed 3D Mode\n");
1034                 ipcmode |= FD1_IPC_MODE_DIM_FIXED3D;
1035                 /* Except for first and last frame, enable all channels */
1036                 if (!(ctx->sequence == 0 || ctx->aborting))
1037                         channels |= FD1_CTL_CHACT_RD0 | FD1_CTL_CHACT_RD2;
1038                 break;
1039         case FDP1_FIXED2D:
1040                 dprintk(fdp1, "Fixed 2D Mode\n");
1041                 ipcmode |= FD1_IPC_MODE_DIM_FIXED2D;
1042                 /* No extra channels enabled */
1043                 break;
1044         case FDP1_PREVFIELD:
1045                 dprintk(fdp1, "Previous Field Mode\n");
1046                 ipcmode |= FD1_IPC_MODE_DIM_PREVFIELD;
1047                 channels |= FD1_CTL_CHACT_RD0; /* Previous */
1048                 break;
1049         case FDP1_NEXTFIELD:
1050                 dprintk(fdp1, "Next Field Mode\n");
1051                 ipcmode |= FD1_IPC_MODE_DIM_NEXTFIELD;
1052                 channels |= FD1_CTL_CHACT_RD2; /* Next */
1053                 break;
1054         }
1055
1056         fdp1_write(fdp1, channels,      FD1_CTL_CHACT);
1057         fdp1_write(fdp1, opmode,        FD1_CTL_OPMODE);
1058         fdp1_write(fdp1, ipcmode,       FD1_IPC_MODE);
1059 }
1060
1061 /*
1062  * fdp1_device_process() - Run the hardware
1063  *
1064  * Configure and start the hardware to generate a single frame
1065  * of output given our input parameters.
1066  */
1067 static int fdp1_device_process(struct fdp1_ctx *ctx)
1068
1069 {
1070         struct fdp1_dev *fdp1 = ctx->fdp1;
1071         struct fdp1_job *job;
1072         unsigned long flags;
1073
1074         spin_lock_irqsave(&fdp1->device_process_lock, flags);
1075
1076         /* Get a job to process */
1077         job = get_queued_job(fdp1);
1078         if (!job) {
1079                 /*
1080                  * VINT can call us to see if we can queue another job.
1081                  * If we have no work to do, we simply return.
1082                  */
1083                 spin_unlock_irqrestore(&fdp1->device_process_lock, flags);
1084                 return 0;
1085         }
1086
1087         /* First Frame only? ... */
1088         fdp1_write(fdp1, FD1_CTL_CLKCTRL_CSTP_N, FD1_CTL_CLKCTRL);
1089
1090         /* Set the mode, and configuration */
1091         fdp1_configure_deint_mode(ctx, job);
1092
1093         /* DLI Static Configuration */
1094         fdp1_set_ipc_dli(ctx);
1095
1096         /* Sensor Configuration */
1097         fdp1_set_ipc_sensor(ctx);
1098
1099         /* Setup the source picture */
1100         fdp1_configure_rpf(ctx, job);
1101
1102         /* Setup the destination picture */
1103         fdp1_configure_wpf(ctx, job);
1104
1105         /* Line Memory Pixel Number Register for linear access */
1106         fdp1_write(fdp1, FD1_IPC_LMEM_LINEAR, FD1_IPC_LMEM);
1107
1108         /* Enable Interrupts */
1109         fdp1_write(fdp1, FD1_CTL_IRQ_MASK, FD1_CTL_IRQENB);
1110
1111         /* Finally, the Immediate Registers */
1112
1113         /* This job is now in the HW queue */
1114         queue_hw_job(fdp1, job);
1115
1116         /* Start the command */
1117         fdp1_write(fdp1, FD1_CTL_CMD_STRCMD, FD1_CTL_CMD);
1118
1119         /* Registers will update to HW at next VINT */
1120         fdp1_write(fdp1, FD1_CTL_REGEND_REGEND, FD1_CTL_REGEND);
1121
1122         /* Enable VINT Generator */
1123         fdp1_write(fdp1, FD1_CTL_SGCMD_SGEN, FD1_CTL_SGCMD);
1124
1125         spin_unlock_irqrestore(&fdp1->device_process_lock, flags);
1126
1127         return 0;
1128 }
1129
1130 /*
1131  * mem2mem callbacks
1132  */
1133
1134 /*
1135  * job_ready() - check whether an instance is ready to be scheduled to run
1136  */
1137 static int fdp1_m2m_job_ready(void *priv)
1138 {
1139         struct fdp1_ctx *ctx = priv;
1140         struct fdp1_q_data *src_q_data = &ctx->out_q;
1141         int srcbufs = 1;
1142         int dstbufs = 1;
1143
1144         dprintk(ctx->fdp1, "+ Src: %d : Dst: %d\n",
1145                 v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx),
1146                 v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx));
1147
1148         /* One output buffer is required for each field */
1149         if (V4L2_FIELD_HAS_BOTH(src_q_data->format.field))
1150                 dstbufs = 2;
1151
1152         if (v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx) < srcbufs
1153             || v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx) < dstbufs) {
1154                 dprintk(ctx->fdp1, "Not enough buffers available\n");
1155                 return 0;
1156         }
1157
1158         return 1;
1159 }
1160
1161 static void fdp1_m2m_job_abort(void *priv)
1162 {
1163         struct fdp1_ctx *ctx = priv;
1164
1165         dprintk(ctx->fdp1, "+\n");
1166
1167         /* Will cancel the transaction in the next interrupt handler */
1168         ctx->aborting = 1;
1169
1170         /* Immediate abort sequence */
1171         fdp1_write(ctx->fdp1, 0, FD1_CTL_SGCMD);
1172         fdp1_write(ctx->fdp1, FD1_CTL_SRESET_SRST, FD1_CTL_SRESET);
1173 }
1174
1175 /*
1176  * fdp1_prepare_job: Prepare and queue a new job for a single action of work
1177  *
1178  * Prepare the next field, (or frame in progressive) and an output
1179  * buffer for the hardware to perform a single operation.
1180  */
1181 static struct fdp1_job *fdp1_prepare_job(struct fdp1_ctx *ctx)
1182 {
1183         struct vb2_v4l2_buffer *vbuf;
1184         struct fdp1_buffer *fbuf;
1185         struct fdp1_dev *fdp1 = ctx->fdp1;
1186         struct fdp1_job *job;
1187         unsigned int buffers_required = 1;
1188
1189         dprintk(fdp1, "+\n");
1190
1191         if (FDP1_DEINT_MODE_USES_NEXT(ctx->deint_mode))
1192                 buffers_required = 2;
1193
1194         if (ctx->buffers_queued < buffers_required)
1195                 return NULL;
1196
1197         job = fdp1_job_alloc(fdp1);
1198         if (!job) {
1199                 dprintk(fdp1, "No free jobs currently available\n");
1200                 return NULL;
1201         }
1202
1203         job->active = fdp1_dequeue_field(ctx);
1204         if (!job->active) {
1205                 /* Buffer check should prevent this ever happening */
1206                 dprintk(fdp1, "No input buffers currently available\n");
1207
1208                 fdp1_job_free(fdp1, job);
1209                 return NULL;
1210         }
1211
1212         dprintk(fdp1, "+ Buffer en-route...\n");
1213
1214         /* Source buffers have been prepared on our buffer_queue
1215          * Prepare our Output buffer
1216          */
1217         vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1218         fbuf = to_fdp1_buffer(vbuf);
1219         job->dst = &fbuf->fields[0];
1220
1221         job->active->vb->sequence = ctx->sequence;
1222         job->dst->vb->sequence = ctx->sequence;
1223         ctx->sequence++;
1224
1225         if (FDP1_DEINT_MODE_USES_PREV(ctx->deint_mode)) {
1226                 job->previous = ctx->previous;
1227
1228                 /* Active buffer becomes the next job's previous buffer */
1229                 ctx->previous = job->active;
1230         }
1231
1232         if (FDP1_DEINT_MODE_USES_NEXT(ctx->deint_mode)) {
1233                 /* Must be called after 'active' is dequeued */
1234                 job->next = fdp1_peek_queued_field(ctx);
1235         }
1236
1237         /* Transfer timestamps and flags from src->dst */
1238
1239         job->dst->vb->vb2_buf.timestamp = job->active->vb->vb2_buf.timestamp;
1240
1241         job->dst->vb->flags = job->active->vb->flags &
1242                                 V4L2_BUF_FLAG_TSTAMP_SRC_MASK;
1243
1244         /* Ideally, the frame-end function will just 'check' to see
1245          * if there are more jobs instead
1246          */
1247         ctx->translen++;
1248
1249         /* Finally, Put this job on the processing queue */
1250         queue_job(fdp1, job);
1251
1252         dprintk(fdp1, "Job Queued translen = %d\n", ctx->translen);
1253
1254         return job;
1255 }
1256
1257 /* fdp1_m2m_device_run() - prepares and starts the device for an M2M task
1258  *
1259  * A single input buffer is taken and serialised into our fdp1_buffer
1260  * queue. The queue is then processed to create as many jobs as possible
1261  * from our available input.
1262  */
1263 static void fdp1_m2m_device_run(void *priv)
1264 {
1265         struct fdp1_ctx *ctx = priv;
1266         struct fdp1_dev *fdp1 = ctx->fdp1;
1267         struct vb2_v4l2_buffer *src_vb;
1268         struct fdp1_buffer *buf;
1269         unsigned int i;
1270
1271         dprintk(fdp1, "+\n");
1272
1273         ctx->translen = 0;
1274
1275         /* Get our incoming buffer of either one or two fields, or one frame */
1276         src_vb = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1277         buf = to_fdp1_buffer(src_vb);
1278
1279         for (i = 0; i < buf->num_fields; i++) {
1280                 struct fdp1_field_buffer *fbuf = &buf->fields[i];
1281
1282                 fdp1_queue_field(ctx, fbuf);
1283                 dprintk(fdp1, "Queued Buffer [%d] last_field:%d\n",
1284                         i, fbuf->last_field);
1285         }
1286
1287         /* Queue as many jobs as our data provides for */
1288         while (fdp1_prepare_job(ctx))
1289                 ;
1290
1291         if (ctx->translen == 0) {
1292                 dprintk(fdp1, "No jobs were processed. M2M action complete\n");
1293                 v4l2_m2m_job_finish(fdp1->m2m_dev, ctx->fh.m2m_ctx);
1294                 return;
1295         }
1296
1297         /* Kick the job processing action */
1298         fdp1_device_process(ctx);
1299 }
1300
1301 /*
1302  * device_frame_end:
1303  *
1304  * Handles the M2M level after a buffer completion event.
1305  */
1306 static void device_frame_end(struct fdp1_dev *fdp1,
1307                              enum vb2_buffer_state state)
1308 {
1309         struct fdp1_ctx *ctx;
1310         unsigned long flags;
1311         struct fdp1_job *job = get_hw_queued_job(fdp1);
1312
1313         dprintk(fdp1, "+\n");
1314
1315         ctx = v4l2_m2m_get_curr_priv(fdp1->m2m_dev);
1316
1317         if (ctx == NULL) {
1318                 v4l2_err(&fdp1->v4l2_dev,
1319                         "Instance released before the end of transaction\n");
1320                 return;
1321         }
1322
1323         ctx->num_processed++;
1324
1325         /*
1326          * fdp1_field_complete will call buf_done only when the last vb2_buffer
1327          * reference is complete
1328          */
1329         if (FDP1_DEINT_MODE_USES_PREV(ctx->deint_mode))
1330                 fdp1_field_complete(ctx, job->previous);
1331         else
1332                 fdp1_field_complete(ctx, job->active);
1333
1334         spin_lock_irqsave(&fdp1->irqlock, flags);
1335         v4l2_m2m_buf_done(job->dst->vb, state);
1336         job->dst = NULL;
1337         spin_unlock_irqrestore(&fdp1->irqlock, flags);
1338
1339         /* Move this job back to the free job list */
1340         fdp1_job_free(fdp1, job);
1341
1342         dprintk(fdp1, "curr_ctx->num_processed %d curr_ctx->translen %d\n",
1343                 ctx->num_processed, ctx->translen);
1344
1345         if (ctx->num_processed == ctx->translen ||
1346                         ctx->aborting) {
1347                 dprintk(ctx->fdp1, "Finishing transaction\n");
1348                 ctx->num_processed = 0;
1349                 v4l2_m2m_job_finish(fdp1->m2m_dev, ctx->fh.m2m_ctx);
1350         } else {
1351                 /*
1352                  * For pipelined performance support, this would
1353                  * be called from a VINT handler
1354                  */
1355                 fdp1_device_process(ctx);
1356         }
1357 }
1358
1359 /*
1360  * video ioctls
1361  */
1362 static int fdp1_vidioc_querycap(struct file *file, void *priv,
1363                            struct v4l2_capability *cap)
1364 {
1365         strscpy(cap->driver, DRIVER_NAME, sizeof(cap->driver));
1366         strscpy(cap->card, DRIVER_NAME, sizeof(cap->card));
1367         snprintf(cap->bus_info, sizeof(cap->bus_info),
1368                  "platform:%s", DRIVER_NAME);
1369         return 0;
1370 }
1371
1372 static int fdp1_enum_fmt(struct v4l2_fmtdesc *f, u32 type)
1373 {
1374         unsigned int i, num;
1375
1376         num = 0;
1377
1378         for (i = 0; i < ARRAY_SIZE(fdp1_formats); ++i) {
1379                 if (fdp1_formats[i].types & type) {
1380                         if (num == f->index)
1381                                 break;
1382                         ++num;
1383                 }
1384         }
1385
1386         /* Format not found */
1387         if (i >= ARRAY_SIZE(fdp1_formats))
1388                 return -EINVAL;
1389
1390         /* Format found */
1391         f->pixelformat = fdp1_formats[i].fourcc;
1392
1393         return 0;
1394 }
1395
1396 static int fdp1_enum_fmt_vid_cap(struct file *file, void *priv,
1397                                  struct v4l2_fmtdesc *f)
1398 {
1399         return fdp1_enum_fmt(f, FDP1_CAPTURE);
1400 }
1401
1402 static int fdp1_enum_fmt_vid_out(struct file *file, void *priv,
1403                                    struct v4l2_fmtdesc *f)
1404 {
1405         return fdp1_enum_fmt(f, FDP1_OUTPUT);
1406 }
1407
1408 static int fdp1_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
1409 {
1410         struct fdp1_q_data *q_data;
1411         struct fdp1_ctx *ctx = fh_to_ctx(priv);
1412
1413         if (!v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type))
1414                 return -EINVAL;
1415
1416         q_data = get_q_data(ctx, f->type);
1417         f->fmt.pix_mp = q_data->format;
1418
1419         return 0;
1420 }
1421
1422 static void fdp1_compute_stride(struct v4l2_pix_format_mplane *pix,
1423                                 const struct fdp1_fmt *fmt)
1424 {
1425         unsigned int i;
1426
1427         /* Compute and clamp the stride and image size. */
1428         for (i = 0; i < min_t(unsigned int, fmt->num_planes, 2U); ++i) {
1429                 unsigned int hsub = i > 0 ? fmt->hsub : 1;
1430                 unsigned int vsub = i > 0 ? fmt->vsub : 1;
1431                  /* From VSP : TODO: Confirm alignment limits for FDP1 */
1432                 unsigned int align = 128;
1433                 unsigned int bpl;
1434
1435                 bpl = clamp_t(unsigned int, pix->plane_fmt[i].bytesperline,
1436                               pix->width / hsub * fmt->bpp[i] / 8,
1437                               round_down(FDP1_MAX_STRIDE, align));
1438
1439                 pix->plane_fmt[i].bytesperline = round_up(bpl, align);
1440                 pix->plane_fmt[i].sizeimage = pix->plane_fmt[i].bytesperline
1441                                             * pix->height / vsub;
1442
1443         }
1444
1445         if (fmt->num_planes == 3) {
1446                 /* The two chroma planes must have the same stride. */
1447                 pix->plane_fmt[2].bytesperline = pix->plane_fmt[1].bytesperline;
1448                 pix->plane_fmt[2].sizeimage = pix->plane_fmt[1].sizeimage;
1449
1450         }
1451 }
1452
1453 static void fdp1_try_fmt_output(struct fdp1_ctx *ctx,
1454                                 const struct fdp1_fmt **fmtinfo,
1455                                 struct v4l2_pix_format_mplane *pix)
1456 {
1457         const struct fdp1_fmt *fmt;
1458         unsigned int width;
1459         unsigned int height;
1460
1461         /* Validate the pixel format to ensure the output queue supports it. */
1462         fmt = fdp1_find_format(pix->pixelformat);
1463         if (!fmt || !(fmt->types & FDP1_OUTPUT))
1464                 fmt = fdp1_find_format(V4L2_PIX_FMT_YUYV);
1465
1466         if (fmtinfo)
1467                 *fmtinfo = fmt;
1468
1469         pix->pixelformat = fmt->fourcc;
1470         pix->num_planes = fmt->num_planes;
1471
1472         /*
1473          * Progressive video and all interlaced field orders are acceptable.
1474          * Default to V4L2_FIELD_INTERLACED.
1475          */
1476         if (pix->field != V4L2_FIELD_NONE &&
1477             pix->field != V4L2_FIELD_ALTERNATE &&
1478             !V4L2_FIELD_HAS_BOTH(pix->field))
1479                 pix->field = V4L2_FIELD_INTERLACED;
1480
1481         /*
1482          * The deinterlacer doesn't care about the colorspace, accept all values
1483          * and default to V4L2_COLORSPACE_SMPTE170M. The YUV to RGB conversion
1484          * at the output of the deinterlacer supports a subset of encodings and
1485          * quantization methods and will only be available when the colorspace
1486          * allows it.
1487          */
1488         if (pix->colorspace == V4L2_COLORSPACE_DEFAULT)
1489                 pix->colorspace = V4L2_COLORSPACE_SMPTE170M;
1490
1491         /*
1492          * Align the width and height for YUV 4:2:2 and 4:2:0 formats and clamp
1493          * them to the supported frame size range. The height boundary are
1494          * related to the full frame, divide them by two when the format passes
1495          * fields in separate buffers.
1496          */
1497         width = round_down(pix->width, fmt->hsub);
1498         pix->width = clamp(width, FDP1_MIN_W, FDP1_MAX_W);
1499
1500         height = round_down(pix->height, fmt->vsub);
1501         if (pix->field == V4L2_FIELD_ALTERNATE)
1502                 pix->height = clamp(height, FDP1_MIN_H / 2, FDP1_MAX_H / 2);
1503         else
1504                 pix->height = clamp(height, FDP1_MIN_H, FDP1_MAX_H);
1505
1506         fdp1_compute_stride(pix, fmt);
1507 }
1508
1509 static void fdp1_try_fmt_capture(struct fdp1_ctx *ctx,
1510                                  const struct fdp1_fmt **fmtinfo,
1511                                  struct v4l2_pix_format_mplane *pix)
1512 {
1513         struct fdp1_q_data *src_data = &ctx->out_q;
1514         enum v4l2_colorspace colorspace;
1515         enum v4l2_ycbcr_encoding ycbcr_enc;
1516         enum v4l2_quantization quantization;
1517         const struct fdp1_fmt *fmt;
1518         bool allow_rgb;
1519
1520         /*
1521          * Validate the pixel format. We can only accept RGB output formats if
1522          * the input encoding and quantization are compatible with the format
1523          * conversions supported by the hardware. The supported combinations are
1524          *
1525          * V4L2_YCBCR_ENC_601 + V4L2_QUANTIZATION_LIM_RANGE
1526          * V4L2_YCBCR_ENC_601 + V4L2_QUANTIZATION_FULL_RANGE
1527          * V4L2_YCBCR_ENC_709 + V4L2_QUANTIZATION_LIM_RANGE
1528          */
1529         colorspace = src_data->format.colorspace;
1530
1531         ycbcr_enc = src_data->format.ycbcr_enc;
1532         if (ycbcr_enc == V4L2_YCBCR_ENC_DEFAULT)
1533                 ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(colorspace);
1534
1535         quantization = src_data->format.quantization;
1536         if (quantization == V4L2_QUANTIZATION_DEFAULT)
1537                 quantization = V4L2_MAP_QUANTIZATION_DEFAULT(false, colorspace,
1538                                                              ycbcr_enc);
1539
1540         allow_rgb = ycbcr_enc == V4L2_YCBCR_ENC_601 ||
1541                     (ycbcr_enc == V4L2_YCBCR_ENC_709 &&
1542                      quantization == V4L2_QUANTIZATION_LIM_RANGE);
1543
1544         fmt = fdp1_find_format(pix->pixelformat);
1545         if (!fmt || (!allow_rgb && fdp1_fmt_is_rgb(fmt)))
1546                 fmt = fdp1_find_format(V4L2_PIX_FMT_YUYV);
1547
1548         if (fmtinfo)
1549                 *fmtinfo = fmt;
1550
1551         pix->pixelformat = fmt->fourcc;
1552         pix->num_planes = fmt->num_planes;
1553         pix->field = V4L2_FIELD_NONE;
1554
1555         /*
1556          * The colorspace on the capture queue is copied from the output queue
1557          * as the hardware can't change the colorspace. It can convert YCbCr to
1558          * RGB though, in which case the encoding and quantization are set to
1559          * default values as anything else wouldn't make sense.
1560          */
1561         pix->colorspace = src_data->format.colorspace;
1562         pix->xfer_func = src_data->format.xfer_func;
1563
1564         if (fdp1_fmt_is_rgb(fmt)) {
1565                 pix->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
1566                 pix->quantization = V4L2_QUANTIZATION_DEFAULT;
1567         } else {
1568                 pix->ycbcr_enc = src_data->format.ycbcr_enc;
1569                 pix->quantization = src_data->format.quantization;
1570         }
1571
1572         /*
1573          * The frame width is identical to the output queue, and the height is
1574          * either doubled or identical depending on whether the output queue
1575          * field order contains one or two fields per frame.
1576          */
1577         pix->width = src_data->format.width;
1578         if (src_data->format.field == V4L2_FIELD_ALTERNATE)
1579                 pix->height = 2 * src_data->format.height;
1580         else
1581                 pix->height = src_data->format.height;
1582
1583         fdp1_compute_stride(pix, fmt);
1584 }
1585
1586 static int fdp1_try_fmt(struct file *file, void *priv, struct v4l2_format *f)
1587 {
1588         struct fdp1_ctx *ctx = fh_to_ctx(priv);
1589
1590         if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
1591                 fdp1_try_fmt_output(ctx, NULL, &f->fmt.pix_mp);
1592         else
1593                 fdp1_try_fmt_capture(ctx, NULL, &f->fmt.pix_mp);
1594
1595         dprintk(ctx->fdp1, "Try %s format: %4.4s (0x%08x) %ux%u field %u\n",
1596                 V4L2_TYPE_IS_OUTPUT(f->type) ? "output" : "capture",
1597                 (char *)&f->fmt.pix_mp.pixelformat, f->fmt.pix_mp.pixelformat,
1598                 f->fmt.pix_mp.width, f->fmt.pix_mp.height, f->fmt.pix_mp.field);
1599
1600         return 0;
1601 }
1602
1603 static void fdp1_set_format(struct fdp1_ctx *ctx,
1604                             struct v4l2_pix_format_mplane *pix,
1605                             enum v4l2_buf_type type)
1606 {
1607         struct fdp1_q_data *q_data = get_q_data(ctx, type);
1608         const struct fdp1_fmt *fmtinfo;
1609
1610         if (type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
1611                 fdp1_try_fmt_output(ctx, &fmtinfo, pix);
1612         else
1613                 fdp1_try_fmt_capture(ctx, &fmtinfo, pix);
1614
1615         q_data->fmt = fmtinfo;
1616         q_data->format = *pix;
1617
1618         q_data->vsize = pix->height;
1619         if (pix->field != V4L2_FIELD_NONE)
1620                 q_data->vsize /= 2;
1621
1622         q_data->stride_y = pix->plane_fmt[0].bytesperline;
1623         q_data->stride_c = pix->plane_fmt[1].bytesperline;
1624
1625         /* Adjust strides for interleaved buffers */
1626         if (pix->field == V4L2_FIELD_INTERLACED ||
1627             pix->field == V4L2_FIELD_INTERLACED_TB ||
1628             pix->field == V4L2_FIELD_INTERLACED_BT) {
1629                 q_data->stride_y *= 2;
1630                 q_data->stride_c *= 2;
1631         }
1632
1633         /* Propagate the format from the output node to the capture node. */
1634         if (type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
1635                 struct fdp1_q_data *dst_data = &ctx->cap_q;
1636
1637                 /*
1638                  * Copy the format, clear the per-plane bytes per line and image
1639                  * size, override the field and double the height if needed.
1640                  */
1641                 dst_data->format = q_data->format;
1642                 memset(dst_data->format.plane_fmt, 0,
1643                        sizeof(dst_data->format.plane_fmt));
1644
1645                 dst_data->format.field = V4L2_FIELD_NONE;
1646                 if (pix->field == V4L2_FIELD_ALTERNATE)
1647                         dst_data->format.height *= 2;
1648
1649                 fdp1_try_fmt_capture(ctx, &dst_data->fmt, &dst_data->format);
1650
1651                 dst_data->vsize = dst_data->format.height;
1652                 dst_data->stride_y = dst_data->format.plane_fmt[0].bytesperline;
1653                 dst_data->stride_c = dst_data->format.plane_fmt[1].bytesperline;
1654         }
1655 }
1656
1657 static int fdp1_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
1658 {
1659         struct fdp1_ctx *ctx = fh_to_ctx(priv);
1660         struct v4l2_m2m_ctx *m2m_ctx = ctx->fh.m2m_ctx;
1661         struct vb2_queue *vq = v4l2_m2m_get_vq(m2m_ctx, f->type);
1662
1663         if (vb2_is_busy(vq)) {
1664                 v4l2_err(&ctx->fdp1->v4l2_dev, "%s queue busy\n", __func__);
1665                 return -EBUSY;
1666         }
1667
1668         fdp1_set_format(ctx, &f->fmt.pix_mp, f->type);
1669
1670         dprintk(ctx->fdp1, "Set %s format: %4.4s (0x%08x) %ux%u field %u\n",
1671                 V4L2_TYPE_IS_OUTPUT(f->type) ? "output" : "capture",
1672                 (char *)&f->fmt.pix_mp.pixelformat, f->fmt.pix_mp.pixelformat,
1673                 f->fmt.pix_mp.width, f->fmt.pix_mp.height, f->fmt.pix_mp.field);
1674
1675         return 0;
1676 }
1677
1678 static int fdp1_g_ctrl(struct v4l2_ctrl *ctrl)
1679 {
1680         struct fdp1_ctx *ctx =
1681                 container_of(ctrl->handler, struct fdp1_ctx, hdl);
1682         struct fdp1_q_data *src_q_data = &ctx->out_q;
1683
1684         switch (ctrl->id) {
1685         case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
1686                 if (V4L2_FIELD_HAS_BOTH(src_q_data->format.field))
1687                         ctrl->val = 2;
1688                 else
1689                         ctrl->val = 1;
1690                 return 0;
1691         }
1692
1693         return 1;
1694 }
1695
1696 static int fdp1_s_ctrl(struct v4l2_ctrl *ctrl)
1697 {
1698         struct fdp1_ctx *ctx =
1699                 container_of(ctrl->handler, struct fdp1_ctx, hdl);
1700
1701         switch (ctrl->id) {
1702         case V4L2_CID_ALPHA_COMPONENT:
1703                 ctx->alpha = ctrl->val;
1704                 break;
1705
1706         case V4L2_CID_DEINTERLACING_MODE:
1707                 ctx->deint_mode = ctrl->val;
1708                 break;
1709         }
1710
1711         return 0;
1712 }
1713
1714 static const struct v4l2_ctrl_ops fdp1_ctrl_ops = {
1715         .s_ctrl = fdp1_s_ctrl,
1716         .g_volatile_ctrl = fdp1_g_ctrl,
1717 };
1718
1719 static const char * const fdp1_ctrl_deint_menu[] = {
1720         "Progressive",
1721         "Adaptive 2D/3D",
1722         "Fixed 2D",
1723         "Fixed 3D",
1724         "Previous field",
1725         "Next field",
1726         NULL
1727 };
1728
1729 static const struct v4l2_ioctl_ops fdp1_ioctl_ops = {
1730         .vidioc_querycap        = fdp1_vidioc_querycap,
1731
1732         .vidioc_enum_fmt_vid_cap        = fdp1_enum_fmt_vid_cap,
1733         .vidioc_enum_fmt_vid_out        = fdp1_enum_fmt_vid_out,
1734         .vidioc_g_fmt_vid_cap_mplane    = fdp1_g_fmt,
1735         .vidioc_g_fmt_vid_out_mplane    = fdp1_g_fmt,
1736         .vidioc_try_fmt_vid_cap_mplane  = fdp1_try_fmt,
1737         .vidioc_try_fmt_vid_out_mplane  = fdp1_try_fmt,
1738         .vidioc_s_fmt_vid_cap_mplane    = fdp1_s_fmt,
1739         .vidioc_s_fmt_vid_out_mplane    = fdp1_s_fmt,
1740
1741         .vidioc_reqbufs         = v4l2_m2m_ioctl_reqbufs,
1742         .vidioc_querybuf        = v4l2_m2m_ioctl_querybuf,
1743         .vidioc_qbuf            = v4l2_m2m_ioctl_qbuf,
1744         .vidioc_dqbuf           = v4l2_m2m_ioctl_dqbuf,
1745         .vidioc_prepare_buf     = v4l2_m2m_ioctl_prepare_buf,
1746         .vidioc_create_bufs     = v4l2_m2m_ioctl_create_bufs,
1747         .vidioc_expbuf          = v4l2_m2m_ioctl_expbuf,
1748
1749         .vidioc_streamon        = v4l2_m2m_ioctl_streamon,
1750         .vidioc_streamoff       = v4l2_m2m_ioctl_streamoff,
1751
1752         .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1753         .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1754 };
1755
1756 /*
1757  * Queue operations
1758  */
1759
1760 static int fdp1_queue_setup(struct vb2_queue *vq,
1761                                 unsigned int *nbuffers, unsigned int *nplanes,
1762                                 unsigned int sizes[],
1763                                 struct device *alloc_ctxs[])
1764 {
1765         struct fdp1_ctx *ctx = vb2_get_drv_priv(vq);
1766         struct fdp1_q_data *q_data;
1767         unsigned int i;
1768
1769         q_data = get_q_data(ctx, vq->type);
1770
1771         if (*nplanes) {
1772                 if (*nplanes > FDP1_MAX_PLANES)
1773                         return -EINVAL;
1774
1775                 return 0;
1776         }
1777
1778         *nplanes = q_data->format.num_planes;
1779
1780         for (i = 0; i < *nplanes; i++)
1781                 sizes[i] = q_data->format.plane_fmt[i].sizeimage;
1782
1783         return 0;
1784 }
1785
1786 static void fdp1_buf_prepare_field(struct fdp1_q_data *q_data,
1787                                    struct vb2_v4l2_buffer *vbuf,
1788                                    unsigned int field_num)
1789 {
1790         struct fdp1_buffer *buf = to_fdp1_buffer(vbuf);
1791         struct fdp1_field_buffer *fbuf = &buf->fields[field_num];
1792         unsigned int num_fields;
1793         unsigned int i;
1794
1795         num_fields = V4L2_FIELD_HAS_BOTH(vbuf->field) ? 2 : 1;
1796
1797         fbuf->vb = vbuf;
1798         fbuf->last_field = (field_num + 1) == num_fields;
1799
1800         for (i = 0; i < vbuf->vb2_buf.num_planes; ++i)
1801                 fbuf->addrs[i] = vb2_dma_contig_plane_dma_addr(&vbuf->vb2_buf, i);
1802
1803         switch (vbuf->field) {
1804         case V4L2_FIELD_INTERLACED:
1805                 /*
1806                  * Interlaced means bottom-top for 60Hz TV standards (NTSC) and
1807                  * top-bottom for 50Hz. As TV standards are not applicable to
1808                  * the mem-to-mem API, use the height as a heuristic.
1809                  */
1810                 fbuf->field = (q_data->format.height < 576) == field_num
1811                             ? V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM;
1812                 break;
1813         case V4L2_FIELD_INTERLACED_TB:
1814         case V4L2_FIELD_SEQ_TB:
1815                 fbuf->field = field_num ? V4L2_FIELD_BOTTOM : V4L2_FIELD_TOP;
1816                 break;
1817         case V4L2_FIELD_INTERLACED_BT:
1818         case V4L2_FIELD_SEQ_BT:
1819                 fbuf->field = field_num ? V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM;
1820                 break;
1821         default:
1822                 fbuf->field = vbuf->field;
1823                 break;
1824         }
1825
1826         /* Buffer is completed */
1827         if (!field_num)
1828                 return;
1829
1830         /* Adjust buffer addresses for second field */
1831         switch (vbuf->field) {
1832         case V4L2_FIELD_INTERLACED:
1833         case V4L2_FIELD_INTERLACED_TB:
1834         case V4L2_FIELD_INTERLACED_BT:
1835                 for (i = 0; i < vbuf->vb2_buf.num_planes; i++)
1836                         fbuf->addrs[i] +=
1837                                 (i == 0 ? q_data->stride_y : q_data->stride_c);
1838                 break;
1839         case V4L2_FIELD_SEQ_TB:
1840         case V4L2_FIELD_SEQ_BT:
1841                 for (i = 0; i < vbuf->vb2_buf.num_planes; i++)
1842                         fbuf->addrs[i] += q_data->vsize *
1843                                 (i == 0 ? q_data->stride_y : q_data->stride_c);
1844                 break;
1845         }
1846 }
1847
1848 static int fdp1_buf_prepare(struct vb2_buffer *vb)
1849 {
1850         struct fdp1_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1851         struct fdp1_q_data *q_data = get_q_data(ctx, vb->vb2_queue->type);
1852         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1853         struct fdp1_buffer *buf = to_fdp1_buffer(vbuf);
1854         unsigned int i;
1855
1856         if (V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) {
1857                 bool field_valid = true;
1858
1859                 /* Validate the buffer field. */
1860                 switch (q_data->format.field) {
1861                 case V4L2_FIELD_NONE:
1862                         if (vbuf->field != V4L2_FIELD_NONE)
1863                                 field_valid = false;
1864                         break;
1865
1866                 case V4L2_FIELD_ALTERNATE:
1867                         if (vbuf->field != V4L2_FIELD_TOP &&
1868                             vbuf->field != V4L2_FIELD_BOTTOM)
1869                                 field_valid = false;
1870                         break;
1871
1872                 case V4L2_FIELD_INTERLACED:
1873                 case V4L2_FIELD_SEQ_TB:
1874                 case V4L2_FIELD_SEQ_BT:
1875                 case V4L2_FIELD_INTERLACED_TB:
1876                 case V4L2_FIELD_INTERLACED_BT:
1877                         if (vbuf->field != q_data->format.field)
1878                                 field_valid = false;
1879                         break;
1880                 }
1881
1882                 if (!field_valid) {
1883                         dprintk(ctx->fdp1,
1884                                 "buffer field %u invalid for format field %u\n",
1885                                 vbuf->field, q_data->format.field);
1886                         return -EINVAL;
1887                 }
1888         } else {
1889                 vbuf->field = V4L2_FIELD_NONE;
1890         }
1891
1892         /* Validate the planes sizes. */
1893         for (i = 0; i < q_data->format.num_planes; i++) {
1894                 unsigned long size = q_data->format.plane_fmt[i].sizeimage;
1895
1896                 if (vb2_plane_size(vb, i) < size) {
1897                         dprintk(ctx->fdp1,
1898                                 "data will not fit into plane [%u/%u] (%lu < %lu)\n",
1899                                 i, q_data->format.num_planes,
1900                                 vb2_plane_size(vb, i), size);
1901                         return -EINVAL;
1902                 }
1903
1904                 /* We have known size formats all around */
1905                 vb2_set_plane_payload(vb, i, size);
1906         }
1907
1908         buf->num_fields = V4L2_FIELD_HAS_BOTH(vbuf->field) ? 2 : 1;
1909         for (i = 0; i < buf->num_fields; ++i)
1910                 fdp1_buf_prepare_field(q_data, vbuf, i);
1911
1912         return 0;
1913 }
1914
1915 static void fdp1_buf_queue(struct vb2_buffer *vb)
1916 {
1917         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1918         struct fdp1_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1919
1920         v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
1921 }
1922
1923 static int fdp1_start_streaming(struct vb2_queue *q, unsigned int count)
1924 {
1925         struct fdp1_ctx *ctx = vb2_get_drv_priv(q);
1926         struct fdp1_q_data *q_data = get_q_data(ctx, q->type);
1927
1928         if (V4L2_TYPE_IS_OUTPUT(q->type)) {
1929                 /*
1930                  * Force our deint_mode when we are progressive,
1931                  * ignoring any setting on the device from the user,
1932                  * Otherwise, lock in the requested de-interlace mode.
1933                  */
1934                 if (q_data->format.field == V4L2_FIELD_NONE)
1935                         ctx->deint_mode = FDP1_PROGRESSIVE;
1936
1937                 if (ctx->deint_mode == FDP1_ADAPT2D3D) {
1938                         u32 stride;
1939                         dma_addr_t smsk_base;
1940                         const u32 bpp = 2; /* bytes per pixel */
1941
1942                         stride = round_up(q_data->format.width, 8);
1943
1944                         ctx->smsk_size = bpp * stride * q_data->vsize;
1945
1946                         ctx->smsk_cpu = dma_alloc_coherent(ctx->fdp1->dev,
1947                                 ctx->smsk_size, &smsk_base, GFP_KERNEL);
1948
1949                         if (ctx->smsk_cpu == NULL) {
1950                                 dprintk(ctx->fdp1, "Failed to alloc smsk\n");
1951                                 return -ENOMEM;
1952                         }
1953
1954                         ctx->smsk_addr[0] = smsk_base;
1955                         ctx->smsk_addr[1] = smsk_base + (ctx->smsk_size/2);
1956                 }
1957         }
1958
1959         return 0;
1960 }
1961
1962 static void fdp1_stop_streaming(struct vb2_queue *q)
1963 {
1964         struct fdp1_ctx *ctx = vb2_get_drv_priv(q);
1965         struct vb2_v4l2_buffer *vbuf;
1966         unsigned long flags;
1967
1968         while (1) {
1969                 if (V4L2_TYPE_IS_OUTPUT(q->type))
1970                         vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1971                 else
1972                         vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1973                 if (vbuf == NULL)
1974                         break;
1975                 spin_lock_irqsave(&ctx->fdp1->irqlock, flags);
1976                 v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR);
1977                 spin_unlock_irqrestore(&ctx->fdp1->irqlock, flags);
1978         }
1979
1980         /* Empty Output queues */
1981         if (V4L2_TYPE_IS_OUTPUT(q->type)) {
1982                 /* Empty our internal queues */
1983                 struct fdp1_field_buffer *fbuf;
1984
1985                 /* Free any queued buffers */
1986                 fbuf = fdp1_dequeue_field(ctx);
1987                 while (fbuf != NULL) {
1988                         fdp1_field_complete(ctx, fbuf);
1989                         fbuf = fdp1_dequeue_field(ctx);
1990                 }
1991
1992                 /* Free smsk_data */
1993                 if (ctx->smsk_cpu) {
1994                         dma_free_coherent(ctx->fdp1->dev, ctx->smsk_size,
1995                                           ctx->smsk_cpu, ctx->smsk_addr[0]);
1996                         ctx->smsk_addr[0] = ctx->smsk_addr[1] = 0;
1997                         ctx->smsk_cpu = NULL;
1998                 }
1999
2000                 WARN(!list_empty(&ctx->fields_queue),
2001                      "Buffer queue not empty");
2002         } else {
2003                 /* Empty Capture queues (Jobs) */
2004                 struct fdp1_job *job;
2005
2006                 job = get_queued_job(ctx->fdp1);
2007                 while (job) {
2008                         if (FDP1_DEINT_MODE_USES_PREV(ctx->deint_mode))
2009                                 fdp1_field_complete(ctx, job->previous);
2010                         else
2011                                 fdp1_field_complete(ctx, job->active);
2012
2013                         v4l2_m2m_buf_done(job->dst->vb, VB2_BUF_STATE_ERROR);
2014                         job->dst = NULL;
2015
2016                         job = get_queued_job(ctx->fdp1);
2017                 }
2018
2019                 /* Free any held buffer in the ctx */
2020                 fdp1_field_complete(ctx, ctx->previous);
2021
2022                 WARN(!list_empty(&ctx->fdp1->queued_job_list),
2023                      "Queued Job List not empty");
2024
2025                 WARN(!list_empty(&ctx->fdp1->hw_job_list),
2026                      "HW Job list not empty");
2027         }
2028 }
2029
2030 static const struct vb2_ops fdp1_qops = {
2031         .queue_setup     = fdp1_queue_setup,
2032         .buf_prepare     = fdp1_buf_prepare,
2033         .buf_queue       = fdp1_buf_queue,
2034         .start_streaming = fdp1_start_streaming,
2035         .stop_streaming  = fdp1_stop_streaming,
2036         .wait_prepare    = vb2_ops_wait_prepare,
2037         .wait_finish     = vb2_ops_wait_finish,
2038 };
2039
2040 static int queue_init(void *priv, struct vb2_queue *src_vq,
2041                       struct vb2_queue *dst_vq)
2042 {
2043         struct fdp1_ctx *ctx = priv;
2044         int ret;
2045
2046         src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
2047         src_vq->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
2048         src_vq->drv_priv = ctx;
2049         src_vq->buf_struct_size = sizeof(struct fdp1_buffer);
2050         src_vq->ops = &fdp1_qops;
2051         src_vq->mem_ops = &vb2_dma_contig_memops;
2052         src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
2053         src_vq->lock = &ctx->fdp1->dev_mutex;
2054         src_vq->dev = ctx->fdp1->dev;
2055
2056         ret = vb2_queue_init(src_vq);
2057         if (ret)
2058                 return ret;
2059
2060         dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
2061         dst_vq->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
2062         dst_vq->drv_priv = ctx;
2063         dst_vq->buf_struct_size = sizeof(struct fdp1_buffer);
2064         dst_vq->ops = &fdp1_qops;
2065         dst_vq->mem_ops = &vb2_dma_contig_memops;
2066         dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
2067         dst_vq->lock = &ctx->fdp1->dev_mutex;
2068         dst_vq->dev = ctx->fdp1->dev;
2069
2070         return vb2_queue_init(dst_vq);
2071 }
2072
2073 /*
2074  * File operations
2075  */
2076 static int fdp1_open(struct file *file)
2077 {
2078         struct fdp1_dev *fdp1 = video_drvdata(file);
2079         struct v4l2_pix_format_mplane format;
2080         struct fdp1_ctx *ctx = NULL;
2081         struct v4l2_ctrl *ctrl;
2082         int ret = 0;
2083
2084         if (mutex_lock_interruptible(&fdp1->dev_mutex))
2085                 return -ERESTARTSYS;
2086
2087         ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
2088         if (!ctx) {
2089                 ret = -ENOMEM;
2090                 goto done;
2091         }
2092
2093         v4l2_fh_init(&ctx->fh, video_devdata(file));
2094         file->private_data = &ctx->fh;
2095         ctx->fdp1 = fdp1;
2096
2097         /* Initialise Queues */
2098         INIT_LIST_HEAD(&ctx->fields_queue);
2099
2100         ctx->translen = 1;
2101         ctx->sequence = 0;
2102
2103         /* Initialise controls */
2104
2105         v4l2_ctrl_handler_init(&ctx->hdl, 3);
2106         v4l2_ctrl_new_std_menu_items(&ctx->hdl, &fdp1_ctrl_ops,
2107                                      V4L2_CID_DEINTERLACING_MODE,
2108                                      FDP1_NEXTFIELD, BIT(0), FDP1_FIXED3D,
2109                                      fdp1_ctrl_deint_menu);
2110
2111         ctrl = v4l2_ctrl_new_std(&ctx->hdl, &fdp1_ctrl_ops,
2112                                  V4L2_CID_MIN_BUFFERS_FOR_CAPTURE, 1, 2, 1, 1);
2113         if (ctrl)
2114                 ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
2115
2116         v4l2_ctrl_new_std(&ctx->hdl, &fdp1_ctrl_ops,
2117                           V4L2_CID_ALPHA_COMPONENT, 0, 255, 1, 255);
2118
2119         if (ctx->hdl.error) {
2120                 ret = ctx->hdl.error;
2121                 goto error_ctx;
2122         }
2123
2124         ctx->fh.ctrl_handler = &ctx->hdl;
2125         v4l2_ctrl_handler_setup(&ctx->hdl);
2126
2127         /* Configure default parameters. */
2128         memset(&format, 0, sizeof(format));
2129         fdp1_set_format(ctx, &format, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
2130
2131         ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(fdp1->m2m_dev, ctx, &queue_init);
2132
2133         if (IS_ERR(ctx->fh.m2m_ctx)) {
2134                 ret = PTR_ERR(ctx->fh.m2m_ctx);
2135                 goto error_ctx;
2136         }
2137
2138         /* Perform any power management required */
2139         ret = pm_runtime_resume_and_get(fdp1->dev);
2140         if (ret < 0)
2141                 goto error_pm;
2142
2143         v4l2_fh_add(&ctx->fh);
2144
2145         dprintk(fdp1, "Created instance: %p, m2m_ctx: %p\n",
2146                 ctx, ctx->fh.m2m_ctx);
2147
2148         mutex_unlock(&fdp1->dev_mutex);
2149         return 0;
2150
2151 error_pm:
2152        v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
2153 error_ctx:
2154         v4l2_ctrl_handler_free(&ctx->hdl);
2155         kfree(ctx);
2156 done:
2157         mutex_unlock(&fdp1->dev_mutex);
2158         return ret;
2159 }
2160
2161 static int fdp1_release(struct file *file)
2162 {
2163         struct fdp1_dev *fdp1 = video_drvdata(file);
2164         struct fdp1_ctx *ctx = fh_to_ctx(file->private_data);
2165
2166         dprintk(fdp1, "Releasing instance %p\n", ctx);
2167
2168         v4l2_fh_del(&ctx->fh);
2169         v4l2_fh_exit(&ctx->fh);
2170         v4l2_ctrl_handler_free(&ctx->hdl);
2171         mutex_lock(&fdp1->dev_mutex);
2172         v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
2173         mutex_unlock(&fdp1->dev_mutex);
2174         kfree(ctx);
2175
2176         pm_runtime_put(fdp1->dev);
2177
2178         return 0;
2179 }
2180
2181 static const struct v4l2_file_operations fdp1_fops = {
2182         .owner          = THIS_MODULE,
2183         .open           = fdp1_open,
2184         .release        = fdp1_release,
2185         .poll           = v4l2_m2m_fop_poll,
2186         .unlocked_ioctl = video_ioctl2,
2187         .mmap           = v4l2_m2m_fop_mmap,
2188 };
2189
2190 static const struct video_device fdp1_videodev = {
2191         .name           = DRIVER_NAME,
2192         .vfl_dir        = VFL_DIR_M2M,
2193         .fops           = &fdp1_fops,
2194         .device_caps    = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING,
2195         .ioctl_ops      = &fdp1_ioctl_ops,
2196         .minor          = -1,
2197         .release        = video_device_release_empty,
2198 };
2199
2200 static const struct v4l2_m2m_ops m2m_ops = {
2201         .device_run     = fdp1_m2m_device_run,
2202         .job_ready      = fdp1_m2m_job_ready,
2203         .job_abort      = fdp1_m2m_job_abort,
2204 };
2205
2206 static irqreturn_t fdp1_irq_handler(int irq, void *dev_id)
2207 {
2208         struct fdp1_dev *fdp1 = dev_id;
2209         u32 int_status;
2210         u32 ctl_status;
2211         u32 vint_cnt;
2212         u32 cycles;
2213
2214         int_status = fdp1_read(fdp1, FD1_CTL_IRQSTA);
2215         cycles = fdp1_read(fdp1, FD1_CTL_VCYCLE_STAT);
2216         ctl_status = fdp1_read(fdp1, FD1_CTL_STATUS);
2217         vint_cnt = (ctl_status & FD1_CTL_STATUS_VINT_CNT_MASK) >>
2218                         FD1_CTL_STATUS_VINT_CNT_SHIFT;
2219
2220         /* Clear interrupts */
2221         fdp1_write(fdp1, ~(int_status) & FD1_CTL_IRQ_MASK, FD1_CTL_IRQSTA);
2222
2223         if (debug >= 2) {
2224                 dprintk(fdp1, "IRQ: 0x%x %s%s%s\n", int_status,
2225                         int_status & FD1_CTL_IRQ_VERE ? "[Error]" : "[!E]",
2226                         int_status & FD1_CTL_IRQ_VINTE ? "[VSync]" : "[!V]",
2227                         int_status & FD1_CTL_IRQ_FREE ? "[FrameEnd]" : "[!F]");
2228
2229                 dprintk(fdp1, "CycleStatus = %d (%dms)\n",
2230                         cycles, cycles/(fdp1->clk_rate/1000));
2231
2232                 dprintk(fdp1,
2233                         "Control Status = 0x%08x : VINT_CNT = %d %s:%s:%s:%s\n",
2234                         ctl_status, vint_cnt,
2235                         ctl_status & FD1_CTL_STATUS_SGREGSET ? "RegSet" : "",
2236                         ctl_status & FD1_CTL_STATUS_SGVERR ? "Vsync Error" : "",
2237                         ctl_status & FD1_CTL_STATUS_SGFREND ? "FrameEnd" : "",
2238                         ctl_status & FD1_CTL_STATUS_BSY ? "Busy" : "");
2239                 dprintk(fdp1, "***********************************\n");
2240         }
2241
2242         /* Spurious interrupt */
2243         if (!(FD1_CTL_IRQ_MASK & int_status))
2244                 return IRQ_NONE;
2245
2246         /* Work completed, release the frame */
2247         if (FD1_CTL_IRQ_VERE & int_status)
2248                 device_frame_end(fdp1, VB2_BUF_STATE_ERROR);
2249         else if (FD1_CTL_IRQ_FREE & int_status)
2250                 device_frame_end(fdp1, VB2_BUF_STATE_DONE);
2251
2252         return IRQ_HANDLED;
2253 }
2254
2255 static int fdp1_probe(struct platform_device *pdev)
2256 {
2257         struct fdp1_dev *fdp1;
2258         struct video_device *vfd;
2259         struct device_node *fcp_node;
2260         struct clk *clk;
2261         unsigned int i;
2262
2263         int ret;
2264         int hw_version;
2265
2266         fdp1 = devm_kzalloc(&pdev->dev, sizeof(*fdp1), GFP_KERNEL);
2267         if (!fdp1)
2268                 return -ENOMEM;
2269
2270         INIT_LIST_HEAD(&fdp1->free_job_list);
2271         INIT_LIST_HEAD(&fdp1->queued_job_list);
2272         INIT_LIST_HEAD(&fdp1->hw_job_list);
2273
2274         /* Initialise the jobs on the free list */
2275         for (i = 0; i < ARRAY_SIZE(fdp1->jobs); i++)
2276                 list_add(&fdp1->jobs[i].list, &fdp1->free_job_list);
2277
2278         mutex_init(&fdp1->dev_mutex);
2279
2280         spin_lock_init(&fdp1->irqlock);
2281         spin_lock_init(&fdp1->device_process_lock);
2282         fdp1->dev = &pdev->dev;
2283         platform_set_drvdata(pdev, fdp1);
2284
2285         /* Memory-mapped registers */
2286         fdp1->regs = devm_platform_ioremap_resource(pdev, 0);
2287         if (IS_ERR(fdp1->regs))
2288                 return PTR_ERR(fdp1->regs);
2289
2290         /* Interrupt service routine registration */
2291         ret = platform_get_irq(pdev, 0);
2292         if (ret < 0)
2293                 return ret;
2294         fdp1->irq = ret;
2295
2296         ret = devm_request_irq(&pdev->dev, fdp1->irq, fdp1_irq_handler, 0,
2297                                dev_name(&pdev->dev), fdp1);
2298         if (ret) {
2299                 dev_err(&pdev->dev, "cannot claim IRQ %d\n", fdp1->irq);
2300                 return ret;
2301         }
2302
2303         /* FCP */
2304         fcp_node = of_parse_phandle(pdev->dev.of_node, "renesas,fcp", 0);
2305         if (fcp_node) {
2306                 fdp1->fcp = rcar_fcp_get(fcp_node);
2307                 of_node_put(fcp_node);
2308                 if (IS_ERR(fdp1->fcp)) {
2309                         dev_dbg(&pdev->dev, "FCP not found (%ld)\n",
2310                                 PTR_ERR(fdp1->fcp));
2311                         return PTR_ERR(fdp1->fcp);
2312                 }
2313         }
2314
2315         /* Determine our clock rate */
2316         clk = clk_get(&pdev->dev, NULL);
2317         if (IS_ERR(clk)) {
2318                 ret = PTR_ERR(clk);
2319                 goto put_dev;
2320         }
2321
2322         fdp1->clk_rate = clk_get_rate(clk);
2323         clk_put(clk);
2324
2325         /* V4L2 device registration */
2326         ret = v4l2_device_register(&pdev->dev, &fdp1->v4l2_dev);
2327         if (ret) {
2328                 v4l2_err(&fdp1->v4l2_dev, "Failed to register video device\n");
2329                 goto put_dev;
2330         }
2331
2332         /* M2M registration */
2333         fdp1->m2m_dev = v4l2_m2m_init(&m2m_ops);
2334         if (IS_ERR(fdp1->m2m_dev)) {
2335                 v4l2_err(&fdp1->v4l2_dev, "Failed to init mem2mem device\n");
2336                 ret = PTR_ERR(fdp1->m2m_dev);
2337                 goto unreg_dev;
2338         }
2339
2340         /* Video registration */
2341         fdp1->vfd = fdp1_videodev;
2342         vfd = &fdp1->vfd;
2343         vfd->lock = &fdp1->dev_mutex;
2344         vfd->v4l2_dev = &fdp1->v4l2_dev;
2345         video_set_drvdata(vfd, fdp1);
2346         strscpy(vfd->name, fdp1_videodev.name, sizeof(vfd->name));
2347
2348         ret = video_register_device(vfd, VFL_TYPE_VIDEO, 0);
2349         if (ret) {
2350                 v4l2_err(&fdp1->v4l2_dev, "Failed to register video device\n");
2351                 goto release_m2m;
2352         }
2353
2354         v4l2_info(&fdp1->v4l2_dev, "Device registered as /dev/video%d\n",
2355                   vfd->num);
2356
2357         /* Power up the cells to read HW */
2358         pm_runtime_enable(&pdev->dev);
2359         ret = pm_runtime_resume_and_get(fdp1->dev);
2360         if (ret < 0)
2361                 goto disable_pm;
2362
2363         hw_version = fdp1_read(fdp1, FD1_IP_INTDATA);
2364         switch (hw_version) {
2365         case FD1_IP_GEN2:
2366                 dprintk(fdp1, "FDP1 Version R-Car Gen2\n");
2367                 break;
2368         case FD1_IP_M3W:
2369                 dprintk(fdp1, "FDP1 Version R-Car M3-W\n");
2370                 break;
2371         case FD1_IP_H3:
2372                 dprintk(fdp1, "FDP1 Version R-Car H3\n");
2373                 break;
2374         case FD1_IP_M3N:
2375                 dprintk(fdp1, "FDP1 Version R-Car M3-N\n");
2376                 break;
2377         case FD1_IP_E3:
2378                 dprintk(fdp1, "FDP1 Version R-Car E3\n");
2379                 break;
2380         default:
2381                 dev_err(fdp1->dev, "FDP1 Unidentifiable (0x%08x)\n",
2382                         hw_version);
2383         }
2384
2385         /* Allow the hw to sleep until an open call puts it to use */
2386         pm_runtime_put(fdp1->dev);
2387
2388         return 0;
2389
2390 disable_pm:
2391         pm_runtime_disable(fdp1->dev);
2392
2393 release_m2m:
2394         v4l2_m2m_release(fdp1->m2m_dev);
2395
2396 unreg_dev:
2397         v4l2_device_unregister(&fdp1->v4l2_dev);
2398
2399 put_dev:
2400         rcar_fcp_put(fdp1->fcp);
2401         return ret;
2402 }
2403
2404 static void fdp1_remove(struct platform_device *pdev)
2405 {
2406         struct fdp1_dev *fdp1 = platform_get_drvdata(pdev);
2407
2408         v4l2_m2m_release(fdp1->m2m_dev);
2409         video_unregister_device(&fdp1->vfd);
2410         v4l2_device_unregister(&fdp1->v4l2_dev);
2411         pm_runtime_disable(&pdev->dev);
2412         rcar_fcp_put(fdp1->fcp);
2413 }
2414
2415 static int __maybe_unused fdp1_pm_runtime_suspend(struct device *dev)
2416 {
2417         struct fdp1_dev *fdp1 = dev_get_drvdata(dev);
2418
2419         rcar_fcp_disable(fdp1->fcp);
2420
2421         return 0;
2422 }
2423
2424 static int __maybe_unused fdp1_pm_runtime_resume(struct device *dev)
2425 {
2426         struct fdp1_dev *fdp1 = dev_get_drvdata(dev);
2427
2428         /* Program in the static LUTs */
2429         fdp1_set_lut(fdp1);
2430
2431         return rcar_fcp_enable(fdp1->fcp);
2432 }
2433
2434 static const struct dev_pm_ops fdp1_pm_ops = {
2435         SET_RUNTIME_PM_OPS(fdp1_pm_runtime_suspend,
2436                            fdp1_pm_runtime_resume,
2437                            NULL)
2438 };
2439
2440 static const struct of_device_id fdp1_dt_ids[] = {
2441         { .compatible = "renesas,fdp1" },
2442         { },
2443 };
2444 MODULE_DEVICE_TABLE(of, fdp1_dt_ids);
2445
2446 static struct platform_driver fdp1_pdrv = {
2447         .probe          = fdp1_probe,
2448         .remove_new     = fdp1_remove,
2449         .driver         = {
2450                 .name   = DRIVER_NAME,
2451                 .of_match_table = fdp1_dt_ids,
2452                 .pm     = &fdp1_pm_ops,
2453         },
2454 };
2455
2456 module_platform_driver(fdp1_pdrv);
2457
2458 MODULE_DESCRIPTION("Renesas R-Car Fine Display Processor Driver");
2459 MODULE_AUTHOR("Kieran Bingham <[email protected]>");
2460 MODULE_LICENSE("GPL");
2461 MODULE_ALIAS("platform:" DRIVER_NAME);
This page took 0.173952 seconds and 4 git commands to generate.