162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __SAA7146_VV__
362306a36Sopenharmony_ci#define __SAA7146_VV__
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <media/v4l2-common.h>
662306a36Sopenharmony_ci#include <media/v4l2-ioctl.h>
762306a36Sopenharmony_ci#include <media/v4l2-fh.h>
862306a36Sopenharmony_ci#include <media/drv-intf/saa7146.h>
962306a36Sopenharmony_ci#include <media/videobuf2-dma-sg.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#define MAX_SAA7146_CAPTURE_BUFFERS	32	/* arbitrary */
1262306a36Sopenharmony_ci#define BUFFER_TIMEOUT     (HZ/2)  /* 0.5 seconds */
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define WRITE_RPS0(x) do { \
1562306a36Sopenharmony_ci	dev->d_rps0.cpu_addr[ count++ ] = cpu_to_le32(x); \
1662306a36Sopenharmony_ci	} while (0);
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define WRITE_RPS1(x) do { \
1962306a36Sopenharmony_ci	dev->d_rps1.cpu_addr[ count++ ] = cpu_to_le32(x); \
2062306a36Sopenharmony_ci	} while (0);
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct	saa7146_video_dma {
2362306a36Sopenharmony_ci	u32 base_odd;
2462306a36Sopenharmony_ci	u32 base_even;
2562306a36Sopenharmony_ci	u32 prot_addr;
2662306a36Sopenharmony_ci	u32 pitch;
2762306a36Sopenharmony_ci	u32 base_page;
2862306a36Sopenharmony_ci	u32 num_line_byte;
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define FORMAT_BYTE_SWAP	0x1
3262306a36Sopenharmony_ci#define FORMAT_IS_PLANAR	0x2
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistruct saa7146_format {
3562306a36Sopenharmony_ci	u32	pixelformat;
3662306a36Sopenharmony_ci	u32	trans;
3762306a36Sopenharmony_ci	u8	depth;
3862306a36Sopenharmony_ci	u8	flags;
3962306a36Sopenharmony_ci	u8	swap;
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct saa7146_standard
4362306a36Sopenharmony_ci{
4462306a36Sopenharmony_ci	char          *name;
4562306a36Sopenharmony_ci	v4l2_std_id   id;
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	int v_offset;	/* number of lines of vertical offset before processing */
4862306a36Sopenharmony_ci	int v_field;	/* number of lines in a field for HPS to process */
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	int h_offset;	/* horizontal offset of processing window */
5162306a36Sopenharmony_ci	int h_pixels;	/* number of horizontal pixels to process */
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	int v_max_out;
5462306a36Sopenharmony_ci	int h_max_out;
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci/* buffer for one video/vbi frame */
5862306a36Sopenharmony_cistruct saa7146_buf {
5962306a36Sopenharmony_ci	/* common v4l buffer stuff -- must be first */
6062306a36Sopenharmony_ci	struct vb2_v4l2_buffer vb;
6162306a36Sopenharmony_ci	struct list_head list;
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	/* saa7146 specific */
6462306a36Sopenharmony_ci	int (*activate)(struct saa7146_dev *dev,
6562306a36Sopenharmony_ci			struct saa7146_buf *buf,
6662306a36Sopenharmony_ci			struct saa7146_buf *next);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci	/* page tables */
6962306a36Sopenharmony_ci	struct saa7146_pgtable  pt[3];
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistruct saa7146_dmaqueue {
7362306a36Sopenharmony_ci	struct saa7146_dev	*dev;
7462306a36Sopenharmony_ci	struct saa7146_buf	*curr;
7562306a36Sopenharmony_ci	struct list_head	queue;
7662306a36Sopenharmony_ci	struct timer_list	timeout;
7762306a36Sopenharmony_ci	struct vb2_queue	q;
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistruct saa7146_vv
8162306a36Sopenharmony_ci{
8262306a36Sopenharmony_ci	/* vbi capture */
8362306a36Sopenharmony_ci	struct saa7146_dmaqueue		vbi_dmaq;
8462306a36Sopenharmony_ci	struct v4l2_vbi_format		vbi_fmt;
8562306a36Sopenharmony_ci	struct timer_list		vbi_read_timeout;
8662306a36Sopenharmony_ci	/* vbi workaround interrupt queue */
8762306a36Sopenharmony_ci	wait_queue_head_t		vbi_wq;
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	/* video capture */
9062306a36Sopenharmony_ci	struct saa7146_dmaqueue		video_dmaq;
9162306a36Sopenharmony_ci	struct v4l2_pix_format		video_fmt;
9262306a36Sopenharmony_ci	enum v4l2_field			last_field;
9362306a36Sopenharmony_ci	u32				seqnr;
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	/* common: fixme? shouldn't this be in saa7146_fh?
9662306a36Sopenharmony_ci	   (this leads to a more complicated question: shall the driver
9762306a36Sopenharmony_ci	   store the different settings (for example S_INPUT) for every open
9862306a36Sopenharmony_ci	   and restore it appropriately, or should all settings be common for
9962306a36Sopenharmony_ci	   all opens? currently, we do the latter, like all other
10062306a36Sopenharmony_ci	   drivers do... */
10162306a36Sopenharmony_ci	struct saa7146_standard	*standard;
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	int	vflip;
10462306a36Sopenharmony_ci	int	hflip;
10562306a36Sopenharmony_ci	int	current_hps_source;
10662306a36Sopenharmony_ci	int	current_hps_sync;
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci	unsigned int resources; /* resource management for device */
10962306a36Sopenharmony_ci};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci/* flags */
11262306a36Sopenharmony_ci#define SAA7146_USE_PORT_B_FOR_VBI	0x2     /* use input port b for vbi hardware bug workaround */
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_cistruct saa7146_ext_vv
11562306a36Sopenharmony_ci{
11662306a36Sopenharmony_ci	/* information about the video capabilities of the device */
11762306a36Sopenharmony_ci	int	inputs;
11862306a36Sopenharmony_ci	int	audios;
11962306a36Sopenharmony_ci	u32	capabilities;
12062306a36Sopenharmony_ci	int	flags;
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci	/* additionally supported transmission standards */
12362306a36Sopenharmony_ci	struct saa7146_standard *stds;
12462306a36Sopenharmony_ci	int num_stds;
12562306a36Sopenharmony_ci	int (*std_callback)(struct saa7146_dev*, struct saa7146_standard *);
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	/* the extension can override this */
12862306a36Sopenharmony_ci	struct v4l2_ioctl_ops vid_ops;
12962306a36Sopenharmony_ci	struct v4l2_ioctl_ops vbi_ops;
13062306a36Sopenharmony_ci	/* pointer to the saa7146 core ops */
13162306a36Sopenharmony_ci	const struct v4l2_ioctl_ops *core_ops;
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	struct v4l2_file_operations vbi_fops;
13462306a36Sopenharmony_ci};
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_cistruct saa7146_use_ops  {
13762306a36Sopenharmony_ci	void (*init)(struct saa7146_dev *, struct saa7146_vv *);
13862306a36Sopenharmony_ci	void (*irq_done)(struct saa7146_dev *, unsigned long status);
13962306a36Sopenharmony_ci};
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci/* from saa7146_fops.c */
14262306a36Sopenharmony_ciint saa7146_register_device(struct video_device *vid, struct saa7146_dev *dev, char *name, int type);
14362306a36Sopenharmony_ciint saa7146_unregister_device(struct video_device *vid, struct saa7146_dev *dev);
14462306a36Sopenharmony_civoid saa7146_buffer_finish(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, int state);
14562306a36Sopenharmony_civoid saa7146_buffer_next(struct saa7146_dev *dev, struct saa7146_dmaqueue *q,int vbi);
14662306a36Sopenharmony_ciint saa7146_buffer_queue(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, struct saa7146_buf *buf);
14762306a36Sopenharmony_civoid saa7146_buffer_timeout(struct timer_list *t);
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ciint saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv);
15062306a36Sopenharmony_ciint saa7146_vv_release(struct saa7146_dev* dev);
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci/* from saa7146_hlp.c */
15362306a36Sopenharmony_civoid saa7146_set_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struct saa7146_buf *next);
15462306a36Sopenharmony_civoid saa7146_write_out_dma(struct saa7146_dev* dev, int which, struct saa7146_video_dma* vdma) ;
15562306a36Sopenharmony_civoid saa7146_set_hps_source_and_sync(struct saa7146_dev *saa, int source, int sync);
15662306a36Sopenharmony_civoid saa7146_set_gpio(struct saa7146_dev *saa, u8 pin, u8 data);
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci/* from saa7146_video.c */
15962306a36Sopenharmony_ciextern const struct v4l2_ioctl_ops saa7146_video_ioctl_ops;
16062306a36Sopenharmony_ciextern const struct v4l2_ioctl_ops saa7146_vbi_ioctl_ops;
16162306a36Sopenharmony_ciextern const struct saa7146_use_ops saa7146_video_uops;
16262306a36Sopenharmony_ciextern const struct vb2_ops video_qops;
16362306a36Sopenharmony_cilong saa7146_video_do_ioctl(struct file *file, unsigned int cmd, void *arg);
16462306a36Sopenharmony_ciint saa7146_s_ctrl(struct v4l2_ctrl *ctrl);
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci/* from saa7146_vbi.c */
16762306a36Sopenharmony_ciextern const struct saa7146_use_ops saa7146_vbi_uops;
16862306a36Sopenharmony_ciextern const struct vb2_ops vbi_qops;
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci/* resource management functions */
17162306a36Sopenharmony_ciint saa7146_res_get(struct saa7146_dev *dev, unsigned int bit);
17262306a36Sopenharmony_civoid saa7146_res_free(struct saa7146_dev *dev, unsigned int bits);
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci#define RESOURCE_DMA1_HPS	0x1
17562306a36Sopenharmony_ci#define RESOURCE_DMA2_CLP	0x2
17662306a36Sopenharmony_ci#define RESOURCE_DMA3_BRS	0x4
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci/* saa7146 source inputs */
17962306a36Sopenharmony_ci#define SAA7146_HPS_SOURCE_PORT_A	0x00
18062306a36Sopenharmony_ci#define SAA7146_HPS_SOURCE_PORT_B	0x01
18162306a36Sopenharmony_ci#define SAA7146_HPS_SOURCE_YPB_CPA	0x02
18262306a36Sopenharmony_ci#define SAA7146_HPS_SOURCE_YPA_CPB	0x03
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci/* sync inputs */
18562306a36Sopenharmony_ci#define SAA7146_HPS_SYNC_PORT_A		0x00
18662306a36Sopenharmony_ci#define SAA7146_HPS_SYNC_PORT_B		0x01
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci/* some memory sizes */
18962306a36Sopenharmony_ci/* max. 16 clipping rectangles */
19062306a36Sopenharmony_ci#define SAA7146_CLIPPING_MEM	(16 * 4 * sizeof(u32))
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci/* some defines for the various clipping-modes */
19362306a36Sopenharmony_ci#define SAA7146_CLIPPING_RECT		0x4
19462306a36Sopenharmony_ci#define SAA7146_CLIPPING_RECT_INVERTED	0x5
19562306a36Sopenharmony_ci#define SAA7146_CLIPPING_MASK		0x6
19662306a36Sopenharmony_ci#define SAA7146_CLIPPING_MASK_INVERTED	0x7
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci/* output formats: each entry holds four information */
19962306a36Sopenharmony_ci#define RGB08_COMPOSED	0x0217 /* composed is used in the sense of "not-planar" */
20062306a36Sopenharmony_ci/* this means: planar?=0, yuv2rgb-conversation-mode=2, dither=yes(=1), format-mode = 7 */
20162306a36Sopenharmony_ci#define RGB15_COMPOSED	0x0213
20262306a36Sopenharmony_ci#define RGB16_COMPOSED	0x0210
20362306a36Sopenharmony_ci#define RGB24_COMPOSED	0x0201
20462306a36Sopenharmony_ci#define RGB32_COMPOSED	0x0202
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci#define Y8			0x0006
20762306a36Sopenharmony_ci#define YUV411_COMPOSED		0x0003
20862306a36Sopenharmony_ci#define YUV422_COMPOSED		0x0000
20962306a36Sopenharmony_ci/* this means: planar?=1, yuv2rgb-conversion-mode=0, dither=no(=0), format-mode = b */
21062306a36Sopenharmony_ci#define YUV411_DECOMPOSED	0x100b
21162306a36Sopenharmony_ci#define YUV422_DECOMPOSED	0x1009
21262306a36Sopenharmony_ci#define YUV420_DECOMPOSED	0x100a
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci#define IS_PLANAR(x) (x & 0xf000)
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci/* misc defines */
21762306a36Sopenharmony_ci#define SAA7146_NO_SWAP		(0x0)
21862306a36Sopenharmony_ci#define SAA7146_TWO_BYTE_SWAP	(0x1)
21962306a36Sopenharmony_ci#define SAA7146_FOUR_BYTE_SWAP	(0x2)
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci#endif
222