18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _AV7110_H_
38c2ecf20Sopenharmony_ci#define _AV7110_H_
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/interrupt.h>
68c2ecf20Sopenharmony_ci#include <linux/socket.h>
78c2ecf20Sopenharmony_ci#include <linux/netdevice.h>
88c2ecf20Sopenharmony_ci#include <linux/i2c.h>
98c2ecf20Sopenharmony_ci#include <linux/input.h>
108c2ecf20Sopenharmony_ci#include <linux/time.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/dvb/video.h>
138c2ecf20Sopenharmony_ci#include <linux/dvb/audio.h>
148c2ecf20Sopenharmony_ci#include <linux/dvb/dmx.h>
158c2ecf20Sopenharmony_ci#include <linux/dvb/ca.h>
168c2ecf20Sopenharmony_ci#include <linux/dvb/osd.h>
178c2ecf20Sopenharmony_ci#include <linux/dvb/net.h>
188c2ecf20Sopenharmony_ci#include <linux/mutex.h>
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#include <media/dvbdev.h>
218c2ecf20Sopenharmony_ci#include <media/demux.h>
228c2ecf20Sopenharmony_ci#include <media/dvb_demux.h>
238c2ecf20Sopenharmony_ci#include <media/dmxdev.h>
248c2ecf20Sopenharmony_ci#include "dvb_filter.h"
258c2ecf20Sopenharmony_ci#include <media/dvb_net.h>
268c2ecf20Sopenharmony_ci#include <media/dvb_ringbuffer.h>
278c2ecf20Sopenharmony_ci#include <media/dvb_frontend.h>
288c2ecf20Sopenharmony_ci#include "ves1820.h"
298c2ecf20Sopenharmony_ci#include "ves1x93.h"
308c2ecf20Sopenharmony_ci#include "stv0299.h"
318c2ecf20Sopenharmony_ci#include "tda8083.h"
328c2ecf20Sopenharmony_ci#include "sp8870.h"
338c2ecf20Sopenharmony_ci#include "stv0297.h"
348c2ecf20Sopenharmony_ci#include "l64781.h"
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#include <media/drv-intf/saa7146_vv.h>
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#define ANALOG_TUNER_VES1820 1
408c2ecf20Sopenharmony_ci#define ANALOG_TUNER_STV0297 2
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ciextern int av7110_debug;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci#define dprintk(level, fmt, arg...) do {				\
458c2ecf20Sopenharmony_ci	if (level & av7110_debug)					\
468c2ecf20Sopenharmony_ci		printk(KERN_DEBUG KBUILD_MODNAME ": %s(): " fmt,	\
478c2ecf20Sopenharmony_ci		       __func__, ##arg);				\
488c2ecf20Sopenharmony_ci} while (0)
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci#define MAXFILT 32
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cienum {AV_PES_STREAM, PS_STREAM, TS_STREAM, PES_STREAM};
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_cienum av7110_video_mode {
558c2ecf20Sopenharmony_ci	AV7110_VIDEO_MODE_PAL	= 0,
568c2ecf20Sopenharmony_ci	AV7110_VIDEO_MODE_NTSC	= 1
578c2ecf20Sopenharmony_ci};
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_cistruct av7110_p2t {
608c2ecf20Sopenharmony_ci	u8		  pes[TS_SIZE];
618c2ecf20Sopenharmony_ci	u8		  counter;
628c2ecf20Sopenharmony_ci	long int	  pos;
638c2ecf20Sopenharmony_ci	int		  frags;
648c2ecf20Sopenharmony_ci	struct dvb_demux_feed *feed;
658c2ecf20Sopenharmony_ci};
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci/* video MPEG decoder events: */
688c2ecf20Sopenharmony_ci/* (code copied from dvb_frontend.c, should maybe be factored out...) */
698c2ecf20Sopenharmony_ci#define MAX_VIDEO_EVENT 8
708c2ecf20Sopenharmony_cistruct dvb_video_events {
718c2ecf20Sopenharmony_ci	struct video_event	  events[MAX_VIDEO_EVENT];
728c2ecf20Sopenharmony_ci	int			  eventw;
738c2ecf20Sopenharmony_ci	int			  eventr;
748c2ecf20Sopenharmony_ci	int			  overflow;
758c2ecf20Sopenharmony_ci	wait_queue_head_t	  wait_queue;
768c2ecf20Sopenharmony_ci	spinlock_t		  lock;
778c2ecf20Sopenharmony_ci};
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_cistruct av7110;
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci/* infrared remote control */
838c2ecf20Sopenharmony_cistruct infrared {
848c2ecf20Sopenharmony_ci	struct rc_dev		*rcdev;
858c2ecf20Sopenharmony_ci	char			input_phys[32];
868c2ecf20Sopenharmony_ci	u32			ir_config;
878c2ecf20Sopenharmony_ci};
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci/* place to store all the necessary device information */
908c2ecf20Sopenharmony_cistruct av7110 {
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci	/* devices */
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci	struct dvb_device	dvb_dev;
958c2ecf20Sopenharmony_ci	struct dvb_net		dvb_net;
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci	struct video_device	v4l_dev;
988c2ecf20Sopenharmony_ci	struct video_device	vbi_dev;
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci	struct saa7146_dev	*dev;
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	struct i2c_adapter	i2c_adap;
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci	char			*card_name;
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ci	/* support for analog module of dvb-c */
1078c2ecf20Sopenharmony_ci	int			analog_tuner_flags;
1088c2ecf20Sopenharmony_ci	int			current_input;
1098c2ecf20Sopenharmony_ci	u32			current_freq;
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ci	struct tasklet_struct	debi_tasklet;
1128c2ecf20Sopenharmony_ci	struct tasklet_struct	gpio_tasklet;
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ci	int adac_type;	       /* audio DAC type */
1158c2ecf20Sopenharmony_ci#define DVB_ADAC_TI	  0
1168c2ecf20Sopenharmony_ci#define DVB_ADAC_CRYSTAL  1
1178c2ecf20Sopenharmony_ci#define DVB_ADAC_MSP34x0  2
1188c2ecf20Sopenharmony_ci#define DVB_ADAC_MSP34x5  3
1198c2ecf20Sopenharmony_ci#define DVB_ADAC_NONE	 -1
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci	/* buffers */
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci	void		       *iobuf;	 /* memory for all buffers */
1258c2ecf20Sopenharmony_ci	struct dvb_ringbuffer	avout;   /* buffer for video or A/V mux */
1268c2ecf20Sopenharmony_ci#define AVOUTLEN (128*1024)
1278c2ecf20Sopenharmony_ci	struct dvb_ringbuffer	aout;    /* buffer for audio */
1288c2ecf20Sopenharmony_ci#define AOUTLEN (64*1024)
1298c2ecf20Sopenharmony_ci	void		       *bmpbuf;
1308c2ecf20Sopenharmony_ci#define BMPLEN (8*32768+1024)
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci	/* bitmap buffers and states */
1338c2ecf20Sopenharmony_ci
1348c2ecf20Sopenharmony_ci	int			bmpp;
1358c2ecf20Sopenharmony_ci	int			bmplen;
1368c2ecf20Sopenharmony_ci	volatile int		bmp_state;
1378c2ecf20Sopenharmony_ci#define BMP_NONE     0
1388c2ecf20Sopenharmony_ci#define BMP_LOADING  1
1398c2ecf20Sopenharmony_ci#define BMP_LOADED   2
1408c2ecf20Sopenharmony_ci	wait_queue_head_t	bmpq;
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci	/* DEBI and polled command interface */
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_ci	spinlock_t		debilock;
1468c2ecf20Sopenharmony_ci	struct mutex		dcomlock;
1478c2ecf20Sopenharmony_ci	volatile int		debitype;
1488c2ecf20Sopenharmony_ci	volatile int		debilen;
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ci	/* Recording and playback flags */
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci	int			rec_mode;
1548c2ecf20Sopenharmony_ci	int			playing;
1558c2ecf20Sopenharmony_ci#define RP_NONE  0
1568c2ecf20Sopenharmony_ci#define RP_VIDEO 1
1578c2ecf20Sopenharmony_ci#define RP_AUDIO 2
1588c2ecf20Sopenharmony_ci#define RP_AV	 3
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci	/* OSD */
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	int			osdwin;      /* currently active window */
1648c2ecf20Sopenharmony_ci	u16			osdbpp[8];
1658c2ecf20Sopenharmony_ci	struct mutex		osd_mutex;
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_ci	/* CA */
1688c2ecf20Sopenharmony_ci
1698c2ecf20Sopenharmony_ci	struct ca_slot_info	ci_slot[2];
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_ci	enum av7110_video_mode	vidmode;
1728c2ecf20Sopenharmony_ci	struct dmxdev		dmxdev;
1738c2ecf20Sopenharmony_ci	struct dvb_demux	demux;
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ci	struct dmx_frontend	hw_frontend;
1768c2ecf20Sopenharmony_ci	struct dmx_frontend	mem_frontend;
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci	/* for budget mode demux1 */
1798c2ecf20Sopenharmony_ci	struct dmxdev		dmxdev1;
1808c2ecf20Sopenharmony_ci	struct dvb_demux	demux1;
1818c2ecf20Sopenharmony_ci	struct dvb_net		dvb_net1;
1828c2ecf20Sopenharmony_ci	spinlock_t		feedlock1;
1838c2ecf20Sopenharmony_ci	int			feeding1;
1848c2ecf20Sopenharmony_ci	u32			ttbp;
1858c2ecf20Sopenharmony_ci	unsigned char           *grabbing;
1868c2ecf20Sopenharmony_ci	struct saa7146_pgtable  pt;
1878c2ecf20Sopenharmony_ci	struct tasklet_struct   vpe_tasklet;
1888c2ecf20Sopenharmony_ci	bool			full_ts;
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_ci	int			fe_synced;
1918c2ecf20Sopenharmony_ci	struct mutex		pid_mutex;
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_ci	int			video_blank;
1948c2ecf20Sopenharmony_ci	struct video_status	videostate;
1958c2ecf20Sopenharmony_ci	u16			display_panscan;
1968c2ecf20Sopenharmony_ci	int			display_ar;
1978c2ecf20Sopenharmony_ci	int			trickmode;
1988c2ecf20Sopenharmony_ci#define TRICK_NONE   0
1998c2ecf20Sopenharmony_ci#define TRICK_FAST   1
2008c2ecf20Sopenharmony_ci#define TRICK_SLOW   2
2018c2ecf20Sopenharmony_ci#define TRICK_FREEZE 3
2028c2ecf20Sopenharmony_ci	struct audio_status	audiostate;
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_ci	struct dvb_demux_filter *handle2filter[32];
2058c2ecf20Sopenharmony_ci	struct av7110_p2t	 p2t_filter[MAXFILT];
2068c2ecf20Sopenharmony_ci	struct dvb_filter_pes2ts p2t[2];
2078c2ecf20Sopenharmony_ci	struct ipack		 ipack[2];
2088c2ecf20Sopenharmony_ci	u8			*kbuf[2];
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_ci	int sinfo;
2118c2ecf20Sopenharmony_ci	int feeding;
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ci	int arm_errors;
2148c2ecf20Sopenharmony_ci	int registered;
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_ci
2178c2ecf20Sopenharmony_ci	/* AV711X */
2188c2ecf20Sopenharmony_ci
2198c2ecf20Sopenharmony_ci	u32		    arm_fw;
2208c2ecf20Sopenharmony_ci	u32		    arm_rtsl;
2218c2ecf20Sopenharmony_ci	u32		    arm_vid;
2228c2ecf20Sopenharmony_ci	u32		    arm_app;
2238c2ecf20Sopenharmony_ci	u32		    avtype;
2248c2ecf20Sopenharmony_ci	int		    arm_ready;
2258c2ecf20Sopenharmony_ci	struct task_struct *arm_thread;
2268c2ecf20Sopenharmony_ci	wait_queue_head_t   arm_wait;
2278c2ecf20Sopenharmony_ci	u16		    arm_loops;
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_ci	void		   *debi_virt;
2308c2ecf20Sopenharmony_ci	dma_addr_t	    debi_bus;
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_ci	u16		    pids[DMX_PES_OTHER];
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_ci	struct dvb_ringbuffer	 ci_rbuffer;
2358c2ecf20Sopenharmony_ci	struct dvb_ringbuffer	 ci_wbuffer;
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci	struct audio_mixer	mixer;
2388c2ecf20Sopenharmony_ci
2398c2ecf20Sopenharmony_ci	struct dvb_adapter	 dvb_adapter;
2408c2ecf20Sopenharmony_ci	struct dvb_device	 *video_dev;
2418c2ecf20Sopenharmony_ci	struct dvb_device	 *audio_dev;
2428c2ecf20Sopenharmony_ci	struct dvb_device	 *ca_dev;
2438c2ecf20Sopenharmony_ci	struct dvb_device	 *osd_dev;
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_ci	struct dvb_video_events  video_events;
2468c2ecf20Sopenharmony_ci	video_size_t		 video_size;
2478c2ecf20Sopenharmony_ci
2488c2ecf20Sopenharmony_ci	u16			wssMode;
2498c2ecf20Sopenharmony_ci	u16			wssData;
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_ci	struct infrared		ir;
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci	/* firmware stuff */
2548c2ecf20Sopenharmony_ci	unsigned char *bin_fw;
2558c2ecf20Sopenharmony_ci	unsigned long size_fw;
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_ci	unsigned char *bin_dpram;
2588c2ecf20Sopenharmony_ci	unsigned long size_dpram;
2598c2ecf20Sopenharmony_ci
2608c2ecf20Sopenharmony_ci	unsigned char *bin_root;
2618c2ecf20Sopenharmony_ci	unsigned long size_root;
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_ci	struct dvb_frontend* fe;
2648c2ecf20Sopenharmony_ci	enum fe_status fe_status;
2658c2ecf20Sopenharmony_ci
2668c2ecf20Sopenharmony_ci	struct mutex ioctl_mutex;
2678c2ecf20Sopenharmony_ci
2688c2ecf20Sopenharmony_ci	/* crash recovery */
2698c2ecf20Sopenharmony_ci	void				(*recover)(struct av7110* av7110);
2708c2ecf20Sopenharmony_ci	enum fe_sec_voltage		saved_voltage;
2718c2ecf20Sopenharmony_ci	enum fe_sec_tone_mode		saved_tone;
2728c2ecf20Sopenharmony_ci	struct dvb_diseqc_master_cmd	saved_master_cmd;
2738c2ecf20Sopenharmony_ci	enum fe_sec_mini_cmd		saved_minicmd;
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_ci	int (*fe_init)(struct dvb_frontend* fe);
2768c2ecf20Sopenharmony_ci	int (*fe_read_status)(struct dvb_frontend *fe, enum fe_status *status);
2778c2ecf20Sopenharmony_ci	int (*fe_diseqc_reset_overload)(struct dvb_frontend *fe);
2788c2ecf20Sopenharmony_ci	int (*fe_diseqc_send_master_cmd)(struct dvb_frontend *fe,
2798c2ecf20Sopenharmony_ci					 struct dvb_diseqc_master_cmd *cmd);
2808c2ecf20Sopenharmony_ci	int (*fe_diseqc_send_burst)(struct dvb_frontend *fe,
2818c2ecf20Sopenharmony_ci				    enum fe_sec_mini_cmd minicmd);
2828c2ecf20Sopenharmony_ci	int (*fe_set_tone)(struct dvb_frontend *fe,
2838c2ecf20Sopenharmony_ci			   enum fe_sec_tone_mode tone);
2848c2ecf20Sopenharmony_ci	int (*fe_set_voltage)(struct dvb_frontend *fe,
2858c2ecf20Sopenharmony_ci			      enum fe_sec_voltage voltage);
2868c2ecf20Sopenharmony_ci	int (*fe_dishnetwork_send_legacy_command)(struct dvb_frontend *fe,
2878c2ecf20Sopenharmony_ci						  unsigned long cmd);
2888c2ecf20Sopenharmony_ci	int (*fe_set_frontend)(struct dvb_frontend *fe);
2898c2ecf20Sopenharmony_ci};
2908c2ecf20Sopenharmony_ci
2918c2ecf20Sopenharmony_ci
2928c2ecf20Sopenharmony_ciextern int ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid,
2938c2ecf20Sopenharmony_ci		       u16 subpid, u16 pcrpid);
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_civoid av7110_ir_handler(struct av7110 *av7110, u32 ircom);
2968c2ecf20Sopenharmony_ciint av7110_set_ir_config(struct av7110 *av7110);
2978c2ecf20Sopenharmony_ciint av7110_ir_init(struct av7110 *av7110);
2988c2ecf20Sopenharmony_civoid av7110_ir_exit(struct av7110 *av7110);
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_ci/* msp3400 i2c subaddresses */
3018c2ecf20Sopenharmony_ci#define MSP_WR_DEM 0x10
3028c2ecf20Sopenharmony_ci#define MSP_RD_DEM 0x11
3038c2ecf20Sopenharmony_ci#define MSP_WR_DSP 0x12
3048c2ecf20Sopenharmony_ci#define MSP_RD_DSP 0x13
3058c2ecf20Sopenharmony_ci
3068c2ecf20Sopenharmony_ciextern int i2c_writereg(struct av7110 *av7110, u8 id, u8 reg, u8 val);
3078c2ecf20Sopenharmony_ciextern u8 i2c_readreg(struct av7110 *av7110, u8 id, u8 reg);
3088c2ecf20Sopenharmony_ciextern int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val);
3098c2ecf20Sopenharmony_ci
3108c2ecf20Sopenharmony_ci
3118c2ecf20Sopenharmony_ciextern int av7110_init_analog_module(struct av7110 *av7110);
3128c2ecf20Sopenharmony_ciextern int av7110_init_v4l(struct av7110 *av7110);
3138c2ecf20Sopenharmony_ciextern int av7110_exit_v4l(struct av7110 *av7110);
3148c2ecf20Sopenharmony_ci
3158c2ecf20Sopenharmony_ci#endif /* _AV7110_H_ */
316