139d08ab9SHans Verkuil /* SPDX-License-Identifier: GPL-2.0 */
239d08ab9SHans Verkuil #ifndef __SAA7146_VV__
339d08ab9SHans Verkuil #define __SAA7146_VV__
439d08ab9SHans Verkuil 
539d08ab9SHans Verkuil #include <media/v4l2-common.h>
639d08ab9SHans Verkuil #include <media/v4l2-ioctl.h>
739d08ab9SHans Verkuil #include <media/v4l2-fh.h>
839d08ab9SHans Verkuil #include <media/drv-intf/saa7146.h>
9*0b6e30bdSHans Verkuil #include <media/videobuf2-dma-sg.h>
1039d08ab9SHans Verkuil 
1139d08ab9SHans Verkuil #define MAX_SAA7146_CAPTURE_BUFFERS	32	/* arbitrary */
1239d08ab9SHans Verkuil #define BUFFER_TIMEOUT     (HZ/2)  /* 0.5 seconds */
1339d08ab9SHans Verkuil 
1439d08ab9SHans Verkuil #define WRITE_RPS0(x) do { \
1539d08ab9SHans Verkuil 	dev->d_rps0.cpu_addr[ count++ ] = cpu_to_le32(x); \
1639d08ab9SHans Verkuil 	} while (0);
1739d08ab9SHans Verkuil 
1839d08ab9SHans Verkuil #define WRITE_RPS1(x) do { \
1939d08ab9SHans Verkuil 	dev->d_rps1.cpu_addr[ count++ ] = cpu_to_le32(x); \
2039d08ab9SHans Verkuil 	} while (0);
2139d08ab9SHans Verkuil 
2239d08ab9SHans Verkuil struct	saa7146_video_dma {
2339d08ab9SHans Verkuil 	u32 base_odd;
2439d08ab9SHans Verkuil 	u32 base_even;
2539d08ab9SHans Verkuil 	u32 prot_addr;
2639d08ab9SHans Verkuil 	u32 pitch;
2739d08ab9SHans Verkuil 	u32 base_page;
2839d08ab9SHans Verkuil 	u32 num_line_byte;
2939d08ab9SHans Verkuil };
3039d08ab9SHans Verkuil 
3139d08ab9SHans Verkuil #define FORMAT_BYTE_SWAP	0x1
3239d08ab9SHans Verkuil #define FORMAT_IS_PLANAR	0x2
3339d08ab9SHans Verkuil 
3439d08ab9SHans Verkuil struct saa7146_format {
3539d08ab9SHans Verkuil 	u32	pixelformat;
3639d08ab9SHans Verkuil 	u32	trans;
3739d08ab9SHans Verkuil 	u8	depth;
3839d08ab9SHans Verkuil 	u8	flags;
3939d08ab9SHans Verkuil 	u8	swap;
4039d08ab9SHans Verkuil };
4139d08ab9SHans Verkuil 
4239d08ab9SHans Verkuil struct saa7146_standard
4339d08ab9SHans Verkuil {
4439d08ab9SHans Verkuil 	char          *name;
4539d08ab9SHans Verkuil 	v4l2_std_id   id;
4639d08ab9SHans Verkuil 
4739d08ab9SHans Verkuil 	int v_offset;	/* number of lines of vertical offset before processing */
4839d08ab9SHans Verkuil 	int v_field;	/* number of lines in a field for HPS to process */
4939d08ab9SHans Verkuil 
5039d08ab9SHans Verkuil 	int h_offset;	/* horizontal offset of processing window */
5139d08ab9SHans Verkuil 	int h_pixels;	/* number of horizontal pixels to process */
5239d08ab9SHans Verkuil 
5339d08ab9SHans Verkuil 	int v_max_out;
5439d08ab9SHans Verkuil 	int h_max_out;
5539d08ab9SHans Verkuil };
5639d08ab9SHans Verkuil 
5739d08ab9SHans Verkuil /* buffer for one video/vbi frame */
5839d08ab9SHans Verkuil struct saa7146_buf {
5939d08ab9SHans Verkuil 	/* common v4l buffer stuff -- must be first */
60*0b6e30bdSHans Verkuil 	struct vb2_v4l2_buffer vb;
61*0b6e30bdSHans Verkuil 	struct list_head list;
6239d08ab9SHans Verkuil 
6339d08ab9SHans Verkuil 	/* saa7146 specific */
6439d08ab9SHans Verkuil 	int (*activate)(struct saa7146_dev *dev,
6539d08ab9SHans Verkuil 			struct saa7146_buf *buf,
6639d08ab9SHans Verkuil 			struct saa7146_buf *next);
6739d08ab9SHans Verkuil 
6839d08ab9SHans Verkuil 	/* page tables */
6939d08ab9SHans Verkuil 	struct saa7146_pgtable  pt[3];
7039d08ab9SHans Verkuil };
7139d08ab9SHans Verkuil 
7239d08ab9SHans Verkuil struct saa7146_dmaqueue {
7339d08ab9SHans Verkuil 	struct saa7146_dev	*dev;
7439d08ab9SHans Verkuil 	struct saa7146_buf	*curr;
7539d08ab9SHans Verkuil 	struct list_head	queue;
7639d08ab9SHans Verkuil 	struct timer_list	timeout;
77*0b6e30bdSHans Verkuil 	struct vb2_queue	q;
7839d08ab9SHans Verkuil };
7939d08ab9SHans Verkuil 
8039d08ab9SHans Verkuil struct saa7146_vv
8139d08ab9SHans Verkuil {
8239d08ab9SHans Verkuil 	/* vbi capture */
8339d08ab9SHans Verkuil 	struct saa7146_dmaqueue		vbi_dmaq;
8439d08ab9SHans Verkuil 	struct v4l2_vbi_format		vbi_fmt;
8539d08ab9SHans Verkuil 	struct timer_list		vbi_read_timeout;
8639d08ab9SHans Verkuil 	/* vbi workaround interrupt queue */
8739d08ab9SHans Verkuil 	wait_queue_head_t		vbi_wq;
8839d08ab9SHans Verkuil 
8939d08ab9SHans Verkuil 	/* video capture */
9039d08ab9SHans Verkuil 	struct saa7146_dmaqueue		video_dmaq;
9139d08ab9SHans Verkuil 	struct v4l2_pix_format		video_fmt;
9239d08ab9SHans Verkuil 	enum v4l2_field			last_field;
93*0b6e30bdSHans Verkuil 	u32				seqnr;
9439d08ab9SHans Verkuil 
9539d08ab9SHans Verkuil 	/* common: fixme? shouldn't this be in saa7146_fh?
9639d08ab9SHans Verkuil 	   (this leads to a more complicated question: shall the driver
9739d08ab9SHans Verkuil 	   store the different settings (for example S_INPUT) for every open
9839d08ab9SHans Verkuil 	   and restore it appropriately, or should all settings be common for
9939d08ab9SHans Verkuil 	   all opens? currently, we do the latter, like all other
10039d08ab9SHans Verkuil 	   drivers do... */
10139d08ab9SHans Verkuil 	struct saa7146_standard	*standard;
10239d08ab9SHans Verkuil 
10339d08ab9SHans Verkuil 	int	vflip;
10439d08ab9SHans Verkuil 	int	hflip;
10539d08ab9SHans Verkuil 	int	current_hps_source;
10639d08ab9SHans Verkuil 	int	current_hps_sync;
10739d08ab9SHans Verkuil 
10839d08ab9SHans Verkuil 	unsigned int resources; /* resource management for device */
10939d08ab9SHans Verkuil };
11039d08ab9SHans Verkuil 
11139d08ab9SHans Verkuil /* flags */
11239d08ab9SHans Verkuil #define SAA7146_USE_PORT_B_FOR_VBI	0x2     /* use input port b for vbi hardware bug workaround */
11339d08ab9SHans Verkuil 
11439d08ab9SHans Verkuil struct saa7146_ext_vv
11539d08ab9SHans Verkuil {
11639d08ab9SHans Verkuil 	/* information about the video capabilities of the device */
11739d08ab9SHans Verkuil 	int	inputs;
11839d08ab9SHans Verkuil 	int	audios;
11939d08ab9SHans Verkuil 	u32	capabilities;
12039d08ab9SHans Verkuil 	int	flags;
12139d08ab9SHans Verkuil 
12239d08ab9SHans Verkuil 	/* additionally supported transmission standards */
12339d08ab9SHans Verkuil 	struct saa7146_standard *stds;
12439d08ab9SHans Verkuil 	int num_stds;
12539d08ab9SHans Verkuil 	int (*std_callback)(struct saa7146_dev*, struct saa7146_standard *);
12639d08ab9SHans Verkuil 
12739d08ab9SHans Verkuil 	/* the extension can override this */
12839d08ab9SHans Verkuil 	struct v4l2_ioctl_ops vid_ops;
12939d08ab9SHans Verkuil 	struct v4l2_ioctl_ops vbi_ops;
13039d08ab9SHans Verkuil 	/* pointer to the saa7146 core ops */
13139d08ab9SHans Verkuil 	const struct v4l2_ioctl_ops *core_ops;
13239d08ab9SHans Verkuil 
13339d08ab9SHans Verkuil 	struct v4l2_file_operations vbi_fops;
13439d08ab9SHans Verkuil };
13539d08ab9SHans Verkuil 
13639d08ab9SHans Verkuil struct saa7146_use_ops  {
13739d08ab9SHans Verkuil 	void (*init)(struct saa7146_dev *, struct saa7146_vv *);
13839d08ab9SHans Verkuil 	void (*irq_done)(struct saa7146_dev *, unsigned long status);
13939d08ab9SHans Verkuil };
14039d08ab9SHans Verkuil 
14139d08ab9SHans Verkuil /* from saa7146_fops.c */
14239d08ab9SHans Verkuil int saa7146_register_device(struct video_device *vid, struct saa7146_dev *dev, char *name, int type);
14339d08ab9SHans Verkuil int saa7146_unregister_device(struct video_device *vid, struct saa7146_dev *dev);
14439d08ab9SHans Verkuil void saa7146_buffer_finish(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, int state);
14539d08ab9SHans Verkuil void saa7146_buffer_next(struct saa7146_dev *dev, struct saa7146_dmaqueue *q,int vbi);
14639d08ab9SHans Verkuil int saa7146_buffer_queue(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, struct saa7146_buf *buf);
14739d08ab9SHans Verkuil void saa7146_buffer_timeout(struct timer_list *t);
14839d08ab9SHans Verkuil 
14939d08ab9SHans Verkuil int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv);
15039d08ab9SHans Verkuil int saa7146_vv_release(struct saa7146_dev* dev);
15139d08ab9SHans Verkuil 
15239d08ab9SHans Verkuil /* from saa7146_hlp.c */
15339d08ab9SHans Verkuil void saa7146_set_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struct saa7146_buf *next);
15439d08ab9SHans Verkuil void saa7146_write_out_dma(struct saa7146_dev* dev, int which, struct saa7146_video_dma* vdma) ;
15539d08ab9SHans Verkuil void saa7146_set_hps_source_and_sync(struct saa7146_dev *saa, int source, int sync);
15639d08ab9SHans Verkuil void saa7146_set_gpio(struct saa7146_dev *saa, u8 pin, u8 data);
15739d08ab9SHans Verkuil 
15839d08ab9SHans Verkuil /* from saa7146_video.c */
15939d08ab9SHans Verkuil extern const struct v4l2_ioctl_ops saa7146_video_ioctl_ops;
16039d08ab9SHans Verkuil extern const struct v4l2_ioctl_ops saa7146_vbi_ioctl_ops;
16139d08ab9SHans Verkuil extern const struct saa7146_use_ops saa7146_video_uops;
162*0b6e30bdSHans Verkuil extern const struct vb2_ops video_qops;
16339d08ab9SHans Verkuil long saa7146_video_do_ioctl(struct file *file, unsigned int cmd, void *arg);
16439d08ab9SHans Verkuil int saa7146_s_ctrl(struct v4l2_ctrl *ctrl);
16539d08ab9SHans Verkuil 
16639d08ab9SHans Verkuil /* from saa7146_vbi.c */
16739d08ab9SHans Verkuil extern const struct saa7146_use_ops saa7146_vbi_uops;
168*0b6e30bdSHans Verkuil extern const struct vb2_ops vbi_qops;
16939d08ab9SHans Verkuil 
17039d08ab9SHans Verkuil /* resource management functions */
171acdb1573SHans Verkuil int saa7146_res_get(struct saa7146_dev *dev, unsigned int bit);
172acdb1573SHans Verkuil void saa7146_res_free(struct saa7146_dev *dev, unsigned int bits);
17339d08ab9SHans Verkuil 
17439d08ab9SHans Verkuil #define RESOURCE_DMA1_HPS	0x1
17539d08ab9SHans Verkuil #define RESOURCE_DMA2_CLP	0x2
17639d08ab9SHans Verkuil #define RESOURCE_DMA3_BRS	0x4
17739d08ab9SHans Verkuil 
17839d08ab9SHans Verkuil /* saa7146 source inputs */
17939d08ab9SHans Verkuil #define SAA7146_HPS_SOURCE_PORT_A	0x00
18039d08ab9SHans Verkuil #define SAA7146_HPS_SOURCE_PORT_B	0x01
18139d08ab9SHans Verkuil #define SAA7146_HPS_SOURCE_YPB_CPA	0x02
18239d08ab9SHans Verkuil #define SAA7146_HPS_SOURCE_YPA_CPB	0x03
18339d08ab9SHans Verkuil 
18439d08ab9SHans Verkuil /* sync inputs */
18539d08ab9SHans Verkuil #define SAA7146_HPS_SYNC_PORT_A		0x00
18639d08ab9SHans Verkuil #define SAA7146_HPS_SYNC_PORT_B		0x01
18739d08ab9SHans Verkuil 
18839d08ab9SHans Verkuil /* some memory sizes */
18939d08ab9SHans Verkuil /* max. 16 clipping rectangles */
19039d08ab9SHans Verkuil #define SAA7146_CLIPPING_MEM	(16 * 4 * sizeof(u32))
19139d08ab9SHans Verkuil 
19239d08ab9SHans Verkuil /* some defines for the various clipping-modes */
19339d08ab9SHans Verkuil #define SAA7146_CLIPPING_RECT		0x4
19439d08ab9SHans Verkuil #define SAA7146_CLIPPING_RECT_INVERTED	0x5
19539d08ab9SHans Verkuil #define SAA7146_CLIPPING_MASK		0x6
19639d08ab9SHans Verkuil #define SAA7146_CLIPPING_MASK_INVERTED	0x7
19739d08ab9SHans Verkuil 
19839d08ab9SHans Verkuil /* output formats: each entry holds four information */
19939d08ab9SHans Verkuil #define RGB08_COMPOSED	0x0217 /* composed is used in the sense of "not-planar" */
20039d08ab9SHans Verkuil /* this means: planar?=0, yuv2rgb-conversation-mode=2, dither=yes(=1), format-mode = 7 */
20139d08ab9SHans Verkuil #define RGB15_COMPOSED	0x0213
20239d08ab9SHans Verkuil #define RGB16_COMPOSED	0x0210
20339d08ab9SHans Verkuil #define RGB24_COMPOSED	0x0201
20439d08ab9SHans Verkuil #define RGB32_COMPOSED	0x0202
20539d08ab9SHans Verkuil 
20639d08ab9SHans Verkuil #define Y8			0x0006
20739d08ab9SHans Verkuil #define YUV411_COMPOSED		0x0003
20839d08ab9SHans Verkuil #define YUV422_COMPOSED		0x0000
20939d08ab9SHans Verkuil /* this means: planar?=1, yuv2rgb-conversion-mode=0, dither=no(=0), format-mode = b */
21039d08ab9SHans Verkuil #define YUV411_DECOMPOSED	0x100b
21139d08ab9SHans Verkuil #define YUV422_DECOMPOSED	0x1009
21239d08ab9SHans Verkuil #define YUV420_DECOMPOSED	0x100a
21339d08ab9SHans Verkuil 
21439d08ab9SHans Verkuil #define IS_PLANAR(x) (x & 0xf000)
21539d08ab9SHans Verkuil 
21639d08ab9SHans Verkuil /* misc defines */
21739d08ab9SHans Verkuil #define SAA7146_NO_SWAP		(0x0)
21839d08ab9SHans Verkuil #define SAA7146_TWO_BYTE_SWAP	(0x1)
21939d08ab9SHans Verkuil #define SAA7146_FOUR_BYTE_SWAP	(0x2)
22039d08ab9SHans Verkuil 
22139d08ab9SHans Verkuil #endif
222