1407965e2SMauro Carvalho Chehab /* SPDX-License-Identifier: GPL-2.0-only */
2407965e2SMauro Carvalho Chehab /*
3407965e2SMauro Carvalho Chehab * Copyright (C) 2013 - 2014 Texas Instruments, Inc.
4407965e2SMauro Carvalho Chehab *
5407965e2SMauro Carvalho Chehab * Benoit Parrot <bparrot@ti.com>
6407965e2SMauro Carvalho Chehab * Lad, Prabhakar <prabhakar.csengg@gmail.com>
7407965e2SMauro Carvalho Chehab */
8407965e2SMauro Carvalho Chehab
9407965e2SMauro Carvalho Chehab #ifndef AM437X_VPFE_H
10407965e2SMauro Carvalho Chehab #define AM437X_VPFE_H
11407965e2SMauro Carvalho Chehab
12407965e2SMauro Carvalho Chehab #include <linux/am437x-vpfe.h>
13407965e2SMauro Carvalho Chehab #include <linux/clk.h>
14407965e2SMauro Carvalho Chehab #include <linux/completion.h>
15407965e2SMauro Carvalho Chehab #include <linux/device.h>
16407965e2SMauro Carvalho Chehab #include <linux/io.h>
17407965e2SMauro Carvalho Chehab #include <linux/i2c.h>
18407965e2SMauro Carvalho Chehab #include <linux/videodev2.h>
19407965e2SMauro Carvalho Chehab
20407965e2SMauro Carvalho Chehab #include <media/v4l2-dev.h>
21407965e2SMauro Carvalho Chehab #include <media/v4l2-device.h>
22407965e2SMauro Carvalho Chehab #include <media/v4l2-ioctl.h>
23407965e2SMauro Carvalho Chehab #include <media/videobuf2-v4l2.h>
24407965e2SMauro Carvalho Chehab #include <media/videobuf2-dma-contig.h>
25407965e2SMauro Carvalho Chehab
26407965e2SMauro Carvalho Chehab #include "am437x-vpfe_regs.h"
27407965e2SMauro Carvalho Chehab
28407965e2SMauro Carvalho Chehab enum vpfe_pin_pol {
29407965e2SMauro Carvalho Chehab VPFE_PINPOL_POSITIVE = 0,
30407965e2SMauro Carvalho Chehab VPFE_PINPOL_NEGATIVE,
31407965e2SMauro Carvalho Chehab };
32407965e2SMauro Carvalho Chehab
33407965e2SMauro Carvalho Chehab enum vpfe_hw_if_type {
34407965e2SMauro Carvalho Chehab /* Raw Bayer */
35407965e2SMauro Carvalho Chehab VPFE_RAW_BAYER = 0,
36407965e2SMauro Carvalho Chehab /* BT656 - 8 bit */
37407965e2SMauro Carvalho Chehab VPFE_BT656,
38407965e2SMauro Carvalho Chehab /* BT656 - 10 bit */
39407965e2SMauro Carvalho Chehab VPFE_BT656_10BIT,
40407965e2SMauro Carvalho Chehab /* YCbCr - 8 bit with external sync */
41407965e2SMauro Carvalho Chehab VPFE_YCBCR_SYNC_8,
42407965e2SMauro Carvalho Chehab /* YCbCr - 16 bit with external sync */
43407965e2SMauro Carvalho Chehab VPFE_YCBCR_SYNC_16,
44407965e2SMauro Carvalho Chehab };
45407965e2SMauro Carvalho Chehab
46407965e2SMauro Carvalho Chehab /* interface description */
47407965e2SMauro Carvalho Chehab struct vpfe_hw_if_param {
48407965e2SMauro Carvalho Chehab enum vpfe_hw_if_type if_type;
49407965e2SMauro Carvalho Chehab enum vpfe_pin_pol hdpol;
50407965e2SMauro Carvalho Chehab enum vpfe_pin_pol vdpol;
51407965e2SMauro Carvalho Chehab unsigned int bus_width;
52407965e2SMauro Carvalho Chehab };
53407965e2SMauro Carvalho Chehab
54407965e2SMauro Carvalho Chehab #define VPFE_MAX_SUBDEV 1
55407965e2SMauro Carvalho Chehab #define VPFE_MAX_INPUTS 1
56407965e2SMauro Carvalho Chehab
57407965e2SMauro Carvalho Chehab struct vpfe_std_info {
58407965e2SMauro Carvalho Chehab int active_pixels;
59407965e2SMauro Carvalho Chehab int active_lines;
60407965e2SMauro Carvalho Chehab /* current frame format */
61407965e2SMauro Carvalho Chehab int frame_format;
62407965e2SMauro Carvalho Chehab };
63407965e2SMauro Carvalho Chehab
64407965e2SMauro Carvalho Chehab struct vpfe_route {
65407965e2SMauro Carvalho Chehab u32 input;
66407965e2SMauro Carvalho Chehab u32 output;
67407965e2SMauro Carvalho Chehab };
68407965e2SMauro Carvalho Chehab
69407965e2SMauro Carvalho Chehab struct vpfe_subdev_info {
70407965e2SMauro Carvalho Chehab /* Sub device group id */
71407965e2SMauro Carvalho Chehab int grp_id;
72407965e2SMauro Carvalho Chehab /* inputs available at the sub device */
73407965e2SMauro Carvalho Chehab struct v4l2_input inputs[VPFE_MAX_INPUTS];
74407965e2SMauro Carvalho Chehab /* Sub dev routing information for each input */
75407965e2SMauro Carvalho Chehab struct vpfe_route *routes;
76407965e2SMauro Carvalho Chehab /* check if sub dev supports routing */
77407965e2SMauro Carvalho Chehab int can_route;
78407965e2SMauro Carvalho Chehab /* ccdc bus/interface configuration */
79407965e2SMauro Carvalho Chehab struct vpfe_hw_if_param vpfe_param;
80407965e2SMauro Carvalho Chehab struct v4l2_subdev *sd;
81407965e2SMauro Carvalho Chehab };
82407965e2SMauro Carvalho Chehab
83407965e2SMauro Carvalho Chehab struct vpfe_config {
84407965e2SMauro Carvalho Chehab /* information about each subdev */
85407965e2SMauro Carvalho Chehab struct vpfe_subdev_info sub_devs[VPFE_MAX_SUBDEV];
86407965e2SMauro Carvalho Chehab /* Flat array, arranged in groups */
87*adb2dcd5SSakari Ailus struct v4l2_async_connection *asd[VPFE_MAX_SUBDEV];
88407965e2SMauro Carvalho Chehab };
89407965e2SMauro Carvalho Chehab
90407965e2SMauro Carvalho Chehab struct vpfe_cap_buffer {
91407965e2SMauro Carvalho Chehab struct vb2_v4l2_buffer vb;
92407965e2SMauro Carvalho Chehab struct list_head list;
93407965e2SMauro Carvalho Chehab };
94407965e2SMauro Carvalho Chehab
95407965e2SMauro Carvalho Chehab enum ccdc_pixfmt {
96407965e2SMauro Carvalho Chehab CCDC_PIXFMT_RAW = 0,
97407965e2SMauro Carvalho Chehab CCDC_PIXFMT_YCBCR_16BIT,
98407965e2SMauro Carvalho Chehab CCDC_PIXFMT_YCBCR_8BIT,
99407965e2SMauro Carvalho Chehab };
100407965e2SMauro Carvalho Chehab
101407965e2SMauro Carvalho Chehab enum ccdc_frmfmt {
102407965e2SMauro Carvalho Chehab CCDC_FRMFMT_PROGRESSIVE = 0,
103407965e2SMauro Carvalho Chehab CCDC_FRMFMT_INTERLACED,
104407965e2SMauro Carvalho Chehab };
105407965e2SMauro Carvalho Chehab
106407965e2SMauro Carvalho Chehab /* PIXEL ORDER IN MEMORY from LSB to MSB */
107407965e2SMauro Carvalho Chehab /* only applicable for 8-bit input mode */
108407965e2SMauro Carvalho Chehab enum ccdc_pixorder {
109407965e2SMauro Carvalho Chehab CCDC_PIXORDER_YCBYCR,
110407965e2SMauro Carvalho Chehab CCDC_PIXORDER_CBYCRY,
111407965e2SMauro Carvalho Chehab };
112407965e2SMauro Carvalho Chehab
113407965e2SMauro Carvalho Chehab enum ccdc_buftype {
114407965e2SMauro Carvalho Chehab CCDC_BUFTYPE_FLD_INTERLEAVED,
115407965e2SMauro Carvalho Chehab CCDC_BUFTYPE_FLD_SEPARATED
116407965e2SMauro Carvalho Chehab };
117407965e2SMauro Carvalho Chehab
118407965e2SMauro Carvalho Chehab
119407965e2SMauro Carvalho Chehab /* returns the highest bit used for the gamma */
ccdc_gamma_width_max_bit(enum vpfe_ccdc_gamma_width width)120407965e2SMauro Carvalho Chehab static inline u8 ccdc_gamma_width_max_bit(enum vpfe_ccdc_gamma_width width)
121407965e2SMauro Carvalho Chehab {
122407965e2SMauro Carvalho Chehab return 15 - width;
123407965e2SMauro Carvalho Chehab }
124407965e2SMauro Carvalho Chehab
125407965e2SMauro Carvalho Chehab /* returns the highest bit used for this data size */
ccdc_data_size_max_bit(enum vpfe_ccdc_data_size sz)126407965e2SMauro Carvalho Chehab static inline u8 ccdc_data_size_max_bit(enum vpfe_ccdc_data_size sz)
127407965e2SMauro Carvalho Chehab {
128407965e2SMauro Carvalho Chehab return sz == VPFE_CCDC_DATA_8BITS ? 7 : 15 - sz;
129407965e2SMauro Carvalho Chehab }
130407965e2SMauro Carvalho Chehab
131407965e2SMauro Carvalho Chehab /* Structure for CCDC configuration parameters for raw capture mode */
132407965e2SMauro Carvalho Chehab struct ccdc_params_raw {
133407965e2SMauro Carvalho Chehab /* pixel format */
134407965e2SMauro Carvalho Chehab enum ccdc_pixfmt pix_fmt;
135407965e2SMauro Carvalho Chehab /* progressive or interlaced frame */
136407965e2SMauro Carvalho Chehab enum ccdc_frmfmt frm_fmt;
137407965e2SMauro Carvalho Chehab struct v4l2_rect win;
138407965e2SMauro Carvalho Chehab /* Current Format Bytes Per Pixels */
139407965e2SMauro Carvalho Chehab unsigned int bytesperpixel;
140407965e2SMauro Carvalho Chehab /* Current Format Bytes per Lines
141407965e2SMauro Carvalho Chehab * (Aligned to 32 bytes) used for HORZ_INFO
142407965e2SMauro Carvalho Chehab */
143407965e2SMauro Carvalho Chehab unsigned int bytesperline;
144407965e2SMauro Carvalho Chehab /* field id polarity */
145407965e2SMauro Carvalho Chehab enum vpfe_pin_pol fid_pol;
146407965e2SMauro Carvalho Chehab /* vertical sync polarity */
147407965e2SMauro Carvalho Chehab enum vpfe_pin_pol vd_pol;
148407965e2SMauro Carvalho Chehab /* horizontal sync polarity */
149407965e2SMauro Carvalho Chehab enum vpfe_pin_pol hd_pol;
150407965e2SMauro Carvalho Chehab /* interleaved or separated fields */
151407965e2SMauro Carvalho Chehab enum ccdc_buftype buf_type;
152407965e2SMauro Carvalho Chehab /*
153407965e2SMauro Carvalho Chehab * enable to store the image in inverse
154407965e2SMauro Carvalho Chehab * order in memory(bottom to top)
155407965e2SMauro Carvalho Chehab */
156407965e2SMauro Carvalho Chehab unsigned char image_invert_enable;
157407965e2SMauro Carvalho Chehab /* configurable parameters */
158407965e2SMauro Carvalho Chehab struct vpfe_ccdc_config_params_raw config_params;
159407965e2SMauro Carvalho Chehab };
160407965e2SMauro Carvalho Chehab
161407965e2SMauro Carvalho Chehab struct ccdc_params_ycbcr {
162407965e2SMauro Carvalho Chehab /* pixel format */
163407965e2SMauro Carvalho Chehab enum ccdc_pixfmt pix_fmt;
164407965e2SMauro Carvalho Chehab /* progressive or interlaced frame */
165407965e2SMauro Carvalho Chehab enum ccdc_frmfmt frm_fmt;
166407965e2SMauro Carvalho Chehab struct v4l2_rect win;
167407965e2SMauro Carvalho Chehab /* Current Format Bytes Per Pixels */
168407965e2SMauro Carvalho Chehab unsigned int bytesperpixel;
169407965e2SMauro Carvalho Chehab /* Current Format Bytes per Lines
170407965e2SMauro Carvalho Chehab * (Aligned to 32 bytes) used for HORZ_INFO
171407965e2SMauro Carvalho Chehab */
172407965e2SMauro Carvalho Chehab unsigned int bytesperline;
173407965e2SMauro Carvalho Chehab /* field id polarity */
174407965e2SMauro Carvalho Chehab enum vpfe_pin_pol fid_pol;
175407965e2SMauro Carvalho Chehab /* vertical sync polarity */
176407965e2SMauro Carvalho Chehab enum vpfe_pin_pol vd_pol;
177407965e2SMauro Carvalho Chehab /* horizontal sync polarity */
178407965e2SMauro Carvalho Chehab enum vpfe_pin_pol hd_pol;
179407965e2SMauro Carvalho Chehab /* enable BT.656 embedded sync mode */
180407965e2SMauro Carvalho Chehab int bt656_enable;
181407965e2SMauro Carvalho Chehab /* cb:y:cr:y or y:cb:y:cr in memory */
182407965e2SMauro Carvalho Chehab enum ccdc_pixorder pix_order;
183407965e2SMauro Carvalho Chehab /* interleaved or separated fields */
184407965e2SMauro Carvalho Chehab enum ccdc_buftype buf_type;
185407965e2SMauro Carvalho Chehab };
186407965e2SMauro Carvalho Chehab
187407965e2SMauro Carvalho Chehab /*
188407965e2SMauro Carvalho Chehab * CCDC operational configuration
189407965e2SMauro Carvalho Chehab */
190407965e2SMauro Carvalho Chehab struct ccdc_config {
191407965e2SMauro Carvalho Chehab /* CCDC interface type */
192407965e2SMauro Carvalho Chehab enum vpfe_hw_if_type if_type;
193407965e2SMauro Carvalho Chehab /* Raw Bayer configuration */
194407965e2SMauro Carvalho Chehab struct ccdc_params_raw bayer;
195407965e2SMauro Carvalho Chehab /* YCbCr configuration */
196407965e2SMauro Carvalho Chehab struct ccdc_params_ycbcr ycbcr;
197407965e2SMauro Carvalho Chehab /* ccdc base address */
198407965e2SMauro Carvalho Chehab void __iomem *base_addr;
199407965e2SMauro Carvalho Chehab };
200407965e2SMauro Carvalho Chehab
201407965e2SMauro Carvalho Chehab struct vpfe_ccdc {
202407965e2SMauro Carvalho Chehab struct ccdc_config ccdc_cfg;
203407965e2SMauro Carvalho Chehab u32 ccdc_ctx[VPFE_REG_END / sizeof(u32)];
204407965e2SMauro Carvalho Chehab };
205407965e2SMauro Carvalho Chehab
206407965e2SMauro Carvalho Chehab /*
207407965e2SMauro Carvalho Chehab * struct vpfe_fmt - VPFE media bus format information
208407965e2SMauro Carvalho Chehab * fourcc: V4L2 pixel format code
209407965e2SMauro Carvalho Chehab * code: V4L2 media bus format code
210407965e2SMauro Carvalho Chehab * bitsperpixel: Bits per pixel over the bus
211407965e2SMauro Carvalho Chehab */
212407965e2SMauro Carvalho Chehab struct vpfe_fmt {
213407965e2SMauro Carvalho Chehab u32 fourcc;
214407965e2SMauro Carvalho Chehab u32 code;
215407965e2SMauro Carvalho Chehab u32 bitsperpixel;
216407965e2SMauro Carvalho Chehab };
217407965e2SMauro Carvalho Chehab
218407965e2SMauro Carvalho Chehab /*
219407965e2SMauro Carvalho Chehab * When formats[] is modified make sure to adjust this value also.
220407965e2SMauro Carvalho Chehab * Expect compile time warnings if VPFE_NUM_FORMATS is smaller then
221407965e2SMauro Carvalho Chehab * the number of elements in formats[].
222407965e2SMauro Carvalho Chehab */
223407965e2SMauro Carvalho Chehab #define VPFE_NUM_FORMATS 10
224407965e2SMauro Carvalho Chehab
225407965e2SMauro Carvalho Chehab struct vpfe_device {
226407965e2SMauro Carvalho Chehab /* V4l2 specific parameters */
227407965e2SMauro Carvalho Chehab /* Identifies video device for this channel */
228407965e2SMauro Carvalho Chehab struct video_device video_dev;
229407965e2SMauro Carvalho Chehab /* sub devices */
230407965e2SMauro Carvalho Chehab struct v4l2_subdev **sd;
231407965e2SMauro Carvalho Chehab /* vpfe cfg */
232407965e2SMauro Carvalho Chehab struct vpfe_config *cfg;
233407965e2SMauro Carvalho Chehab /* V4l2 device */
234407965e2SMauro Carvalho Chehab struct v4l2_device v4l2_dev;
235407965e2SMauro Carvalho Chehab /* parent device */
236407965e2SMauro Carvalho Chehab struct device *pdev;
237407965e2SMauro Carvalho Chehab /* subdevice async Notifier */
238407965e2SMauro Carvalho Chehab struct v4l2_async_notifier notifier;
239407965e2SMauro Carvalho Chehab /* Indicates id of the field which is being displayed */
240407965e2SMauro Carvalho Chehab unsigned field;
241407965e2SMauro Carvalho Chehab unsigned sequence;
242407965e2SMauro Carvalho Chehab /* current interface type */
243407965e2SMauro Carvalho Chehab struct vpfe_hw_if_param vpfe_if_params;
244407965e2SMauro Carvalho Chehab /* ptr to currently selected sub device */
245407965e2SMauro Carvalho Chehab struct vpfe_subdev_info *current_subdev;
246407965e2SMauro Carvalho Chehab /* current input at the sub device */
247407965e2SMauro Carvalho Chehab int current_input;
248407965e2SMauro Carvalho Chehab /* Keeps track of the information about the standard */
249407965e2SMauro Carvalho Chehab struct vpfe_std_info std_info;
250407965e2SMauro Carvalho Chehab /* std index into std table */
251407965e2SMauro Carvalho Chehab int std_index;
252407965e2SMauro Carvalho Chehab /* IRQs used when CCDC output to SDRAM */
253407965e2SMauro Carvalho Chehab unsigned int irq;
254407965e2SMauro Carvalho Chehab /* Pointer pointing to current v4l2_buffer */
255407965e2SMauro Carvalho Chehab struct vpfe_cap_buffer *cur_frm;
256407965e2SMauro Carvalho Chehab /* Pointer pointing to next v4l2_buffer */
257407965e2SMauro Carvalho Chehab struct vpfe_cap_buffer *next_frm;
258407965e2SMauro Carvalho Chehab /* Used to store pixel format */
259407965e2SMauro Carvalho Chehab struct v4l2_format fmt;
260407965e2SMauro Carvalho Chehab /* Used to keep a reference to the current vpfe_fmt */
261407965e2SMauro Carvalho Chehab struct vpfe_fmt *current_vpfe_fmt;
262407965e2SMauro Carvalho Chehab struct vpfe_fmt *active_fmt[VPFE_NUM_FORMATS];
263407965e2SMauro Carvalho Chehab unsigned int num_active_fmt;
264407965e2SMauro Carvalho Chehab
265407965e2SMauro Carvalho Chehab /*
266407965e2SMauro Carvalho Chehab * used when IMP is chained to store the crop window which
267407965e2SMauro Carvalho Chehab * is different from the image window
268407965e2SMauro Carvalho Chehab */
269407965e2SMauro Carvalho Chehab struct v4l2_rect crop;
2706be95480SHans Verkuil /* Buffer queue used in vb2 */
271407965e2SMauro Carvalho Chehab struct vb2_queue buffer_queue;
272407965e2SMauro Carvalho Chehab /* Queue of filled frames */
273407965e2SMauro Carvalho Chehab struct list_head dma_queue;
274407965e2SMauro Carvalho Chehab /* IRQ lock for DMA queue */
275407965e2SMauro Carvalho Chehab spinlock_t dma_queue_lock;
276407965e2SMauro Carvalho Chehab /* lock used to access this structure */
277407965e2SMauro Carvalho Chehab struct mutex lock;
278407965e2SMauro Carvalho Chehab /*
279407965e2SMauro Carvalho Chehab * offset where second field starts from the starting of the
280407965e2SMauro Carvalho Chehab * buffer for field separated YCbCr formats
281407965e2SMauro Carvalho Chehab */
282407965e2SMauro Carvalho Chehab u32 field_off;
283407965e2SMauro Carvalho Chehab struct vpfe_ccdc ccdc;
284407965e2SMauro Carvalho Chehab int stopping;
285407965e2SMauro Carvalho Chehab struct completion capture_stop;
286407965e2SMauro Carvalho Chehab };
287407965e2SMauro Carvalho Chehab
288407965e2SMauro Carvalho Chehab #endif /* AM437X_VPFE_H */
289