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