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> 31b1196126SSri Deevi 3264fbf444SPalash Bandyopadhyay #include <media/cx2341x.h> 33b1196126SSri Deevi 34b1196126SSri Deevi #include <media/videobuf-vmalloc.h> 35b1196126SSri Deevi #include <media/v4l2-device.h> 36d2370f8eSHans Verkuil #include <media/v4l2-ctrls.h> 371d08a4faSHans Verkuil #include <media/v4l2-fh.h> 386bda9644SMauro Carvalho Chehab #include <media/rc-core.h> 399ab66912SMauro Carvalho Chehab #include <media/ir-kbd-i2c.h> 40e0d3bafdSSri Deevi #include <media/videobuf-dvb.h> 41e0d3bafdSSri Deevi 42e0d3bafdSSri Deevi #include "cx231xx-reg.h" 436e4f574bSSri Deevi #include "cx231xx-pcb-cfg.h" 44e0d3bafdSSri Deevi #include "cx231xx-conf-reg.h" 45e0d3bafdSSri Deevi 46e0d3bafdSSri Deevi #define DRIVER_NAME "cx231xx" 4744ecf1dfSDevin Heitmueller #define PWR_SLEEP_INTERVAL 10 48e0d3bafdSSri Deevi 49e0d3bafdSSri Deevi /* I2C addresses for control block in Cx231xx */ 50ecc67d10SSri Deevi #define AFE_DEVICE_ADDRESS 0x60 51ecc67d10SSri Deevi #define I2S_BLK_DEVICE_ADDRESS 0x98 52ecc67d10SSri Deevi #define VID_BLK_I2C_ADDRESS 0x88 5364fbf444SPalash Bandyopadhyay #define VERVE_I2C_ADDRESS 0x40 54e0d3bafdSSri Deevi #define DIF_USE_BASEBAND 0xFFFFFFFF 55e0d3bafdSSri Deevi 56e0d3bafdSSri Deevi /* Boards supported by driver */ 57e0d3bafdSSri Deevi #define CX231XX_BOARD_UNKNOWN 0 5864fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_CARRAERA 1 5964fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_SHELBY 2 6064fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_RDE_253S 3 6164fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_RDU_253S 4 6264fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_VIDEO_GRABBER 5 6364fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_RDE_250 6 6464fbf444SPalash Bandyopadhyay #define CX231XX_BOARD_CNXT_RDU_250 7 651a50fddeSMichael Krufky #define CX231XX_BOARD_HAUPPAUGE_EXETER 8 664270c3caSDevin Heitmueller #define CX231XX_BOARD_HAUPPAUGE_USBLIVE2 9 679417bc6dSMauro Carvalho Chehab #define CX231XX_BOARD_PV_PLAYTV_USB_HYBRID 10 684e105039SMauro Carvalho Chehab #define CX231XX_BOARD_PV_XCAPTURE_USB 11 69eeaaf817SMárcio Alves #define CX231XX_BOARD_KWORLD_UB430_USB_HYBRID 12 702a7b6a40SIgor Novgorodov #define CX231XX_BOARD_ICONBIT_U100 13 71de8ae0d5SPeter Moon #define CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL 14 72de8ae0d5SPeter Moon #define CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC 15 7368c97bf3SAlf Høgemark #define CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2 16 743ead1ba3SMatt Gomboc #define CX231XX_BOARD_OTG102 17 758b1255a2SJohannes Erdfelt #define CX231XX_BOARD_KWORLD_UB445_USB_HYBRID 18 76dd2e7dd2SMatthias Schwarzott #define CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx 19 779e49f7c3SMatthias Schwarzott #define CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx 20 78e0d3bafdSSri Deevi 79e0d3bafdSSri Deevi /* Limits minimum and default number of buffers */ 80e0d3bafdSSri Deevi #define CX231XX_MIN_BUF 4 81e0d3bafdSSri Deevi #define CX231XX_DEF_BUF 12 82e0d3bafdSSri Deevi #define CX231XX_DEF_VBI_BUF 6 83e0d3bafdSSri Deevi 84e0d3bafdSSri Deevi #define VBI_LINE_COUNT 17 85e0d3bafdSSri Deevi #define VBI_LINE_LENGTH 1440 86e0d3bafdSSri Deevi 87e0d3bafdSSri Deevi /*Limits the max URB message size */ 88e0d3bafdSSri Deevi #define URB_MAX_CTRL_SIZE 80 89e0d3bafdSSri Deevi 90e0d3bafdSSri Deevi /* Params for validated field */ 91e0d3bafdSSri Deevi #define CX231XX_BOARD_NOT_VALIDATED 1 92e0d3bafdSSri Deevi #define CX231XX_BOARD_VALIDATED 0 93e0d3bafdSSri Deevi 94e0d3bafdSSri Deevi /* maximum number of cx231xx boards */ 95e0d3bafdSSri Deevi #define CX231XX_MAXBOARDS 8 96e0d3bafdSSri Deevi 97e0d3bafdSSri Deevi /* maximum number of frames that can be queued */ 98e0d3bafdSSri Deevi #define CX231XX_NUM_FRAMES 5 99e0d3bafdSSri Deevi 100e0d3bafdSSri Deevi /* number of buffers for isoc transfers */ 101e0d3bafdSSri Deevi #define CX231XX_NUM_BUFS 8 102e0d3bafdSSri Deevi 103e0d3bafdSSri Deevi /* number of packets for each buffer 104e0d3bafdSSri Deevi windows requests only 40 packets .. so we better do the same 105e0d3bafdSSri Deevi this is what I found out for all alternate numbers there! 106e0d3bafdSSri Deevi */ 107e0d3bafdSSri Deevi #define CX231XX_NUM_PACKETS 40 108e0d3bafdSSri Deevi 109e0d3bafdSSri Deevi /* default alternate; 0 means choose the best */ 110e0d3bafdSSri Deevi #define CX231XX_PINOUT 0 111e0d3bafdSSri Deevi 112e0d3bafdSSri Deevi #define CX231XX_INTERLACED_DEFAULT 1 113e0d3bafdSSri Deevi 114e0d3bafdSSri Deevi /* time to wait when stopping the isoc transfer */ 115b9255176SSri Deevi #define CX231XX_URB_TIMEOUT \ 116b9255176SSri Deevi msecs_to_jiffies(CX231XX_NUM_BUFS * CX231XX_NUM_PACKETS) 117e0d3bafdSSri Deevi 11864fbf444SPalash Bandyopadhyay #define CX231xx_NORMS (\ 11964fbf444SPalash Bandyopadhyay V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_JP | V4L2_STD_NTSC_443 | \ 12064fbf444SPalash Bandyopadhyay V4L2_STD_PAL_BG | V4L2_STD_PAL_DK | V4L2_STD_PAL_I | \ 12164fbf444SPalash Bandyopadhyay V4L2_STD_PAL_M | V4L2_STD_PAL_N | V4L2_STD_PAL_Nc | \ 12264fbf444SPalash Bandyopadhyay V4L2_STD_PAL_60 | V4L2_STD_SECAM_L | V4L2_STD_SECAM_DK) 12364fbf444SPalash Bandyopadhyay 12464fbf444SPalash Bandyopadhyay #define SLEEP_S5H1432 30 12564fbf444SPalash Bandyopadhyay #define CX23417_OSC_EN 8 12664fbf444SPalash Bandyopadhyay #define CX23417_RESET 9 12764fbf444SPalash Bandyopadhyay 12864fbf444SPalash Bandyopadhyay struct cx23417_fmt { 12964fbf444SPalash Bandyopadhyay char *name; 13064fbf444SPalash Bandyopadhyay u32 fourcc; /* v4l2 format id */ 13164fbf444SPalash Bandyopadhyay int depth; 13264fbf444SPalash Bandyopadhyay int flags; 13364fbf444SPalash Bandyopadhyay u32 cxformat; 13464fbf444SPalash Bandyopadhyay }; 135e0d3bafdSSri Deevi enum cx231xx_mode { 136e0d3bafdSSri Deevi CX231XX_SUSPEND, 137e0d3bafdSSri Deevi CX231XX_ANALOG_MODE, 138e0d3bafdSSri Deevi CX231XX_DIGITAL_MODE, 139e0d3bafdSSri Deevi }; 140e0d3bafdSSri Deevi 141e0d3bafdSSri Deevi enum cx231xx_std_mode { 142e0d3bafdSSri Deevi CX231XX_TV_AIR = 0, 143e0d3bafdSSri Deevi CX231XX_TV_CABLE 144e0d3bafdSSri Deevi }; 145e0d3bafdSSri Deevi 146e0d3bafdSSri Deevi enum cx231xx_stream_state { 147e0d3bafdSSri Deevi STREAM_OFF, 148e0d3bafdSSri Deevi STREAM_INTERRUPT, 149e0d3bafdSSri Deevi STREAM_ON, 150e0d3bafdSSri Deevi }; 151e0d3bafdSSri Deevi 152e0d3bafdSSri Deevi struct cx231xx; 153e0d3bafdSSri Deevi 15464fbf444SPalash Bandyopadhyay struct cx231xx_isoc_ctl { 155e0d3bafdSSri Deevi /* max packet size of isoc transaction */ 156e0d3bafdSSri Deevi int max_pkt_size; 157e0d3bafdSSri Deevi 158e0d3bafdSSri Deevi /* number of allocated urbs */ 159e0d3bafdSSri Deevi int num_bufs; 160e0d3bafdSSri Deevi 161e0d3bafdSSri Deevi /* urb for isoc transfers */ 162e0d3bafdSSri Deevi struct urb **urb; 163e0d3bafdSSri Deevi 164e0d3bafdSSri Deevi /* transfer buffers for isoc transfer */ 165e0d3bafdSSri Deevi char **transfer_buffer; 166e0d3bafdSSri Deevi 167e0d3bafdSSri Deevi /* Last buffer command and region */ 168e0d3bafdSSri Deevi u8 cmd; 169e0d3bafdSSri Deevi int pos, size, pktsize; 170e0d3bafdSSri Deevi 171e0d3bafdSSri Deevi /* Last field: ODD or EVEN? */ 172e0d3bafdSSri Deevi int field; 173e0d3bafdSSri Deevi 174e0d3bafdSSri Deevi /* Stores incomplete commands */ 175e0d3bafdSSri Deevi u32 tmp_buf; 176e0d3bafdSSri Deevi int tmp_buf_len; 177e0d3bafdSSri Deevi 178e0d3bafdSSri Deevi /* Stores already requested buffers */ 179e0d3bafdSSri Deevi struct cx231xx_buffer *buf; 180e0d3bafdSSri Deevi 181e0d3bafdSSri Deevi /* Stores the number of received fields */ 182e0d3bafdSSri Deevi int nfields; 183e0d3bafdSSri Deevi 184e0d3bafdSSri Deevi /* isoc urb callback */ 185e0d3bafdSSri Deevi int (*isoc_copy) (struct cx231xx *dev, struct urb *urb); 186e0d3bafdSSri Deevi }; 187e0d3bafdSSri Deevi 18864fbf444SPalash Bandyopadhyay struct cx231xx_bulk_ctl { 18964fbf444SPalash Bandyopadhyay /* max packet size of bulk transaction */ 19064fbf444SPalash Bandyopadhyay int max_pkt_size; 19164fbf444SPalash Bandyopadhyay 19264fbf444SPalash Bandyopadhyay /* number of allocated urbs */ 19364fbf444SPalash Bandyopadhyay int num_bufs; 19464fbf444SPalash Bandyopadhyay 19564fbf444SPalash Bandyopadhyay /* urb for bulk transfers */ 19664fbf444SPalash Bandyopadhyay struct urb **urb; 19764fbf444SPalash Bandyopadhyay 19864fbf444SPalash Bandyopadhyay /* transfer buffers for bulk transfer */ 19964fbf444SPalash Bandyopadhyay char **transfer_buffer; 20064fbf444SPalash Bandyopadhyay 20164fbf444SPalash Bandyopadhyay /* Last buffer command and region */ 20264fbf444SPalash Bandyopadhyay u8 cmd; 20364fbf444SPalash Bandyopadhyay int pos, size, pktsize; 20464fbf444SPalash Bandyopadhyay 20564fbf444SPalash Bandyopadhyay /* Last field: ODD or EVEN? */ 20664fbf444SPalash Bandyopadhyay int field; 20764fbf444SPalash Bandyopadhyay 20864fbf444SPalash Bandyopadhyay /* Stores incomplete commands */ 20964fbf444SPalash Bandyopadhyay u32 tmp_buf; 21064fbf444SPalash Bandyopadhyay int tmp_buf_len; 21164fbf444SPalash Bandyopadhyay 21264fbf444SPalash Bandyopadhyay /* Stores already requested buffers */ 21364fbf444SPalash Bandyopadhyay struct cx231xx_buffer *buf; 21464fbf444SPalash Bandyopadhyay 21564fbf444SPalash Bandyopadhyay /* Stores the number of received fields */ 21664fbf444SPalash Bandyopadhyay int nfields; 21764fbf444SPalash Bandyopadhyay 21864fbf444SPalash Bandyopadhyay /* bulk urb callback */ 21964fbf444SPalash Bandyopadhyay int (*bulk_copy) (struct cx231xx *dev, struct urb *urb); 22064fbf444SPalash Bandyopadhyay }; 22164fbf444SPalash Bandyopadhyay 222e0d3bafdSSri Deevi struct cx231xx_fmt { 223e0d3bafdSSri Deevi char *name; 224e0d3bafdSSri Deevi u32 fourcc; /* v4l2 format id */ 225e0d3bafdSSri Deevi int depth; 226e0d3bafdSSri Deevi int reg; 227e0d3bafdSSri Deevi }; 228e0d3bafdSSri Deevi 229e0d3bafdSSri Deevi /* buffer for one video frame */ 230e0d3bafdSSri Deevi struct cx231xx_buffer { 231e0d3bafdSSri Deevi /* common v4l buffer stuff -- must be first */ 232e0d3bafdSSri Deevi struct videobuf_buffer vb; 233e0d3bafdSSri Deevi 234e0d3bafdSSri Deevi struct list_head frame; 235e0d3bafdSSri Deevi int top_field; 236e0d3bafdSSri Deevi int receiving; 237e0d3bafdSSri Deevi }; 238e0d3bafdSSri Deevi 23964fbf444SPalash Bandyopadhyay enum ps_package_head { 24064fbf444SPalash Bandyopadhyay CX231XX_NEED_ADD_PS_PACKAGE_HEAD = 0, 24164fbf444SPalash Bandyopadhyay CX231XX_NONEED_PS_PACKAGE_HEAD 24264fbf444SPalash Bandyopadhyay }; 24364fbf444SPalash Bandyopadhyay 244e0d3bafdSSri Deevi struct cx231xx_dmaqueue { 245e0d3bafdSSri Deevi struct list_head active; 246e0d3bafdSSri Deevi struct list_head queued; 247e0d3bafdSSri Deevi 248e0d3bafdSSri Deevi wait_queue_head_t wq; 249e0d3bafdSSri Deevi 250e0d3bafdSSri Deevi /* Counters to control buffer fill */ 251e0d3bafdSSri Deevi int pos; 252e0d3bafdSSri Deevi u8 is_partial_line; 253e0d3bafdSSri Deevi u8 partial_buf[8]; 254e0d3bafdSSri Deevi u8 last_sav; 255e0d3bafdSSri Deevi int current_field; 256e0d3bafdSSri Deevi u32 bytes_left_in_line; 257e0d3bafdSSri Deevi u32 lines_completed; 258e0d3bafdSSri Deevi u8 field1_done; 259e0d3bafdSSri Deevi u32 lines_per_field; 26064fbf444SPalash Bandyopadhyay 26164fbf444SPalash Bandyopadhyay /*Mpeg2 control buffer*/ 26264fbf444SPalash Bandyopadhyay u8 *p_left_data; 26364fbf444SPalash Bandyopadhyay u32 left_data_count; 26464fbf444SPalash Bandyopadhyay u8 mpeg_buffer_done; 26564fbf444SPalash Bandyopadhyay u32 mpeg_buffer_completed; 26664fbf444SPalash Bandyopadhyay enum ps_package_head add_ps_package_head; 26764fbf444SPalash Bandyopadhyay char ps_head[10]; 268e0d3bafdSSri Deevi }; 269e0d3bafdSSri Deevi 270e0d3bafdSSri Deevi /* inputs */ 271e0d3bafdSSri Deevi 272e0d3bafdSSri Deevi #define MAX_CX231XX_INPUT 4 273e0d3bafdSSri Deevi 274e0d3bafdSSri Deevi enum cx231xx_itype { 275e0d3bafdSSri Deevi CX231XX_VMUX_COMPOSITE1 = 1, 276e0d3bafdSSri Deevi CX231XX_VMUX_SVIDEO, 277e0d3bafdSSri Deevi CX231XX_VMUX_TELEVISION, 278e0d3bafdSSri Deevi CX231XX_VMUX_CABLE, 279e0d3bafdSSri Deevi CX231XX_RADIO, 280e0d3bafdSSri Deevi CX231XX_VMUX_DVB, 281e0d3bafdSSri Deevi CX231XX_VMUX_DEBUG 282e0d3bafdSSri Deevi }; 283e0d3bafdSSri Deevi 284e0d3bafdSSri Deevi enum cx231xx_v_input { 285e0d3bafdSSri Deevi CX231XX_VIN_1_1 = 0x1, 286e0d3bafdSSri Deevi CX231XX_VIN_2_1, 287e0d3bafdSSri Deevi CX231XX_VIN_3_1, 288e0d3bafdSSri Deevi CX231XX_VIN_4_1, 289e0d3bafdSSri Deevi CX231XX_VIN_1_2 = 0x01, 290e0d3bafdSSri Deevi CX231XX_VIN_2_2, 291e0d3bafdSSri Deevi CX231XX_VIN_3_2, 292e0d3bafdSSri Deevi CX231XX_VIN_1_3 = 0x1, 293e0d3bafdSSri Deevi CX231XX_VIN_2_3, 294e0d3bafdSSri Deevi CX231XX_VIN_3_3, 295e0d3bafdSSri Deevi }; 296e0d3bafdSSri Deevi 297e0d3bafdSSri Deevi /* cx231xx has two audio inputs: tuner and line in */ 298e0d3bafdSSri Deevi enum cx231xx_amux { 299e0d3bafdSSri Deevi /* This is the only entry for cx231xx tuner input */ 300e0d3bafdSSri Deevi CX231XX_AMUX_VIDEO, /* cx231xx tuner */ 301e0d3bafdSSri Deevi CX231XX_AMUX_LINE_IN, /* Line In */ 302e0d3bafdSSri Deevi }; 303e0d3bafdSSri Deevi 304e0d3bafdSSri Deevi struct cx231xx_reg_seq { 305e0d3bafdSSri Deevi unsigned char bit; 306e0d3bafdSSri Deevi unsigned char val; 307e0d3bafdSSri Deevi int sleep; 308e0d3bafdSSri Deevi }; 309e0d3bafdSSri Deevi 310e0d3bafdSSri Deevi struct cx231xx_input { 311e0d3bafdSSri Deevi enum cx231xx_itype type; 312e0d3bafdSSri Deevi unsigned int vmux; 313e0d3bafdSSri Deevi enum cx231xx_amux amux; 314e0d3bafdSSri Deevi struct cx231xx_reg_seq *gpio; 315e0d3bafdSSri Deevi }; 316e0d3bafdSSri Deevi 317e0d3bafdSSri Deevi #define INPUT(nr) (&cx231xx_boards[dev->model].input[nr]) 318e0d3bafdSSri Deevi 319e0d3bafdSSri Deevi enum cx231xx_decoder { 320e0d3bafdSSri Deevi CX231XX_NODECODER, 321e0d3bafdSSri Deevi CX231XX_AVDECODER 322e0d3bafdSSri Deevi }; 323e0d3bafdSSri Deevi 324b9255176SSri Deevi enum CX231XX_I2C_MASTER_PORT { 3259abe3b89SMatthias Schwarzott I2C_0 = 0, /* master 0 - internal connection */ 3269abe3b89SMatthias Schwarzott I2C_1 = 1, /* master 1 - used with mux */ 3279abe3b89SMatthias Schwarzott I2C_2 = 2, /* master 2 */ 3289abe3b89SMatthias Schwarzott I2C_1_MUX_1 = 3, /* master 1 - port 1 (I2C_DEMOD_EN = 0) */ 3299abe3b89SMatthias Schwarzott I2C_1_MUX_3 = 4 /* master 1 - port 3 (I2C_DEMOD_EN = 1) */ 330b9255176SSri Deevi }; 331e0d3bafdSSri Deevi 332e0d3bafdSSri Deevi struct cx231xx_board { 333e0d3bafdSSri Deevi char *name; 334e0d3bafdSSri Deevi int vchannels; 335e0d3bafdSSri Deevi int tuner_type; 336e0d3bafdSSri Deevi int tuner_addr; 337e0d3bafdSSri Deevi v4l2_std_id norm; /* tv norm */ 338e0d3bafdSSri Deevi 339e0d3bafdSSri Deevi /* demod related */ 340e0d3bafdSSri Deevi int demod_addr; 341e0d3bafdSSri Deevi u8 demod_xfer_mode; /* 0 - Serial; 1 - parallel */ 342e0d3bafdSSri Deevi 343e0d3bafdSSri Deevi /* GPIO Pins */ 344e0d3bafdSSri Deevi struct cx231xx_reg_seq *dvb_gpio; 345e0d3bafdSSri Deevi struct cx231xx_reg_seq *suspend_gpio; 346e0d3bafdSSri Deevi struct cx231xx_reg_seq *tuner_gpio; 34778bb6df6SMauro Carvalho Chehab /* Negative means don't use it */ 34878bb6df6SMauro Carvalho Chehab s8 tuner_sif_gpio; 34978bb6df6SMauro Carvalho Chehab s8 tuner_scl_gpio; 35078bb6df6SMauro Carvalho Chehab s8 tuner_sda_gpio; 351e0d3bafdSSri Deevi 352e0d3bafdSSri Deevi /* PIN ctrl */ 353e0d3bafdSSri Deevi u32 ctl_pin_status_mask; 354e0d3bafdSSri Deevi u8 agc_analog_digital_select_gpio; 355e0d3bafdSSri Deevi u32 gpio_pin_status_mask; 356e0d3bafdSSri Deevi 357e0d3bafdSSri Deevi /* i2c masters */ 358e0d3bafdSSri Deevi u8 tuner_i2c_master; 359e0d3bafdSSri Deevi u8 demod_i2c_master; 3609ab66912SMauro Carvalho Chehab u8 ir_i2c_master; 3619ab66912SMauro Carvalho Chehab 3629ab66912SMauro Carvalho Chehab /* for devices with I2C chips for IR */ 36329e3ec19SMauro Carvalho Chehab char *rc_map_name; 364e0d3bafdSSri Deevi 365e0d3bafdSSri Deevi unsigned int max_range_640_480:1; 366e0d3bafdSSri Deevi unsigned int has_dvb:1; 3672f861387SMauro Carvalho Chehab unsigned int has_417:1; 368e0d3bafdSSri Deevi unsigned int valid:1; 3692f861387SMauro Carvalho Chehab unsigned int no_alt_vanc:1; 3702f861387SMauro Carvalho Chehab unsigned int external_av:1; 37138f5ddc1SMauro Carvalho Chehab unsigned int dont_use_port_3: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 612e0d3bafdSSri Deevi struct cx231xx_fmt *format; 613e0d3bafdSSri Deevi 614b1196126SSri Deevi struct v4l2_device v4l2_dev; 615b1196126SSri Deevi struct v4l2_subdev *sd_cx25840; 616b1196126SSri Deevi struct v4l2_subdev *sd_tuner; 617d2370f8eSHans Verkuil struct v4l2_ctrl_handler ctrl_handler; 618d2370f8eSHans Verkuil struct v4l2_ctrl_handler radio_ctrl_handler; 61988b6ffedSHans Verkuil struct cx2341x_handler mpeg_ctrl_handler; 620b1196126SSri Deevi 62161b04cb2SMauro Carvalho Chehab struct work_struct wq_trigger; /* Trigger to start/stop audio for alsa module */ 62261b04cb2SMauro Carvalho Chehab atomic_t stream_started; /* stream should be running if true */ 62361b04cb2SMauro Carvalho Chehab 624e0d3bafdSSri Deevi struct list_head devlist; 625e0d3bafdSSri Deevi 626e0d3bafdSSri Deevi int tuner_type; /* type of the tuner */ 627e0d3bafdSSri Deevi int tuner_addr; /* tuner address */ 628e0d3bafdSSri Deevi 629e0d3bafdSSri Deevi /* I2C adapters: Master 1 & 2 (External) & Master 3 (Internal only) */ 630e0d3bafdSSri Deevi struct cx231xx_i2c i2c_bus[3]; 631e0d3bafdSSri Deevi unsigned int xc_fw_load_done:1; 632*a1f26765SMatthias Schwarzott unsigned int port_3_switch_enabled:1; 63364fbf444SPalash Bandyopadhyay /* locks */ 634e0d3bafdSSri Deevi struct mutex gpio_i2c_lock; 63564fbf444SPalash Bandyopadhyay struct mutex i2c_lock; 636e0d3bafdSSri Deevi 637e0d3bafdSSri Deevi /* video for linux */ 638e0d3bafdSSri Deevi int users; /* user count for exclusive use */ 639e0d3bafdSSri Deevi struct video_device *vdev; /* video for linux device struct */ 640e0d3bafdSSri Deevi v4l2_std_id norm; /* selected tv norm */ 641e0d3bafdSSri Deevi int ctl_freq; /* selected frequency */ 642e0d3bafdSSri Deevi unsigned int ctl_ainput; /* selected audio input */ 643e0d3bafdSSri Deevi 644e0d3bafdSSri Deevi /* frame properties */ 645e0d3bafdSSri Deevi int width; /* current frame width */ 646e0d3bafdSSri Deevi int height; /* current frame height */ 647e0d3bafdSSri Deevi int interlaced; /* 1=interlace fileds, 0=just top fileds */ 648e0d3bafdSSri Deevi 649e0d3bafdSSri Deevi struct cx231xx_audio adev; 650e0d3bafdSSri Deevi 651e0d3bafdSSri Deevi /* states */ 652e0d3bafdSSri Deevi enum cx231xx_dev_state state; 653e0d3bafdSSri Deevi 654e0d3bafdSSri Deevi struct work_struct request_module_wk; 655e0d3bafdSSri Deevi 656e0d3bafdSSri Deevi /* locks */ 657e0d3bafdSSri Deevi struct mutex lock; 658e0d3bafdSSri Deevi struct mutex ctrl_urb_lock; /* protects urb_buf */ 659e0d3bafdSSri Deevi struct list_head inqueue, outqueue; 660e0d3bafdSSri Deevi wait_queue_head_t open, wait_frame, wait_stream; 661e0d3bafdSSri Deevi struct video_device *vbi_dev; 662e0d3bafdSSri Deevi struct video_device *radio_dev; 663e0d3bafdSSri Deevi 664e0d3bafdSSri Deevi unsigned char eedata[256]; 665e0d3bafdSSri Deevi 666e0d3bafdSSri Deevi struct cx231xx_video_mode video_mode; 667e0d3bafdSSri Deevi struct cx231xx_video_mode vbi_mode; 668e0d3bafdSSri Deevi struct cx231xx_video_mode sliced_cc_mode; 669e0d3bafdSSri Deevi struct cx231xx_video_mode ts1_mode; 670e0d3bafdSSri Deevi 67164fbf444SPalash Bandyopadhyay atomic_t devlist_count; 67264fbf444SPalash Bandyopadhyay 673e0d3bafdSSri Deevi struct usb_device *udev; /* the usb device */ 674e0d3bafdSSri Deevi char urb_buf[URB_MAX_CTRL_SIZE]; /* urb control msg buffer */ 675e0d3bafdSSri Deevi 676e0d3bafdSSri Deevi /* helper funcs that call usb_control_msg */ 677e0d3bafdSSri Deevi int (*cx231xx_read_ctrl_reg) (struct cx231xx *dev, u8 req, u16 reg, 678e0d3bafdSSri Deevi char *buf, int len); 679e0d3bafdSSri Deevi int (*cx231xx_write_ctrl_reg) (struct cx231xx *dev, u8 req, u16 reg, 680e0d3bafdSSri Deevi char *buf, int len); 681e0d3bafdSSri Deevi int (*cx231xx_send_usb_command) (struct cx231xx_i2c *i2c_bus, 682cde4362fSMauro Carvalho Chehab struct cx231xx_i2c_xfer_data *req_data); 68384b5dbf3SMauro Carvalho Chehab int (*cx231xx_gpio_i2c_read) (struct cx231xx *dev, u8 dev_addr, 68484b5dbf3SMauro Carvalho Chehab u8 *buf, u8 len); 68584b5dbf3SMauro Carvalho Chehab int (*cx231xx_gpio_i2c_write) (struct cx231xx *dev, u8 dev_addr, 68684b5dbf3SMauro Carvalho Chehab u8 *buf, u8 len); 687e0d3bafdSSri Deevi 688e0d3bafdSSri Deevi int (*cx231xx_set_analog_freq) (struct cx231xx *dev, u32 freq); 689e0d3bafdSSri Deevi int (*cx231xx_reset_analog_tuner) (struct cx231xx *dev); 690e0d3bafdSSri Deevi 691e0d3bafdSSri Deevi enum cx231xx_mode mode; 692e0d3bafdSSri Deevi 693e0d3bafdSSri Deevi struct cx231xx_dvb *dvb; 694e0d3bafdSSri Deevi 695e0d3bafdSSri Deevi /* Cx231xx supported PCB config's */ 696e0d3bafdSSri Deevi struct pcb_config current_pcb_config; 697e0d3bafdSSri Deevi u8 current_scenario_idx; 698e0d3bafdSSri Deevi u8 interface_count; 699e0d3bafdSSri Deevi u8 max_iad_interface_count; 700e0d3bafdSSri Deevi 701e0d3bafdSSri Deevi /* GPIO related register direction and values */ 702e0d3bafdSSri Deevi u32 gpio_dir; 703e0d3bafdSSri Deevi u32 gpio_val; 704e0d3bafdSSri Deevi 705e0d3bafdSSri Deevi /* Power Modes */ 706e0d3bafdSSri Deevi int power_mode; 707e0d3bafdSSri Deevi 708ecc67d10SSri Deevi /* afe parameters */ 709ecc67d10SSri Deevi enum AFE_MODE afe_mode; 710ecc67d10SSri Deevi u32 afe_ref_count; 711e0d3bafdSSri Deevi 712e0d3bafdSSri Deevi /* video related parameters */ 713e0d3bafdSSri Deevi u32 video_input; 714e0d3bafdSSri Deevi u32 active_mode; 715e0d3bafdSSri Deevi u8 vbi_or_sliced_cc_mode; /* 0 - vbi ; 1 - sliced cc mode */ 716e0d3bafdSSri Deevi enum cx231xx_std_mode std_mode; /* 0 - Air; 1 - cable */ 717e0d3bafdSSri Deevi 71864fbf444SPalash Bandyopadhyay /*mode: digital=1 or analog=0*/ 71964fbf444SPalash Bandyopadhyay u8 mode_tv; 72064fbf444SPalash Bandyopadhyay 72164fbf444SPalash Bandyopadhyay u8 USE_ISO; 72264fbf444SPalash Bandyopadhyay struct cx231xx_tvnorm encodernorm; 72364fbf444SPalash Bandyopadhyay struct cx231xx_tsport ts1, ts2; 72464fbf444SPalash Bandyopadhyay struct video_device *v4l_device; 72564fbf444SPalash Bandyopadhyay atomic_t v4l_reader_count; 72664fbf444SPalash Bandyopadhyay u32 freq; 72764fbf444SPalash Bandyopadhyay unsigned int input; 72864fbf444SPalash Bandyopadhyay u32 cx23417_mailbox; 72964fbf444SPalash Bandyopadhyay u32 __iomem *lmmio; 73064fbf444SPalash Bandyopadhyay u8 __iomem *bmmio; 731e0d3bafdSSri Deevi }; 732e0d3bafdSSri Deevi 73364fbf444SPalash Bandyopadhyay extern struct list_head cx231xx_devlist; 73464fbf444SPalash Bandyopadhyay 735b1196126SSri Deevi #define cx25840_call(cx231xx, o, f, args...) \ 736b1196126SSri Deevi v4l2_subdev_call(cx231xx->sd_cx25840, o, f, ##args) 737b1196126SSri Deevi #define tuner_call(cx231xx, o, f, args...) \ 738b1196126SSri Deevi v4l2_subdev_call(cx231xx->sd_tuner, o, f, ##args) 739b1196126SSri Deevi #define call_all(dev, o, f, args...) \ 740b1196126SSri Deevi v4l2_device_call_until_err(&dev->v4l2_dev, 0, o, f, ##args) 741b1196126SSri Deevi 742e0d3bafdSSri Deevi struct cx231xx_ops { 743e0d3bafdSSri Deevi struct list_head next; 744e0d3bafdSSri Deevi char *name; 745e0d3bafdSSri Deevi int id; 746e0d3bafdSSri Deevi int (*init) (struct cx231xx *); 747e0d3bafdSSri Deevi int (*fini) (struct cx231xx *); 748e0d3bafdSSri Deevi }; 749e0d3bafdSSri Deevi 750e0d3bafdSSri Deevi /* call back functions in dvb module */ 751e0d3bafdSSri Deevi int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq); 752e0d3bafdSSri Deevi int cx231xx_reset_analog_tuner(struct cx231xx *dev); 753e0d3bafdSSri Deevi 754e0d3bafdSSri Deevi /* Provided by cx231xx-i2c.c */ 7557c894a3bSMatthias Schwarzott void cx231xx_do_i2c_scan(struct cx231xx *dev, int i2c_port); 756e0d3bafdSSri Deevi int cx231xx_i2c_register(struct cx231xx_i2c *bus); 757e0d3bafdSSri Deevi int cx231xx_i2c_unregister(struct cx231xx_i2c *bus); 758c3c3f1aeSMatthias Schwarzott struct i2c_adapter *cx231xx_get_i2c_adap(struct cx231xx *dev, int i2c_port); 759e0d3bafdSSri Deevi 760e0d3bafdSSri Deevi /* Internal block control functions */ 76164fbf444SPalash Bandyopadhyay int cx231xx_read_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr, 76264fbf444SPalash Bandyopadhyay u8 saddr_len, u32 *data, u8 data_len, int master); 76364fbf444SPalash Bandyopadhyay int cx231xx_write_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr, 76464fbf444SPalash Bandyopadhyay u8 saddr_len, u32 data, u8 data_len, int master); 765e0d3bafdSSri Deevi int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr, 766e0d3bafdSSri Deevi u16 saddr, u8 saddr_len, u32 *data, u8 data_len); 767e0d3bafdSSri Deevi int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr, 768e0d3bafdSSri Deevi u16 saddr, u8 saddr_len, u32 data, u8 data_len); 76984b5dbf3SMauro Carvalho Chehab int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size, 77084b5dbf3SMauro Carvalho Chehab u16 register_address, u8 bit_start, u8 bit_end, 77184b5dbf3SMauro Carvalho Chehab u32 value); 772e0d3bafdSSri Deevi int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr, 773e0d3bafdSSri Deevi u16 saddr, u32 mask, u32 value); 774e0d3bafdSSri Deevi u32 cx231xx_set_field(u32 field_mask, u32 data); 775e0d3bafdSSri Deevi 77664fbf444SPalash Bandyopadhyay /*verve r/w*/ 77764fbf444SPalash Bandyopadhyay void initGPIO(struct cx231xx *dev); 77864fbf444SPalash Bandyopadhyay void uninitGPIO(struct cx231xx *dev); 779ecc67d10SSri Deevi /* afe related functions */ 780ecc67d10SSri Deevi int cx231xx_afe_init_super_block(struct cx231xx *dev, u32 ref_count); 781ecc67d10SSri Deevi int cx231xx_afe_init_channels(struct cx231xx *dev); 782ecc67d10SSri Deevi int cx231xx_afe_setup_AFE_for_baseband(struct cx231xx *dev); 783ecc67d10SSri Deevi int cx231xx_afe_set_input_mux(struct cx231xx *dev, u32 input_mux); 784ecc67d10SSri Deevi int cx231xx_afe_set_mode(struct cx231xx *dev, enum AFE_MODE mode); 785ecc67d10SSri Deevi int cx231xx_afe_update_power_control(struct cx231xx *dev, 7866e4f574bSSri Deevi enum AV_MODE avmode); 787ecc67d10SSri Deevi int cx231xx_afe_adjust_ref_count(struct cx231xx *dev, u32 video_input); 788e0d3bafdSSri Deevi 789ecc67d10SSri Deevi /* i2s block related functions */ 790ecc67d10SSri Deevi int cx231xx_i2s_blk_initialize(struct cx231xx *dev); 791ecc67d10SSri Deevi int cx231xx_i2s_blk_update_power_control(struct cx231xx *dev, 7926e4f574bSSri Deevi enum AV_MODE avmode); 793ecc67d10SSri Deevi int cx231xx_i2s_blk_set_audio_input(struct cx231xx *dev, u8 audio_input); 794e0d3bafdSSri Deevi 795e0d3bafdSSri Deevi /* DIF related functions */ 796e0d3bafdSSri Deevi int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode, 797e0d3bafdSSri Deevi u32 function_mode, u32 standard); 79864fbf444SPalash Bandyopadhyay void cx231xx_set_Colibri_For_LowIF(struct cx231xx *dev, u32 if_freq, 79964fbf444SPalash Bandyopadhyay u8 spectral_invert, u32 mode); 80064fbf444SPalash Bandyopadhyay u32 cx231xx_Get_Colibri_CarrierOffset(u32 mode, u32 standerd); 80164fbf444SPalash Bandyopadhyay void cx231xx_set_DIF_bandpass(struct cx231xx *dev, u32 if_freq, 80264fbf444SPalash Bandyopadhyay u8 spectral_invert, u32 mode); 80364fbf444SPalash Bandyopadhyay void cx231xx_Setup_AFE_for_LowIF(struct cx231xx *dev); 80464fbf444SPalash Bandyopadhyay void reset_s5h1432_demod(struct cx231xx *dev); 80564fbf444SPalash Bandyopadhyay void cx231xx_dump_HH_reg(struct cx231xx *dev); 80664fbf444SPalash Bandyopadhyay void update_HH_register_after_set_DIF(struct cx231xx *dev); 80764fbf444SPalash Bandyopadhyay void cx231xx_dump_SC_reg(struct cx231xx *dev); 80864fbf444SPalash Bandyopadhyay 80964fbf444SPalash Bandyopadhyay 81064fbf444SPalash Bandyopadhyay 811e0d3bafdSSri Deevi int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard); 812e0d3bafdSSri Deevi int cx231xx_tuner_pre_channel_change(struct cx231xx *dev); 813e0d3bafdSSri Deevi int cx231xx_tuner_post_channel_change(struct cx231xx *dev); 814e0d3bafdSSri Deevi 815e0d3bafdSSri Deevi /* video parser functions */ 81684b5dbf3SMauro Carvalho Chehab u8 cx231xx_find_next_SAV_EAV(u8 *p_buffer, u32 buffer_size, 81784b5dbf3SMauro Carvalho Chehab u32 *p_bytes_used); 81884b5dbf3SMauro Carvalho Chehab u8 cx231xx_find_boundary_SAV_EAV(u8 *p_buffer, u8 *partial_buf, 81984b5dbf3SMauro Carvalho Chehab u32 *p_bytes_used); 820e0d3bafdSSri Deevi int cx231xx_do_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q, 821e0d3bafdSSri Deevi u8 *p_buffer, u32 bytes_to_copy); 82284b5dbf3SMauro Carvalho Chehab void cx231xx_reset_video_buffer(struct cx231xx *dev, 82384b5dbf3SMauro Carvalho Chehab struct cx231xx_dmaqueue *dma_q); 824e0d3bafdSSri Deevi u8 cx231xx_is_buffer_done(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q); 825e0d3bafdSSri Deevi u32 cx231xx_copy_video_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q, 826e0d3bafdSSri Deevi u8 *p_line, u32 length, int field_number); 827e0d3bafdSSri Deevi u32 cx231xx_get_video_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q, 828e0d3bafdSSri Deevi u8 sav_eav, u8 *p_buffer, u32 buffer_size); 829e0d3bafdSSri Deevi void cx231xx_swab(u16 *from, u16 *to, u16 len); 830e0d3bafdSSri Deevi 831e0d3bafdSSri Deevi /* Provided by cx231xx-core.c */ 832e0d3bafdSSri Deevi 833e0d3bafdSSri Deevi u32 cx231xx_request_buffers(struct cx231xx *dev, u32 count); 834e0d3bafdSSri Deevi void cx231xx_queue_unusedframes(struct cx231xx *dev); 835e0d3bafdSSri Deevi void cx231xx_release_buffers(struct cx231xx *dev); 836e0d3bafdSSri Deevi 837e0d3bafdSSri Deevi /* read from control pipe */ 838e0d3bafdSSri Deevi int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg, 839e0d3bafdSSri Deevi char *buf, int len); 840e0d3bafdSSri Deevi 841e0d3bafdSSri Deevi /* write to control pipe */ 842e0d3bafdSSri Deevi int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg, 843e0d3bafdSSri Deevi char *buf, int len); 844e0d3bafdSSri Deevi int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode); 845e0d3bafdSSri Deevi 846b9255176SSri Deevi int cx231xx_send_vendor_cmd(struct cx231xx *dev, 847b9255176SSri Deevi struct VENDOR_REQUEST_IN *ven_req); 848e0d3bafdSSri Deevi int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus, 849e0d3bafdSSri Deevi struct cx231xx_i2c_xfer_data *req_data); 850e0d3bafdSSri Deevi 851e0d3bafdSSri Deevi /* Gpio related functions */ 852e0d3bafdSSri Deevi int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val, 853e0d3bafdSSri Deevi u8 len, u8 request, u8 direction); 854e0d3bafdSSri Deevi int cx231xx_set_gpio_value(struct cx231xx *dev, int pin_number, int pin_value); 85584b5dbf3SMauro Carvalho Chehab int cx231xx_set_gpio_direction(struct cx231xx *dev, int pin_number, 85684b5dbf3SMauro Carvalho Chehab int pin_value); 857e0d3bafdSSri Deevi 858e0d3bafdSSri Deevi int cx231xx_gpio_i2c_start(struct cx231xx *dev); 859e0d3bafdSSri Deevi int cx231xx_gpio_i2c_end(struct cx231xx *dev); 860e0d3bafdSSri Deevi int cx231xx_gpio_i2c_write_byte(struct cx231xx *dev, u8 data); 861e0d3bafdSSri Deevi int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 *buf); 862e0d3bafdSSri Deevi int cx231xx_gpio_i2c_read_ack(struct cx231xx *dev); 863e0d3bafdSSri Deevi int cx231xx_gpio_i2c_write_ack(struct cx231xx *dev); 864e0d3bafdSSri Deevi int cx231xx_gpio_i2c_write_nak(struct cx231xx *dev); 865e0d3bafdSSri Deevi 866e0d3bafdSSri Deevi int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len); 867e0d3bafdSSri Deevi int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len); 868e0d3bafdSSri Deevi 869e0d3bafdSSri Deevi /* audio related functions */ 87084b5dbf3SMauro Carvalho Chehab int cx231xx_set_audio_decoder_input(struct cx231xx *dev, 87184b5dbf3SMauro Carvalho Chehab enum AUDIO_INPUT audio_input); 872e0d3bafdSSri Deevi 873e0d3bafdSSri Deevi int cx231xx_capture_start(struct cx231xx *dev, int start, u8 media_type); 874e0d3bafdSSri Deevi int cx231xx_set_video_alternate(struct cx231xx *dev); 875e0d3bafdSSri Deevi int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt); 87664fbf444SPalash Bandyopadhyay int is_fw_load(struct cx231xx *dev); 87764fbf444SPalash Bandyopadhyay int cx231xx_check_fw(struct cx231xx *dev); 878e0d3bafdSSri Deevi int cx231xx_init_isoc(struct cx231xx *dev, int max_packets, 879e0d3bafdSSri Deevi int num_bufs, int max_pkt_size, 88084b5dbf3SMauro Carvalho Chehab int (*isoc_copy) (struct cx231xx *dev, 88184b5dbf3SMauro Carvalho Chehab struct urb *urb)); 88264fbf444SPalash Bandyopadhyay int cx231xx_init_bulk(struct cx231xx *dev, int max_packets, 88364fbf444SPalash Bandyopadhyay int num_bufs, int max_pkt_size, 88464fbf444SPalash Bandyopadhyay int (*bulk_copy) (struct cx231xx *dev, 88564fbf444SPalash Bandyopadhyay struct urb *urb)); 88664fbf444SPalash Bandyopadhyay void cx231xx_stop_TS1(struct cx231xx *dev); 88764fbf444SPalash Bandyopadhyay void cx231xx_start_TS1(struct cx231xx *dev); 888e0d3bafdSSri Deevi void cx231xx_uninit_isoc(struct cx231xx *dev); 88964fbf444SPalash Bandyopadhyay void cx231xx_uninit_bulk(struct cx231xx *dev); 890e0d3bafdSSri Deevi int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode); 89164fbf444SPalash Bandyopadhyay int cx231xx_unmute_audio(struct cx231xx *dev); 89264fbf444SPalash Bandyopadhyay int cx231xx_ep5_bulkout(struct cx231xx *dev, u8 *firmware, u16 size); 89364fbf444SPalash Bandyopadhyay void cx231xx_disable656(struct cx231xx *dev); 89464fbf444SPalash Bandyopadhyay void cx231xx_enable656(struct cx231xx *dev); 89564fbf444SPalash Bandyopadhyay int cx231xx_demod_reset(struct cx231xx *dev); 896e0d3bafdSSri Deevi int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio); 897e0d3bafdSSri Deevi 898e0d3bafdSSri Deevi /* Device list functions */ 899e0d3bafdSSri Deevi void cx231xx_release_resources(struct cx231xx *dev); 900e0d3bafdSSri Deevi void cx231xx_release_analog_resources(struct cx231xx *dev); 901e0d3bafdSSri Deevi int cx231xx_register_analog_devices(struct cx231xx *dev); 902e0d3bafdSSri Deevi void cx231xx_remove_from_devlist(struct cx231xx *dev); 903e0d3bafdSSri Deevi void cx231xx_add_into_devlist(struct cx231xx *dev); 904e0d3bafdSSri Deevi void cx231xx_init_extension(struct cx231xx *dev); 905e0d3bafdSSri Deevi void cx231xx_close_extension(struct cx231xx *dev); 906e0d3bafdSSri Deevi 907e0d3bafdSSri Deevi /* hardware init functions */ 908e0d3bafdSSri Deevi int cx231xx_dev_init(struct cx231xx *dev); 909e0d3bafdSSri Deevi void cx231xx_dev_uninit(struct cx231xx *dev); 910e0d3bafdSSri Deevi void cx231xx_config_i2c(struct cx231xx *dev); 911e0d3bafdSSri Deevi int cx231xx_config(struct cx231xx *dev); 912e0d3bafdSSri Deevi 913e0d3bafdSSri Deevi /* Stream control functions */ 914e0d3bafdSSri Deevi int cx231xx_start_stream(struct cx231xx *dev, u32 ep_mask); 915e0d3bafdSSri Deevi int cx231xx_stop_stream(struct cx231xx *dev, u32 ep_mask); 916e0d3bafdSSri Deevi 917e0d3bafdSSri Deevi int cx231xx_initialize_stream_xfer(struct cx231xx *dev, u32 media_type); 918e0d3bafdSSri Deevi 919e0d3bafdSSri Deevi /* Power control functions */ 9206e4f574bSSri Deevi int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode); 921e0d3bafdSSri Deevi int cx231xx_power_suspend(struct cx231xx *dev); 922e0d3bafdSSri Deevi 923e0d3bafdSSri Deevi /* chip specific control functions */ 924e0d3bafdSSri Deevi int cx231xx_init_ctrl_pin_status(struct cx231xx *dev); 92584b5dbf3SMauro Carvalho Chehab int cx231xx_set_agc_analog_digital_mux_select(struct cx231xx *dev, 92684b5dbf3SMauro Carvalho Chehab u8 analog_or_digital); 927a6f6fb9cSMauro Carvalho Chehab int cx231xx_enable_i2c_port_3(struct cx231xx *dev, bool is_port_3); 928e0d3bafdSSri Deevi 929e0d3bafdSSri Deevi /* video audio decoder related functions */ 930e0d3bafdSSri Deevi void video_mux(struct cx231xx *dev, int index); 931e0d3bafdSSri Deevi int cx231xx_set_video_input_mux(struct cx231xx *dev, u8 input); 932e0d3bafdSSri Deevi int cx231xx_set_decoder_video_input(struct cx231xx *dev, u8 pin_type, u8 input); 933e0d3bafdSSri Deevi int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev); 934e0d3bafdSSri Deevi int cx231xx_set_audio_input(struct cx231xx *dev, u8 input); 935e0d3bafdSSri Deevi 936e0d3bafdSSri Deevi /* Provided by cx231xx-video.c */ 937e0d3bafdSSri Deevi int cx231xx_register_extension(struct cx231xx_ops *dev); 938e0d3bafdSSri Deevi void cx231xx_unregister_extension(struct cx231xx_ops *dev); 939e0d3bafdSSri Deevi void cx231xx_init_extension(struct cx231xx *dev); 940e0d3bafdSSri Deevi void cx231xx_close_extension(struct cx231xx *dev); 941bc08734cSHans Verkuil int cx231xx_querycap(struct file *file, void *priv, 942bc08734cSHans Verkuil struct v4l2_capability *cap); 943b86d1544SHans Verkuil int cx231xx_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t); 9442f73c7c5SHans Verkuil int cx231xx_s_tuner(struct file *file, void *priv, const struct v4l2_tuner *t); 945b86d1544SHans Verkuil int cx231xx_g_frequency(struct file *file, void *priv, 946b86d1544SHans Verkuil struct v4l2_frequency *f); 947b86d1544SHans Verkuil int cx231xx_s_frequency(struct file *file, void *priv, 948b530a447SHans Verkuil const struct v4l2_frequency *f); 949b86d1544SHans Verkuil int cx231xx_enum_input(struct file *file, void *priv, 950b86d1544SHans Verkuil struct v4l2_input *i); 951b86d1544SHans Verkuil int cx231xx_g_input(struct file *file, void *priv, unsigned int *i); 952b86d1544SHans Verkuil int cx231xx_s_input(struct file *file, void *priv, unsigned int i); 95308fe9f7dSHans Verkuil int cx231xx_g_chip_info(struct file *file, void *fh, struct v4l2_dbg_chip_info *chip); 954b86d1544SHans Verkuil int cx231xx_g_register(struct file *file, void *priv, 955b86d1544SHans Verkuil struct v4l2_dbg_register *reg); 956b86d1544SHans Verkuil int cx231xx_s_register(struct file *file, void *priv, 957977ba3b1SHans Verkuil const struct v4l2_dbg_register *reg); 958e0d3bafdSSri Deevi 959e0d3bafdSSri Deevi /* Provided by cx231xx-cards.c */ 960e0d3bafdSSri Deevi extern void cx231xx_pre_card_setup(struct cx231xx *dev); 961e0d3bafdSSri Deevi extern void cx231xx_card_setup(struct cx231xx *dev); 962e0d3bafdSSri Deevi extern struct cx231xx_board cx231xx_boards[]; 963e0d3bafdSSri Deevi extern struct usb_device_id cx231xx_id_table[]; 964e0d3bafdSSri Deevi extern const unsigned int cx231xx_bcount; 965e0d3bafdSSri Deevi int cx231xx_tuner_callback(void *ptr, int component, int command, int arg); 966e0d3bafdSSri Deevi 96764fbf444SPalash Bandyopadhyay /* cx23885-417.c */ 96864fbf444SPalash Bandyopadhyay extern int cx231xx_417_register(struct cx231xx *dev); 96964fbf444SPalash Bandyopadhyay extern void cx231xx_417_unregister(struct cx231xx *dev); 97064fbf444SPalash Bandyopadhyay 9719ab66912SMauro Carvalho Chehab /* cx23885-input.c */ 9729ab66912SMauro Carvalho Chehab 9739ab66912SMauro Carvalho Chehab #if defined(CONFIG_VIDEO_CX231XX_RC) 9749ab66912SMauro Carvalho Chehab int cx231xx_ir_init(struct cx231xx *dev); 9759ab66912SMauro Carvalho Chehab void cx231xx_ir_exit(struct cx231xx *dev); 9769ab66912SMauro Carvalho Chehab #else 9779ab66912SMauro Carvalho Chehab #define cx231xx_ir_init(dev) (0) 9789ab66912SMauro Carvalho Chehab #define cx231xx_ir_exit(dev) (0) 9799ab66912SMauro Carvalho Chehab #endif 9809ab66912SMauro Carvalho Chehab 9819ab66912SMauro Carvalho Chehab 982e0d3bafdSSri Deevi /* printk macros */ 983e0d3bafdSSri Deevi 984e0d3bafdSSri Deevi #define cx231xx_err(fmt, arg...) do {\ 985e0d3bafdSSri Deevi printk(KERN_ERR fmt , ##arg); } while (0) 986e0d3bafdSSri Deevi 987e0d3bafdSSri Deevi #define cx231xx_errdev(fmt, arg...) do {\ 988e0d3bafdSSri Deevi printk(KERN_ERR "%s: "fmt,\ 989e0d3bafdSSri Deevi dev->name , ##arg); } while (0) 990e0d3bafdSSri Deevi 991e0d3bafdSSri Deevi #define cx231xx_info(fmt, arg...) do {\ 992e0d3bafdSSri Deevi printk(KERN_INFO "%s: "fmt,\ 993e0d3bafdSSri Deevi dev->name , ##arg); } while (0) 994e0d3bafdSSri Deevi #define cx231xx_warn(fmt, arg...) do {\ 995e0d3bafdSSri Deevi printk(KERN_WARNING "%s: "fmt,\ 996e0d3bafdSSri Deevi dev->name , ##arg); } while (0) 997e0d3bafdSSri Deevi 998e0d3bafdSSri Deevi static inline unsigned int norm_maxw(struct cx231xx *dev) 999e0d3bafdSSri Deevi { 1000e0d3bafdSSri Deevi if (dev->board.max_range_640_480) 1001e0d3bafdSSri Deevi return 640; 1002e0d3bafdSSri Deevi else 1003e0d3bafdSSri Deevi return 720; 1004e0d3bafdSSri Deevi } 1005e0d3bafdSSri Deevi 1006e0d3bafdSSri Deevi static inline unsigned int norm_maxh(struct cx231xx *dev) 1007e0d3bafdSSri Deevi { 1008e0d3bafdSSri Deevi if (dev->board.max_range_640_480) 1009e0d3bafdSSri Deevi return 480; 1010e0d3bafdSSri Deevi else 1011e0d3bafdSSri Deevi return (dev->norm & V4L2_STD_625_50) ? 576 : 480; 1012e0d3bafdSSri Deevi } 1013e0d3bafdSSri Deevi #endif 1014