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