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