xref: /OK3568_Linux_fs/kernel/drivers/media/pci/ttpci/av7110.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _AV7110_H_
3*4882a593Smuzhiyun #define _AV7110_H_
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/interrupt.h>
6*4882a593Smuzhiyun #include <linux/socket.h>
7*4882a593Smuzhiyun #include <linux/netdevice.h>
8*4882a593Smuzhiyun #include <linux/i2c.h>
9*4882a593Smuzhiyun #include <linux/input.h>
10*4882a593Smuzhiyun #include <linux/time.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/dvb/video.h>
13*4882a593Smuzhiyun #include <linux/dvb/audio.h>
14*4882a593Smuzhiyun #include <linux/dvb/dmx.h>
15*4882a593Smuzhiyun #include <linux/dvb/ca.h>
16*4882a593Smuzhiyun #include <linux/dvb/osd.h>
17*4882a593Smuzhiyun #include <linux/dvb/net.h>
18*4882a593Smuzhiyun #include <linux/mutex.h>
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include <media/dvbdev.h>
21*4882a593Smuzhiyun #include <media/demux.h>
22*4882a593Smuzhiyun #include <media/dvb_demux.h>
23*4882a593Smuzhiyun #include <media/dmxdev.h>
24*4882a593Smuzhiyun #include "dvb_filter.h"
25*4882a593Smuzhiyun #include <media/dvb_net.h>
26*4882a593Smuzhiyun #include <media/dvb_ringbuffer.h>
27*4882a593Smuzhiyun #include <media/dvb_frontend.h>
28*4882a593Smuzhiyun #include "ves1820.h"
29*4882a593Smuzhiyun #include "ves1x93.h"
30*4882a593Smuzhiyun #include "stv0299.h"
31*4882a593Smuzhiyun #include "tda8083.h"
32*4882a593Smuzhiyun #include "sp8870.h"
33*4882a593Smuzhiyun #include "stv0297.h"
34*4882a593Smuzhiyun #include "l64781.h"
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #include <media/drv-intf/saa7146_vv.h>
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #define ANALOG_TUNER_VES1820 1
40*4882a593Smuzhiyun #define ANALOG_TUNER_STV0297 2
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun extern int av7110_debug;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define dprintk(level, fmt, arg...) do {				\
45*4882a593Smuzhiyun 	if (level & av7110_debug)					\
46*4882a593Smuzhiyun 		printk(KERN_DEBUG KBUILD_MODNAME ": %s(): " fmt,	\
47*4882a593Smuzhiyun 		       __func__, ##arg);				\
48*4882a593Smuzhiyun } while (0)
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define MAXFILT 32
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun enum {AV_PES_STREAM, PS_STREAM, TS_STREAM, PES_STREAM};
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun enum av7110_video_mode {
55*4882a593Smuzhiyun 	AV7110_VIDEO_MODE_PAL	= 0,
56*4882a593Smuzhiyun 	AV7110_VIDEO_MODE_NTSC	= 1
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun struct av7110_p2t {
60*4882a593Smuzhiyun 	u8		  pes[TS_SIZE];
61*4882a593Smuzhiyun 	u8		  counter;
62*4882a593Smuzhiyun 	long int	  pos;
63*4882a593Smuzhiyun 	int		  frags;
64*4882a593Smuzhiyun 	struct dvb_demux_feed *feed;
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun /* video MPEG decoder events: */
68*4882a593Smuzhiyun /* (code copied from dvb_frontend.c, should maybe be factored out...) */
69*4882a593Smuzhiyun #define MAX_VIDEO_EVENT 8
70*4882a593Smuzhiyun struct dvb_video_events {
71*4882a593Smuzhiyun 	struct video_event	  events[MAX_VIDEO_EVENT];
72*4882a593Smuzhiyun 	int			  eventw;
73*4882a593Smuzhiyun 	int			  eventr;
74*4882a593Smuzhiyun 	int			  overflow;
75*4882a593Smuzhiyun 	wait_queue_head_t	  wait_queue;
76*4882a593Smuzhiyun 	spinlock_t		  lock;
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun struct av7110;
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun /* infrared remote control */
83*4882a593Smuzhiyun struct infrared {
84*4882a593Smuzhiyun 	struct rc_dev		*rcdev;
85*4882a593Smuzhiyun 	char			input_phys[32];
86*4882a593Smuzhiyun 	u32			ir_config;
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /* place to store all the necessary device information */
90*4882a593Smuzhiyun struct av7110 {
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 	/* devices */
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	struct dvb_device	dvb_dev;
95*4882a593Smuzhiyun 	struct dvb_net		dvb_net;
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun 	struct video_device	v4l_dev;
98*4882a593Smuzhiyun 	struct video_device	vbi_dev;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	struct saa7146_dev	*dev;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 	struct i2c_adapter	i2c_adap;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	char			*card_name;
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	/* support for analog module of dvb-c */
107*4882a593Smuzhiyun 	int			analog_tuner_flags;
108*4882a593Smuzhiyun 	int			current_input;
109*4882a593Smuzhiyun 	u32			current_freq;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	struct tasklet_struct	debi_tasklet;
112*4882a593Smuzhiyun 	struct tasklet_struct	gpio_tasklet;
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	int adac_type;	       /* audio DAC type */
115*4882a593Smuzhiyun #define DVB_ADAC_TI	  0
116*4882a593Smuzhiyun #define DVB_ADAC_CRYSTAL  1
117*4882a593Smuzhiyun #define DVB_ADAC_MSP34x0  2
118*4882a593Smuzhiyun #define DVB_ADAC_MSP34x5  3
119*4882a593Smuzhiyun #define DVB_ADAC_NONE	 -1
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	/* buffers */
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	void		       *iobuf;	 /* memory for all buffers */
125*4882a593Smuzhiyun 	struct dvb_ringbuffer	avout;   /* buffer for video or A/V mux */
126*4882a593Smuzhiyun #define AVOUTLEN (128*1024)
127*4882a593Smuzhiyun 	struct dvb_ringbuffer	aout;    /* buffer for audio */
128*4882a593Smuzhiyun #define AOUTLEN (64*1024)
129*4882a593Smuzhiyun 	void		       *bmpbuf;
130*4882a593Smuzhiyun #define BMPLEN (8*32768+1024)
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 	/* bitmap buffers and states */
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	int			bmpp;
135*4882a593Smuzhiyun 	int			bmplen;
136*4882a593Smuzhiyun 	volatile int		bmp_state;
137*4882a593Smuzhiyun #define BMP_NONE     0
138*4882a593Smuzhiyun #define BMP_LOADING  1
139*4882a593Smuzhiyun #define BMP_LOADED   2
140*4882a593Smuzhiyun 	wait_queue_head_t	bmpq;
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	/* DEBI and polled command interface */
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	spinlock_t		debilock;
146*4882a593Smuzhiyun 	struct mutex		dcomlock;
147*4882a593Smuzhiyun 	volatile int		debitype;
148*4882a593Smuzhiyun 	volatile int		debilen;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	/* Recording and playback flags */
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	int			rec_mode;
154*4882a593Smuzhiyun 	int			playing;
155*4882a593Smuzhiyun #define RP_NONE  0
156*4882a593Smuzhiyun #define RP_VIDEO 1
157*4882a593Smuzhiyun #define RP_AUDIO 2
158*4882a593Smuzhiyun #define RP_AV	 3
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	/* OSD */
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	int			osdwin;      /* currently active window */
164*4882a593Smuzhiyun 	u16			osdbpp[8];
165*4882a593Smuzhiyun 	struct mutex		osd_mutex;
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	/* CA */
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	struct ca_slot_info	ci_slot[2];
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 	enum av7110_video_mode	vidmode;
172*4882a593Smuzhiyun 	struct dmxdev		dmxdev;
173*4882a593Smuzhiyun 	struct dvb_demux	demux;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	struct dmx_frontend	hw_frontend;
176*4882a593Smuzhiyun 	struct dmx_frontend	mem_frontend;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	/* for budget mode demux1 */
179*4882a593Smuzhiyun 	struct dmxdev		dmxdev1;
180*4882a593Smuzhiyun 	struct dvb_demux	demux1;
181*4882a593Smuzhiyun 	struct dvb_net		dvb_net1;
182*4882a593Smuzhiyun 	spinlock_t		feedlock1;
183*4882a593Smuzhiyun 	int			feeding1;
184*4882a593Smuzhiyun 	u32			ttbp;
185*4882a593Smuzhiyun 	unsigned char           *grabbing;
186*4882a593Smuzhiyun 	struct saa7146_pgtable  pt;
187*4882a593Smuzhiyun 	struct tasklet_struct   vpe_tasklet;
188*4882a593Smuzhiyun 	bool			full_ts;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	int			fe_synced;
191*4882a593Smuzhiyun 	struct mutex		pid_mutex;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	int			video_blank;
194*4882a593Smuzhiyun 	struct video_status	videostate;
195*4882a593Smuzhiyun 	u16			display_panscan;
196*4882a593Smuzhiyun 	int			display_ar;
197*4882a593Smuzhiyun 	int			trickmode;
198*4882a593Smuzhiyun #define TRICK_NONE   0
199*4882a593Smuzhiyun #define TRICK_FAST   1
200*4882a593Smuzhiyun #define TRICK_SLOW   2
201*4882a593Smuzhiyun #define TRICK_FREEZE 3
202*4882a593Smuzhiyun 	struct audio_status	audiostate;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	struct dvb_demux_filter *handle2filter[32];
205*4882a593Smuzhiyun 	struct av7110_p2t	 p2t_filter[MAXFILT];
206*4882a593Smuzhiyun 	struct dvb_filter_pes2ts p2t[2];
207*4882a593Smuzhiyun 	struct ipack		 ipack[2];
208*4882a593Smuzhiyun 	u8			*kbuf[2];
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	int sinfo;
211*4882a593Smuzhiyun 	int feeding;
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	int arm_errors;
214*4882a593Smuzhiyun 	int registered;
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	/* AV711X */
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	u32		    arm_fw;
220*4882a593Smuzhiyun 	u32		    arm_rtsl;
221*4882a593Smuzhiyun 	u32		    arm_vid;
222*4882a593Smuzhiyun 	u32		    arm_app;
223*4882a593Smuzhiyun 	u32		    avtype;
224*4882a593Smuzhiyun 	int		    arm_ready;
225*4882a593Smuzhiyun 	struct task_struct *arm_thread;
226*4882a593Smuzhiyun 	wait_queue_head_t   arm_wait;
227*4882a593Smuzhiyun 	u16		    arm_loops;
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 	void		   *debi_virt;
230*4882a593Smuzhiyun 	dma_addr_t	    debi_bus;
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	u16		    pids[DMX_PES_OTHER];
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	struct dvb_ringbuffer	 ci_rbuffer;
235*4882a593Smuzhiyun 	struct dvb_ringbuffer	 ci_wbuffer;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	struct audio_mixer	mixer;
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 	struct dvb_adapter	 dvb_adapter;
240*4882a593Smuzhiyun 	struct dvb_device	 *video_dev;
241*4882a593Smuzhiyun 	struct dvb_device	 *audio_dev;
242*4882a593Smuzhiyun 	struct dvb_device	 *ca_dev;
243*4882a593Smuzhiyun 	struct dvb_device	 *osd_dev;
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun 	struct dvb_video_events  video_events;
246*4882a593Smuzhiyun 	video_size_t		 video_size;
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	u16			wssMode;
249*4882a593Smuzhiyun 	u16			wssData;
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 	struct infrared		ir;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	/* firmware stuff */
254*4882a593Smuzhiyun 	unsigned char *bin_fw;
255*4882a593Smuzhiyun 	unsigned long size_fw;
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	unsigned char *bin_dpram;
258*4882a593Smuzhiyun 	unsigned long size_dpram;
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun 	unsigned char *bin_root;
261*4882a593Smuzhiyun 	unsigned long size_root;
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	struct dvb_frontend* fe;
264*4882a593Smuzhiyun 	enum fe_status fe_status;
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	struct mutex ioctl_mutex;
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	/* crash recovery */
269*4882a593Smuzhiyun 	void				(*recover)(struct av7110* av7110);
270*4882a593Smuzhiyun 	enum fe_sec_voltage		saved_voltage;
271*4882a593Smuzhiyun 	enum fe_sec_tone_mode		saved_tone;
272*4882a593Smuzhiyun 	struct dvb_diseqc_master_cmd	saved_master_cmd;
273*4882a593Smuzhiyun 	enum fe_sec_mini_cmd		saved_minicmd;
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun 	int (*fe_init)(struct dvb_frontend* fe);
276*4882a593Smuzhiyun 	int (*fe_read_status)(struct dvb_frontend *fe, enum fe_status *status);
277*4882a593Smuzhiyun 	int (*fe_diseqc_reset_overload)(struct dvb_frontend *fe);
278*4882a593Smuzhiyun 	int (*fe_diseqc_send_master_cmd)(struct dvb_frontend *fe,
279*4882a593Smuzhiyun 					 struct dvb_diseqc_master_cmd *cmd);
280*4882a593Smuzhiyun 	int (*fe_diseqc_send_burst)(struct dvb_frontend *fe,
281*4882a593Smuzhiyun 				    enum fe_sec_mini_cmd minicmd);
282*4882a593Smuzhiyun 	int (*fe_set_tone)(struct dvb_frontend *fe,
283*4882a593Smuzhiyun 			   enum fe_sec_tone_mode tone);
284*4882a593Smuzhiyun 	int (*fe_set_voltage)(struct dvb_frontend *fe,
285*4882a593Smuzhiyun 			      enum fe_sec_voltage voltage);
286*4882a593Smuzhiyun 	int (*fe_dishnetwork_send_legacy_command)(struct dvb_frontend *fe,
287*4882a593Smuzhiyun 						  unsigned long cmd);
288*4882a593Smuzhiyun 	int (*fe_set_frontend)(struct dvb_frontend *fe);
289*4882a593Smuzhiyun };
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun extern int ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid,
293*4882a593Smuzhiyun 		       u16 subpid, u16 pcrpid);
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun void av7110_ir_handler(struct av7110 *av7110, u32 ircom);
296*4882a593Smuzhiyun int av7110_set_ir_config(struct av7110 *av7110);
297*4882a593Smuzhiyun int av7110_ir_init(struct av7110 *av7110);
298*4882a593Smuzhiyun void av7110_ir_exit(struct av7110 *av7110);
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun /* msp3400 i2c subaddresses */
301*4882a593Smuzhiyun #define MSP_WR_DEM 0x10
302*4882a593Smuzhiyun #define MSP_RD_DEM 0x11
303*4882a593Smuzhiyun #define MSP_WR_DSP 0x12
304*4882a593Smuzhiyun #define MSP_RD_DSP 0x13
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun extern int i2c_writereg(struct av7110 *av7110, u8 id, u8 reg, u8 val);
307*4882a593Smuzhiyun extern u8 i2c_readreg(struct av7110 *av7110, u8 id, u8 reg);
308*4882a593Smuzhiyun extern int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val);
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun extern int av7110_init_analog_module(struct av7110 *av7110);
312*4882a593Smuzhiyun extern int av7110_init_v4l(struct av7110 *av7110);
313*4882a593Smuzhiyun extern int av7110_exit_v4l(struct av7110 *av7110);
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun #endif /* _AV7110_H_ */
316