162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * v4l2 device driver for cx2388x based TV cards 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * (c) 2003,04 Gerd Knorr <kraxel@bytesex.org> [SUSE Labs] 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef CX88_H 962306a36Sopenharmony_ci#define CX88_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/pci.h> 1462306a36Sopenharmony_ci#include <linux/i2c.h> 1562306a36Sopenharmony_ci#include <linux/i2c-algo-bit.h> 1662306a36Sopenharmony_ci#include <linux/videodev2.h> 1762306a36Sopenharmony_ci#include <linux/kdev_t.h> 1862306a36Sopenharmony_ci#include <linux/refcount.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include <media/v4l2-device.h> 2162306a36Sopenharmony_ci#include <media/v4l2-fh.h> 2262306a36Sopenharmony_ci#include <media/tuner.h> 2362306a36Sopenharmony_ci#include <media/tveeprom.h> 2462306a36Sopenharmony_ci#include <media/videobuf2-dma-sg.h> 2562306a36Sopenharmony_ci#include <media/drv-intf/cx2341x.h> 2662306a36Sopenharmony_ci#include <media/videobuf2-dvb.h> 2762306a36Sopenharmony_ci#include <media/i2c/ir-kbd-i2c.h> 2862306a36Sopenharmony_ci#include <media/i2c/wm8775.h> 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#include "cx88-reg.h" 3162306a36Sopenharmony_ci#include "xc2028.h" 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#include <linux/mutex.h> 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define CX88_VERSION "1.0.0" 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define UNSET (-1U) 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#define CX88_MAXBOARDS 8 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/* Max number of inputs by card */ 4262306a36Sopenharmony_ci#define MAX_CX88_INPUT 8 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 4562306a36Sopenharmony_ci/* defines and enums */ 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci/* Currently unsupported by the driver: PAL/H, NTSC/Kr, SECAM/LC */ 4862306a36Sopenharmony_ci#define CX88_NORMS (V4L2_STD_ALL \ 4962306a36Sopenharmony_ci & ~V4L2_STD_PAL_H \ 5062306a36Sopenharmony_ci & ~V4L2_STD_NTSC_M_KR \ 5162306a36Sopenharmony_ci & ~V4L2_STD_SECAM_LC) 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define FORMAT_FLAGS_PACKED 0x01 5462306a36Sopenharmony_ci#define FORMAT_FLAGS_PLANAR 0x02 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci#define VBI_LINE_PAL_COUNT 18 5762306a36Sopenharmony_ci#define VBI_LINE_NTSC_COUNT 12 5862306a36Sopenharmony_ci#define VBI_LINE_LENGTH 2048 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#define AUD_RDS_LINES 4 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci/* need "shadow" registers for some write-only ones ... */ 6362306a36Sopenharmony_ci#define SHADOW_AUD_VOL_CTL 1 6462306a36Sopenharmony_ci#define SHADOW_AUD_BAL_CTL 2 6562306a36Sopenharmony_ci#define SHADOW_MAX 3 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci/* FM Radio deemphasis type */ 6862306a36Sopenharmony_cienum cx88_deemph_type { 6962306a36Sopenharmony_ci FM_NO_DEEMPH = 0, 7062306a36Sopenharmony_ci FM_DEEMPH_50, 7162306a36Sopenharmony_ci FM_DEEMPH_75 7262306a36Sopenharmony_ci}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cienum cx88_board_type { 7562306a36Sopenharmony_ci CX88_BOARD_NONE = 0, 7662306a36Sopenharmony_ci CX88_MPEG_DVB, 7762306a36Sopenharmony_ci CX88_MPEG_BLACKBIRD 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cienum cx8802_board_access { 8162306a36Sopenharmony_ci CX8802_DRVCTL_SHARED = 1, 8262306a36Sopenharmony_ci CX8802_DRVCTL_EXCLUSIVE = 2, 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 8662306a36Sopenharmony_ci/* tv norms */ 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistatic inline unsigned int norm_maxw(v4l2_std_id norm) 8962306a36Sopenharmony_ci{ 9062306a36Sopenharmony_ci return 720; 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistatic inline unsigned int norm_maxh(v4l2_std_id norm) 9462306a36Sopenharmony_ci{ 9562306a36Sopenharmony_ci return (norm & V4L2_STD_525_60) ? 480 : 576; 9662306a36Sopenharmony_ci} 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 9962306a36Sopenharmony_ci/* static data */ 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cistruct cx8800_fmt { 10262306a36Sopenharmony_ci u32 fourcc; /* v4l2 format id */ 10362306a36Sopenharmony_ci int depth; 10462306a36Sopenharmony_ci int flags; 10562306a36Sopenharmony_ci u32 cxformat; 10662306a36Sopenharmony_ci}; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 10962306a36Sopenharmony_ci/* SRAM memory management data (see cx88-core.c) */ 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#define SRAM_CH21 0 /* video */ 11262306a36Sopenharmony_ci#define SRAM_CH22 1 11362306a36Sopenharmony_ci#define SRAM_CH23 2 11462306a36Sopenharmony_ci#define SRAM_CH24 3 /* vbi */ 11562306a36Sopenharmony_ci#define SRAM_CH25 4 /* audio */ 11662306a36Sopenharmony_ci#define SRAM_CH26 5 11762306a36Sopenharmony_ci#define SRAM_CH28 6 /* mpeg */ 11862306a36Sopenharmony_ci#define SRAM_CH27 7 /* audio rds */ 11962306a36Sopenharmony_ci/* more */ 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_cistruct sram_channel { 12262306a36Sopenharmony_ci const char *name; 12362306a36Sopenharmony_ci u32 cmds_start; 12462306a36Sopenharmony_ci u32 ctrl_start; 12562306a36Sopenharmony_ci u32 cdt; 12662306a36Sopenharmony_ci u32 fifo_start; 12762306a36Sopenharmony_ci u32 fifo_size; 12862306a36Sopenharmony_ci u32 ptr1_reg; 12962306a36Sopenharmony_ci u32 ptr2_reg; 13062306a36Sopenharmony_ci u32 cnt1_reg; 13162306a36Sopenharmony_ci u32 cnt2_reg; 13262306a36Sopenharmony_ci}; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ciextern const struct sram_channel cx88_sram_channels[]; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 13762306a36Sopenharmony_ci/* card configuration */ 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci#define CX88_BOARD_NOAUTO UNSET 14062306a36Sopenharmony_ci#define CX88_BOARD_UNKNOWN 0 14162306a36Sopenharmony_ci#define CX88_BOARD_HAUPPAUGE 1 14262306a36Sopenharmony_ci#define CX88_BOARD_GDI 2 14362306a36Sopenharmony_ci#define CX88_BOARD_PIXELVIEW 3 14462306a36Sopenharmony_ci#define CX88_BOARD_ATI_WONDER_PRO 4 14562306a36Sopenharmony_ci#define CX88_BOARD_WINFAST2000XP_EXPERT 5 14662306a36Sopenharmony_ci#define CX88_BOARD_AVERTV_STUDIO_303 6 14762306a36Sopenharmony_ci#define CX88_BOARD_MSI_TVANYWHERE_MASTER 7 14862306a36Sopenharmony_ci#define CX88_BOARD_WINFAST_DV2000 8 14962306a36Sopenharmony_ci#define CX88_BOARD_LEADTEK_PVR2000 9 15062306a36Sopenharmony_ci#define CX88_BOARD_IODATA_GVVCP3PCI 10 15162306a36Sopenharmony_ci#define CX88_BOARD_PROLINK_PLAYTVPVR 11 15262306a36Sopenharmony_ci#define CX88_BOARD_ASUS_PVR_416 12 15362306a36Sopenharmony_ci#define CX88_BOARD_MSI_TVANYWHERE 13 15462306a36Sopenharmony_ci#define CX88_BOARD_KWORLD_DVB_T 14 15562306a36Sopenharmony_ci#define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1 15 15662306a36Sopenharmony_ci#define CX88_BOARD_KWORLD_LTV883 16 15762306a36Sopenharmony_ci#define CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q 17 15862306a36Sopenharmony_ci#define CX88_BOARD_HAUPPAUGE_DVB_T1 18 15962306a36Sopenharmony_ci#define CX88_BOARD_CONEXANT_DVB_T1 19 16062306a36Sopenharmony_ci#define CX88_BOARD_PROVIDEO_PV259 20 16162306a36Sopenharmony_ci#define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS 21 16262306a36Sopenharmony_ci#define CX88_BOARD_PCHDTV_HD3000 22 16362306a36Sopenharmony_ci#define CX88_BOARD_DNTV_LIVE_DVB_T 23 16462306a36Sopenharmony_ci#define CX88_BOARD_HAUPPAUGE_ROSLYN 24 16562306a36Sopenharmony_ci#define CX88_BOARD_DIGITALLOGIC_MEC 25 16662306a36Sopenharmony_ci#define CX88_BOARD_IODATA_GVBCTV7E 26 16762306a36Sopenharmony_ci#define CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO 27 16862306a36Sopenharmony_ci#define CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T 28 16962306a36Sopenharmony_ci#define CX88_BOARD_ADSTECH_DVB_T_PCI 29 17062306a36Sopenharmony_ci#define CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1 30 17162306a36Sopenharmony_ci#define CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD 31 17262306a36Sopenharmony_ci#define CX88_BOARD_AVERMEDIA_ULTRATV_MC_550 32 17362306a36Sopenharmony_ci#define CX88_BOARD_KWORLD_VSTREAM_EXPERT_DVD 33 17462306a36Sopenharmony_ci#define CX88_BOARD_ATI_HDTVWONDER 34 17562306a36Sopenharmony_ci#define CX88_BOARD_WINFAST_DTV1000 35 17662306a36Sopenharmony_ci#define CX88_BOARD_AVERTV_303 36 17762306a36Sopenharmony_ci#define CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1 37 17862306a36Sopenharmony_ci#define CX88_BOARD_HAUPPAUGE_NOVASE2_S1 38 17962306a36Sopenharmony_ci#define CX88_BOARD_KWORLD_DVBS_100 39 18062306a36Sopenharmony_ci#define CX88_BOARD_HAUPPAUGE_HVR1100 40 18162306a36Sopenharmony_ci#define CX88_BOARD_HAUPPAUGE_HVR1100LP 41 18262306a36Sopenharmony_ci#define CX88_BOARD_DNTV_LIVE_DVB_T_PRO 42 18362306a36Sopenharmony_ci#define CX88_BOARD_KWORLD_DVB_T_CX22702 43 18462306a36Sopenharmony_ci#define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL 44 18562306a36Sopenharmony_ci#define CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT 45 18662306a36Sopenharmony_ci#define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID 46 18762306a36Sopenharmony_ci#define CX88_BOARD_PCHDTV_HD5500 47 18862306a36Sopenharmony_ci#define CX88_BOARD_KWORLD_MCE200_DELUXE 48 18962306a36Sopenharmony_ci#define CX88_BOARD_PIXELVIEW_PLAYTV_P7000 49 19062306a36Sopenharmony_ci#define CX88_BOARD_NPGTECH_REALTV_TOP10FM 50 19162306a36Sopenharmony_ci#define CX88_BOARD_WINFAST_DTV2000H 51 19262306a36Sopenharmony_ci#define CX88_BOARD_GENIATECH_DVBS 52 19362306a36Sopenharmony_ci#define CX88_BOARD_HAUPPAUGE_HVR3000 53 19462306a36Sopenharmony_ci#define CX88_BOARD_NORWOOD_MICRO 54 19562306a36Sopenharmony_ci#define CX88_BOARD_TE_DTV_250_OEM_SWANN 55 19662306a36Sopenharmony_ci#define CX88_BOARD_HAUPPAUGE_HVR1300 56 19762306a36Sopenharmony_ci#define CX88_BOARD_ADSTECH_PTV_390 57 19862306a36Sopenharmony_ci#define CX88_BOARD_PINNACLE_PCTV_HD_800i 58 19962306a36Sopenharmony_ci#define CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO 59 20062306a36Sopenharmony_ci#define CX88_BOARD_PINNACLE_HYBRID_PCTV 60 20162306a36Sopenharmony_ci#define CX88_BOARD_WINFAST_TV2000_XP_GLOBAL 61 20262306a36Sopenharmony_ci#define CX88_BOARD_POWERCOLOR_REAL_ANGEL 62 20362306a36Sopenharmony_ci#define CX88_BOARD_GENIATECH_X8000_MT 63 20462306a36Sopenharmony_ci#define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO 64 20562306a36Sopenharmony_ci#define CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD 65 20662306a36Sopenharmony_ci#define CX88_BOARD_PROLINK_PV_8000GT 66 20762306a36Sopenharmony_ci#define CX88_BOARD_KWORLD_ATSC_120 67 20862306a36Sopenharmony_ci#define CX88_BOARD_HAUPPAUGE_HVR4000 68 20962306a36Sopenharmony_ci#define CX88_BOARD_HAUPPAUGE_HVR4000LITE 69 21062306a36Sopenharmony_ci#define CX88_BOARD_TEVII_S460 70 21162306a36Sopenharmony_ci#define CX88_BOARD_OMICOM_SS4_PCI 71 21262306a36Sopenharmony_ci#define CX88_BOARD_TBS_8920 72 21362306a36Sopenharmony_ci#define CX88_BOARD_TEVII_S420 73 21462306a36Sopenharmony_ci#define CX88_BOARD_PROLINK_PV_GLOBAL_XTREME 74 21562306a36Sopenharmony_ci#define CX88_BOARD_PROF_7300 75 21662306a36Sopenharmony_ci#define CX88_BOARD_SATTRADE_ST4200 76 21762306a36Sopenharmony_ci#define CX88_BOARD_TBS_8910 77 21862306a36Sopenharmony_ci#define CX88_BOARD_PROF_6200 78 21962306a36Sopenharmony_ci#define CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII 79 22062306a36Sopenharmony_ci#define CX88_BOARD_HAUPPAUGE_IRONLY 80 22162306a36Sopenharmony_ci#define CX88_BOARD_WINFAST_DTV1800H 81 22262306a36Sopenharmony_ci#define CX88_BOARD_WINFAST_DTV2000H_J 82 22362306a36Sopenharmony_ci#define CX88_BOARD_PROF_7301 83 22462306a36Sopenharmony_ci#define CX88_BOARD_SAMSUNG_SMT_7020 84 22562306a36Sopenharmony_ci#define CX88_BOARD_TWINHAN_VP1027_DVBS 85 22662306a36Sopenharmony_ci#define CX88_BOARD_TEVII_S464 86 22762306a36Sopenharmony_ci#define CX88_BOARD_WINFAST_DTV2000H_PLUS 87 22862306a36Sopenharmony_ci#define CX88_BOARD_WINFAST_DTV1800H_XC4000 88 22962306a36Sopenharmony_ci#define CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36 89 23062306a36Sopenharmony_ci#define CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43 90 23162306a36Sopenharmony_ci#define CX88_BOARD_NOTONLYTV_LV3H 91 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cienum cx88_itype { 23462306a36Sopenharmony_ci CX88_VMUX_COMPOSITE1 = 1, 23562306a36Sopenharmony_ci CX88_VMUX_COMPOSITE2, 23662306a36Sopenharmony_ci CX88_VMUX_COMPOSITE3, 23762306a36Sopenharmony_ci CX88_VMUX_COMPOSITE4, 23862306a36Sopenharmony_ci CX88_VMUX_SVIDEO, 23962306a36Sopenharmony_ci CX88_VMUX_TELEVISION, 24062306a36Sopenharmony_ci CX88_VMUX_CABLE, 24162306a36Sopenharmony_ci CX88_VMUX_DVB, 24262306a36Sopenharmony_ci CX88_VMUX_DEBUG, 24362306a36Sopenharmony_ci CX88_RADIO, 24462306a36Sopenharmony_ci}; 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_cistruct cx88_input { 24762306a36Sopenharmony_ci enum cx88_itype type; 24862306a36Sopenharmony_ci u32 gpio0, gpio1, gpio2, gpio3; 24962306a36Sopenharmony_ci unsigned int vmux:2; 25062306a36Sopenharmony_ci unsigned int audioroute:4; 25162306a36Sopenharmony_ci}; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_cienum cx88_audio_chip { 25462306a36Sopenharmony_ci CX88_AUDIO_WM8775 = 1, 25562306a36Sopenharmony_ci CX88_AUDIO_TVAUDIO, 25662306a36Sopenharmony_ci}; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cistruct cx88_board { 25962306a36Sopenharmony_ci const char *name; 26062306a36Sopenharmony_ci unsigned int tuner_type; 26162306a36Sopenharmony_ci unsigned int radio_type; 26262306a36Sopenharmony_ci unsigned char tuner_addr; 26362306a36Sopenharmony_ci unsigned char radio_addr; 26462306a36Sopenharmony_ci int tda9887_conf; 26562306a36Sopenharmony_ci struct cx88_input input[MAX_CX88_INPUT]; 26662306a36Sopenharmony_ci struct cx88_input radio; 26762306a36Sopenharmony_ci enum cx88_board_type mpeg; 26862306a36Sopenharmony_ci enum cx88_audio_chip audio_chip; 26962306a36Sopenharmony_ci int num_frontends; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci /* Used for I2S devices */ 27262306a36Sopenharmony_ci int i2sinputcntl; 27362306a36Sopenharmony_ci}; 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_cistruct cx88_subid { 27662306a36Sopenharmony_ci u16 subvendor; 27762306a36Sopenharmony_ci u16 subdevice; 27862306a36Sopenharmony_ci u32 card; 27962306a36Sopenharmony_ci}; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_cienum cx88_tvaudio { 28262306a36Sopenharmony_ci WW_NONE = 1, 28362306a36Sopenharmony_ci WW_BTSC, 28462306a36Sopenharmony_ci WW_BG, 28562306a36Sopenharmony_ci WW_DK, 28662306a36Sopenharmony_ci WW_I, 28762306a36Sopenharmony_ci WW_L, 28862306a36Sopenharmony_ci WW_EIAJ, 28962306a36Sopenharmony_ci WW_I2SPT, 29062306a36Sopenharmony_ci WW_FM, 29162306a36Sopenharmony_ci WW_I2SADC, 29262306a36Sopenharmony_ci WW_M 29362306a36Sopenharmony_ci}; 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci#define INPUT(nr) (core->board.input[nr]) 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 29862306a36Sopenharmony_ci/* device / file handle status */ 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci#define RESOURCE_OVERLAY 1 30162306a36Sopenharmony_ci#define RESOURCE_VIDEO 2 30262306a36Sopenharmony_ci#define RESOURCE_VBI 4 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci#define BUFFER_TIMEOUT msecs_to_jiffies(2000) 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_cistruct cx88_riscmem { 30762306a36Sopenharmony_ci unsigned int size; 30862306a36Sopenharmony_ci __le32 *cpu; 30962306a36Sopenharmony_ci __le32 *jmp; 31062306a36Sopenharmony_ci dma_addr_t dma; 31162306a36Sopenharmony_ci}; 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci/* buffer for one video frame */ 31462306a36Sopenharmony_cistruct cx88_buffer { 31562306a36Sopenharmony_ci /* common v4l buffer stuff -- must be first */ 31662306a36Sopenharmony_ci struct vb2_v4l2_buffer vb; 31762306a36Sopenharmony_ci struct list_head list; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci /* cx88 specific */ 32062306a36Sopenharmony_ci unsigned int bpl; 32162306a36Sopenharmony_ci struct cx88_riscmem risc; 32262306a36Sopenharmony_ci}; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_cistruct cx88_dmaqueue { 32562306a36Sopenharmony_ci struct list_head active; 32662306a36Sopenharmony_ci u32 count; 32762306a36Sopenharmony_ci}; 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_cistruct cx8800_dev; 33062306a36Sopenharmony_cistruct cx8802_dev; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cistruct cx88_core { 33362306a36Sopenharmony_ci struct list_head devlist; 33462306a36Sopenharmony_ci refcount_t refcount; 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci /* board name */ 33762306a36Sopenharmony_ci int nr; 33862306a36Sopenharmony_ci char name[32]; 33962306a36Sopenharmony_ci u32 model; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci /* pci stuff */ 34262306a36Sopenharmony_ci int pci_bus; 34362306a36Sopenharmony_ci int pci_slot; 34462306a36Sopenharmony_ci u32 __iomem *lmmio; 34562306a36Sopenharmony_ci u8 __iomem *bmmio; 34662306a36Sopenharmony_ci u32 shadow[SHADOW_MAX]; 34762306a36Sopenharmony_ci int pci_irqmask; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci /* i2c i/o */ 35062306a36Sopenharmony_ci struct i2c_adapter i2c_adap; 35162306a36Sopenharmony_ci struct i2c_algo_bit_data i2c_algo; 35262306a36Sopenharmony_ci struct i2c_client i2c_client; 35362306a36Sopenharmony_ci u32 i2c_state, i2c_rc; 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci /* config info -- analog */ 35662306a36Sopenharmony_ci struct v4l2_device v4l2_dev; 35762306a36Sopenharmony_ci struct v4l2_ctrl_handler video_hdl; 35862306a36Sopenharmony_ci struct v4l2_ctrl *chroma_agc; 35962306a36Sopenharmony_ci struct v4l2_ctrl_handler audio_hdl; 36062306a36Sopenharmony_ci struct v4l2_subdev *sd_wm8775; 36162306a36Sopenharmony_ci struct i2c_client *i2c_rtc; 36262306a36Sopenharmony_ci unsigned int boardnr; 36362306a36Sopenharmony_ci struct cx88_board board; 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci /* Supported V4L _STD_ tuner formats */ 36662306a36Sopenharmony_ci unsigned int tuner_formats; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci /* config info -- dvb */ 36962306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_VIDEO_CX88_DVB) 37062306a36Sopenharmony_ci int (*prev_set_voltage)(struct dvb_frontend *fe, 37162306a36Sopenharmony_ci enum fe_sec_voltage voltage); 37262306a36Sopenharmony_ci#endif 37362306a36Sopenharmony_ci void (*gate_ctrl)(struct cx88_core *core, int open); 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci /* state info */ 37662306a36Sopenharmony_ci struct task_struct *kthread; 37762306a36Sopenharmony_ci v4l2_std_id tvnorm; 37862306a36Sopenharmony_ci unsigned int width, height; 37962306a36Sopenharmony_ci unsigned int field; 38062306a36Sopenharmony_ci enum cx88_tvaudio tvaudio; 38162306a36Sopenharmony_ci u32 audiomode_manual; 38262306a36Sopenharmony_ci u32 audiomode_current; 38362306a36Sopenharmony_ci u32 input; 38462306a36Sopenharmony_ci u32 last_analog_input; 38562306a36Sopenharmony_ci u32 astat; 38662306a36Sopenharmony_ci u32 use_nicam; 38762306a36Sopenharmony_ci unsigned long last_change; 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ci /* IR remote control state */ 39062306a36Sopenharmony_ci struct cx88_IR *ir; 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci /* I2C remote data */ 39362306a36Sopenharmony_ci struct IR_i2c_init_data init_data; 39462306a36Sopenharmony_ci struct wm8775_platform_data wm8775_data; 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci struct mutex lock; 39762306a36Sopenharmony_ci /* various v4l controls */ 39862306a36Sopenharmony_ci u32 freq; 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci /* 40162306a36Sopenharmony_ci * cx88-video needs to access cx8802 for hybrid tuner pll access and 40262306a36Sopenharmony_ci * for vb2_is_busy() checks. 40362306a36Sopenharmony_ci */ 40462306a36Sopenharmony_ci struct cx8802_dev *dvbdev; 40562306a36Sopenharmony_ci /* cx88-blackbird needs to access cx8800 for vb2_is_busy() checks */ 40662306a36Sopenharmony_ci struct cx8800_dev *v4ldev; 40762306a36Sopenharmony_ci enum cx88_board_type active_type_id; 40862306a36Sopenharmony_ci int active_ref; 40962306a36Sopenharmony_ci int active_fe_id; 41062306a36Sopenharmony_ci}; 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_cistatic inline struct cx88_core *to_core(struct v4l2_device *v4l2_dev) 41362306a36Sopenharmony_ci{ 41462306a36Sopenharmony_ci return container_of(v4l2_dev, struct cx88_core, v4l2_dev); 41562306a36Sopenharmony_ci} 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci#define call_hw(core, grpid, o, f, args...) \ 41862306a36Sopenharmony_ci do { \ 41962306a36Sopenharmony_ci if (!core->i2c_rc) { \ 42062306a36Sopenharmony_ci if (core->gate_ctrl) \ 42162306a36Sopenharmony_ci core->gate_ctrl(core, 1); \ 42262306a36Sopenharmony_ci v4l2_device_call_all(&core->v4l2_dev, \ 42362306a36Sopenharmony_ci grpid, o, f, ##args); \ 42462306a36Sopenharmony_ci if (core->gate_ctrl) \ 42562306a36Sopenharmony_ci core->gate_ctrl(core, 0); \ 42662306a36Sopenharmony_ci } \ 42762306a36Sopenharmony_ci } while (0) 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci#define call_all(core, o, f, args...) call_hw(core, 0, o, f, ##args) 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci#define WM8775_GID (1 << 0) 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_ci#define wm8775_s_ctrl(core, id, val) \ 43462306a36Sopenharmony_ci do { \ 43562306a36Sopenharmony_ci struct v4l2_ctrl *ctrl_ = \ 43662306a36Sopenharmony_ci v4l2_ctrl_find(core->sd_wm8775->ctrl_handler, id);\ 43762306a36Sopenharmony_ci if (ctrl_ && !core->i2c_rc) { \ 43862306a36Sopenharmony_ci if (core->gate_ctrl) \ 43962306a36Sopenharmony_ci core->gate_ctrl(core, 1); \ 44062306a36Sopenharmony_ci v4l2_ctrl_s_ctrl(ctrl_, val); \ 44162306a36Sopenharmony_ci if (core->gate_ctrl) \ 44262306a36Sopenharmony_ci core->gate_ctrl(core, 0); \ 44362306a36Sopenharmony_ci } \ 44462306a36Sopenharmony_ci } while (0) 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci#define wm8775_g_ctrl(core, id) \ 44762306a36Sopenharmony_ci ({ \ 44862306a36Sopenharmony_ci struct v4l2_ctrl *ctrl_ = \ 44962306a36Sopenharmony_ci v4l2_ctrl_find(core->sd_wm8775->ctrl_handler, id);\ 45062306a36Sopenharmony_ci s32 val = 0; \ 45162306a36Sopenharmony_ci if (ctrl_ && !core->i2c_rc) { \ 45262306a36Sopenharmony_ci if (core->gate_ctrl) \ 45362306a36Sopenharmony_ci core->gate_ctrl(core, 1); \ 45462306a36Sopenharmony_ci val = v4l2_ctrl_g_ctrl(ctrl_); \ 45562306a36Sopenharmony_ci if (core->gate_ctrl) \ 45662306a36Sopenharmony_ci core->gate_ctrl(core, 0); \ 45762306a36Sopenharmony_ci } \ 45862306a36Sopenharmony_ci val; \ 45962306a36Sopenharmony_ci }) 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 46262306a36Sopenharmony_ci/* function 0: video stuff */ 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_cistruct cx8800_suspend_state { 46562306a36Sopenharmony_ci int disabled; 46662306a36Sopenharmony_ci}; 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_cistruct cx8800_dev { 46962306a36Sopenharmony_ci struct cx88_core *core; 47062306a36Sopenharmony_ci spinlock_t slock; 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_ci /* various device info */ 47362306a36Sopenharmony_ci unsigned int resources; 47462306a36Sopenharmony_ci struct video_device video_dev; 47562306a36Sopenharmony_ci struct video_device vbi_dev; 47662306a36Sopenharmony_ci struct video_device radio_dev; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci /* pci i/o */ 47962306a36Sopenharmony_ci struct pci_dev *pci; 48062306a36Sopenharmony_ci unsigned char pci_rev, pci_lat; 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci const struct cx8800_fmt *fmt; 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci /* capture queues */ 48562306a36Sopenharmony_ci struct cx88_dmaqueue vidq; 48662306a36Sopenharmony_ci struct vb2_queue vb2_vidq; 48762306a36Sopenharmony_ci struct cx88_dmaqueue vbiq; 48862306a36Sopenharmony_ci struct vb2_queue vb2_vbiq; 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci /* various v4l controls */ 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ci /* other global state info */ 49362306a36Sopenharmony_ci struct cx8800_suspend_state state; 49462306a36Sopenharmony_ci}; 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 49762306a36Sopenharmony_ci/* function 1: audio/alsa stuff */ 49862306a36Sopenharmony_ci/* =============> moved to cx88-alsa.c <====================== */ 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 50162306a36Sopenharmony_ci/* function 2: mpeg stuff */ 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_cistruct cx8802_suspend_state { 50462306a36Sopenharmony_ci int disabled; 50562306a36Sopenharmony_ci}; 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_cistruct cx8802_driver { 50862306a36Sopenharmony_ci struct cx88_core *core; 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci /* List of drivers attached to device */ 51162306a36Sopenharmony_ci struct list_head drvlist; 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ci /* Type of driver and access required */ 51462306a36Sopenharmony_ci enum cx88_board_type type_id; 51562306a36Sopenharmony_ci enum cx8802_board_access hw_access; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ci /* MPEG 8802 internal only */ 51862306a36Sopenharmony_ci int (*suspend)(struct pci_dev *pci_dev, pm_message_t state); 51962306a36Sopenharmony_ci int (*resume)(struct pci_dev *pci_dev); 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_ci /* Callers to the following functions must hold core->lock */ 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci /* MPEG 8802 -> mini driver - Driver probe and configuration */ 52462306a36Sopenharmony_ci int (*probe)(struct cx8802_driver *drv); 52562306a36Sopenharmony_ci int (*remove)(struct cx8802_driver *drv); 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci /* MPEG 8802 -> mini driver - Access for hardware control */ 52862306a36Sopenharmony_ci int (*advise_acquire)(struct cx8802_driver *drv); 52962306a36Sopenharmony_ci int (*advise_release)(struct cx8802_driver *drv); 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_ci /* MPEG 8802 <- mini driver - Access for hardware control */ 53262306a36Sopenharmony_ci int (*request_acquire)(struct cx8802_driver *drv); 53362306a36Sopenharmony_ci int (*request_release)(struct cx8802_driver *drv); 53462306a36Sopenharmony_ci}; 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_cistruct cx8802_dev { 53762306a36Sopenharmony_ci struct cx88_core *core; 53862306a36Sopenharmony_ci spinlock_t slock; 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci /* pci i/o */ 54162306a36Sopenharmony_ci struct pci_dev *pci; 54262306a36Sopenharmony_ci unsigned char pci_rev, pci_lat; 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci /* dma queues */ 54562306a36Sopenharmony_ci struct cx88_dmaqueue mpegq; 54662306a36Sopenharmony_ci struct vb2_queue vb2_mpegq; 54762306a36Sopenharmony_ci u32 ts_packet_size; 54862306a36Sopenharmony_ci u32 ts_packet_count; 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_ci /* other global state info */ 55162306a36Sopenharmony_ci struct cx8802_suspend_state state; 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci /* for blackbird only */ 55462306a36Sopenharmony_ci struct list_head devlist; 55562306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_VIDEO_CX88_BLACKBIRD) 55662306a36Sopenharmony_ci struct video_device mpeg_dev; 55762306a36Sopenharmony_ci u32 mailbox; 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_ci /* mpeg params */ 56062306a36Sopenharmony_ci struct cx2341x_handler cxhdl; 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_ci#endif 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_VIDEO_CX88_DVB) 56562306a36Sopenharmony_ci /* for dvb only */ 56662306a36Sopenharmony_ci struct vb2_dvb_frontends frontends; 56762306a36Sopenharmony_ci#endif 56862306a36Sopenharmony_ci 56962306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_VIDEO_CX88_VP3054) 57062306a36Sopenharmony_ci /* For VP3045 secondary I2C bus support */ 57162306a36Sopenharmony_ci struct vp3054_i2c_state *vp3054; 57262306a36Sopenharmony_ci#endif 57362306a36Sopenharmony_ci /* for switching modulation types */ 57462306a36Sopenharmony_ci unsigned char ts_gen_cntrl; 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_ci /* List of attached drivers; must hold core->lock to access */ 57762306a36Sopenharmony_ci struct list_head drvlist; 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci struct work_struct request_module_wk; 58062306a36Sopenharmony_ci}; 58162306a36Sopenharmony_ci 58262306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_ci#define cx_read(reg) readl(core->lmmio + ((reg) >> 2)) 58562306a36Sopenharmony_ci#define cx_write(reg, value) writel((value), core->lmmio + ((reg) >> 2)) 58662306a36Sopenharmony_ci#define cx_writeb(reg, value) writeb((value), core->bmmio + (reg)) 58762306a36Sopenharmony_ci 58862306a36Sopenharmony_ci#define cx_andor(reg, mask, value) \ 58962306a36Sopenharmony_ci writel((readl(core->lmmio + ((reg) >> 2)) & ~(mask)) |\ 59062306a36Sopenharmony_ci ((value) & (mask)), core->lmmio + ((reg) >> 2)) 59162306a36Sopenharmony_ci#define cx_set(reg, bit) cx_andor((reg), (bit), (bit)) 59262306a36Sopenharmony_ci#define cx_clear(reg, bit) cx_andor((reg), (bit), 0) 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci#define cx_wait(d) { if (need_resched()) schedule(); else udelay(d); } 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_ci/* shadow registers */ 59762306a36Sopenharmony_ci#define cx_sread(sreg) (core->shadow[sreg]) 59862306a36Sopenharmony_ci#define cx_swrite(sreg, reg, value) \ 59962306a36Sopenharmony_ci (core->shadow[sreg] = value, \ 60062306a36Sopenharmony_ci writel(core->shadow[sreg], core->lmmio + ((reg) >> 2))) 60162306a36Sopenharmony_ci#define cx_sandor(sreg, reg, mask, value) \ 60262306a36Sopenharmony_ci (core->shadow[sreg] = (core->shadow[sreg] & ~(mask)) | \ 60362306a36Sopenharmony_ci ((value) & (mask)), \ 60462306a36Sopenharmony_ci writel(core->shadow[sreg], \ 60562306a36Sopenharmony_ci core->lmmio + ((reg) >> 2))) 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 60862306a36Sopenharmony_ci/* cx88-core.c */ 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ciextern unsigned int cx88_core_debug; 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_civoid cx88_print_irqbits(const char *tag, const char *strings[], 61362306a36Sopenharmony_ci int len, u32 bits, u32 mask); 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_ciint cx88_core_irq(struct cx88_core *core, u32 status); 61662306a36Sopenharmony_civoid cx88_wakeup(struct cx88_core *core, 61762306a36Sopenharmony_ci struct cx88_dmaqueue *q, u32 count); 61862306a36Sopenharmony_civoid cx88_shutdown(struct cx88_core *core); 61962306a36Sopenharmony_ciint cx88_reset(struct cx88_core *core); 62062306a36Sopenharmony_ci 62162306a36Sopenharmony_ciextern int 62262306a36Sopenharmony_cicx88_risc_buffer(struct pci_dev *pci, struct cx88_riscmem *risc, 62362306a36Sopenharmony_ci struct scatterlist *sglist, 62462306a36Sopenharmony_ci unsigned int top_offset, unsigned int bottom_offset, 62562306a36Sopenharmony_ci unsigned int bpl, unsigned int padding, unsigned int lines); 62662306a36Sopenharmony_ciextern int 62762306a36Sopenharmony_cicx88_risc_databuffer(struct pci_dev *pci, struct cx88_riscmem *risc, 62862306a36Sopenharmony_ci struct scatterlist *sglist, unsigned int bpl, 62962306a36Sopenharmony_ci unsigned int lines, unsigned int lpi); 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_civoid cx88_risc_disasm(struct cx88_core *core, 63262306a36Sopenharmony_ci struct cx88_riscmem *risc); 63362306a36Sopenharmony_ciint cx88_sram_channel_setup(struct cx88_core *core, 63462306a36Sopenharmony_ci const struct sram_channel *ch, 63562306a36Sopenharmony_ci unsigned int bpl, u32 risc); 63662306a36Sopenharmony_civoid cx88_sram_channel_dump(struct cx88_core *core, 63762306a36Sopenharmony_ci const struct sram_channel *ch); 63862306a36Sopenharmony_ci 63962306a36Sopenharmony_ciint cx88_set_scale(struct cx88_core *core, unsigned int width, 64062306a36Sopenharmony_ci unsigned int height, enum v4l2_field field); 64162306a36Sopenharmony_ciint cx88_set_tvnorm(struct cx88_core *core, v4l2_std_id norm); 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_civoid cx88_vdev_init(struct cx88_core *core, 64462306a36Sopenharmony_ci struct pci_dev *pci, 64562306a36Sopenharmony_ci struct video_device *vfd, 64662306a36Sopenharmony_ci const struct video_device *template_, 64762306a36Sopenharmony_ci const char *type); 64862306a36Sopenharmony_cistruct cx88_core *cx88_core_get(struct pci_dev *pci); 64962306a36Sopenharmony_civoid cx88_core_put(struct cx88_core *core, 65062306a36Sopenharmony_ci struct pci_dev *pci); 65162306a36Sopenharmony_ci 65262306a36Sopenharmony_ciint cx88_start_audio_dma(struct cx88_core *core); 65362306a36Sopenharmony_ciint cx88_stop_audio_dma(struct cx88_core *core); 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 65662306a36Sopenharmony_ci/* cx88-vbi.c */ 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_ci/* Can be used as g_vbi_fmt, try_vbi_fmt and s_vbi_fmt */ 65962306a36Sopenharmony_ciint cx8800_vbi_fmt(struct file *file, void *priv, 66062306a36Sopenharmony_ci struct v4l2_format *f); 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_civoid cx8800_stop_vbi_dma(struct cx8800_dev *dev); 66362306a36Sopenharmony_ciint cx8800_restart_vbi_queue(struct cx8800_dev *dev, struct cx88_dmaqueue *q); 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ciextern const struct vb2_ops cx8800_vbi_qops; 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 66862306a36Sopenharmony_ci/* cx88-i2c.c */ 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_ciint cx88_i2c_init(struct cx88_core *core, struct pci_dev *pci); 67162306a36Sopenharmony_ci 67262306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 67362306a36Sopenharmony_ci/* cx88-cards.c */ 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_ciint cx88_tuner_callback(void *dev, int component, int command, int arg); 67662306a36Sopenharmony_ciint cx88_get_resources(const struct cx88_core *core, 67762306a36Sopenharmony_ci struct pci_dev *pci); 67862306a36Sopenharmony_cistruct cx88_core *cx88_core_create(struct pci_dev *pci, int nr); 67962306a36Sopenharmony_civoid cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl); 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 68262306a36Sopenharmony_ci/* cx88-tvaudio.c */ 68362306a36Sopenharmony_ci 68462306a36Sopenharmony_civoid cx88_set_tvaudio(struct cx88_core *core); 68562306a36Sopenharmony_civoid cx88_newstation(struct cx88_core *core); 68662306a36Sopenharmony_civoid cx88_get_stereo(struct cx88_core *core, struct v4l2_tuner *t); 68762306a36Sopenharmony_civoid cx88_set_stereo(struct cx88_core *core, u32 mode, int manual); 68862306a36Sopenharmony_ciint cx88_audio_thread(void *data); 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ciint cx8802_register_driver(struct cx8802_driver *drv); 69162306a36Sopenharmony_ciint cx8802_unregister_driver(struct cx8802_driver *drv); 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci/* Caller must hold core->lock */ 69462306a36Sopenharmony_cistruct cx8802_driver *cx8802_get_driver(struct cx8802_dev *dev, 69562306a36Sopenharmony_ci enum cx88_board_type btype); 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 69862306a36Sopenharmony_ci/* cx88-dsp.c */ 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_cis32 cx88_dsp_detect_stereo_sap(struct cx88_core *core); 70162306a36Sopenharmony_ci 70262306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 70362306a36Sopenharmony_ci/* cx88-input.c */ 70462306a36Sopenharmony_ci 70562306a36Sopenharmony_ciint cx88_ir_init(struct cx88_core *core, struct pci_dev *pci); 70662306a36Sopenharmony_ciint cx88_ir_fini(struct cx88_core *core); 70762306a36Sopenharmony_civoid cx88_ir_irq(struct cx88_core *core); 70862306a36Sopenharmony_ciint cx88_ir_start(struct cx88_core *core); 70962306a36Sopenharmony_civoid cx88_ir_stop(struct cx88_core *core); 71062306a36Sopenharmony_civoid cx88_i2c_init_ir(struct cx88_core *core); 71162306a36Sopenharmony_ci 71262306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 71362306a36Sopenharmony_ci/* cx88-mpeg.c */ 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_ciint cx8802_buf_prepare(struct vb2_queue *q, struct cx8802_dev *dev, 71662306a36Sopenharmony_ci struct cx88_buffer *buf); 71762306a36Sopenharmony_civoid cx8802_buf_queue(struct cx8802_dev *dev, struct cx88_buffer *buf); 71862306a36Sopenharmony_civoid cx8802_cancel_buffers(struct cx8802_dev *dev); 71962306a36Sopenharmony_ciint cx8802_start_dma(struct cx8802_dev *dev, 72062306a36Sopenharmony_ci struct cx88_dmaqueue *q, 72162306a36Sopenharmony_ci struct cx88_buffer *buf); 72262306a36Sopenharmony_ci 72362306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 72462306a36Sopenharmony_ci/* cx88-video.c*/ 72562306a36Sopenharmony_ciint cx88_enum_input(struct cx88_core *core, struct v4l2_input *i); 72662306a36Sopenharmony_ciint cx88_set_freq(struct cx88_core *core, const struct v4l2_frequency *f); 72762306a36Sopenharmony_ciint cx88_video_mux(struct cx88_core *core, unsigned int input); 72862306a36Sopenharmony_ciint cx88_querycap(struct file *file, struct cx88_core *core, 72962306a36Sopenharmony_ci struct v4l2_capability *cap); 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci#endif 732