xref: /linux/drivers/media/usb/cx231xx/cx231xx.h (revision b7085c08647598aafbf8f6223ebcdd413745449c)
1e0d3bafdSSri Deevi /*
2e0d3bafdSSri Deevi    cx231xx.h - driver for Conexant Cx23100/101/102 USB video capture devices
3e0d3bafdSSri Deevi 
4e0d3bafdSSri Deevi    Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
5e0d3bafdSSri Deevi 	Based on em28xx driver
6e0d3bafdSSri Deevi 
7e0d3bafdSSri Deevi    This program is free software; you can redistribute it and/or modify
8e0d3bafdSSri Deevi    it under the terms of the GNU General Public License as published by
9e0d3bafdSSri Deevi    the Free Software Foundation; either version 2 of the License, or
10e0d3bafdSSri Deevi    (at your option) any later version.
11e0d3bafdSSri Deevi 
12e0d3bafdSSri Deevi    This program is distributed in the hope that it will be useful,
13e0d3bafdSSri Deevi    but WITHOUT ANY WARRANTY; without even the implied warranty of
14e0d3bafdSSri Deevi    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15e0d3bafdSSri Deevi    GNU General Public License for more details.
16e0d3bafdSSri Deevi 
17e0d3bafdSSri Deevi    You should have received a copy of the GNU General Public License
18e0d3bafdSSri Deevi    along with this program; if not, write to the Free Software
19e0d3bafdSSri Deevi    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20e0d3bafdSSri Deevi  */
21e0d3bafdSSri Deevi 
22e0d3bafdSSri Deevi #ifndef _CX231XX_H
23e0d3bafdSSri Deevi #define _CX231XX_H
24e0d3bafdSSri Deevi 
25e0d3bafdSSri Deevi #include <linux/videodev2.h>
26b1196126SSri Deevi #include <linux/types.h>
27b1196126SSri Deevi #include <linux/ioctl.h>
28e0d3bafdSSri Deevi #include <linux/i2c.h>
2961b04cb2SMauro Carvalho Chehab #include <linux/workqueue.h>
30e0d3bafdSSri Deevi #include <linux/mutex.h>
31*b7085c08SMauro Carvalho Chehab #include <linux/usb.h>
32b1196126SSri Deevi 
3364fbf444SPalash Bandyopadhyay #include <media/cx2341x.h>
34b1196126SSri Deevi 
35b1196126SSri Deevi #include <media/videobuf-vmalloc.h>
36b1196126SSri Deevi #include <media/v4l2-device.h>
37d2370f8eSHans Verkuil #include <media/v4l2-ctrls.h>
381d08a4faSHans Verkuil #include <media/v4l2-fh.h>
396bda9644SMauro Carvalho Chehab #include <media/rc-core.h>
409ab66912SMauro Carvalho Chehab #include <media/ir-kbd-i2c.h>
41e0d3bafdSSri Deevi #include <media/videobuf-dvb.h>
42e0d3bafdSSri Deevi 
43e0d3bafdSSri Deevi #include "cx231xx-reg.h"
446e4f574bSSri Deevi #include "cx231xx-pcb-cfg.h"
45e0d3bafdSSri Deevi #include "cx231xx-conf-reg.h"
46e0d3bafdSSri Deevi 
47e0d3bafdSSri Deevi #define DRIVER_NAME                     "cx231xx"
4844ecf1dfSDevin Heitmueller #define PWR_SLEEP_INTERVAL              10
49e0d3bafdSSri Deevi 
50e0d3bafdSSri Deevi /* I2C addresses for control block in Cx231xx */
51ecc67d10SSri Deevi #define     AFE_DEVICE_ADDRESS		0x60
52ecc67d10SSri Deevi #define     I2S_BLK_DEVICE_ADDRESS	0x98
53ecc67d10SSri Deevi #define     VID_BLK_I2C_ADDRESS		0x88
5464fbf444SPalash Bandyopadhyay #define     VERVE_I2C_ADDRESS           0x40
55e0d3bafdSSri Deevi #define     DIF_USE_BASEBAND            0xFFFFFFFF
56e0d3bafdSSri Deevi 
57e0d3bafdSSri Deevi /* Boards supported by driver */
58e0d3bafdSSri Deevi #define CX231XX_BOARD_UNKNOWN		    0
5964fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_CARRAERA	1
6064fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_SHELBY	2
6164fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_RDE_253S	3
6264fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_RDU_253S	4
6364fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_VIDEO_GRABBER	5
6464fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_RDE_250	6
6564fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_RDU_250	7
661a50fddeSMichael Krufky #define CX231XX_BOARD_HAUPPAUGE_EXETER  8
674270c3caSDevin Heitmueller #define CX231XX_BOARD_HAUPPAUGE_USBLIVE2 9
689417bc6dSMauro Carvalho Chehab #define CX231XX_BOARD_PV_PLAYTV_USB_HYBRID 10
694e105039SMauro Carvalho Chehab #define CX231XX_BOARD_PV_XCAPTURE_USB 11
70eeaaf817SMárcio Alves #define CX231XX_BOARD_KWORLD_UB430_USB_HYBRID 12
712a7b6a40SIgor Novgorodov #define CX231XX_BOARD_ICONBIT_U100 13
72de8ae0d5SPeter Moon #define CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL 14
73de8ae0d5SPeter Moon #define CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC 15
7468c97bf3SAlf Høgemark #define CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2 16
753ead1ba3SMatt Gomboc #define CX231XX_BOARD_OTG102 17
768b1255a2SJohannes Erdfelt #define CX231XX_BOARD_KWORLD_UB445_USB_HYBRID 18
77dd2e7dd2SMatthias Schwarzott #define CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx 19
789e49f7c3SMatthias Schwarzott #define CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx 20
79e0d3bafdSSri Deevi 
80e0d3bafdSSri Deevi /* Limits minimum and default number of buffers */
81e0d3bafdSSri Deevi #define CX231XX_MIN_BUF                 4
82e0d3bafdSSri Deevi #define CX231XX_DEF_BUF                 12
83e0d3bafdSSri Deevi #define CX231XX_DEF_VBI_BUF             6
84e0d3bafdSSri Deevi 
85e0d3bafdSSri Deevi #define VBI_LINE_COUNT                  17
86e0d3bafdSSri Deevi #define VBI_LINE_LENGTH                 1440
87e0d3bafdSSri Deevi 
88e0d3bafdSSri Deevi /*Limits the max URB message size */
89e0d3bafdSSri Deevi #define URB_MAX_CTRL_SIZE               80
90e0d3bafdSSri Deevi 
91e0d3bafdSSri Deevi /* Params for validated field */
92e0d3bafdSSri Deevi #define CX231XX_BOARD_NOT_VALIDATED     1
93e0d3bafdSSri Deevi #define CX231XX_BOARD_VALIDATED		0
94e0d3bafdSSri Deevi 
95e0d3bafdSSri Deevi /* maximum number of cx231xx boards */
96e0d3bafdSSri Deevi #define CX231XX_MAXBOARDS               8
97e0d3bafdSSri Deevi 
98e0d3bafdSSri Deevi /* maximum number of frames that can be queued */
99e0d3bafdSSri Deevi #define CX231XX_NUM_FRAMES              5
100e0d3bafdSSri Deevi 
101e0d3bafdSSri Deevi /* number of buffers for isoc transfers */
102e0d3bafdSSri Deevi #define CX231XX_NUM_BUFS                8
103e0d3bafdSSri Deevi 
104e0d3bafdSSri Deevi /* number of packets for each buffer
105e0d3bafdSSri Deevi    windows requests only 40 packets .. so we better do the same
106e0d3bafdSSri Deevi    this is what I found out for all alternate numbers there!
107e0d3bafdSSri Deevi  */
108e0d3bafdSSri Deevi #define CX231XX_NUM_PACKETS             40
109e0d3bafdSSri Deevi 
110e0d3bafdSSri Deevi /* default alternate; 0 means choose the best */
111e0d3bafdSSri Deevi #define CX231XX_PINOUT                  0
112e0d3bafdSSri Deevi 
113e0d3bafdSSri Deevi #define CX231XX_INTERLACED_DEFAULT      1
114e0d3bafdSSri Deevi 
115e0d3bafdSSri Deevi /* time to wait when stopping the isoc transfer */
116b9255176SSri Deevi #define CX231XX_URB_TIMEOUT		\
117b9255176SSri Deevi 		msecs_to_jiffies(CX231XX_NUM_BUFS * CX231XX_NUM_PACKETS)
118e0d3bafdSSri Deevi 
11964fbf444SPalash Bandyopadhyay #define CX231xx_NORMS (\
12064fbf444SPalash Bandyopadhyay 	V4L2_STD_NTSC_M |  V4L2_STD_NTSC_M_JP |  V4L2_STD_NTSC_443 | \
12164fbf444SPalash Bandyopadhyay 	V4L2_STD_PAL_BG |  V4L2_STD_PAL_DK    |  V4L2_STD_PAL_I    | \
12264fbf444SPalash Bandyopadhyay 	V4L2_STD_PAL_M  |  V4L2_STD_PAL_N     |  V4L2_STD_PAL_Nc   | \
12364fbf444SPalash Bandyopadhyay 	V4L2_STD_PAL_60 |  V4L2_STD_SECAM_L   |  V4L2_STD_SECAM_DK)
12464fbf444SPalash Bandyopadhyay 
12564fbf444SPalash Bandyopadhyay #define SLEEP_S5H1432    30
12664fbf444SPalash Bandyopadhyay #define CX23417_OSC_EN   8
12764fbf444SPalash Bandyopadhyay #define CX23417_RESET    9
12864fbf444SPalash Bandyopadhyay 
12964fbf444SPalash Bandyopadhyay struct cx23417_fmt {
13064fbf444SPalash Bandyopadhyay 	char  *name;
13164fbf444SPalash Bandyopadhyay 	u32   fourcc;          /* v4l2 format id */
13264fbf444SPalash Bandyopadhyay 	int   depth;
13364fbf444SPalash Bandyopadhyay 	int   flags;
13464fbf444SPalash Bandyopadhyay 	u32   cxformat;
13564fbf444SPalash Bandyopadhyay };
136e0d3bafdSSri Deevi enum cx231xx_mode {
137e0d3bafdSSri Deevi 	CX231XX_SUSPEND,
138e0d3bafdSSri Deevi 	CX231XX_ANALOG_MODE,
139e0d3bafdSSri Deevi 	CX231XX_DIGITAL_MODE,
140e0d3bafdSSri Deevi };
141e0d3bafdSSri Deevi 
142e0d3bafdSSri Deevi enum cx231xx_std_mode {
143e0d3bafdSSri Deevi 	CX231XX_TV_AIR = 0,
144e0d3bafdSSri Deevi 	CX231XX_TV_CABLE
145e0d3bafdSSri Deevi };
146e0d3bafdSSri Deevi 
147e0d3bafdSSri Deevi enum cx231xx_stream_state {
148e0d3bafdSSri Deevi 	STREAM_OFF,
149e0d3bafdSSri Deevi 	STREAM_INTERRUPT,
150e0d3bafdSSri Deevi 	STREAM_ON,
151e0d3bafdSSri Deevi };
152e0d3bafdSSri Deevi 
153e0d3bafdSSri Deevi struct cx231xx;
154e0d3bafdSSri Deevi 
15564fbf444SPalash Bandyopadhyay struct cx231xx_isoc_ctl {
156e0d3bafdSSri Deevi 	/* max packet size of isoc transaction */
157e0d3bafdSSri Deevi 	int max_pkt_size;
158e0d3bafdSSri Deevi 
159e0d3bafdSSri Deevi 	/* number of allocated urbs */
160e0d3bafdSSri Deevi 	int num_bufs;
161e0d3bafdSSri Deevi 
162e0d3bafdSSri Deevi 	/* urb for isoc transfers */
163e0d3bafdSSri Deevi 	struct urb **urb;
164e0d3bafdSSri Deevi 
165e0d3bafdSSri Deevi 	/* transfer buffers for isoc transfer */
166e0d3bafdSSri Deevi 	char **transfer_buffer;
167e0d3bafdSSri Deevi 
168e0d3bafdSSri Deevi 	/* Last buffer command and region */
169e0d3bafdSSri Deevi 	u8 cmd;
170e0d3bafdSSri Deevi 	int pos, size, pktsize;
171e0d3bafdSSri Deevi 
172e0d3bafdSSri Deevi 	/* Last field: ODD or EVEN? */
173e0d3bafdSSri Deevi 	int field;
174e0d3bafdSSri Deevi 
175e0d3bafdSSri Deevi 	/* Stores incomplete commands */
176e0d3bafdSSri Deevi 	u32 tmp_buf;
177e0d3bafdSSri Deevi 	int tmp_buf_len;
178e0d3bafdSSri Deevi 
179e0d3bafdSSri Deevi 	/* Stores already requested buffers */
180e0d3bafdSSri Deevi 	struct cx231xx_buffer *buf;
181e0d3bafdSSri Deevi 
182e0d3bafdSSri Deevi 	/* Stores the number of received fields */
183e0d3bafdSSri Deevi 	int nfields;
184e0d3bafdSSri Deevi 
185e0d3bafdSSri Deevi 	/* isoc urb callback */
186e0d3bafdSSri Deevi 	int (*isoc_copy) (struct cx231xx *dev, struct urb *urb);
187e0d3bafdSSri Deevi };
188e0d3bafdSSri Deevi 
18964fbf444SPalash Bandyopadhyay struct cx231xx_bulk_ctl {
19064fbf444SPalash Bandyopadhyay 	/* max packet size of bulk transaction */
19164fbf444SPalash Bandyopadhyay 	int max_pkt_size;
19264fbf444SPalash Bandyopadhyay 
19364fbf444SPalash Bandyopadhyay 	/* number of allocated urbs */
19464fbf444SPalash Bandyopadhyay 	int num_bufs;
19564fbf444SPalash Bandyopadhyay 
19664fbf444SPalash Bandyopadhyay 	/* urb for bulk transfers */
19764fbf444SPalash Bandyopadhyay 	struct urb **urb;
19864fbf444SPalash Bandyopadhyay 
19964fbf444SPalash Bandyopadhyay 	/* transfer buffers for bulk transfer */
20064fbf444SPalash Bandyopadhyay 	char **transfer_buffer;
20164fbf444SPalash Bandyopadhyay 
20264fbf444SPalash Bandyopadhyay 	/* Last buffer command and region */
20364fbf444SPalash Bandyopadhyay 	u8 cmd;
20464fbf444SPalash Bandyopadhyay 	int pos, size, pktsize;
20564fbf444SPalash Bandyopadhyay 
20664fbf444SPalash Bandyopadhyay 	/* Last field: ODD or EVEN? */
20764fbf444SPalash Bandyopadhyay 	int field;
20864fbf444SPalash Bandyopadhyay 
20964fbf444SPalash Bandyopadhyay 	/* Stores incomplete commands */
21064fbf444SPalash Bandyopadhyay 	u32 tmp_buf;
21164fbf444SPalash Bandyopadhyay 	int tmp_buf_len;
21264fbf444SPalash Bandyopadhyay 
21364fbf444SPalash Bandyopadhyay 	/* Stores already requested buffers */
21464fbf444SPalash Bandyopadhyay 	struct cx231xx_buffer *buf;
21564fbf444SPalash Bandyopadhyay 
21664fbf444SPalash Bandyopadhyay 	/* Stores the number of received fields */
21764fbf444SPalash Bandyopadhyay 	int nfields;
21864fbf444SPalash Bandyopadhyay 
21964fbf444SPalash Bandyopadhyay 	/* bulk urb callback */
22064fbf444SPalash Bandyopadhyay 	int (*bulk_copy) (struct cx231xx *dev, struct urb *urb);
22164fbf444SPalash Bandyopadhyay };
22264fbf444SPalash Bandyopadhyay 
223e0d3bafdSSri Deevi struct cx231xx_fmt {
224e0d3bafdSSri Deevi 	char *name;
225e0d3bafdSSri Deevi 	u32 fourcc;		/* v4l2 format id */
226e0d3bafdSSri Deevi 	int depth;
227e0d3bafdSSri Deevi 	int reg;
228e0d3bafdSSri Deevi };
229e0d3bafdSSri Deevi 
230e0d3bafdSSri Deevi /* buffer for one video frame */
231e0d3bafdSSri Deevi struct cx231xx_buffer {
232e0d3bafdSSri Deevi 	/* common v4l buffer stuff -- must be first */
233e0d3bafdSSri Deevi 	struct videobuf_buffer vb;
234e0d3bafdSSri Deevi 
235e0d3bafdSSri Deevi 	struct list_head frame;
236e0d3bafdSSri Deevi 	int top_field;
237e0d3bafdSSri Deevi 	int receiving;
238e0d3bafdSSri Deevi };
239e0d3bafdSSri Deevi 
24064fbf444SPalash Bandyopadhyay enum ps_package_head {
24164fbf444SPalash Bandyopadhyay 	CX231XX_NEED_ADD_PS_PACKAGE_HEAD = 0,
24264fbf444SPalash Bandyopadhyay 	CX231XX_NONEED_PS_PACKAGE_HEAD
24364fbf444SPalash Bandyopadhyay };
24464fbf444SPalash Bandyopadhyay 
245e0d3bafdSSri Deevi struct cx231xx_dmaqueue {
246e0d3bafdSSri Deevi 	struct list_head active;
247e0d3bafdSSri Deevi 	struct list_head queued;
248e0d3bafdSSri Deevi 
249e0d3bafdSSri Deevi 	wait_queue_head_t wq;
250e0d3bafdSSri Deevi 
251e0d3bafdSSri Deevi 	/* Counters to control buffer fill */
252e0d3bafdSSri Deevi 	int pos;
253e0d3bafdSSri Deevi 	u8 is_partial_line;
254e0d3bafdSSri Deevi 	u8 partial_buf[8];
255e0d3bafdSSri Deevi 	u8 last_sav;
256e0d3bafdSSri Deevi 	int current_field;
257e0d3bafdSSri Deevi 	u32 bytes_left_in_line;
258e0d3bafdSSri Deevi 	u32 lines_completed;
259e0d3bafdSSri Deevi 	u8 field1_done;
260e0d3bafdSSri Deevi 	u32 lines_per_field;
26164fbf444SPalash Bandyopadhyay 
26264fbf444SPalash Bandyopadhyay 	/*Mpeg2 control buffer*/
26364fbf444SPalash Bandyopadhyay 	u8 *p_left_data;
26464fbf444SPalash Bandyopadhyay 	u32 left_data_count;
26564fbf444SPalash Bandyopadhyay 	u8 mpeg_buffer_done;
26664fbf444SPalash Bandyopadhyay 	u32 mpeg_buffer_completed;
26764fbf444SPalash Bandyopadhyay 	enum ps_package_head add_ps_package_head;
26864fbf444SPalash Bandyopadhyay 	char ps_head[10];
269e0d3bafdSSri Deevi };
270e0d3bafdSSri Deevi 
271e0d3bafdSSri Deevi /* inputs */
272e0d3bafdSSri Deevi 
273e0d3bafdSSri Deevi #define MAX_CX231XX_INPUT               4
274e0d3bafdSSri Deevi 
275e0d3bafdSSri Deevi enum cx231xx_itype {
276e0d3bafdSSri Deevi 	CX231XX_VMUX_COMPOSITE1 = 1,
277e0d3bafdSSri Deevi 	CX231XX_VMUX_SVIDEO,
278e0d3bafdSSri Deevi 	CX231XX_VMUX_TELEVISION,
279e0d3bafdSSri Deevi 	CX231XX_VMUX_CABLE,
280e0d3bafdSSri Deevi 	CX231XX_RADIO,
281e0d3bafdSSri Deevi 	CX231XX_VMUX_DVB,
282e0d3bafdSSri Deevi 	CX231XX_VMUX_DEBUG
283e0d3bafdSSri Deevi };
284e0d3bafdSSri Deevi 
285e0d3bafdSSri Deevi enum cx231xx_v_input {
286e0d3bafdSSri Deevi 	CX231XX_VIN_1_1 = 0x1,
287e0d3bafdSSri Deevi 	CX231XX_VIN_2_1,
288e0d3bafdSSri Deevi 	CX231XX_VIN_3_1,
289e0d3bafdSSri Deevi 	CX231XX_VIN_4_1,
290e0d3bafdSSri Deevi 	CX231XX_VIN_1_2 = 0x01,
291e0d3bafdSSri Deevi 	CX231XX_VIN_2_2,
292e0d3bafdSSri Deevi 	CX231XX_VIN_3_2,
293e0d3bafdSSri Deevi 	CX231XX_VIN_1_3 = 0x1,
294e0d3bafdSSri Deevi 	CX231XX_VIN_2_3,
295e0d3bafdSSri Deevi 	CX231XX_VIN_3_3,
296e0d3bafdSSri Deevi };
297e0d3bafdSSri Deevi 
298e0d3bafdSSri Deevi /* cx231xx has two audio inputs: tuner and line in */
299e0d3bafdSSri Deevi enum cx231xx_amux {
300e0d3bafdSSri Deevi 	/* This is the only entry for cx231xx tuner input */
301e0d3bafdSSri Deevi 	CX231XX_AMUX_VIDEO,	/* cx231xx tuner */
302e0d3bafdSSri Deevi 	CX231XX_AMUX_LINE_IN,	/* Line In */
303e0d3bafdSSri Deevi };
304e0d3bafdSSri Deevi 
305e0d3bafdSSri Deevi struct cx231xx_reg_seq {
306e0d3bafdSSri Deevi 	unsigned char bit;
307e0d3bafdSSri Deevi 	unsigned char val;
308e0d3bafdSSri Deevi 	int sleep;
309e0d3bafdSSri Deevi };
310e0d3bafdSSri Deevi 
311e0d3bafdSSri Deevi struct cx231xx_input {
312e0d3bafdSSri Deevi 	enum cx231xx_itype type;
313e0d3bafdSSri Deevi 	unsigned int vmux;
314e0d3bafdSSri Deevi 	enum cx231xx_amux amux;
315e0d3bafdSSri Deevi 	struct cx231xx_reg_seq *gpio;
316e0d3bafdSSri Deevi };
317e0d3bafdSSri Deevi 
318e0d3bafdSSri Deevi #define INPUT(nr) (&cx231xx_boards[dev->model].input[nr])
319e0d3bafdSSri Deevi 
320e0d3bafdSSri Deevi enum cx231xx_decoder {
321e0d3bafdSSri Deevi 	CX231XX_NODECODER,
322e0d3bafdSSri Deevi 	CX231XX_AVDECODER
323e0d3bafdSSri Deevi };
324e0d3bafdSSri Deevi 
325b9255176SSri Deevi enum CX231XX_I2C_MASTER_PORT {
3269abe3b89SMatthias Schwarzott 	I2C_0 = 0,       /* master 0 - internal connection */
3279abe3b89SMatthias Schwarzott 	I2C_1 = 1,       /* master 1 - used with mux */
3289abe3b89SMatthias Schwarzott 	I2C_2 = 2,       /* master 2 */
3299abe3b89SMatthias Schwarzott 	I2C_1_MUX_1 = 3, /* master 1 - port 1 (I2C_DEMOD_EN = 0) */
3309abe3b89SMatthias Schwarzott 	I2C_1_MUX_3 = 4  /* master 1 - port 3 (I2C_DEMOD_EN = 1) */
331b9255176SSri Deevi };
332e0d3bafdSSri Deevi 
333e0d3bafdSSri Deevi struct cx231xx_board {
334e0d3bafdSSri Deevi 	char *name;
335e0d3bafdSSri Deevi 	int vchannels;
336e0d3bafdSSri Deevi 	int tuner_type;
337e0d3bafdSSri Deevi 	int tuner_addr;
338e0d3bafdSSri Deevi 	v4l2_std_id norm;	/* tv norm */
339e0d3bafdSSri Deevi 
340e0d3bafdSSri Deevi 	/* demod related */
341e0d3bafdSSri Deevi 	int demod_addr;
342e0d3bafdSSri Deevi 	u8 demod_xfer_mode;	/* 0 - Serial; 1 - parallel */
343e0d3bafdSSri Deevi 
344e0d3bafdSSri Deevi 	/* GPIO Pins */
345e0d3bafdSSri Deevi 	struct cx231xx_reg_seq *dvb_gpio;
346e0d3bafdSSri Deevi 	struct cx231xx_reg_seq *suspend_gpio;
347e0d3bafdSSri Deevi 	struct cx231xx_reg_seq *tuner_gpio;
34878bb6df6SMauro Carvalho Chehab 		/* Negative means don't use it */
34978bb6df6SMauro Carvalho Chehab 	s8 tuner_sif_gpio;
35078bb6df6SMauro Carvalho Chehab 	s8 tuner_scl_gpio;
35178bb6df6SMauro Carvalho Chehab 	s8 tuner_sda_gpio;
352e0d3bafdSSri Deevi 
353e0d3bafdSSri Deevi 	/* PIN ctrl */
354e0d3bafdSSri Deevi 	u32 ctl_pin_status_mask;
355e0d3bafdSSri Deevi 	u8 agc_analog_digital_select_gpio;
356e0d3bafdSSri Deevi 	u32 gpio_pin_status_mask;
357e0d3bafdSSri Deevi 
358e0d3bafdSSri Deevi 	/* i2c masters */
359e0d3bafdSSri Deevi 	u8 tuner_i2c_master;
360e0d3bafdSSri Deevi 	u8 demod_i2c_master;
3619ab66912SMauro Carvalho Chehab 	u8 ir_i2c_master;
3629ab66912SMauro Carvalho Chehab 
3639ab66912SMauro Carvalho Chehab 	/* for devices with I2C chips for IR */
36429e3ec19SMauro Carvalho Chehab 	char *rc_map_name;
365e0d3bafdSSri Deevi 
366e0d3bafdSSri Deevi 	unsigned int max_range_640_480:1;
367e0d3bafdSSri Deevi 	unsigned int has_dvb:1;
3682f861387SMauro Carvalho Chehab 	unsigned int has_417:1;
369e0d3bafdSSri Deevi 	unsigned int valid:1;
3702f861387SMauro Carvalho Chehab 	unsigned int no_alt_vanc:1;
3712f861387SMauro Carvalho Chehab 	unsigned int external_av:1;
372e0d3bafdSSri Deevi 
373e0d3bafdSSri Deevi 	unsigned char xclk, i2c_speed;
374e0d3bafdSSri Deevi 
375e0d3bafdSSri Deevi 	enum cx231xx_decoder decoder;
37688806218SDevin Heitmueller 	int output_mode;
377e0d3bafdSSri Deevi 
378e0d3bafdSSri Deevi 	struct cx231xx_input input[MAX_CX231XX_INPUT];
379e0d3bafdSSri Deevi 	struct cx231xx_input radio;
380b088ba65SMauro Carvalho Chehab 	struct rc_map *ir_codes;
381e0d3bafdSSri Deevi };
382e0d3bafdSSri Deevi 
383e0d3bafdSSri Deevi /* device states */
384e0d3bafdSSri Deevi enum cx231xx_dev_state {
385e0d3bafdSSri Deevi 	DEV_INITIALIZED = 0x01,
386e0d3bafdSSri Deevi 	DEV_DISCONNECTED = 0x02,
387e0d3bafdSSri Deevi };
388e0d3bafdSSri Deevi 
38984b5dbf3SMauro Carvalho Chehab enum AFE_MODE {
390e0d3bafdSSri Deevi 	AFE_MODE_LOW_IF,
391e0d3bafdSSri Deevi 	AFE_MODE_BASEBAND,
392e0d3bafdSSri Deevi 	AFE_MODE_EU_HI_IF,
393e0d3bafdSSri Deevi 	AFE_MODE_US_HI_IF,
394e0d3bafdSSri Deevi 	AFE_MODE_JAPAN_HI_IF
395e0d3bafdSSri Deevi };
396e0d3bafdSSri Deevi 
39784b5dbf3SMauro Carvalho Chehab enum AUDIO_INPUT {
398e0d3bafdSSri Deevi 	AUDIO_INPUT_MUTE,
399e0d3bafdSSri Deevi 	AUDIO_INPUT_LINE,
400e0d3bafdSSri Deevi 	AUDIO_INPUT_TUNER_TV,
401e0d3bafdSSri Deevi 	AUDIO_INPUT_SPDIF,
402e0d3bafdSSri Deevi 	AUDIO_INPUT_TUNER_FM
403e0d3bafdSSri Deevi };
404e0d3bafdSSri Deevi 
405e0d3bafdSSri Deevi #define CX231XX_AUDIO_BUFS              5
40664fbf444SPalash Bandyopadhyay #define CX231XX_NUM_AUDIO_PACKETS       16
40764fbf444SPalash Bandyopadhyay #define CX231XX_ISO_NUM_AUDIO_PACKETS	64
408e0d3bafdSSri Deevi 
409e0d3bafdSSri Deevi /* cx231xx extensions */
410e0d3bafdSSri Deevi #define CX231XX_AUDIO                   0x10
411e0d3bafdSSri Deevi #define CX231XX_DVB                     0x20
412e0d3bafdSSri Deevi 
413e0d3bafdSSri Deevi struct cx231xx_audio {
414e0d3bafdSSri Deevi 	char name[50];
415e0d3bafdSSri Deevi 	char *transfer_buffer[CX231XX_AUDIO_BUFS];
416e0d3bafdSSri Deevi 	struct urb *urb[CX231XX_AUDIO_BUFS];
417e0d3bafdSSri Deevi 	struct usb_device *udev;
418e0d3bafdSSri Deevi 	unsigned int capture_transfer_done;
419e0d3bafdSSri Deevi 	struct snd_pcm_substream *capture_pcm_substream;
420e0d3bafdSSri Deevi 
421e0d3bafdSSri Deevi 	unsigned int hwptr_done_capture;
422e0d3bafdSSri Deevi 	struct snd_card *sndcard;
423e0d3bafdSSri Deevi 
424e0d3bafdSSri Deevi 	int users, shutdown;
42564fbf444SPalash Bandyopadhyay 	/* locks */
426e0d3bafdSSri Deevi 	spinlock_t slock;
427e0d3bafdSSri Deevi 
428e0d3bafdSSri Deevi 	int alt;		/* alternate */
429e0d3bafdSSri Deevi 	int max_pkt_size;	/* max packet size of isoc transaction */
430e0d3bafdSSri Deevi 	int num_alt;		/* Number of alternative settings */
431e0d3bafdSSri Deevi 	unsigned int *alt_max_pkt_size;	/* array of wMaxPacketSize */
432e0d3bafdSSri Deevi 	u16 end_point_addr;
433e0d3bafdSSri Deevi };
434e0d3bafdSSri Deevi 
435e0d3bafdSSri Deevi struct cx231xx;
436e0d3bafdSSri Deevi 
437e0d3bafdSSri Deevi struct cx231xx_fh {
4381d08a4faSHans Verkuil 	struct v4l2_fh fh;
439e0d3bafdSSri Deevi 	struct cx231xx *dev;
440e0d3bafdSSri Deevi 	unsigned int stream_on:1;	/* Locks streams */
441e0d3bafdSSri Deevi 	enum v4l2_buf_type type;
44264fbf444SPalash Bandyopadhyay 
44371590765SHans Verkuil 	struct videobuf_queue vb_vidq;
44464fbf444SPalash Bandyopadhyay 
44564fbf444SPalash Bandyopadhyay 	/* vbi capture */
44664fbf444SPalash Bandyopadhyay 	struct videobuf_queue      vidq;
44764fbf444SPalash Bandyopadhyay 	struct videobuf_queue      vbiq;
44864fbf444SPalash Bandyopadhyay 
44964fbf444SPalash Bandyopadhyay 	/* MPEG Encoder specifics ONLY */
45064fbf444SPalash Bandyopadhyay 
45164fbf444SPalash Bandyopadhyay 	atomic_t                   v4l_reading;
452e0d3bafdSSri Deevi };
453e0d3bafdSSri Deevi 
454b9255176SSri Deevi /*****************************************************************/
455e0d3bafdSSri Deevi /* set/get i2c */
456b9255176SSri Deevi /* 00--1Mb/s, 01-400kb/s, 10--100kb/s, 11--5Mb/s */
457b9255176SSri Deevi #define I2C_SPEED_1M            0x0
458b9255176SSri Deevi #define I2C_SPEED_400K          0x1
459b9255176SSri Deevi #define I2C_SPEED_100K          0x2
460b9255176SSri Deevi #define I2C_SPEED_5M            0x3
461e0d3bafdSSri Deevi 
462b9255176SSri Deevi /* 0-- STOP transaction */
463b9255176SSri Deevi #define I2C_STOP                0x0
464b9255176SSri Deevi /* 1-- do not transmit STOP at end of transaction */
465b9255176SSri Deevi #define I2C_NOSTOP              0x1
466b251e618SJustin P. Mattock /* 1--allow slave to insert clock wait states */
467b9255176SSri Deevi #define I2C_SYNC                0x1
468e0d3bafdSSri Deevi 
469e0d3bafdSSri Deevi struct cx231xx_i2c {
470e0d3bafdSSri Deevi 	struct cx231xx *dev;
471e0d3bafdSSri Deevi 
472e0d3bafdSSri Deevi 	int nr;
473e0d3bafdSSri Deevi 
474e0d3bafdSSri Deevi 	/* i2c i/o */
475e0d3bafdSSri Deevi 	struct i2c_adapter i2c_adap;
476e0d3bafdSSri Deevi 	u32 i2c_rc;
477e0d3bafdSSri Deevi 
478e0d3bafdSSri Deevi 	/* different settings for each bus */
479e0d3bafdSSri Deevi 	u8 i2c_period;
480e0d3bafdSSri Deevi 	u8 i2c_nostop;
481e0d3bafdSSri Deevi 	u8 i2c_reserve;
482e0d3bafdSSri Deevi };
483e0d3bafdSSri Deevi 
484e0d3bafdSSri Deevi struct cx231xx_i2c_xfer_data {
485e0d3bafdSSri Deevi 	u8 dev_addr;
486e0d3bafdSSri Deevi 	u8 direction;		/* 1 - IN, 0 - OUT */
487e0d3bafdSSri Deevi 	u8 saddr_len;		/* sub address len */
488e0d3bafdSSri Deevi 	u16 saddr_dat;		/* sub addr data */
489e0d3bafdSSri Deevi 	u8 buf_size;		/* buffer size */
490e0d3bafdSSri Deevi 	u8 *p_buffer;		/* pointer to the buffer */
491e0d3bafdSSri Deevi };
492e0d3bafdSSri Deevi 
493b9255176SSri Deevi struct VENDOR_REQUEST_IN {
494e0d3bafdSSri Deevi 	u8 bRequest;
495e0d3bafdSSri Deevi 	u16 wValue;
496e0d3bafdSSri Deevi 	u16 wIndex;
497e0d3bafdSSri Deevi 	u16 wLength;
498e0d3bafdSSri Deevi 	u8 direction;
499e0d3bafdSSri Deevi 	u8 bData;
500e0d3bafdSSri Deevi 	u8 *pBuff;
501b9255176SSri Deevi };
502e0d3bafdSSri Deevi 
50364fbf444SPalash Bandyopadhyay struct cx231xx_tvnorm {
50464fbf444SPalash Bandyopadhyay 	char		*name;
50564fbf444SPalash Bandyopadhyay 	v4l2_std_id	id;
50664fbf444SPalash Bandyopadhyay 	u32		cxiformat;
50764fbf444SPalash Bandyopadhyay 	u32		cxoformat;
50864fbf444SPalash Bandyopadhyay };
50964fbf444SPalash Bandyopadhyay 
510b9255176SSri Deevi enum TRANSFER_TYPE {
511e0d3bafdSSri Deevi 	Raw_Video = 0,
512e0d3bafdSSri Deevi 	Audio,
513e0d3bafdSSri Deevi 	Vbi,			/* VANC */
514e0d3bafdSSri Deevi 	Sliced_cc,		/* HANC */
515e0d3bafdSSri Deevi 	TS1_serial_mode,
516e0d3bafdSSri Deevi 	TS2,
517e0d3bafdSSri Deevi 	TS1_parallel_mode
518b9255176SSri Deevi } ;
519e0d3bafdSSri Deevi 
520e0d3bafdSSri Deevi struct cx231xx_video_mode {
521e0d3bafdSSri Deevi 	/* Isoc control struct */
522e0d3bafdSSri Deevi 	struct cx231xx_dmaqueue vidq;
52364fbf444SPalash Bandyopadhyay 	struct cx231xx_isoc_ctl isoc_ctl;
52464fbf444SPalash Bandyopadhyay 	struct cx231xx_bulk_ctl bulk_ctl;
52564fbf444SPalash Bandyopadhyay 	/* locks */
526e0d3bafdSSri Deevi 	spinlock_t slock;
527e0d3bafdSSri Deevi 
528e0d3bafdSSri Deevi 	/* usb transfer */
529e0d3bafdSSri Deevi 	int alt;		/* alternate */
530e0d3bafdSSri Deevi 	int max_pkt_size;	/* max packet size of isoc transaction */
531e0d3bafdSSri Deevi 	int num_alt;		/* Number of alternative settings */
532e0d3bafdSSri Deevi 	unsigned int *alt_max_pkt_size;	/* array of wMaxPacketSize */
533e0d3bafdSSri Deevi 	u16 end_point_addr;
534e0d3bafdSSri Deevi };
53564fbf444SPalash Bandyopadhyay /*
53664fbf444SPalash Bandyopadhyay struct cx23885_dmaqueue {
53764fbf444SPalash Bandyopadhyay 	struct list_head       active;
53864fbf444SPalash Bandyopadhyay 	struct list_head       queued;
53964fbf444SPalash Bandyopadhyay 	struct timer_list      timeout;
54064fbf444SPalash Bandyopadhyay 	struct btcx_riscmem    stopper;
54164fbf444SPalash Bandyopadhyay 	u32                    count;
54264fbf444SPalash Bandyopadhyay };
54364fbf444SPalash Bandyopadhyay */
54464fbf444SPalash Bandyopadhyay struct cx231xx_tsport {
54564fbf444SPalash Bandyopadhyay 	struct cx231xx *dev;
54664fbf444SPalash Bandyopadhyay 
54764fbf444SPalash Bandyopadhyay 	int                        nr;
54864fbf444SPalash Bandyopadhyay 	int                        sram_chno;
54964fbf444SPalash Bandyopadhyay 
55064fbf444SPalash Bandyopadhyay 	struct videobuf_dvb_frontends frontends;
55164fbf444SPalash Bandyopadhyay 
55264fbf444SPalash Bandyopadhyay 	/* dma queues */
55364fbf444SPalash Bandyopadhyay 
55464fbf444SPalash Bandyopadhyay 	u32                        ts_packet_size;
55564fbf444SPalash Bandyopadhyay 	u32                        ts_packet_count;
55664fbf444SPalash Bandyopadhyay 
55764fbf444SPalash Bandyopadhyay 	int                        width;
55864fbf444SPalash Bandyopadhyay 	int                        height;
55964fbf444SPalash Bandyopadhyay 
56064fbf444SPalash Bandyopadhyay 	/* locks */
56164fbf444SPalash Bandyopadhyay 	spinlock_t                 slock;
56264fbf444SPalash Bandyopadhyay 
56364fbf444SPalash Bandyopadhyay 	/* registers */
56464fbf444SPalash Bandyopadhyay 	u32                        reg_gpcnt;
56564fbf444SPalash Bandyopadhyay 	u32                        reg_gpcnt_ctl;
56664fbf444SPalash Bandyopadhyay 	u32                        reg_dma_ctl;
56764fbf444SPalash Bandyopadhyay 	u32                        reg_lngth;
56864fbf444SPalash Bandyopadhyay 	u32                        reg_hw_sop_ctrl;
56964fbf444SPalash Bandyopadhyay 	u32                        reg_gen_ctrl;
57064fbf444SPalash Bandyopadhyay 	u32                        reg_bd_pkt_status;
57164fbf444SPalash Bandyopadhyay 	u32                        reg_sop_status;
57264fbf444SPalash Bandyopadhyay 	u32                        reg_fifo_ovfl_stat;
57364fbf444SPalash Bandyopadhyay 	u32                        reg_vld_misc;
57464fbf444SPalash Bandyopadhyay 	u32                        reg_ts_clk_en;
57564fbf444SPalash Bandyopadhyay 	u32                        reg_ts_int_msk;
57664fbf444SPalash Bandyopadhyay 	u32                        reg_ts_int_stat;
57764fbf444SPalash Bandyopadhyay 	u32                        reg_src_sel;
57864fbf444SPalash Bandyopadhyay 
57964fbf444SPalash Bandyopadhyay 	/* Default register vals */
58064fbf444SPalash Bandyopadhyay 	int                        pci_irqmask;
58164fbf444SPalash Bandyopadhyay 	u32                        dma_ctl_val;
58264fbf444SPalash Bandyopadhyay 	u32                        ts_int_msk_val;
58364fbf444SPalash Bandyopadhyay 	u32                        gen_ctrl_val;
58464fbf444SPalash Bandyopadhyay 	u32                        ts_clk_en_val;
58564fbf444SPalash Bandyopadhyay 	u32                        src_sel_val;
58664fbf444SPalash Bandyopadhyay 	u32                        vld_misc_val;
58764fbf444SPalash Bandyopadhyay 	u32                        hw_sop_ctrl_val;
58864fbf444SPalash Bandyopadhyay 
58964fbf444SPalash Bandyopadhyay 	/* Allow a single tsport to have multiple frontends */
59064fbf444SPalash Bandyopadhyay 	u32                        num_frontends;
59164fbf444SPalash Bandyopadhyay 	void                       *port_priv;
59264fbf444SPalash Bandyopadhyay };
593e0d3bafdSSri Deevi 
594e0d3bafdSSri Deevi /* main device struct */
595e0d3bafdSSri Deevi struct cx231xx {
596e0d3bafdSSri Deevi 	/* generic device properties */
597e0d3bafdSSri Deevi 	char name[30];		/* name (including minor) of the device */
598e0d3bafdSSri Deevi 	int model;		/* index in the device_data struct */
599e0d3bafdSSri Deevi 	int devno;		/* marks the number of this device */
600e0d3bafdSSri Deevi 
601e0d3bafdSSri Deevi 	struct cx231xx_board board;
602e0d3bafdSSri Deevi 
6039ab66912SMauro Carvalho Chehab 	/* For I2C IR support */
604141bb0dcSMauro Carvalho Chehab 	struct IR_i2c_init_data    init_data;
6057528cd27SMauro Carvalho Chehab 	struct i2c_client          *ir_i2c_client;
6069ab66912SMauro Carvalho Chehab 
607e0d3bafdSSri Deevi 	unsigned int stream_on:1;	/* Locks streams */
608e0d3bafdSSri Deevi 	unsigned int vbi_stream_on:1;	/* Locks streams for VBI */
609e0d3bafdSSri Deevi 	unsigned int has_audio_class:1;
610e0d3bafdSSri Deevi 	unsigned int has_alsa_audio:1;
611e0d3bafdSSri Deevi 
61277e97ba2SMauro Carvalho Chehab 	unsigned int i2c_scan_running:1; /* true only during i2c_scan */
61377e97ba2SMauro Carvalho Chehab 
614e0d3bafdSSri Deevi 	struct cx231xx_fmt *format;
615e0d3bafdSSri Deevi 
616b1196126SSri Deevi 	struct v4l2_device v4l2_dev;
617b1196126SSri Deevi 	struct v4l2_subdev *sd_cx25840;
618b1196126SSri Deevi 	struct v4l2_subdev *sd_tuner;
619d2370f8eSHans Verkuil 	struct v4l2_ctrl_handler ctrl_handler;
620d2370f8eSHans Verkuil 	struct v4l2_ctrl_handler radio_ctrl_handler;
62188b6ffedSHans Verkuil 	struct cx2341x_handler mpeg_ctrl_handler;
622b1196126SSri Deevi 
62361b04cb2SMauro Carvalho Chehab 	struct work_struct wq_trigger;		/* Trigger to start/stop audio for alsa module */
62461b04cb2SMauro Carvalho Chehab 	atomic_t	   stream_started;	/* stream should be running if true */
62561b04cb2SMauro Carvalho Chehab 
626e0d3bafdSSri Deevi 	struct list_head devlist;
627e0d3bafdSSri Deevi 
628e0d3bafdSSri Deevi 	int tuner_type;		/* type of the tuner */
629e0d3bafdSSri Deevi 	int tuner_addr;		/* tuner address */
630e0d3bafdSSri Deevi 
631e0d3bafdSSri Deevi 	/* I2C adapters: Master 1 & 2 (External) & Master 3 (Internal only) */
632e0d3bafdSSri Deevi 	struct cx231xx_i2c i2c_bus[3];
63315c212ddSMatthias Schwarzott 	struct i2c_adapter *i2c_mux_adap[2];
63415c212ddSMatthias Schwarzott 
635e0d3bafdSSri Deevi 	unsigned int xc_fw_load_done:1;
636a1f26765SMatthias Schwarzott 	unsigned int port_3_switch_enabled:1;
63764fbf444SPalash Bandyopadhyay 	/* locks */
638e0d3bafdSSri Deevi 	struct mutex gpio_i2c_lock;
63964fbf444SPalash Bandyopadhyay 	struct mutex i2c_lock;
640e0d3bafdSSri Deevi 
641e0d3bafdSSri Deevi 	/* video for linux */
642e0d3bafdSSri Deevi 	int users;		/* user count for exclusive use */
643e0d3bafdSSri Deevi 	struct video_device *vdev;	/* video for linux device struct */
644e0d3bafdSSri Deevi 	v4l2_std_id norm;	/* selected tv norm */
645e0d3bafdSSri Deevi 	int ctl_freq;		/* selected frequency */
646e0d3bafdSSri Deevi 	unsigned int ctl_ainput;	/* selected audio input */
647e0d3bafdSSri Deevi 
648e0d3bafdSSri Deevi 	/* frame properties */
649e0d3bafdSSri Deevi 	int width;		/* current frame width */
650e0d3bafdSSri Deevi 	int height;		/* current frame height */
651e0d3bafdSSri Deevi 	int interlaced;		/* 1=interlace fileds, 0=just top fileds */
652e0d3bafdSSri Deevi 
653e0d3bafdSSri Deevi 	struct cx231xx_audio adev;
654e0d3bafdSSri Deevi 
655e0d3bafdSSri Deevi 	/* states */
656e0d3bafdSSri Deevi 	enum cx231xx_dev_state state;
657e0d3bafdSSri Deevi 
658e0d3bafdSSri Deevi 	struct work_struct request_module_wk;
659e0d3bafdSSri Deevi 
660e0d3bafdSSri Deevi 	/* locks */
661e0d3bafdSSri Deevi 	struct mutex lock;
662e0d3bafdSSri Deevi 	struct mutex ctrl_urb_lock;	/* protects urb_buf */
663e0d3bafdSSri Deevi 	struct list_head inqueue, outqueue;
664e0d3bafdSSri Deevi 	wait_queue_head_t open, wait_frame, wait_stream;
665e0d3bafdSSri Deevi 	struct video_device *vbi_dev;
666e0d3bafdSSri Deevi 	struct video_device *radio_dev;
667e0d3bafdSSri Deevi 
668e0d3bafdSSri Deevi 	unsigned char eedata[256];
669e0d3bafdSSri Deevi 
670e0d3bafdSSri Deevi 	struct cx231xx_video_mode video_mode;
671e0d3bafdSSri Deevi 	struct cx231xx_video_mode vbi_mode;
672e0d3bafdSSri Deevi 	struct cx231xx_video_mode sliced_cc_mode;
673e0d3bafdSSri Deevi 	struct cx231xx_video_mode ts1_mode;
674e0d3bafdSSri Deevi 
67564fbf444SPalash Bandyopadhyay 	atomic_t devlist_count;
67664fbf444SPalash Bandyopadhyay 
677e0d3bafdSSri Deevi 	struct usb_device *udev;	/* the usb device */
678e0d3bafdSSri Deevi 	char urb_buf[URB_MAX_CTRL_SIZE];	/* urb control msg buffer */
679e0d3bafdSSri Deevi 
680e0d3bafdSSri Deevi 	/* helper funcs that call usb_control_msg */
681e0d3bafdSSri Deevi 	int (*cx231xx_read_ctrl_reg) (struct cx231xx *dev, u8 req, u16 reg,
682e0d3bafdSSri Deevi 				      char *buf, int len);
683e0d3bafdSSri Deevi 	int (*cx231xx_write_ctrl_reg) (struct cx231xx *dev, u8 req, u16 reg,
684e0d3bafdSSri Deevi 				       char *buf, int len);
685e0d3bafdSSri Deevi 	int (*cx231xx_send_usb_command) (struct cx231xx_i2c *i2c_bus,
686cde4362fSMauro Carvalho Chehab 				struct cx231xx_i2c_xfer_data *req_data);
68784b5dbf3SMauro Carvalho Chehab 	int (*cx231xx_gpio_i2c_read) (struct cx231xx *dev, u8 dev_addr,
68884b5dbf3SMauro Carvalho Chehab 				      u8 *buf, u8 len);
68984b5dbf3SMauro Carvalho Chehab 	int (*cx231xx_gpio_i2c_write) (struct cx231xx *dev, u8 dev_addr,
69084b5dbf3SMauro Carvalho Chehab 				       u8 *buf, u8 len);
691e0d3bafdSSri Deevi 
692e0d3bafdSSri Deevi 	int (*cx231xx_set_analog_freq) (struct cx231xx *dev, u32 freq);
693e0d3bafdSSri Deevi 	int (*cx231xx_reset_analog_tuner) (struct cx231xx *dev);
694e0d3bafdSSri Deevi 
695e0d3bafdSSri Deevi 	enum cx231xx_mode mode;
696e0d3bafdSSri Deevi 
697e0d3bafdSSri Deevi 	struct cx231xx_dvb *dvb;
698e0d3bafdSSri Deevi 
699e0d3bafdSSri Deevi 	/* Cx231xx supported PCB config's */
700e0d3bafdSSri Deevi 	struct pcb_config current_pcb_config;
701e0d3bafdSSri Deevi 	u8 current_scenario_idx;
702e0d3bafdSSri Deevi 	u8 interface_count;
703e0d3bafdSSri Deevi 	u8 max_iad_interface_count;
704e0d3bafdSSri Deevi 
705e0d3bafdSSri Deevi 	/* GPIO related register direction and values */
706e0d3bafdSSri Deevi 	u32 gpio_dir;
707e0d3bafdSSri Deevi 	u32 gpio_val;
708e0d3bafdSSri Deevi 
709e0d3bafdSSri Deevi 	/* Power Modes */
710e0d3bafdSSri Deevi 	int power_mode;
711e0d3bafdSSri Deevi 
712ecc67d10SSri Deevi 	/* afe parameters */
713ecc67d10SSri Deevi 	enum AFE_MODE afe_mode;
714ecc67d10SSri Deevi 	u32 afe_ref_count;
715e0d3bafdSSri Deevi 
716e0d3bafdSSri Deevi 	/* video related parameters */
717e0d3bafdSSri Deevi 	u32 video_input;
718e0d3bafdSSri Deevi 	u32 active_mode;
719e0d3bafdSSri Deevi 	u8 vbi_or_sliced_cc_mode;	/* 0 - vbi ; 1 - sliced cc mode */
720e0d3bafdSSri Deevi 	enum cx231xx_std_mode std_mode;	/* 0 - Air; 1 - cable */
721e0d3bafdSSri Deevi 
72264fbf444SPalash Bandyopadhyay 	/*mode: digital=1 or analog=0*/
72364fbf444SPalash Bandyopadhyay 	u8 mode_tv;
72464fbf444SPalash Bandyopadhyay 
72564fbf444SPalash Bandyopadhyay 	u8 USE_ISO;
72664fbf444SPalash Bandyopadhyay 	struct cx231xx_tvnorm      encodernorm;
72764fbf444SPalash Bandyopadhyay 	struct cx231xx_tsport      ts1, ts2;
72864fbf444SPalash Bandyopadhyay 	struct video_device        *v4l_device;
72964fbf444SPalash Bandyopadhyay 	atomic_t                   v4l_reader_count;
73064fbf444SPalash Bandyopadhyay 	u32                        freq;
73164fbf444SPalash Bandyopadhyay 	unsigned int               input;
73264fbf444SPalash Bandyopadhyay 	u32                        cx23417_mailbox;
73364fbf444SPalash Bandyopadhyay 	u32                        __iomem *lmmio;
73464fbf444SPalash Bandyopadhyay 	u8                         __iomem *bmmio;
735e0d3bafdSSri Deevi };
736e0d3bafdSSri Deevi 
73764fbf444SPalash Bandyopadhyay extern struct list_head cx231xx_devlist;
73864fbf444SPalash Bandyopadhyay 
739b1196126SSri Deevi #define cx25840_call(cx231xx, o, f, args...) \
740b1196126SSri Deevi 	v4l2_subdev_call(cx231xx->sd_cx25840, o, f, ##args)
741b1196126SSri Deevi #define tuner_call(cx231xx, o, f, args...) \
742b1196126SSri Deevi 	v4l2_subdev_call(cx231xx->sd_tuner, o, f, ##args)
743b1196126SSri Deevi #define call_all(dev, o, f, args...) \
744b1196126SSri Deevi 	v4l2_device_call_until_err(&dev->v4l2_dev, 0, o, f, ##args)
745b1196126SSri Deevi 
746e0d3bafdSSri Deevi struct cx231xx_ops {
747e0d3bafdSSri Deevi 	struct list_head next;
748e0d3bafdSSri Deevi 	char *name;
749e0d3bafdSSri Deevi 	int id;
750e0d3bafdSSri Deevi 	int (*init) (struct cx231xx *);
751e0d3bafdSSri Deevi 	int (*fini) (struct cx231xx *);
752e0d3bafdSSri Deevi };
753e0d3bafdSSri Deevi 
754e0d3bafdSSri Deevi /* call back functions in dvb module */
755e0d3bafdSSri Deevi int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq);
756e0d3bafdSSri Deevi int cx231xx_reset_analog_tuner(struct cx231xx *dev);
757e0d3bafdSSri Deevi 
758e0d3bafdSSri Deevi /* Provided by cx231xx-i2c.c */
7597c894a3bSMatthias Schwarzott void cx231xx_do_i2c_scan(struct cx231xx *dev, int i2c_port);
760e0d3bafdSSri Deevi int cx231xx_i2c_register(struct cx231xx_i2c *bus);
761e0d3bafdSSri Deevi int cx231xx_i2c_unregister(struct cx231xx_i2c *bus);
76215c212ddSMatthias Schwarzott int cx231xx_i2c_mux_register(struct cx231xx *dev, int mux_no);
76315c212ddSMatthias Schwarzott void cx231xx_i2c_mux_unregister(struct cx231xx *dev, int mux_no);
764c3c3f1aeSMatthias Schwarzott struct i2c_adapter *cx231xx_get_i2c_adap(struct cx231xx *dev, int i2c_port);
765e0d3bafdSSri Deevi 
766e0d3bafdSSri Deevi /* Internal block control functions */
76764fbf444SPalash Bandyopadhyay int cx231xx_read_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
76864fbf444SPalash Bandyopadhyay 		 u8 saddr_len, u32 *data, u8 data_len, int master);
76964fbf444SPalash Bandyopadhyay int cx231xx_write_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
77064fbf444SPalash Bandyopadhyay 		 u8 saddr_len, u32 data, u8 data_len, int master);
771e0d3bafdSSri Deevi int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr,
772e0d3bafdSSri Deevi 			  u16 saddr, u8 saddr_len, u32 *data, u8 data_len);
773e0d3bafdSSri Deevi int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr,
774e0d3bafdSSri Deevi 			   u16 saddr, u8 saddr_len, u32 data, u8 data_len);
77584b5dbf3SMauro Carvalho Chehab int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size,
77684b5dbf3SMauro Carvalho Chehab 			   u16 register_address, u8 bit_start, u8 bit_end,
77784b5dbf3SMauro Carvalho Chehab 			   u32 value);
778e0d3bafdSSri Deevi int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
779e0d3bafdSSri Deevi 					u16 saddr, u32 mask, u32 value);
780e0d3bafdSSri Deevi u32 cx231xx_set_field(u32 field_mask, u32 data);
781e0d3bafdSSri Deevi 
78264fbf444SPalash Bandyopadhyay /*verve r/w*/
78364fbf444SPalash Bandyopadhyay void initGPIO(struct cx231xx *dev);
78464fbf444SPalash Bandyopadhyay void uninitGPIO(struct cx231xx *dev);
785ecc67d10SSri Deevi /* afe related functions */
786ecc67d10SSri Deevi int cx231xx_afe_init_super_block(struct cx231xx *dev, u32 ref_count);
787ecc67d10SSri Deevi int cx231xx_afe_init_channels(struct cx231xx *dev);
788ecc67d10SSri Deevi int cx231xx_afe_setup_AFE_for_baseband(struct cx231xx *dev);
789ecc67d10SSri Deevi int cx231xx_afe_set_input_mux(struct cx231xx *dev, u32 input_mux);
790ecc67d10SSri Deevi int cx231xx_afe_set_mode(struct cx231xx *dev, enum AFE_MODE mode);
791ecc67d10SSri Deevi int cx231xx_afe_update_power_control(struct cx231xx *dev,
7926e4f574bSSri Deevi 					enum AV_MODE avmode);
793ecc67d10SSri Deevi int cx231xx_afe_adjust_ref_count(struct cx231xx *dev, u32 video_input);
794e0d3bafdSSri Deevi 
795ecc67d10SSri Deevi /* i2s block related functions */
796ecc67d10SSri Deevi int cx231xx_i2s_blk_initialize(struct cx231xx *dev);
797ecc67d10SSri Deevi int cx231xx_i2s_blk_update_power_control(struct cx231xx *dev,
7986e4f574bSSri Deevi 					enum AV_MODE avmode);
799ecc67d10SSri Deevi int cx231xx_i2s_blk_set_audio_input(struct cx231xx *dev, u8 audio_input);
800e0d3bafdSSri Deevi 
801e0d3bafdSSri Deevi /* DIF related functions */
802e0d3bafdSSri Deevi int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode,
803e0d3bafdSSri Deevi 					  u32 function_mode, u32 standard);
80464fbf444SPalash Bandyopadhyay void cx231xx_set_Colibri_For_LowIF(struct cx231xx *dev, u32 if_freq,
80564fbf444SPalash Bandyopadhyay 					 u8 spectral_invert, u32 mode);
80664fbf444SPalash Bandyopadhyay u32 cx231xx_Get_Colibri_CarrierOffset(u32 mode, u32 standerd);
80764fbf444SPalash Bandyopadhyay void cx231xx_set_DIF_bandpass(struct cx231xx *dev, u32 if_freq,
80864fbf444SPalash Bandyopadhyay 					 u8 spectral_invert, u32 mode);
80964fbf444SPalash Bandyopadhyay void cx231xx_Setup_AFE_for_LowIF(struct cx231xx *dev);
81064fbf444SPalash Bandyopadhyay void reset_s5h1432_demod(struct cx231xx *dev);
81164fbf444SPalash Bandyopadhyay void cx231xx_dump_HH_reg(struct cx231xx *dev);
81264fbf444SPalash Bandyopadhyay void update_HH_register_after_set_DIF(struct cx231xx *dev);
81364fbf444SPalash Bandyopadhyay 
81464fbf444SPalash Bandyopadhyay 
81564fbf444SPalash Bandyopadhyay 
816e0d3bafdSSri Deevi int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard);
817e0d3bafdSSri Deevi int cx231xx_tuner_pre_channel_change(struct cx231xx *dev);
818e0d3bafdSSri Deevi int cx231xx_tuner_post_channel_change(struct cx231xx *dev);
819e0d3bafdSSri Deevi 
820e0d3bafdSSri Deevi /* video parser functions */
82184b5dbf3SMauro Carvalho Chehab u8 cx231xx_find_next_SAV_EAV(u8 *p_buffer, u32 buffer_size,
82284b5dbf3SMauro Carvalho Chehab 			     u32 *p_bytes_used);
82384b5dbf3SMauro Carvalho Chehab u8 cx231xx_find_boundary_SAV_EAV(u8 *p_buffer, u8 *partial_buf,
82484b5dbf3SMauro Carvalho Chehab 				 u32 *p_bytes_used);
825e0d3bafdSSri Deevi int cx231xx_do_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
826e0d3bafdSSri Deevi 		    u8 *p_buffer, u32 bytes_to_copy);
82784b5dbf3SMauro Carvalho Chehab void cx231xx_reset_video_buffer(struct cx231xx *dev,
82884b5dbf3SMauro Carvalho Chehab 				struct cx231xx_dmaqueue *dma_q);
829e0d3bafdSSri Deevi u8 cx231xx_is_buffer_done(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q);
830e0d3bafdSSri Deevi u32 cx231xx_copy_video_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
831e0d3bafdSSri Deevi 			    u8 *p_line, u32 length, int field_number);
832e0d3bafdSSri Deevi u32 cx231xx_get_video_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
833e0d3bafdSSri Deevi 			   u8 sav_eav, u8 *p_buffer, u32 buffer_size);
834e0d3bafdSSri Deevi void cx231xx_swab(u16 *from, u16 *to, u16 len);
835e0d3bafdSSri Deevi 
836e0d3bafdSSri Deevi /* Provided by cx231xx-core.c */
837e0d3bafdSSri Deevi 
838e0d3bafdSSri Deevi u32 cx231xx_request_buffers(struct cx231xx *dev, u32 count);
839e0d3bafdSSri Deevi void cx231xx_queue_unusedframes(struct cx231xx *dev);
840e0d3bafdSSri Deevi void cx231xx_release_buffers(struct cx231xx *dev);
841e0d3bafdSSri Deevi 
842e0d3bafdSSri Deevi /* read from control pipe */
843e0d3bafdSSri Deevi int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
844e0d3bafdSSri Deevi 			  char *buf, int len);
845e0d3bafdSSri Deevi 
846e0d3bafdSSri Deevi /* write to control pipe */
847e0d3bafdSSri Deevi int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
848e0d3bafdSSri Deevi 			   char *buf, int len);
849e0d3bafdSSri Deevi int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode);
850e0d3bafdSSri Deevi 
851b9255176SSri Deevi int cx231xx_send_vendor_cmd(struct cx231xx *dev,
852b9255176SSri Deevi 				struct VENDOR_REQUEST_IN *ven_req);
853e0d3bafdSSri Deevi int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus,
854e0d3bafdSSri Deevi 				struct cx231xx_i2c_xfer_data *req_data);
855e0d3bafdSSri Deevi 
856e0d3bafdSSri Deevi /* Gpio related functions */
857e0d3bafdSSri Deevi int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val,
858e0d3bafdSSri Deevi 			  u8 len, u8 request, u8 direction);
859e0d3bafdSSri Deevi int cx231xx_set_gpio_value(struct cx231xx *dev, int pin_number, int pin_value);
86084b5dbf3SMauro Carvalho Chehab int cx231xx_set_gpio_direction(struct cx231xx *dev, int pin_number,
86184b5dbf3SMauro Carvalho Chehab 			       int pin_value);
862e0d3bafdSSri Deevi 
863e0d3bafdSSri Deevi int cx231xx_gpio_i2c_start(struct cx231xx *dev);
864e0d3bafdSSri Deevi int cx231xx_gpio_i2c_end(struct cx231xx *dev);
865e0d3bafdSSri Deevi int cx231xx_gpio_i2c_write_byte(struct cx231xx *dev, u8 data);
866e0d3bafdSSri Deevi int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 *buf);
867e0d3bafdSSri Deevi int cx231xx_gpio_i2c_read_ack(struct cx231xx *dev);
868e0d3bafdSSri Deevi int cx231xx_gpio_i2c_write_ack(struct cx231xx *dev);
869e0d3bafdSSri Deevi int cx231xx_gpio_i2c_write_nak(struct cx231xx *dev);
870e0d3bafdSSri Deevi 
871e0d3bafdSSri Deevi int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len);
872e0d3bafdSSri Deevi int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len);
873e0d3bafdSSri Deevi 
874e0d3bafdSSri Deevi /* audio related functions */
87584b5dbf3SMauro Carvalho Chehab int cx231xx_set_audio_decoder_input(struct cx231xx *dev,
87684b5dbf3SMauro Carvalho Chehab 				    enum AUDIO_INPUT audio_input);
877e0d3bafdSSri Deevi 
878e0d3bafdSSri Deevi int cx231xx_capture_start(struct cx231xx *dev, int start, u8 media_type);
879e0d3bafdSSri Deevi int cx231xx_set_video_alternate(struct cx231xx *dev);
880e0d3bafdSSri Deevi int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt);
88164fbf444SPalash Bandyopadhyay int is_fw_load(struct cx231xx *dev);
88264fbf444SPalash Bandyopadhyay int cx231xx_check_fw(struct cx231xx *dev);
883e0d3bafdSSri Deevi int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
884e0d3bafdSSri Deevi 		      int num_bufs, int max_pkt_size,
88584b5dbf3SMauro Carvalho Chehab 		      int (*isoc_copy) (struct cx231xx *dev,
88684b5dbf3SMauro Carvalho Chehab 					struct urb *urb));
88764fbf444SPalash Bandyopadhyay int cx231xx_init_bulk(struct cx231xx *dev, int max_packets,
88864fbf444SPalash Bandyopadhyay 		      int num_bufs, int max_pkt_size,
88964fbf444SPalash Bandyopadhyay 		      int (*bulk_copy) (struct cx231xx *dev,
89064fbf444SPalash Bandyopadhyay 					struct urb *urb));
89164fbf444SPalash Bandyopadhyay void cx231xx_stop_TS1(struct cx231xx *dev);
89264fbf444SPalash Bandyopadhyay void cx231xx_start_TS1(struct cx231xx *dev);
893e0d3bafdSSri Deevi void cx231xx_uninit_isoc(struct cx231xx *dev);
89464fbf444SPalash Bandyopadhyay void cx231xx_uninit_bulk(struct cx231xx *dev);
895e0d3bafdSSri Deevi int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode);
89664fbf444SPalash Bandyopadhyay int cx231xx_unmute_audio(struct cx231xx *dev);
89764fbf444SPalash Bandyopadhyay int cx231xx_ep5_bulkout(struct cx231xx *dev, u8 *firmware, u16 size);
89864fbf444SPalash Bandyopadhyay void cx231xx_disable656(struct cx231xx *dev);
89964fbf444SPalash Bandyopadhyay void cx231xx_enable656(struct cx231xx *dev);
90064fbf444SPalash Bandyopadhyay int cx231xx_demod_reset(struct cx231xx *dev);
901e0d3bafdSSri Deevi int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio);
902e0d3bafdSSri Deevi 
903e0d3bafdSSri Deevi /* Device list functions */
904e0d3bafdSSri Deevi void cx231xx_release_resources(struct cx231xx *dev);
905e0d3bafdSSri Deevi void cx231xx_release_analog_resources(struct cx231xx *dev);
906e0d3bafdSSri Deevi int cx231xx_register_analog_devices(struct cx231xx *dev);
907e0d3bafdSSri Deevi void cx231xx_remove_from_devlist(struct cx231xx *dev);
908e0d3bafdSSri Deevi void cx231xx_add_into_devlist(struct cx231xx *dev);
909e0d3bafdSSri Deevi void cx231xx_init_extension(struct cx231xx *dev);
910e0d3bafdSSri Deevi void cx231xx_close_extension(struct cx231xx *dev);
911e0d3bafdSSri Deevi 
912e0d3bafdSSri Deevi /* hardware init functions */
913e0d3bafdSSri Deevi int cx231xx_dev_init(struct cx231xx *dev);
914e0d3bafdSSri Deevi void cx231xx_dev_uninit(struct cx231xx *dev);
915e0d3bafdSSri Deevi void cx231xx_config_i2c(struct cx231xx *dev);
916e0d3bafdSSri Deevi int cx231xx_config(struct cx231xx *dev);
917e0d3bafdSSri Deevi 
918e0d3bafdSSri Deevi /* Stream control functions */
919e0d3bafdSSri Deevi int cx231xx_start_stream(struct cx231xx *dev, u32 ep_mask);
920e0d3bafdSSri Deevi int cx231xx_stop_stream(struct cx231xx *dev, u32 ep_mask);
921e0d3bafdSSri Deevi 
922e0d3bafdSSri Deevi int cx231xx_initialize_stream_xfer(struct cx231xx *dev, u32 media_type);
923e0d3bafdSSri Deevi 
924e0d3bafdSSri Deevi /* Power control functions */
9256e4f574bSSri Deevi int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode);
926e0d3bafdSSri Deevi int cx231xx_power_suspend(struct cx231xx *dev);
927e0d3bafdSSri Deevi 
928e0d3bafdSSri Deevi /* chip specific control functions */
929e0d3bafdSSri Deevi int cx231xx_init_ctrl_pin_status(struct cx231xx *dev);
93084b5dbf3SMauro Carvalho Chehab int cx231xx_set_agc_analog_digital_mux_select(struct cx231xx *dev,
93184b5dbf3SMauro Carvalho Chehab 					      u8 analog_or_digital);
932a6f6fb9cSMauro Carvalho Chehab int cx231xx_enable_i2c_port_3(struct cx231xx *dev, bool is_port_3);
933e0d3bafdSSri Deevi 
934e0d3bafdSSri Deevi /* video audio decoder related functions */
935e0d3bafdSSri Deevi void video_mux(struct cx231xx *dev, int index);
936e0d3bafdSSri Deevi int cx231xx_set_video_input_mux(struct cx231xx *dev, u8 input);
937e0d3bafdSSri Deevi int cx231xx_set_decoder_video_input(struct cx231xx *dev, u8 pin_type, u8 input);
938e0d3bafdSSri Deevi int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev);
939e0d3bafdSSri Deevi int cx231xx_set_audio_input(struct cx231xx *dev, u8 input);
940e0d3bafdSSri Deevi 
941e0d3bafdSSri Deevi /* Provided by cx231xx-video.c */
942e0d3bafdSSri Deevi int cx231xx_register_extension(struct cx231xx_ops *dev);
943e0d3bafdSSri Deevi void cx231xx_unregister_extension(struct cx231xx_ops *dev);
944e0d3bafdSSri Deevi void cx231xx_init_extension(struct cx231xx *dev);
945e0d3bafdSSri Deevi void cx231xx_close_extension(struct cx231xx *dev);
946bc08734cSHans Verkuil int cx231xx_querycap(struct file *file, void *priv,
947bc08734cSHans Verkuil 			   struct v4l2_capability *cap);
948b86d1544SHans Verkuil int cx231xx_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t);
9492f73c7c5SHans Verkuil int cx231xx_s_tuner(struct file *file, void *priv, const struct v4l2_tuner *t);
950b86d1544SHans Verkuil int cx231xx_g_frequency(struct file *file, void *priv,
951b86d1544SHans Verkuil 			      struct v4l2_frequency *f);
952b86d1544SHans Verkuil int cx231xx_s_frequency(struct file *file, void *priv,
953b530a447SHans Verkuil 			      const struct v4l2_frequency *f);
954b86d1544SHans Verkuil int cx231xx_enum_input(struct file *file, void *priv,
955b86d1544SHans Verkuil 			     struct v4l2_input *i);
956b86d1544SHans Verkuil int cx231xx_g_input(struct file *file, void *priv, unsigned int *i);
957b86d1544SHans Verkuil int cx231xx_s_input(struct file *file, void *priv, unsigned int i);
95808fe9f7dSHans Verkuil int cx231xx_g_chip_info(struct file *file, void *fh, struct v4l2_dbg_chip_info *chip);
959b86d1544SHans Verkuil int cx231xx_g_register(struct file *file, void *priv,
960b86d1544SHans Verkuil 			     struct v4l2_dbg_register *reg);
961b86d1544SHans Verkuil int cx231xx_s_register(struct file *file, void *priv,
962977ba3b1SHans Verkuil 			     const struct v4l2_dbg_register *reg);
963e0d3bafdSSri Deevi 
964e0d3bafdSSri Deevi /* Provided by cx231xx-cards.c */
965e0d3bafdSSri Deevi extern void cx231xx_pre_card_setup(struct cx231xx *dev);
966e0d3bafdSSri Deevi extern void cx231xx_card_setup(struct cx231xx *dev);
967e0d3bafdSSri Deevi extern struct cx231xx_board cx231xx_boards[];
968e0d3bafdSSri Deevi extern struct usb_device_id cx231xx_id_table[];
969e0d3bafdSSri Deevi extern const unsigned int cx231xx_bcount;
970e0d3bafdSSri Deevi int cx231xx_tuner_callback(void *ptr, int component, int command, int arg);
971e0d3bafdSSri Deevi 
97264fbf444SPalash Bandyopadhyay /* cx23885-417.c                                               */
97364fbf444SPalash Bandyopadhyay extern int cx231xx_417_register(struct cx231xx *dev);
97464fbf444SPalash Bandyopadhyay extern void cx231xx_417_unregister(struct cx231xx *dev);
97564fbf444SPalash Bandyopadhyay 
9769ab66912SMauro Carvalho Chehab /* cx23885-input.c                                             */
9779ab66912SMauro Carvalho Chehab 
9789ab66912SMauro Carvalho Chehab #if defined(CONFIG_VIDEO_CX231XX_RC)
9799ab66912SMauro Carvalho Chehab int cx231xx_ir_init(struct cx231xx *dev);
9809ab66912SMauro Carvalho Chehab void cx231xx_ir_exit(struct cx231xx *dev);
9819ab66912SMauro Carvalho Chehab #else
9829ab66912SMauro Carvalho Chehab #define cx231xx_ir_init(dev)	(0)
9839ab66912SMauro Carvalho Chehab #define cx231xx_ir_exit(dev)	(0)
9849ab66912SMauro Carvalho Chehab #endif
9859ab66912SMauro Carvalho Chehab 
986e0d3bafdSSri Deevi static inline unsigned int norm_maxw(struct cx231xx *dev)
987e0d3bafdSSri Deevi {
988e0d3bafdSSri Deevi 	if (dev->board.max_range_640_480)
989e0d3bafdSSri Deevi 		return 640;
990e0d3bafdSSri Deevi 	else
991e0d3bafdSSri Deevi 		return 720;
992e0d3bafdSSri Deevi }
993e0d3bafdSSri Deevi 
994e0d3bafdSSri Deevi static inline unsigned int norm_maxh(struct cx231xx *dev)
995e0d3bafdSSri Deevi {
996e0d3bafdSSri Deevi 	if (dev->board.max_range_640_480)
997e0d3bafdSSri Deevi 		return 480;
998e0d3bafdSSri Deevi 	else
999e0d3bafdSSri Deevi 		return (dev->norm & V4L2_STD_625_50) ? 576 : 480;
1000e0d3bafdSSri Deevi }
1001e0d3bafdSSri Deevi #endif
1002