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