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