diff options
Diffstat (limited to 'drivers/media/video/cx88/cx88.h')
-rw-r--r-- | drivers/media/video/cx88/cx88.h | 730 |
1 files changed, 730 insertions, 0 deletions
diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h new file mode 100644 index 00000000000..fa8d307e1a3 --- /dev/null +++ b/drivers/media/video/cx88/cx88.h | |||
@@ -0,0 +1,730 @@ | |||
1 | /* | ||
2 | * | ||
3 | * v4l2 device driver for cx2388x based TV cards | ||
4 | * | ||
5 | * (c) 2003,04 Gerd Knorr <kraxel@bytesex.org> [SUSE Labs] | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | ||
21 | |||
22 | #include <linux/pci.h> | ||
23 | #include <linux/i2c.h> | ||
24 | #include <linux/i2c-algo-bit.h> | ||
25 | #include <linux/videodev2.h> | ||
26 | #include <linux/kdev_t.h> | ||
27 | |||
28 | #include <media/v4l2-device.h> | ||
29 | #include <media/tuner.h> | ||
30 | #include <media/tveeprom.h> | ||
31 | #include <media/videobuf-dma-sg.h> | ||
32 | #include <media/v4l2-chip-ident.h> | ||
33 | #include <media/cx2341x.h> | ||
34 | #include <media/videobuf-dvb.h> | ||
35 | #include <media/ir-kbd-i2c.h> | ||
36 | #include <media/wm8775.h> | ||
37 | |||
38 | #include "btcx-risc.h" | ||
39 | #include "cx88-reg.h" | ||
40 | #include "tuner-xc2028.h" | ||
41 | |||
42 | #include <linux/mutex.h> | ||
43 | |||
44 | #define CX88_VERSION "0.0.9" | ||
45 | |||
46 | #define UNSET (-1U) | ||
47 | |||
48 | #define CX88_MAXBOARDS 8 | ||
49 | |||
50 | /* Max number of inputs by card */ | ||
51 | #define MAX_CX88_INPUT 8 | ||
52 | |||
53 | /* ----------------------------------------------------------- */ | ||
54 | /* defines and enums */ | ||
55 | |||
56 | /* Currently unsupported by the driver: PAL/H, NTSC/Kr, SECAM/LC */ | ||
57 | #define CX88_NORMS (V4L2_STD_ALL \ | ||
58 | & ~V4L2_STD_PAL_H \ | ||
59 | & ~V4L2_STD_NTSC_M_KR \ | ||
60 | & ~V4L2_STD_SECAM_LC) | ||
61 | |||
62 | #define FORMAT_FLAGS_PACKED 0x01 | ||
63 | #define FORMAT_FLAGS_PLANAR 0x02 | ||
64 | |||
65 | #define VBI_LINE_COUNT 17 | ||
66 | #define VBI_LINE_LENGTH 2048 | ||
67 | |||
68 | #define AUD_RDS_LINES 4 | ||
69 | |||
70 | /* need "shadow" registers for some write-only ones ... */ | ||
71 | #define SHADOW_AUD_VOL_CTL 1 | ||
72 | #define SHADOW_AUD_BAL_CTL 2 | ||
73 | #define SHADOW_MAX 3 | ||
74 | |||
75 | /* FM Radio deemphasis type */ | ||
76 | enum cx88_deemph_type { | ||
77 | FM_NO_DEEMPH = 0, | ||
78 | FM_DEEMPH_50, | ||
79 | FM_DEEMPH_75 | ||
80 | }; | ||
81 | |||
82 | enum cx88_board_type { | ||
83 | CX88_BOARD_NONE = 0, | ||
84 | CX88_MPEG_DVB, | ||
85 | CX88_MPEG_BLACKBIRD | ||
86 | }; | ||
87 | |||
88 | enum cx8802_board_access { | ||
89 | CX8802_DRVCTL_SHARED = 1, | ||
90 | CX8802_DRVCTL_EXCLUSIVE = 2, | ||
91 | }; | ||
92 | |||
93 | /* ----------------------------------------------------------- */ | ||
94 | /* tv norms */ | ||
95 | |||
96 | static unsigned int inline norm_maxw(v4l2_std_id norm) | ||
97 | { | ||
98 | return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 720 : 768; | ||
99 | } | ||
100 | |||
101 | |||
102 | static unsigned int inline norm_maxh(v4l2_std_id norm) | ||
103 | { | ||
104 | return (norm & V4L2_STD_625_50) ? 576 : 480; | ||
105 | } | ||
106 | |||
107 | /* ----------------------------------------------------------- */ | ||
108 | /* static data */ | ||
109 | |||
110 | struct cx8800_fmt { | ||
111 | const char *name; | ||
112 | u32 fourcc; /* v4l2 format id */ | ||
113 | int depth; | ||
114 | int flags; | ||
115 | u32 cxformat; | ||
116 | }; | ||
117 | |||
118 | struct cx88_ctrl { | ||
119 | struct v4l2_queryctrl v; | ||
120 | u32 off; | ||
121 | u32 reg; | ||
122 | u32 sreg; | ||
123 | u32 mask; | ||
124 | u32 shift; | ||
125 | }; | ||
126 | |||
127 | /* ----------------------------------------------------------- */ | ||
128 | /* SRAM memory management data (see cx88-core.c) */ | ||
129 | |||
130 | #define SRAM_CH21 0 /* video */ | ||
131 | #define SRAM_CH22 1 | ||
132 | #define SRAM_CH23 2 | ||
133 | #define SRAM_CH24 3 /* vbi */ | ||
134 | #define SRAM_CH25 4 /* audio */ | ||
135 | #define SRAM_CH26 5 | ||
136 | #define SRAM_CH28 6 /* mpeg */ | ||
137 | #define SRAM_CH27 7 /* audio rds */ | ||
138 | /* more */ | ||
139 | |||
140 | struct sram_channel { | ||
141 | const char *name; | ||
142 | u32 cmds_start; | ||
143 | u32 ctrl_start; | ||
144 | u32 cdt; | ||
145 | u32 fifo_start; | ||
146 | u32 fifo_size; | ||
147 | u32 ptr1_reg; | ||
148 | u32 ptr2_reg; | ||
149 | u32 cnt1_reg; | ||
150 | u32 cnt2_reg; | ||
151 | }; | ||
152 | extern const struct sram_channel const cx88_sram_channels[]; | ||
153 | |||
154 | /* ----------------------------------------------------------- */ | ||
155 | /* card configuration */ | ||
156 | |||
157 | #define CX88_BOARD_NOAUTO UNSET | ||
158 | #define CX88_BOARD_UNKNOWN 0 | ||
159 | #define CX88_BOARD_HAUPPAUGE 1 | ||
160 | #define CX88_BOARD_GDI 2 | ||
161 | #define CX88_BOARD_PIXELVIEW 3 | ||
162 | #define CX88_BOARD_ATI_WONDER_PRO 4 | ||
163 | #define CX88_BOARD_WINFAST2000XP_EXPERT 5 | ||
164 | #define CX88_BOARD_AVERTV_STUDIO_303 6 | ||
165 | #define CX88_BOARD_MSI_TVANYWHERE_MASTER 7 | ||
166 | #define CX88_BOARD_WINFAST_DV2000 8 | ||
167 | #define CX88_BOARD_LEADTEK_PVR2000 9 | ||
168 | #define CX88_BOARD_IODATA_GVVCP3PCI 10 | ||
169 | #define CX88_BOARD_PROLINK_PLAYTVPVR 11 | ||
170 | #define CX88_BOARD_ASUS_PVR_416 12 | ||
171 | #define CX88_BOARD_MSI_TVANYWHERE 13 | ||
172 | #define CX88_BOARD_KWORLD_DVB_T 14 | ||
173 | #define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1 15 | ||
174 | #define CX88_BOARD_KWORLD_LTV883 16 | ||
175 | #define CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q 17 | ||
176 | #define CX88_BOARD_HAUPPAUGE_DVB_T1 18 | ||
177 | #define CX88_BOARD_CONEXANT_DVB_T1 19 | ||
178 | #define CX88_BOARD_PROVIDEO_PV259 20 | ||
179 | #define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS 21 | ||
180 | #define CX88_BOARD_PCHDTV_HD3000 22 | ||
181 | #define CX88_BOARD_DNTV_LIVE_DVB_T 23 | ||
182 | #define CX88_BOARD_HAUPPAUGE_ROSLYN 24 | ||
183 | #define CX88_BOARD_DIGITALLOGIC_MEC 25 | ||
184 | #define CX88_BOARD_IODATA_GVBCTV7E 26 | ||
185 | #define CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO 27 | ||
186 | #define CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T 28 | ||
187 | #define CX88_BOARD_ADSTECH_DVB_T_PCI 29 | ||
188 | #define CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1 30 | ||
189 | #define CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD 31 | ||
190 | #define CX88_BOARD_AVERMEDIA_ULTRATV_MC_550 32 | ||
191 | #define CX88_BOARD_KWORLD_VSTREAM_EXPERT_DVD 33 | ||
192 | #define CX88_BOARD_ATI_HDTVWONDER 34 | ||
193 | #define CX88_BOARD_WINFAST_DTV1000 35 | ||
194 | #define CX88_BOARD_AVERTV_303 36 | ||
195 | #define CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1 37 | ||
196 | #define CX88_BOARD_HAUPPAUGE_NOVASE2_S1 38 | ||
197 | #define CX88_BOARD_KWORLD_DVBS_100 39 | ||
198 | #define CX88_BOARD_HAUPPAUGE_HVR1100 40 | ||
199 | #define CX88_BOARD_HAUPPAUGE_HVR1100LP 41 | ||
200 | #define CX88_BOARD_DNTV_LIVE_DVB_T_PRO 42 | ||
201 | #define CX88_BOARD_KWORLD_DVB_T_CX22702 43 | ||
202 | #define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL 44 | ||
203 | #define CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT 45 | ||
204 | #define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID 46 | ||
205 | #define CX88_BOARD_PCHDTV_HD5500 47 | ||
206 | #define CX88_BOARD_KWORLD_MCE200_DELUXE 48 | ||
207 | #define CX88_BOARD_PIXELVIEW_PLAYTV_P7000 49 | ||
208 | #define CX88_BOARD_NPGTECH_REALTV_TOP10FM 50 | ||
209 | #define CX88_BOARD_WINFAST_DTV2000H 51 | ||
210 | #define CX88_BOARD_GENIATECH_DVBS 52 | ||
211 | #define CX88_BOARD_HAUPPAUGE_HVR3000 53 | ||
212 | #define CX88_BOARD_NORWOOD_MICRO 54 | ||
213 | #define CX88_BOARD_TE_DTV_250_OEM_SWANN 55 | ||
214 | #define CX88_BOARD_HAUPPAUGE_HVR1300 56 | ||
215 | #define CX88_BOARD_ADSTECH_PTV_390 57 | ||
216 | #define CX88_BOARD_PINNACLE_PCTV_HD_800i 58 | ||
217 | #define CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO 59 | ||
218 | #define CX88_BOARD_PINNACLE_HYBRID_PCTV 60 | ||
219 | #define CX88_BOARD_WINFAST_TV2000_XP_GLOBAL 61 | ||
220 | #define CX88_BOARD_POWERCOLOR_REAL_ANGEL 62 | ||
221 | #define CX88_BOARD_GENIATECH_X8000_MT 63 | ||
222 | #define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO 64 | ||
223 | #define CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD 65 | ||
224 | #define CX88_BOARD_PROLINK_PV_8000GT 66 | ||
225 | #define CX88_BOARD_KWORLD_ATSC_120 67 | ||
226 | #define CX88_BOARD_HAUPPAUGE_HVR4000 68 | ||
227 | #define CX88_BOARD_HAUPPAUGE_HVR4000LITE 69 | ||
228 | #define CX88_BOARD_TEVII_S460 70 | ||
229 | #define CX88_BOARD_OMICOM_SS4_PCI 71 | ||
230 | #define CX88_BOARD_TBS_8920 72 | ||
231 | #define CX88_BOARD_TEVII_S420 73 | ||
232 | #define CX88_BOARD_PROLINK_PV_GLOBAL_XTREME 74 | ||
233 | #define CX88_BOARD_PROF_7300 75 | ||
234 | #define CX88_BOARD_SATTRADE_ST4200 76 | ||
235 | #define CX88_BOARD_TBS_8910 77 | ||
236 | #define CX88_BOARD_PROF_6200 78 | ||
237 | #define CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII 79 | ||
238 | #define CX88_BOARD_HAUPPAUGE_IRONLY 80 | ||
239 | #define CX88_BOARD_WINFAST_DTV1800H 81 | ||
240 | #define CX88_BOARD_WINFAST_DTV2000H_J 82 | ||
241 | #define CX88_BOARD_PROF_7301 83 | ||
242 | #define CX88_BOARD_SAMSUNG_SMT_7020 84 | ||
243 | #define CX88_BOARD_TWINHAN_VP1027_DVBS 85 | ||
244 | #define CX88_BOARD_TEVII_S464 86 | ||
245 | #define CX88_BOARD_WINFAST_DTV2000H_PLUS 87 | ||
246 | #define CX88_BOARD_WINFAST_DTV1800H_XC4000 88 | ||
247 | |||
248 | enum cx88_itype { | ||
249 | CX88_VMUX_COMPOSITE1 = 1, | ||
250 | CX88_VMUX_COMPOSITE2, | ||
251 | CX88_VMUX_COMPOSITE3, | ||
252 | CX88_VMUX_COMPOSITE4, | ||
253 | CX88_VMUX_SVIDEO, | ||
254 | CX88_VMUX_TELEVISION, | ||
255 | CX88_VMUX_CABLE, | ||
256 | CX88_VMUX_DVB, | ||
257 | CX88_VMUX_DEBUG, | ||
258 | CX88_RADIO, | ||
259 | }; | ||
260 | |||
261 | struct cx88_input { | ||
262 | enum cx88_itype type; | ||
263 | u32 gpio0, gpio1, gpio2, gpio3; | ||
264 | unsigned int vmux:2; | ||
265 | unsigned int audioroute:4; | ||
266 | }; | ||
267 | |||
268 | struct cx88_board { | ||
269 | const char *name; | ||
270 | unsigned int tuner_type; | ||
271 | unsigned int radio_type; | ||
272 | unsigned char tuner_addr; | ||
273 | unsigned char radio_addr; | ||
274 | int tda9887_conf; | ||
275 | struct cx88_input input[MAX_CX88_INPUT]; | ||
276 | struct cx88_input radio; | ||
277 | enum cx88_board_type mpeg; | ||
278 | unsigned int audio_chip; | ||
279 | int num_frontends; | ||
280 | |||
281 | /* Used for I2S devices */ | ||
282 | int i2sinputcntl; | ||
283 | }; | ||
284 | |||
285 | struct cx88_subid { | ||
286 | u16 subvendor; | ||
287 | u16 subdevice; | ||
288 | u32 card; | ||
289 | }; | ||
290 | |||
291 | enum cx88_tvaudio { | ||
292 | WW_NONE = 1, | ||
293 | WW_BTSC, | ||
294 | WW_BG, | ||
295 | WW_DK, | ||
296 | WW_I, | ||
297 | WW_L, | ||
298 | WW_EIAJ, | ||
299 | WW_I2SPT, | ||
300 | WW_FM, | ||
301 | WW_I2SADC, | ||
302 | WW_M | ||
303 | }; | ||
304 | |||
305 | #define INPUT(nr) (core->board.input[nr]) | ||
306 | |||
307 | /* ----------------------------------------------------------- */ | ||
308 | /* device / file handle status */ | ||
309 | |||
310 | #define RESOURCE_OVERLAY 1 | ||
311 | #define RESOURCE_VIDEO 2 | ||
312 | #define RESOURCE_VBI 4 | ||
313 | |||
314 | #define BUFFER_TIMEOUT msecs_to_jiffies(2000) | ||
315 | |||
316 | /* buffer for one video frame */ | ||
317 | struct cx88_buffer { | ||
318 | /* common v4l buffer stuff -- must be first */ | ||
319 | struct videobuf_buffer vb; | ||
320 | |||
321 | /* cx88 specific */ | ||
322 | unsigned int bpl; | ||
323 | struct btcx_riscmem risc; | ||
324 | const struct cx8800_fmt *fmt; | ||
325 | u32 count; | ||
326 | }; | ||
327 | |||
328 | struct cx88_dmaqueue { | ||
329 | struct list_head active; | ||
330 | struct list_head queued; | ||
331 | struct timer_list timeout; | ||
332 | struct btcx_riscmem stopper; | ||
333 | u32 count; | ||
334 | }; | ||
335 | |||
336 | struct cx88_core { | ||
337 | struct list_head devlist; | ||
338 | atomic_t refcount; | ||
339 | |||
340 | /* board name */ | ||
341 | int nr; | ||
342 | char name[32]; | ||
343 | |||
344 | /* pci stuff */ | ||
345 | int pci_bus; | ||
346 | int pci_slot; | ||
347 | u32 __iomem *lmmio; | ||
348 | u8 __iomem *bmmio; | ||
349 | u32 shadow[SHADOW_MAX]; | ||
350 | int pci_irqmask; | ||
351 | |||
352 | /* i2c i/o */ | ||
353 | struct i2c_adapter i2c_adap; | ||
354 | struct i2c_algo_bit_data i2c_algo; | ||
355 | struct i2c_client i2c_client; | ||
356 | u32 i2c_state, i2c_rc; | ||
357 | |||
358 | /* config info -- analog */ | ||
359 | struct v4l2_device v4l2_dev; | ||
360 | struct i2c_client *i2c_rtc; | ||
361 | unsigned int boardnr; | ||
362 | struct cx88_board board; | ||
363 | |||
364 | /* Supported V4L _STD_ tuner formats */ | ||
365 | unsigned int tuner_formats; | ||
366 | |||
367 | /* config info -- dvb */ | ||
368 | #if defined(CONFIG_VIDEO_CX88_DVB) || defined(CONFIG_VIDEO_CX88_DVB_MODULE) | ||
369 | int (*prev_set_voltage)(struct dvb_frontend *fe, fe_sec_voltage_t voltage); | ||
370 | #endif | ||
371 | void (*gate_ctrl)(struct cx88_core *core, int open); | ||
372 | |||
373 | /* state info */ | ||
374 | struct task_struct *kthread; | ||
375 | v4l2_std_id tvnorm; | ||
376 | enum cx88_tvaudio tvaudio; | ||
377 | u32 audiomode_manual; | ||
378 | u32 audiomode_current; | ||
379 | u32 input; | ||
380 | u32 last_analog_input; | ||
381 | u32 astat; | ||
382 | u32 use_nicam; | ||
383 | unsigned long last_change; | ||
384 | |||
385 | /* IR remote control state */ | ||
386 | struct cx88_IR *ir; | ||
387 | |||
388 | /* I2C remote data */ | ||
389 | struct IR_i2c_init_data init_data; | ||
390 | struct wm8775_platform_data wm8775_data; | ||
391 | |||
392 | struct mutex lock; | ||
393 | /* various v4l controls */ | ||
394 | u32 freq; | ||
395 | int users; | ||
396 | int mpeg_users; | ||
397 | |||
398 | /* cx88-video needs to access cx8802 for hybrid tuner pll access. */ | ||
399 | struct cx8802_dev *dvbdev; | ||
400 | enum cx88_board_type active_type_id; | ||
401 | int active_ref; | ||
402 | int active_fe_id; | ||
403 | }; | ||
404 | |||
405 | static inline struct cx88_core *to_core(struct v4l2_device *v4l2_dev) | ||
406 | { | ||
407 | return container_of(v4l2_dev, struct cx88_core, v4l2_dev); | ||
408 | } | ||
409 | |||
410 | #define WM8775_GID (1 << 0) | ||
411 | |||
412 | #define call_hw(core, grpid, o, f, args...) \ | ||
413 | do { \ | ||
414 | if (!core->i2c_rc) { \ | ||
415 | if (core->gate_ctrl) \ | ||
416 | core->gate_ctrl(core, 1); \ | ||
417 | v4l2_device_call_all(&core->v4l2_dev, grpid, o, f, ##args); \ | ||
418 | if (core->gate_ctrl) \ | ||
419 | core->gate_ctrl(core, 0); \ | ||
420 | } \ | ||
421 | } while (0) | ||
422 | |||
423 | #define call_all(core, o, f, args...) call_hw(core, 0, o, f, ##args) | ||
424 | |||
425 | struct cx8800_dev; | ||
426 | struct cx8802_dev; | ||
427 | |||
428 | /* ----------------------------------------------------------- */ | ||
429 | /* function 0: video stuff */ | ||
430 | |||
431 | struct cx8800_fh { | ||
432 | struct cx8800_dev *dev; | ||
433 | enum v4l2_buf_type type; | ||
434 | int radio; | ||
435 | unsigned int resources; | ||
436 | |||
437 | /* video overlay */ | ||
438 | struct v4l2_window win; | ||
439 | struct v4l2_clip *clips; | ||
440 | unsigned int nclips; | ||
441 | |||
442 | /* video capture */ | ||
443 | const struct cx8800_fmt *fmt; | ||
444 | unsigned int width,height; | ||
445 | struct videobuf_queue vidq; | ||
446 | |||
447 | /* vbi capture */ | ||
448 | struct videobuf_queue vbiq; | ||
449 | }; | ||
450 | |||
451 | struct cx8800_suspend_state { | ||
452 | int disabled; | ||
453 | }; | ||
454 | |||
455 | struct cx8800_dev { | ||
456 | struct cx88_core *core; | ||
457 | spinlock_t slock; | ||
458 | |||
459 | /* various device info */ | ||
460 | unsigned int resources; | ||
461 | struct video_device *video_dev; | ||
462 | struct video_device *vbi_dev; | ||
463 | struct video_device *radio_dev; | ||
464 | |||
465 | /* pci i/o */ | ||
466 | struct pci_dev *pci; | ||
467 | unsigned char pci_rev,pci_lat; | ||
468 | |||
469 | |||
470 | /* capture queues */ | ||
471 | struct cx88_dmaqueue vidq; | ||
472 | struct cx88_dmaqueue vbiq; | ||
473 | |||
474 | /* various v4l controls */ | ||
475 | |||
476 | /* other global state info */ | ||
477 | struct cx8800_suspend_state state; | ||
478 | }; | ||
479 | |||
480 | /* ----------------------------------------------------------- */ | ||
481 | /* function 1: audio/alsa stuff */ | ||
482 | /* =============> moved to cx88-alsa.c <====================== */ | ||
483 | |||
484 | |||
485 | /* ----------------------------------------------------------- */ | ||
486 | /* function 2: mpeg stuff */ | ||
487 | |||
488 | struct cx8802_fh { | ||
489 | struct cx8802_dev *dev; | ||
490 | struct videobuf_queue mpegq; | ||
491 | }; | ||
492 | |||
493 | struct cx8802_suspend_state { | ||
494 | int disabled; | ||
495 | }; | ||
496 | |||
497 | struct cx8802_driver { | ||
498 | struct cx88_core *core; | ||
499 | |||
500 | /* List of drivers attached to device */ | ||
501 | struct list_head drvlist; | ||
502 | |||
503 | /* Type of driver and access required */ | ||
504 | enum cx88_board_type type_id; | ||
505 | enum cx8802_board_access hw_access; | ||
506 | |||
507 | /* MPEG 8802 internal only */ | ||
508 | int (*suspend)(struct pci_dev *pci_dev, pm_message_t state); | ||
509 | int (*resume)(struct pci_dev *pci_dev); | ||
510 | |||
511 | /* Callers to the following functions must hold core->lock */ | ||
512 | |||
513 | /* MPEG 8802 -> mini driver - Driver probe and configuration */ | ||
514 | int (*probe)(struct cx8802_driver *drv); | ||
515 | int (*remove)(struct cx8802_driver *drv); | ||
516 | |||
517 | /* MPEG 8802 -> mini driver - Access for hardware control */ | ||
518 | int (*advise_acquire)(struct cx8802_driver *drv); | ||
519 | int (*advise_release)(struct cx8802_driver *drv); | ||
520 | |||
521 | /* MPEG 8802 <- mini driver - Access for hardware control */ | ||
522 | int (*request_acquire)(struct cx8802_driver *drv); | ||
523 | int (*request_release)(struct cx8802_driver *drv); | ||
524 | }; | ||
525 | |||
526 | struct cx8802_dev { | ||
527 | struct cx88_core *core; | ||
528 | spinlock_t slock; | ||
529 | |||
530 | /* pci i/o */ | ||
531 | struct pci_dev *pci; | ||
532 | unsigned char pci_rev,pci_lat; | ||
533 | |||
534 | /* dma queues */ | ||
535 | struct cx88_dmaqueue mpegq; | ||
536 | u32 ts_packet_size; | ||
537 | u32 ts_packet_count; | ||
538 | |||
539 | /* other global state info */ | ||
540 | struct cx8802_suspend_state state; | ||
541 | |||
542 | /* for blackbird only */ | ||
543 | struct list_head devlist; | ||
544 | #if defined(CONFIG_VIDEO_CX88_BLACKBIRD) || \ | ||
545 | defined(CONFIG_VIDEO_CX88_BLACKBIRD_MODULE) | ||
546 | struct video_device *mpeg_dev; | ||
547 | u32 mailbox; | ||
548 | int width; | ||
549 | int height; | ||
550 | unsigned char mpeg_active; /* nonzero if mpeg encoder is active */ | ||
551 | |||
552 | /* mpeg params */ | ||
553 | struct cx2341x_mpeg_params params; | ||
554 | #endif | ||
555 | |||
556 | #if defined(CONFIG_VIDEO_CX88_DVB) || defined(CONFIG_VIDEO_CX88_DVB_MODULE) | ||
557 | /* for dvb only */ | ||
558 | struct videobuf_dvb_frontends frontends; | ||
559 | #endif | ||
560 | |||
561 | #if defined(CONFIG_VIDEO_CX88_VP3054) || \ | ||
562 | defined(CONFIG_VIDEO_CX88_VP3054_MODULE) | ||
563 | /* For VP3045 secondary I2C bus support */ | ||
564 | struct vp3054_i2c_state *vp3054; | ||
565 | #endif | ||
566 | /* for switching modulation types */ | ||
567 | unsigned char ts_gen_cntrl; | ||
568 | |||
569 | /* List of attached drivers; must hold core->lock to access */ | ||
570 | struct list_head drvlist; | ||
571 | |||
572 | struct work_struct request_module_wk; | ||
573 | }; | ||
574 | |||
575 | /* ----------------------------------------------------------- */ | ||
576 | |||
577 | #define cx_read(reg) readl(core->lmmio + ((reg)>>2)) | ||
578 | #define cx_write(reg,value) writel((value), core->lmmio + ((reg)>>2)) | ||
579 | #define cx_writeb(reg,value) writeb((value), core->bmmio + (reg)) | ||
580 | |||
581 | #define cx_andor(reg,mask,value) \ | ||
582 | writel((readl(core->lmmio+((reg)>>2)) & ~(mask)) |\ | ||
583 | ((value) & (mask)), core->lmmio+((reg)>>2)) | ||
584 | #define cx_set(reg,bit) cx_andor((reg),(bit),(bit)) | ||
585 | #define cx_clear(reg,bit) cx_andor((reg),(bit),0) | ||
586 | |||
587 | #define cx_wait(d) { if (need_resched()) schedule(); else udelay(d); } | ||
588 | |||
589 | /* shadow registers */ | ||
590 | #define cx_sread(sreg) (core->shadow[sreg]) | ||
591 | #define cx_swrite(sreg,reg,value) \ | ||
592 | (core->shadow[sreg] = value, \ | ||
593 | writel(core->shadow[sreg], core->lmmio + ((reg)>>2))) | ||
594 | #define cx_sandor(sreg,reg,mask,value) \ | ||
595 | (core->shadow[sreg] = (core->shadow[sreg] & ~(mask)) | ((value) & (mask)), \ | ||
596 | writel(core->shadow[sreg], core->lmmio + ((reg)>>2))) | ||
597 | |||
598 | /* ----------------------------------------------------------- */ | ||
599 | /* cx88-core.c */ | ||
600 | |||
601 | extern void cx88_print_irqbits(const char *name, const char *tag, const char *strings[], | ||
602 | int len, u32 bits, u32 mask); | ||
603 | |||
604 | extern int cx88_core_irq(struct cx88_core *core, u32 status); | ||
605 | extern void cx88_wakeup(struct cx88_core *core, | ||
606 | struct cx88_dmaqueue *q, u32 count); | ||
607 | extern void cx88_shutdown(struct cx88_core *core); | ||
608 | extern int cx88_reset(struct cx88_core *core); | ||
609 | |||
610 | extern int | ||
611 | cx88_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc, | ||
612 | struct scatterlist *sglist, | ||
613 | unsigned int top_offset, unsigned int bottom_offset, | ||
614 | unsigned int bpl, unsigned int padding, unsigned int lines); | ||
615 | extern int | ||
616 | cx88_risc_databuffer(struct pci_dev *pci, struct btcx_riscmem *risc, | ||
617 | struct scatterlist *sglist, unsigned int bpl, | ||
618 | unsigned int lines, unsigned int lpi); | ||
619 | extern int | ||
620 | cx88_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc, | ||
621 | u32 reg, u32 mask, u32 value); | ||
622 | extern void | ||
623 | cx88_free_buffer(struct videobuf_queue *q, struct cx88_buffer *buf); | ||
624 | |||
625 | extern void cx88_risc_disasm(struct cx88_core *core, | ||
626 | struct btcx_riscmem *risc); | ||
627 | extern int cx88_sram_channel_setup(struct cx88_core *core, | ||
628 | const struct sram_channel *ch, | ||
629 | unsigned int bpl, u32 risc); | ||
630 | extern void cx88_sram_channel_dump(struct cx88_core *core, | ||
631 | const struct sram_channel *ch); | ||
632 | |||
633 | extern int cx88_set_scale(struct cx88_core *core, unsigned int width, | ||
634 | unsigned int height, enum v4l2_field field); | ||
635 | extern int cx88_set_tvnorm(struct cx88_core *core, v4l2_std_id norm); | ||
636 | |||
637 | extern struct video_device *cx88_vdev_init(struct cx88_core *core, | ||
638 | struct pci_dev *pci, | ||
639 | const struct video_device *template_, | ||
640 | const char *type); | ||
641 | extern struct cx88_core* cx88_core_get(struct pci_dev *pci); | ||
642 | extern void cx88_core_put(struct cx88_core *core, | ||
643 | struct pci_dev *pci); | ||
644 | |||
645 | extern int cx88_start_audio_dma(struct cx88_core *core); | ||
646 | extern int cx88_stop_audio_dma(struct cx88_core *core); | ||
647 | |||
648 | |||
649 | /* ----------------------------------------------------------- */ | ||
650 | /* cx88-vbi.c */ | ||
651 | |||
652 | /* Can be used as g_vbi_fmt, try_vbi_fmt and s_vbi_fmt */ | ||
653 | int cx8800_vbi_fmt (struct file *file, void *priv, | ||
654 | struct v4l2_format *f); | ||
655 | |||
656 | /* | ||
657 | int cx8800_start_vbi_dma(struct cx8800_dev *dev, | ||
658 | struct cx88_dmaqueue *q, | ||
659 | struct cx88_buffer *buf); | ||
660 | */ | ||
661 | int cx8800_stop_vbi_dma(struct cx8800_dev *dev); | ||
662 | int cx8800_restart_vbi_queue(struct cx8800_dev *dev, | ||
663 | struct cx88_dmaqueue *q); | ||
664 | void cx8800_vbi_timeout(unsigned long data); | ||
665 | |||
666 | extern const struct videobuf_queue_ops cx8800_vbi_qops; | ||
667 | |||
668 | /* ----------------------------------------------------------- */ | ||
669 | /* cx88-i2c.c */ | ||
670 | |||
671 | extern int cx88_i2c_init(struct cx88_core *core, struct pci_dev *pci); | ||
672 | |||
673 | |||
674 | /* ----------------------------------------------------------- */ | ||
675 | /* cx88-cards.c */ | ||
676 | |||
677 | extern int cx88_tuner_callback(void *dev, int component, int command, int arg); | ||
678 | extern int cx88_get_resources(const struct cx88_core *core, | ||
679 | struct pci_dev *pci); | ||
680 | extern struct cx88_core *cx88_core_create(struct pci_dev *pci, int nr); | ||
681 | extern void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl); | ||
682 | |||
683 | /* ----------------------------------------------------------- */ | ||
684 | /* cx88-tvaudio.c */ | ||
685 | |||
686 | void cx88_set_tvaudio(struct cx88_core *core); | ||
687 | void cx88_newstation(struct cx88_core *core); | ||
688 | void cx88_get_stereo(struct cx88_core *core, struct v4l2_tuner *t); | ||
689 | void cx88_set_stereo(struct cx88_core *core, u32 mode, int manual); | ||
690 | int cx88_audio_thread(void *data); | ||
691 | |||
692 | int cx8802_register_driver(struct cx8802_driver *drv); | ||
693 | int cx8802_unregister_driver(struct cx8802_driver *drv); | ||
694 | |||
695 | /* Caller must hold core->lock */ | ||
696 | struct cx8802_driver * cx8802_get_driver(struct cx8802_dev *dev, enum cx88_board_type btype); | ||
697 | |||
698 | /* ----------------------------------------------------------- */ | ||
699 | /* cx88-dsp.c */ | ||
700 | |||
701 | s32 cx88_dsp_detect_stereo_sap(struct cx88_core *core); | ||
702 | |||
703 | /* ----------------------------------------------------------- */ | ||
704 | /* cx88-input.c */ | ||
705 | |||
706 | int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci); | ||
707 | int cx88_ir_fini(struct cx88_core *core); | ||
708 | void cx88_ir_irq(struct cx88_core *core); | ||
709 | int cx88_ir_start(struct cx88_core *core); | ||
710 | void cx88_ir_stop(struct cx88_core *core); | ||
711 | extern void cx88_i2c_init_ir(struct cx88_core *core); | ||
712 | |||
713 | /* ----------------------------------------------------------- */ | ||
714 | /* cx88-mpeg.c */ | ||
715 | |||
716 | int cx8802_buf_prepare(struct videobuf_queue *q,struct cx8802_dev *dev, | ||
717 | struct cx88_buffer *buf, enum v4l2_field field); | ||
718 | void cx8802_buf_queue(struct cx8802_dev *dev, struct cx88_buffer *buf); | ||
719 | void cx8802_cancel_buffers(struct cx8802_dev *dev); | ||
720 | |||
721 | /* ----------------------------------------------------------- */ | ||
722 | /* cx88-video.c*/ | ||
723 | extern const u32 cx88_user_ctrls[]; | ||
724 | extern int cx8800_ctrl_query(struct cx88_core *core, | ||
725 | struct v4l2_queryctrl *qctrl); | ||
726 | int cx88_enum_input (struct cx88_core *core,struct v4l2_input *i); | ||
727 | int cx88_set_freq (struct cx88_core *core,struct v4l2_frequency *f); | ||
728 | int cx88_get_control(struct cx88_core *core, struct v4l2_control *ctl); | ||
729 | int cx88_set_control(struct cx88_core *core, struct v4l2_control *ctl); | ||
730 | int cx88_video_mux(struct cx88_core *core, unsigned int input); | ||