162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2010-2013 Bluecherry, LLC <https://www.bluecherrydvr.com>
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Original author:
662306a36Sopenharmony_ci * Ben Collins <bcollins@ubuntu.com>
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Additional work by:
962306a36Sopenharmony_ci * John Brooks <john.brooks@bluecherry.net>
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#ifndef __SOLO6X10_H
1362306a36Sopenharmony_ci#define __SOLO6X10_H
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <linux/pci.h>
1662306a36Sopenharmony_ci#include <linux/i2c.h>
1762306a36Sopenharmony_ci#include <linux/mutex.h>
1862306a36Sopenharmony_ci#include <linux/list.h>
1962306a36Sopenharmony_ci#include <linux/wait.h>
2062306a36Sopenharmony_ci#include <linux/stringify.h>
2162306a36Sopenharmony_ci#include <linux/io.h>
2262306a36Sopenharmony_ci#include <linux/atomic.h>
2362306a36Sopenharmony_ci#include <linux/slab.h>
2462306a36Sopenharmony_ci#include <linux/videodev2.h>
2562306a36Sopenharmony_ci#include <linux/gpio/driver.h>
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#include <media/v4l2-dev.h>
2862306a36Sopenharmony_ci#include <media/v4l2-device.h>
2962306a36Sopenharmony_ci#include <media/v4l2-ctrls.h>
3062306a36Sopenharmony_ci#include <media/videobuf2-v4l2.h>
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#include "solo6x10-regs.h"
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#ifndef PCI_VENDOR_ID_SOFTLOGIC
3562306a36Sopenharmony_ci#define PCI_VENDOR_ID_SOFTLOGIC		0x9413
3662306a36Sopenharmony_ci#define PCI_DEVICE_ID_SOLO6010		0x6010
3762306a36Sopenharmony_ci#define PCI_DEVICE_ID_SOLO6110		0x6110
3862306a36Sopenharmony_ci#endif
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#ifndef PCI_VENDOR_ID_BLUECHERRY
4162306a36Sopenharmony_ci#define PCI_VENDOR_ID_BLUECHERRY	0x1BB3
4262306a36Sopenharmony_ci/* Neugent Softlogic 6010 based cards */
4362306a36Sopenharmony_ci#define PCI_DEVICE_ID_NEUSOLO_4		0x4304
4462306a36Sopenharmony_ci#define PCI_DEVICE_ID_NEUSOLO_9		0x4309
4562306a36Sopenharmony_ci#define PCI_DEVICE_ID_NEUSOLO_16	0x4310
4662306a36Sopenharmony_ci/* Bluecherry Softlogic 6010 based cards */
4762306a36Sopenharmony_ci#define PCI_DEVICE_ID_BC_SOLO_4		0x4E04
4862306a36Sopenharmony_ci#define PCI_DEVICE_ID_BC_SOLO_9		0x4E09
4962306a36Sopenharmony_ci#define PCI_DEVICE_ID_BC_SOLO_16	0x4E10
5062306a36Sopenharmony_ci/* Bluecherry Softlogic 6110 based cards */
5162306a36Sopenharmony_ci#define PCI_DEVICE_ID_BC_6110_4		0x5304
5262306a36Sopenharmony_ci#define PCI_DEVICE_ID_BC_6110_8		0x5308
5362306a36Sopenharmony_ci#define PCI_DEVICE_ID_BC_6110_16	0x5310
5462306a36Sopenharmony_ci#endif /* Bluecherry */
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/* Used in pci_device_id, and solo_dev->type */
5762306a36Sopenharmony_ci#define SOLO_DEV_6010			0
5862306a36Sopenharmony_ci#define SOLO_DEV_6110			1
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#define SOLO6X10_NAME			"solo6x10"
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#define SOLO_MAX_CHANNELS		16
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#define SOLO6X10_VERSION		"3.0.0"
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci/*
6762306a36Sopenharmony_ci * The SOLO6x10 actually has 8 i2c channels, but we only use 2.
6862306a36Sopenharmony_ci * 0 - Techwell chip(s)
6962306a36Sopenharmony_ci * 1 - SAA7128
7062306a36Sopenharmony_ci */
7162306a36Sopenharmony_ci#define SOLO_I2C_ADAPTERS		2
7262306a36Sopenharmony_ci#define SOLO_I2C_TW			0
7362306a36Sopenharmony_ci#define SOLO_I2C_SAA			1
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci/* DMA Engine setup */
7662306a36Sopenharmony_ci#define SOLO_NR_P2M			4
7762306a36Sopenharmony_ci#define SOLO_NR_P2M_DESC		256
7862306a36Sopenharmony_ci#define SOLO_P2M_DESC_SIZE		(SOLO_NR_P2M_DESC * 16)
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci/* Encoder standard modes */
8162306a36Sopenharmony_ci#define SOLO_ENC_MODE_CIF		2
8262306a36Sopenharmony_ci#define SOLO_ENC_MODE_HD1		1
8362306a36Sopenharmony_ci#define SOLO_ENC_MODE_D1		9
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci#define SOLO_DEFAULT_QP			3
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci#define SOLO_CID_CUSTOM_BASE		(V4L2_CID_USER_BASE | 0xf000)
8862306a36Sopenharmony_ci#define V4L2_CID_MOTION_TRACE		(SOLO_CID_CUSTOM_BASE+2)
8962306a36Sopenharmony_ci#define V4L2_CID_OSD_TEXT		(SOLO_CID_CUSTOM_BASE+3)
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/*
9262306a36Sopenharmony_ci * Motion thresholds are in a table of 64x64 samples, with
9362306a36Sopenharmony_ci * each sample representing 16x16 pixels of the source. In
9462306a36Sopenharmony_ci * effect, 44x30 samples are used for NTSC, and 44x36 for PAL.
9562306a36Sopenharmony_ci * The 5th sample on the 10th row is (10*64)+5 = 645.
9662306a36Sopenharmony_ci *
9762306a36Sopenharmony_ci * Internally it is stored as a 45x45 array (45*16 = 720, which is the
9862306a36Sopenharmony_ci * maximum PAL/NTSC width).
9962306a36Sopenharmony_ci */
10062306a36Sopenharmony_ci#define SOLO_MOTION_SZ (45)
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cienum SOLO_I2C_STATE {
10362306a36Sopenharmony_ci	IIC_STATE_IDLE,
10462306a36Sopenharmony_ci	IIC_STATE_START,
10562306a36Sopenharmony_ci	IIC_STATE_READ,
10662306a36Sopenharmony_ci	IIC_STATE_WRITE,
10762306a36Sopenharmony_ci	IIC_STATE_STOP
10862306a36Sopenharmony_ci};
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci/* Defined in Table 4-16, Page 68-69 of the 6010 Datasheet */
11162306a36Sopenharmony_cistruct solo_p2m_desc {
11262306a36Sopenharmony_ci	u32	ctrl;
11362306a36Sopenharmony_ci	u32	cfg;
11462306a36Sopenharmony_ci	u32	dma_addr;
11562306a36Sopenharmony_ci	u32	ext_addr;
11662306a36Sopenharmony_ci};
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_cistruct solo_p2m_dev {
11962306a36Sopenharmony_ci	struct mutex		mutex;
12062306a36Sopenharmony_ci	struct completion	completion;
12162306a36Sopenharmony_ci	int			desc_count;
12262306a36Sopenharmony_ci	int			desc_idx;
12362306a36Sopenharmony_ci	struct solo_p2m_desc	*descs;
12462306a36Sopenharmony_ci	int			error;
12562306a36Sopenharmony_ci};
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci#define OSD_TEXT_MAX		44
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_cistruct solo_vb2_buf {
13062306a36Sopenharmony_ci	struct vb2_v4l2_buffer vb;
13162306a36Sopenharmony_ci	struct list_head list;
13262306a36Sopenharmony_ci};
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_cienum solo_enc_types {
13562306a36Sopenharmony_ci	SOLO_ENC_TYPE_STD,
13662306a36Sopenharmony_ci	SOLO_ENC_TYPE_EXT,
13762306a36Sopenharmony_ci};
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_cistruct solo_enc_dev {
14062306a36Sopenharmony_ci	struct solo_dev	*solo_dev;
14162306a36Sopenharmony_ci	/* V4L2 Items */
14262306a36Sopenharmony_ci	struct v4l2_ctrl_handler hdl;
14362306a36Sopenharmony_ci	struct v4l2_ctrl *md_thresholds;
14462306a36Sopenharmony_ci	struct video_device	*vfd;
14562306a36Sopenharmony_ci	/* General accounting */
14662306a36Sopenharmony_ci	struct mutex		lock;
14762306a36Sopenharmony_ci	spinlock_t		motion_lock;
14862306a36Sopenharmony_ci	u8			ch;
14962306a36Sopenharmony_ci	u8			mode, gop, qp, interlaced, interval;
15062306a36Sopenharmony_ci	u8			bw_weight;
15162306a36Sopenharmony_ci	u16			motion_thresh;
15262306a36Sopenharmony_ci	bool			motion_global;
15362306a36Sopenharmony_ci	bool			motion_enabled;
15462306a36Sopenharmony_ci	u16			width;
15562306a36Sopenharmony_ci	u16			height;
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	/* OSD buffers */
15862306a36Sopenharmony_ci	char			osd_text[OSD_TEXT_MAX + 1];
15962306a36Sopenharmony_ci	u8			osd_buf[SOLO_EOSD_EXT_SIZE_MAX]
16062306a36Sopenharmony_ci					__aligned(4);
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	/* VOP stuff */
16362306a36Sopenharmony_ci	u8			vop[64];
16462306a36Sopenharmony_ci	int			vop_len;
16562306a36Sopenharmony_ci	u8			jpeg_header[1024];
16662306a36Sopenharmony_ci	int			jpeg_len;
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci	u32			fmt;
16962306a36Sopenharmony_ci	enum solo_enc_types	type;
17062306a36Sopenharmony_ci	u32			sequence;
17162306a36Sopenharmony_ci	struct vb2_queue	vidq;
17262306a36Sopenharmony_ci	struct list_head	vidq_active;
17362306a36Sopenharmony_ci	int			desc_count;
17462306a36Sopenharmony_ci	int			desc_nelts;
17562306a36Sopenharmony_ci	struct solo_p2m_desc	*desc_items;
17662306a36Sopenharmony_ci	dma_addr_t		desc_dma;
17762306a36Sopenharmony_ci	spinlock_t		av_lock;
17862306a36Sopenharmony_ci};
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci/* The SOLO6x10 PCI Device */
18162306a36Sopenharmony_cistruct solo_dev {
18262306a36Sopenharmony_ci	/* General stuff */
18362306a36Sopenharmony_ci	struct pci_dev		*pdev;
18462306a36Sopenharmony_ci	int			type;
18562306a36Sopenharmony_ci	unsigned int		time_sync;
18662306a36Sopenharmony_ci	unsigned int		usec_lsb;
18762306a36Sopenharmony_ci	unsigned int		clock_mhz;
18862306a36Sopenharmony_ci	u8 __iomem		*reg_base;
18962306a36Sopenharmony_ci	int			nr_chans;
19062306a36Sopenharmony_ci	int			nr_ext;
19162306a36Sopenharmony_ci	u32			irq_mask;
19262306a36Sopenharmony_ci	u32			motion_mask;
19362306a36Sopenharmony_ci	struct v4l2_device	v4l2_dev;
19462306a36Sopenharmony_ci#ifdef CONFIG_GPIOLIB
19562306a36Sopenharmony_ci	/* GPIO */
19662306a36Sopenharmony_ci	struct gpio_chip	gpio_dev;
19762306a36Sopenharmony_ci#endif
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci	/* tw28xx accounting */
20062306a36Sopenharmony_ci	u8			tw2865, tw2864, tw2815;
20162306a36Sopenharmony_ci	u8			tw28_cnt;
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci	/* i2c related items */
20462306a36Sopenharmony_ci	struct i2c_adapter	i2c_adap[SOLO_I2C_ADAPTERS];
20562306a36Sopenharmony_ci	enum SOLO_I2C_STATE	i2c_state;
20662306a36Sopenharmony_ci	struct mutex		i2c_mutex;
20762306a36Sopenharmony_ci	int			i2c_id;
20862306a36Sopenharmony_ci	wait_queue_head_t	i2c_wait;
20962306a36Sopenharmony_ci	struct i2c_msg		*i2c_msg;
21062306a36Sopenharmony_ci	unsigned int		i2c_msg_num;
21162306a36Sopenharmony_ci	unsigned int		i2c_msg_ptr;
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci	/* P2M DMA Engine */
21462306a36Sopenharmony_ci	struct solo_p2m_dev	p2m_dev[SOLO_NR_P2M];
21562306a36Sopenharmony_ci	atomic_t		p2m_count;
21662306a36Sopenharmony_ci	int			p2m_jiffies;
21762306a36Sopenharmony_ci	unsigned int		p2m_timeouts;
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci	/* V4L2 Display items */
22062306a36Sopenharmony_ci	struct video_device	*vfd;
22162306a36Sopenharmony_ci	unsigned int		erasing;
22262306a36Sopenharmony_ci	unsigned int		frame_blank;
22362306a36Sopenharmony_ci	u8			cur_disp_ch;
22462306a36Sopenharmony_ci	wait_queue_head_t	disp_thread_wait;
22562306a36Sopenharmony_ci	struct v4l2_ctrl_handler disp_hdl;
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci	/* V4L2 Encoder items */
22862306a36Sopenharmony_ci	struct solo_enc_dev	*v4l2_enc[SOLO_MAX_CHANNELS];
22962306a36Sopenharmony_ci	u16			enc_bw_remain;
23062306a36Sopenharmony_ci	/* IDX into hw mp4 encoder */
23162306a36Sopenharmony_ci	u8			enc_idx;
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci	/* Current video settings */
23462306a36Sopenharmony_ci	u32			video_type;
23562306a36Sopenharmony_ci	u16			video_hsize, video_vsize;
23662306a36Sopenharmony_ci	u16			vout_hstart, vout_vstart;
23762306a36Sopenharmony_ci	u16			vin_hstart, vin_vstart;
23862306a36Sopenharmony_ci	u8			fps;
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci	/* JPEG Qp setting */
24162306a36Sopenharmony_ci	spinlock_t      jpeg_qp_lock;
24262306a36Sopenharmony_ci	u32		jpeg_qp[2];
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci	/* Audio components */
24562306a36Sopenharmony_ci	struct snd_card		*snd_card;
24662306a36Sopenharmony_ci	struct snd_pcm		*snd_pcm;
24762306a36Sopenharmony_ci	atomic_t		snd_users;
24862306a36Sopenharmony_ci	int			g723_hw_idx;
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	/* sysfs stuffs */
25162306a36Sopenharmony_ci	struct device		dev;
25262306a36Sopenharmony_ci	int			sdram_size;
25362306a36Sopenharmony_ci	struct bin_attribute	sdram_attr;
25462306a36Sopenharmony_ci	unsigned int		sys_config;
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci	/* Ring thread */
25762306a36Sopenharmony_ci	struct task_struct	*ring_thread;
25862306a36Sopenharmony_ci	wait_queue_head_t	ring_thread_wait;
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci	/* VOP_HEADER handling */
26162306a36Sopenharmony_ci	void                    *vh_buf;
26262306a36Sopenharmony_ci	dma_addr_t		vh_dma;
26362306a36Sopenharmony_ci	int			vh_size;
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci	/* Buffer handling */
26662306a36Sopenharmony_ci	struct vb2_queue	vidq;
26762306a36Sopenharmony_ci	u32			sequence;
26862306a36Sopenharmony_ci	struct task_struct      *kthread;
26962306a36Sopenharmony_ci	struct mutex		lock;
27062306a36Sopenharmony_ci	spinlock_t		slock;
27162306a36Sopenharmony_ci	int			old_write;
27262306a36Sopenharmony_ci	struct list_head	vidq_active;
27362306a36Sopenharmony_ci};
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_cistatic inline u32 solo_reg_read(struct solo_dev *solo_dev, int reg)
27662306a36Sopenharmony_ci{
27762306a36Sopenharmony_ci	return readl(solo_dev->reg_base + reg);
27862306a36Sopenharmony_ci}
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_cistatic inline void solo_reg_write(struct solo_dev *solo_dev, int reg,
28162306a36Sopenharmony_ci				  u32 data)
28262306a36Sopenharmony_ci{
28362306a36Sopenharmony_ci	u16 val;
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci	writel(data, solo_dev->reg_base + reg);
28662306a36Sopenharmony_ci	pci_read_config_word(solo_dev->pdev, PCI_STATUS, &val);
28762306a36Sopenharmony_ci}
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_cistatic inline void solo_irq_on(struct solo_dev *dev, u32 mask)
29062306a36Sopenharmony_ci{
29162306a36Sopenharmony_ci	dev->irq_mask |= mask;
29262306a36Sopenharmony_ci	solo_reg_write(dev, SOLO_IRQ_MASK, dev->irq_mask);
29362306a36Sopenharmony_ci}
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_cistatic inline void solo_irq_off(struct solo_dev *dev, u32 mask)
29662306a36Sopenharmony_ci{
29762306a36Sopenharmony_ci	dev->irq_mask &= ~mask;
29862306a36Sopenharmony_ci	solo_reg_write(dev, SOLO_IRQ_MASK, dev->irq_mask);
29962306a36Sopenharmony_ci}
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci/* Init/exit routines for subsystems */
30262306a36Sopenharmony_ciint solo_disp_init(struct solo_dev *solo_dev);
30362306a36Sopenharmony_civoid solo_disp_exit(struct solo_dev *solo_dev);
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ciint solo_gpio_init(struct solo_dev *solo_dev);
30662306a36Sopenharmony_civoid solo_gpio_exit(struct solo_dev *solo_dev);
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ciint solo_i2c_init(struct solo_dev *solo_dev);
30962306a36Sopenharmony_civoid solo_i2c_exit(struct solo_dev *solo_dev);
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ciint solo_p2m_init(struct solo_dev *solo_dev);
31262306a36Sopenharmony_civoid solo_p2m_exit(struct solo_dev *solo_dev);
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ciint solo_v4l2_init(struct solo_dev *solo_dev, unsigned nr);
31562306a36Sopenharmony_civoid solo_v4l2_exit(struct solo_dev *solo_dev);
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ciint solo_enc_init(struct solo_dev *solo_dev);
31862306a36Sopenharmony_civoid solo_enc_exit(struct solo_dev *solo_dev);
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ciint solo_enc_v4l2_init(struct solo_dev *solo_dev, unsigned nr);
32162306a36Sopenharmony_civoid solo_enc_v4l2_exit(struct solo_dev *solo_dev);
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ciint solo_g723_init(struct solo_dev *solo_dev);
32462306a36Sopenharmony_civoid solo_g723_exit(struct solo_dev *solo_dev);
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ci/* ISR's */
32762306a36Sopenharmony_ciint solo_i2c_isr(struct solo_dev *solo_dev);
32862306a36Sopenharmony_civoid solo_p2m_isr(struct solo_dev *solo_dev, int id);
32962306a36Sopenharmony_civoid solo_p2m_error_isr(struct solo_dev *solo_dev);
33062306a36Sopenharmony_civoid solo_enc_v4l2_isr(struct solo_dev *solo_dev);
33162306a36Sopenharmony_civoid solo_g723_isr(struct solo_dev *solo_dev);
33262306a36Sopenharmony_civoid solo_motion_isr(struct solo_dev *solo_dev);
33362306a36Sopenharmony_civoid solo_video_in_isr(struct solo_dev *solo_dev);
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci/* i2c read/write */
33662306a36Sopenharmony_ciu8 solo_i2c_readbyte(struct solo_dev *solo_dev, int id, u8 addr, u8 off);
33762306a36Sopenharmony_civoid solo_i2c_writebyte(struct solo_dev *solo_dev, int id, u8 addr, u8 off,
33862306a36Sopenharmony_ci			u8 data);
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci/* P2M DMA */
34162306a36Sopenharmony_ciint solo_p2m_dma_t(struct solo_dev *solo_dev, int wr,
34262306a36Sopenharmony_ci		   dma_addr_t dma_addr, u32 ext_addr, u32 size,
34362306a36Sopenharmony_ci		   int repeat, u32 ext_size);
34462306a36Sopenharmony_ciint solo_p2m_dma(struct solo_dev *solo_dev, int wr,
34562306a36Sopenharmony_ci		 void *sys_addr, u32 ext_addr, u32 size,
34662306a36Sopenharmony_ci		 int repeat, u32 ext_size);
34762306a36Sopenharmony_civoid solo_p2m_fill_desc(struct solo_p2m_desc *desc, int wr,
34862306a36Sopenharmony_ci			dma_addr_t dma_addr, u32 ext_addr, u32 size,
34962306a36Sopenharmony_ci			int repeat, u32 ext_size);
35062306a36Sopenharmony_ciint solo_p2m_dma_desc(struct solo_dev *solo_dev,
35162306a36Sopenharmony_ci		      struct solo_p2m_desc *desc, dma_addr_t desc_dma,
35262306a36Sopenharmony_ci		      int desc_cnt);
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci/* Global s_std ioctl */
35562306a36Sopenharmony_ciint solo_set_video_type(struct solo_dev *solo_dev, bool is_50hz);
35662306a36Sopenharmony_civoid solo_update_mode(struct solo_enc_dev *solo_enc);
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_ci/* Set the threshold for motion detection */
35962306a36Sopenharmony_ciint solo_set_motion_threshold(struct solo_dev *solo_dev, u8 ch, u16 val);
36062306a36Sopenharmony_ciint solo_set_motion_block(struct solo_dev *solo_dev, u8 ch,
36162306a36Sopenharmony_ci		const u16 *thresholds);
36262306a36Sopenharmony_ci#define SOLO_DEF_MOT_THRESH		0x0300
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci/* Write text on OSD */
36562306a36Sopenharmony_ciint solo_osd_print(struct solo_enc_dev *solo_enc);
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci/* EEPROM commands */
36862306a36Sopenharmony_ciunsigned int solo_eeprom_ewen(struct solo_dev *solo_dev, int w_en);
36962306a36Sopenharmony_ci__be16 solo_eeprom_read(struct solo_dev *solo_dev, int loc);
37062306a36Sopenharmony_ciint solo_eeprom_write(struct solo_dev *solo_dev, int loc,
37162306a36Sopenharmony_ci		      __be16 data);
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci/* JPEG Qp functions */
37462306a36Sopenharmony_civoid solo_s_jpeg_qp(struct solo_dev *solo_dev, unsigned int ch,
37562306a36Sopenharmony_ci		    unsigned int qp);
37662306a36Sopenharmony_ciint solo_g_jpeg_qp(struct solo_dev *solo_dev, unsigned int ch);
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci#define CHK_FLAGS(v, flags) (((v) & (flags)) == (flags))
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci#endif /* __SOLO6X10_H */
381