[media] cx231xx: Added support for Carraera, Shelby, RDx_253S and VIDEO_GRABBER
authorPalash Bandyopadhyay <palash.bandyopadhyay@conexant.com>
Tue, 6 Jul 2010 21:12:25 +0000 (18:12 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 21 Oct 2010 03:17:10 +0000 (01:17 -0200)
Added support for new cx231xx boards - Carraera, Shelby, RDx_253S and
VIDEO_GRABBER.

[mchehab@redhat.com: Fix a merge conflict with BKL removal patches]
Signed-off-by: Palash Bandyopadhyay <palash.bandyopadhyay@conexant.com>
Signed-off-by: Devin Heitmueller <dheitmueller@hauppauge.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
15 files changed:
drivers/media/video/cx231xx/Makefile
drivers/media/video/cx231xx/cx231xx-417.c [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-audio.c
drivers/media/video/cx231xx/cx231xx-avcore.c
drivers/media/video/cx231xx/cx231xx-cards.c
drivers/media/video/cx231xx/cx231xx-conf-reg.h
drivers/media/video/cx231xx/cx231xx-core.c
drivers/media/video/cx231xx/cx231xx-dif.h [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-dvb.c
drivers/media/video/cx231xx/cx231xx-i2c.c
drivers/media/video/cx231xx/cx231xx-input.c
drivers/media/video/cx231xx/cx231xx-vbi.c
drivers/media/video/cx231xx/cx231xx-vbi.h
drivers/media/video/cx231xx/cx231xx-video.c
drivers/media/video/cx231xx/cx231xx.h

index 6f2b573..a6bc4cc 100644 (file)
@@ -1,5 +1,5 @@
 cx231xx-objs     := cx231xx-video.o cx231xx-i2c.o cx231xx-cards.o cx231xx-core.o \
-                   cx231xx-avcore.o cx231xx-pcb-cfg.o cx231xx-vbi.o
+                   cx231xx-avcore.o cx231xx-417.o cx231xx-pcb-cfg.o cx231xx-vbi.o
 
 cx231xx-alsa-objs := cx231xx-audio.o
 
diff --git a/drivers/media/video/cx231xx/cx231xx-417.c b/drivers/media/video/cx231xx/cx231xx-417.c
new file mode 100644 (file)
index 0000000..d0e0d71
--- /dev/null
@@ -0,0 +1,2230 @@
+/*
+ *
+ *  Support for a cx23417 mpeg encoder via cx231xx host port.
+ *
+ *    (c) 2004 Jelle Foks <jelle@foks.us>
+ *    (c) 2004 Gerd Knorr <kraxel@bytesex.org>
+ *    (c) 2008 Steven Toth <stoth@linuxtv.org>
+ *      - CX23885/7/8 support
+ *
+ *  Includes parts from the ivtv driver( http://ivtv.sourceforge.net/),
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/init.h>
+#include <linux/fs.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/firmware.h>
+#include <linux/smp_lock.h>
+#include <media/v4l2-common.h>
+#include <media/v4l2-ioctl.h>
+#include <media/cx2341x.h>
+#include <linux/usb.h>
+
+#include "cx231xx.h"
+/*#include "cx23885-ioctl.h"*/
+
+#define CX231xx_FIRM_IMAGE_SIZE 376836
+#define CX231xx_FIRM_IMAGE_NAME "v4l-cx23885-enc.fw"
+
+/* for polaris ITVC*/
+#define ITVC_WRITE_DIR          0x03FDFC00
+#define ITVC_READ_DIR            0x0001FC00
+
+#define  MCI_MEMORY_DATA_BYTE0          0x00
+#define  MCI_MEMORY_DATA_BYTE1          0x08
+#define  MCI_MEMORY_DATA_BYTE2          0x10
+#define  MCI_MEMORY_DATA_BYTE3          0x18
+
+#define  MCI_MEMORY_ADDRESS_BYTE2       0x20
+#define  MCI_MEMORY_ADDRESS_BYTE1       0x28
+#define  MCI_MEMORY_ADDRESS_BYTE0       0x30
+
+#define  MCI_REGISTER_DATA_BYTE0        0x40
+#define  MCI_REGISTER_DATA_BYTE1        0x48
+#define  MCI_REGISTER_DATA_BYTE2        0x50
+#define  MCI_REGISTER_DATA_BYTE3        0x58
+
+#define  MCI_REGISTER_ADDRESS_BYTE0     0x60
+#define  MCI_REGISTER_ADDRESS_BYTE1     0x68
+
+#define  MCI_REGISTER_MODE              0x70
+
+/*Read and write modes
+ for polaris ITVC*/
+#define  MCI_MODE_REGISTER_READ         0x000
+#define  MCI_MODE_REGISTER_WRITE        0x100
+#define  MCI_MODE_MEMORY_READ           0x000
+#define  MCI_MODE_MEMORY_WRITE          0x4000
+
+static unsigned int mpegbufs = 8;
+module_param(mpegbufs, int, 0644);
+MODULE_PARM_DESC(mpegbufs, "number of mpeg buffers, range 2-32");
+static unsigned int mpeglines = 128;
+module_param(mpeglines, int, 0644);
+MODULE_PARM_DESC(mpeglines, "number of lines in an MPEG buffer, range 2-32");
+static unsigned int mpeglinesize = 512;
+module_param(mpeglinesize, int, 0644);
+MODULE_PARM_DESC(mpeglinesize,
+       "number of bytes in each line of an MPEG buffer, range 512-1024");
+
+static unsigned int v4l_debug = 1;
+module_param(v4l_debug, int, 0644);
+MODULE_PARM_DESC(v4l_debug, "enable V4L debug messages");
+struct cx231xx_dmaqueue *dma_qq;
+#define dprintk(level, fmt, arg...)\
+       do { if (v4l_debug >= level) \
+               printk(KERN_INFO "%s: " fmt, \
+               (dev) ? dev->name : "cx231xx[?]", ## arg); \
+       } while (0)
+
+static struct cx231xx_tvnorm cx231xx_tvnorms[] = {
+       {
+               .name      = "NTSC-M",
+               .id        = V4L2_STD_NTSC_M,
+       }, {
+               .name      = "NTSC-JP",
+               .id        = V4L2_STD_NTSC_M_JP,
+       }, {
+               .name      = "PAL-BG",
+               .id        = V4L2_STD_PAL_BG,
+       }, {
+               .name      = "PAL-DK",
+               .id        = V4L2_STD_PAL_DK,
+       }, {
+               .name      = "PAL-I",
+               .id        = V4L2_STD_PAL_I,
+       }, {
+               .name      = "PAL-M",
+               .id        = V4L2_STD_PAL_M,
+       }, {
+               .name      = "PAL-N",
+               .id        = V4L2_STD_PAL_N,
+       }, {
+               .name      = "PAL-Nc",
+               .id        = V4L2_STD_PAL_Nc,
+       }, {
+               .name      = "PAL-60",
+               .id        = V4L2_STD_PAL_60,
+       }, {
+               .name      = "SECAM-L",
+               .id        = V4L2_STD_SECAM_L,
+       }, {
+               .name      = "SECAM-DK",
+               .id        = V4L2_STD_SECAM_DK,
+       }
+};
+
+/* ------------------------------------------------------------------ */
+enum cx231xx_capture_type {
+       CX231xx_MPEG_CAPTURE,
+       CX231xx_RAW_CAPTURE,
+       CX231xx_RAW_PASSTHRU_CAPTURE
+};
+enum cx231xx_capture_bits {
+       CX231xx_RAW_BITS_NONE             = 0x00,
+       CX231xx_RAW_BITS_YUV_CAPTURE      = 0x01,
+       CX231xx_RAW_BITS_PCM_CAPTURE      = 0x02,
+       CX231xx_RAW_BITS_VBI_CAPTURE      = 0x04,
+       CX231xx_RAW_BITS_PASSTHRU_CAPTURE = 0x08,
+       CX231xx_RAW_BITS_TO_HOST_CAPTURE  = 0x10
+};
+enum cx231xx_capture_end {
+       CX231xx_END_AT_GOP, /* stop at the end of gop, generate irq */
+       CX231xx_END_NOW, /* stop immediately, no irq */
+};
+enum cx231xx_framerate {
+       CX231xx_FRAMERATE_NTSC_30, /* NTSC: 30fps */
+       CX231xx_FRAMERATE_PAL_25   /* PAL: 25fps */
+};
+enum cx231xx_stream_port {
+       CX231xx_OUTPUT_PORT_MEMORY,
+       CX231xx_OUTPUT_PORT_STREAMING,
+       CX231xx_OUTPUT_PORT_SERIAL
+};
+enum cx231xx_data_xfer_status {
+       CX231xx_MORE_BUFFERS_FOLLOW,
+       CX231xx_LAST_BUFFER,
+};
+enum cx231xx_picture_mask {
+       CX231xx_PICTURE_MASK_NONE,
+       CX231xx_PICTURE_MASK_I_FRAMES,
+       CX231xx_PICTURE_MASK_I_P_FRAMES = 0x3,
+       CX231xx_PICTURE_MASK_ALL_FRAMES = 0x7,
+};
+enum cx231xx_vbi_mode_bits {
+       CX231xx_VBI_BITS_SLICED,
+       CX231xx_VBI_BITS_RAW,
+};
+enum cx231xx_vbi_insertion_bits {
+       CX231xx_VBI_BITS_INSERT_IN_XTENSION_USR_DATA,
+       CX231xx_VBI_BITS_INSERT_IN_PRIVATE_PACKETS = 0x1 << 1,
+       CX231xx_VBI_BITS_SEPARATE_STREAM = 0x2 << 1,
+       CX231xx_VBI_BITS_SEPARATE_STREAM_USR_DATA = 0x4 << 1,
+       CX231xx_VBI_BITS_SEPARATE_STREAM_PRV_DATA = 0x5 << 1,
+};
+enum cx231xx_dma_unit {
+       CX231xx_DMA_BYTES,
+       CX231xx_DMA_FRAMES,
+};
+enum cx231xx_dma_transfer_status_bits {
+       CX231xx_DMA_TRANSFER_BITS_DONE = 0x01,
+       CX231xx_DMA_TRANSFER_BITS_ERROR = 0x04,
+       CX231xx_DMA_TRANSFER_BITS_LL_ERROR = 0x10,
+};
+enum cx231xx_pause {
+       CX231xx_PAUSE_ENCODING,
+       CX231xx_RESUME_ENCODING,
+};
+enum cx231xx_copyright {
+       CX231xx_COPYRIGHT_OFF,
+       CX231xx_COPYRIGHT_ON,
+};
+enum cx231xx_notification_type {
+       CX231xx_NOTIFICATION_REFRESH,
+};
+enum cx231xx_notification_status {
+       CX231xx_NOTIFICATION_OFF,
+       CX231xx_NOTIFICATION_ON,
+};
+enum cx231xx_notification_mailbox {
+       CX231xx_NOTIFICATION_NO_MAILBOX = -1,
+};
+enum cx231xx_field1_lines {
+       CX231xx_FIELD1_SAA7114 = 0x00EF, /* 239 */
+       CX231xx_FIELD1_SAA7115 = 0x00F0, /* 240 */
+       CX231xx_FIELD1_MICRONAS = 0x0105, /* 261 */
+};
+enum cx231xx_field2_lines {
+       CX231xx_FIELD2_SAA7114 = 0x00EF, /* 239 */
+       CX231xx_FIELD2_SAA7115 = 0x00F0, /* 240 */
+       CX231xx_FIELD2_MICRONAS = 0x0106, /* 262 */
+};
+enum cx231xx_custom_data_type {
+       CX231xx_CUSTOM_EXTENSION_USR_DATA,
+       CX231xx_CUSTOM_PRIVATE_PACKET,
+};
+enum cx231xx_mute {
+       CX231xx_UNMUTE,
+       CX231xx_MUTE,
+};
+enum cx231xx_mute_video_mask {
+       CX231xx_MUTE_VIDEO_V_MASK = 0x0000FF00,
+       CX231xx_MUTE_VIDEO_U_MASK = 0x00FF0000,
+       CX231xx_MUTE_VIDEO_Y_MASK = 0xFF000000,
+};
+enum cx231xx_mute_video_shift {
+       CX231xx_MUTE_VIDEO_V_SHIFT = 8,
+       CX231xx_MUTE_VIDEO_U_SHIFT = 16,
+       CX231xx_MUTE_VIDEO_Y_SHIFT = 24,
+};
+
+/* defines below are from ivtv-driver.h */
+#define IVTV_CMD_HW_BLOCKS_RST 0xFFFFFFFF
+
+/* Firmware API commands */
+#define IVTV_API_STD_TIMEOUT 500
+
+/* Registers */
+/* IVTV_REG_OFFSET */
+#define IVTV_REG_ENC_SDRAM_REFRESH (0x07F8)
+#define IVTV_REG_ENC_SDRAM_PRECHARGE (0x07FC)
+#define IVTV_REG_SPU (0x9050)
+#define IVTV_REG_HW_BLOCKS (0x9054)
+#define IVTV_REG_VPU (0x9058)
+#define IVTV_REG_APU (0xA064)
+
+/**** Bit definitions for MC417_RWD and MC417_OEN registers  ***
+  bits 31-16
++-----------+
+| Reserved  |
++-----------+
+  bit 15  bit 14  bit 13 bit 12  bit 11  bit 10  bit 9   bit 8
++-------+-------+-------+-------+-------+-------+-------+-------+
+| MIWR# | MIRD# | MICS# |MIRDY# |MIADDR3|MIADDR2|MIADDR1|MIADDR0|
++-------+-------+-------+-------+-------+-------+-------+-------+
+ bit 7   bit 6   bit 5   bit 4   bit 3   bit 2   bit 1   bit 0
++-------+-------+-------+-------+-------+-------+-------+-------+
+|MIDATA7|MIDATA6|MIDATA5|MIDATA4|MIDATA3|MIDATA2|MIDATA1|MIDATA0|
++-------+-------+-------+-------+-------+-------+-------+-------+
+***/
+#define MC417_MIWR     0x8000
+#define MC417_MIRD     0x4000
+#define MC417_MICS     0x2000
+#define MC417_MIRDY    0x1000
+#define MC417_MIADDR   0x0F00
+#define MC417_MIDATA   0x00FF
+
+
+/*** Bit definitions for MC417_CTL register ****
+ bits 31-6   bits 5-4   bit 3    bits 2-1       Bit 0
++--------+-------------+--------+--------------+------------+
+|Reserved|MC417_SPD_CTL|Reserved|MC417_GPIO_SEL|UART_GPIO_EN|
++--------+-------------+--------+--------------+------------+
+***/
+#define MC417_SPD_CTL(x)       (((x) << 4) & 0x00000030)
+#define MC417_GPIO_SEL(x)      (((x) << 1) & 0x00000006)
+#define MC417_UART_GPIO_EN     0x00000001
+
+/* Values for speed control */
+#define MC417_SPD_CTL_SLOW     0x1
+#define MC417_SPD_CTL_MEDIUM   0x0
+#define MC417_SPD_CTL_FAST     0x3     /* b'1x, but we use b'11 */
+
+/* Values for GPIO select */
+#define MC417_GPIO_SEL_GPIO3   0x3
+#define MC417_GPIO_SEL_GPIO2   0x2
+#define MC417_GPIO_SEL_GPIO1   0x1
+#define MC417_GPIO_SEL_GPIO0   0x0
+
+
+#define CX23417_GPIO_MASK 0xFC0003FF
+int setITVCReg(struct cx231xx *dev, u32 gpio_direction, u32 value)
+{
+       int status = 0;
+       u32 _gpio_direction = 0;
+
+       _gpio_direction = _gpio_direction & CX23417_GPIO_MASK;
+       _gpio_direction = _gpio_direction|gpio_direction;
+       status = cx231xx_send_gpio_cmd(dev, _gpio_direction,
+                        (u8 *)&value, 4, 0, 0);
+       return status;
+}
+int getITVCReg(struct cx231xx *dev, u32 gpio_direction, u32 *pValue)
+{
+       int status = 0;
+       u32 _gpio_direction = 0;
+
+       _gpio_direction = _gpio_direction & CX23417_GPIO_MASK;
+       _gpio_direction = _gpio_direction|gpio_direction;
+
+       status = cx231xx_send_gpio_cmd(dev, _gpio_direction,
+                (u8 *)pValue, 4, 0, 1);
+       return status;
+}
+int waitForMciComplete(struct cx231xx *dev)
+{
+    u32 gpio;
+    u32 gpio_driection = 0;
+    u8 count = 0;
+    getITVCReg(dev, gpio_driection, &gpio);
+
+    while (!(gpio&0x020000)) {
+       msleep(10);
+
+       getITVCReg(dev, gpio_driection, &gpio);
+
+       if (count++ > 100) {
+               dprintk(3, "ERROR: Timeout - gpio=%x\n", gpio);
+               return -1;
+       }
+    }
+       return 0;
+}
+int mc417_register_write(struct cx231xx *dev, u16 address, u32 value)
+{
+    u32 temp;
+       int status = 0;
+
+    temp = 0x82|MCI_REGISTER_DATA_BYTE0|((value&0x000000FF)<<8);
+    temp = temp<<10;
+    status = setITVCReg(dev, ITVC_WRITE_DIR, temp);
+       if (status < 0)
+               return status;
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*write data byte 1;*/
+    temp = 0x82|MCI_REGISTER_DATA_BYTE1|(value&0x0000FF00);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*write data byte 2;*/
+    temp = 0x82|MCI_REGISTER_DATA_BYTE2|((value&0x00FF0000)>>8);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*write data byte 3;*/
+    temp = 0x82|MCI_REGISTER_DATA_BYTE3|((value&0xFF000000)>>16);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*write address byte 0;*/
+    temp = 0x82|MCI_REGISTER_ADDRESS_BYTE0|((address&0x000000FF)<<8);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*write address byte 1;*/
+    temp = 0x82|MCI_REGISTER_ADDRESS_BYTE1|(address&0x0000FF00);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*Write that the mode is write.*/
+    temp = 0x82 | MCI_REGISTER_MODE | MCI_MODE_REGISTER_WRITE;
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    return waitForMciComplete(dev);
+
+}
+
+
+int mc417_register_read(struct cx231xx *dev, u16 address, u32 *value)
+{
+    /*write address byte 0;*/
+    u32 temp;
+    u32 return_value = 0;
+       int ret = 0;
+
+    temp = 0x82|MCI_REGISTER_ADDRESS_BYTE0|((address&0x00FF)<<8);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*write address byte 1;*/
+    temp = 0x82|MCI_REGISTER_ADDRESS_BYTE1|(address&0xFF00);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*write that the mode is read;*/
+    temp = 0x82 | MCI_REGISTER_MODE | MCI_MODE_REGISTER_READ;
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*wait for the MIRDY line to be asserted ,
+               signalling that the read is done;*/
+    ret = waitForMciComplete(dev);
+
+
+    /*switch the DATA- GPIO to input mode;*/
+
+    /*Read data byte 0;*/
+    temp = (0x82|MCI_REGISTER_DATA_BYTE0)<<10;
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    temp = ((0x81|MCI_REGISTER_DATA_BYTE0)<<10);
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    getITVCReg(dev, ITVC_READ_DIR, &temp);
+    return_value |= ((temp&0x03FC0000)>>18);
+    setITVCReg(dev, ITVC_READ_DIR, (0x87<<10));
+
+    /* Read data byte 1;*/
+    temp = (0x82|MCI_REGISTER_DATA_BYTE1)<<10;
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    temp = ((0x81|MCI_REGISTER_DATA_BYTE1)<<10);
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    getITVCReg(dev, ITVC_READ_DIR, &temp);
+
+    return_value |= ((temp&0x03FC0000)>>10);
+    setITVCReg(dev, ITVC_READ_DIR, (0x87<<10));
+
+    /*Read data byte 2;*/
+    temp = (0x82|MCI_REGISTER_DATA_BYTE2)<<10;
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    temp = ((0x81|MCI_REGISTER_DATA_BYTE2)<<10);
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    getITVCReg(dev, ITVC_READ_DIR, &temp);
+    return_value |= ((temp&0x03FC0000)>>2);
+    setITVCReg(dev, ITVC_READ_DIR, (0x87<<10));
+
+    /*Read data byte 3;*/
+    temp = (0x82|MCI_REGISTER_DATA_BYTE3)<<10;
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    temp = ((0x81|MCI_REGISTER_DATA_BYTE3)<<10);
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    getITVCReg(dev, ITVC_READ_DIR, &temp);
+    return_value |= ((temp&0x03FC0000)<<6);
+    setITVCReg(dev, ITVC_READ_DIR, (0x87<<10));
+
+       *value  = return_value;
+
+
+    return ret;
+}
+
+int mc417_memory_write(struct cx231xx *dev, u32 address, u32 value)
+{
+
+    /*write data byte 0;*/
+
+    u32 temp;
+       int ret = 0;
+
+    temp = 0x82|MCI_MEMORY_DATA_BYTE0|((value&0x000000FF)<<8);
+    temp = temp<<10;
+    ret = setITVCReg(dev, ITVC_WRITE_DIR, temp);
+       if (ret < 0)
+               return ret;
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*write data byte 1;*/
+    temp = 0x82|MCI_MEMORY_DATA_BYTE1|(value&0x0000FF00);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*write data byte 2;*/
+    temp = 0x82|MCI_MEMORY_DATA_BYTE2|((value&0x00FF0000)>>8);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*write data byte 3;*/
+    temp = 0x82|MCI_MEMORY_DATA_BYTE3|((value&0xFF000000)>>16);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /* write address byte 2;*/
+    temp = 0x82|MCI_MEMORY_ADDRESS_BYTE2 | MCI_MODE_MEMORY_WRITE |
+               ((address & 0x003F0000)>>8);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /* write address byte 1;*/
+    temp = 0x82|MCI_MEMORY_ADDRESS_BYTE1 | (address & 0xFF00);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /* write address byte 0;*/
+    temp = 0x82|MCI_MEMORY_ADDRESS_BYTE0|((address & 0x00FF)<<8);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*wait for MIRDY line;*/
+    waitForMciComplete(dev);
+
+return 0;
+
+}
+
+int mc417_memory_read(struct cx231xx *dev, u32 address, u32 *value)
+{
+
+    u32 temp = 0;
+    u32 return_value = 0;
+       int ret = 0;
+
+    /*write address byte 2;*/
+    temp = 0x82|MCI_MEMORY_ADDRESS_BYTE2 | MCI_MODE_MEMORY_READ |
+               ((address & 0x003F0000)>>8);
+    temp = temp<<10;
+    ret = setITVCReg(dev, ITVC_WRITE_DIR, temp);
+       if (ret < 0)
+               return ret;
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*write address byte 1*/
+    temp = 0x82|MCI_MEMORY_ADDRESS_BYTE1 | (address & 0xFF00);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*write address byte 0*/
+    temp = 0x82|MCI_MEMORY_ADDRESS_BYTE0 | ((address & 0x00FF)<<8);
+    temp = temp<<10;
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+    temp = temp|((0x05)<<10);
+    setITVCReg(dev, ITVC_WRITE_DIR, temp);
+
+    /*Wait for MIRDY line*/
+    ret = waitForMciComplete(dev);
+
+
+    /*Read data byte 3;*/
+     temp = (0x82|MCI_MEMORY_DATA_BYTE3)<<10;
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    temp = ((0x81|MCI_MEMORY_DATA_BYTE3)<<10);
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    getITVCReg(dev, ITVC_READ_DIR, &temp);
+    return_value |= ((temp&0x03FC0000)<<6);
+    setITVCReg(dev, ITVC_READ_DIR, (0x87<<10));
+
+    /*Read data byte 2;*/
+    temp = (0x82|MCI_MEMORY_DATA_BYTE2)<<10;
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    temp = ((0x81|MCI_MEMORY_DATA_BYTE2)<<10);
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    getITVCReg(dev, ITVC_READ_DIR, &temp);
+    return_value |= ((temp&0x03FC0000)>>2);
+    setITVCReg(dev, ITVC_READ_DIR, (0x87<<10));
+
+    /* Read data byte 1;*/
+    temp = (0x82|MCI_MEMORY_DATA_BYTE1)<<10;
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    temp = ((0x81|MCI_MEMORY_DATA_BYTE1)<<10);
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    getITVCReg(dev, ITVC_READ_DIR, &temp);
+    return_value |= ((temp&0x03FC0000)>>10);
+    setITVCReg(dev, ITVC_READ_DIR, (0x87<<10));
+
+    /*Read data byte 0;*/
+    temp = (0x82|MCI_MEMORY_DATA_BYTE0)<<10;
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    temp = ((0x81|MCI_MEMORY_DATA_BYTE0)<<10);
+    setITVCReg(dev, ITVC_READ_DIR, temp);
+    getITVCReg(dev, ITVC_READ_DIR, &temp);
+    return_value |= ((temp&0x03FC0000)>>18);
+    setITVCReg(dev, ITVC_READ_DIR, (0x87<<10));
+
+       *value  = return_value;
+    return ret;
+}
+
+void mc417_gpio_set(struct cx231xx *dev, u32 mask)
+{
+       u32 val;
+
+       /* Set the gpio value */
+       mc417_register_read(dev, 0x900C, &val);
+       val |= (mask & 0x000ffff);
+       mc417_register_write(dev, 0x900C, val);
+}
+
+void mc417_gpio_clear(struct cx231xx *dev, u32 mask)
+{
+       u32 val;
+
+       /* Clear the gpio value */
+       mc417_register_read(dev, 0x900C, &val);
+       val &= ~(mask & 0x0000ffff);
+       mc417_register_write(dev, 0x900C, val);
+}
+
+void mc417_gpio_enable(struct cx231xx *dev, u32 mask, int asoutput)
+{
+       u32 val;
+
+       /* Enable GPIO direction bits */
+       mc417_register_read(dev, 0x9020, &val);
+       if (asoutput)
+               val |= (mask & 0x0000ffff);
+       else
+               val &= ~(mask & 0x0000ffff);
+
+       mc417_register_write(dev, 0x9020, val);
+}
+/* ------------------------------------------------------------------ */
+
+/* MPEG encoder API */
+static char *cmd_to_str(int cmd)
+{
+       switch (cmd) {
+       case CX2341X_ENC_PING_FW:
+               return  "PING_FW";
+       case CX2341X_ENC_START_CAPTURE:
+               return  "START_CAPTURE";
+       case CX2341X_ENC_STOP_CAPTURE:
+               return  "STOP_CAPTURE";
+       case CX2341X_ENC_SET_AUDIO_ID:
+               return  "SET_AUDIO_ID";
+       case CX2341X_ENC_SET_VIDEO_ID:
+               return  "SET_VIDEO_ID";
+       case CX2341X_ENC_SET_PCR_ID:
+               return  "SET_PCR_PID";
+       case CX2341X_ENC_SET_FRAME_RATE:
+               return  "SET_FRAME_RATE";
+       case CX2341X_ENC_SET_FRAME_SIZE:
+               return  "SET_FRAME_SIZE";
+       case CX2341X_ENC_SET_BIT_RATE:
+               return  "SET_BIT_RATE";
+       case CX2341X_ENC_SET_GOP_PROPERTIES:
+               return  "SET_GOP_PROPERTIES";
+       case CX2341X_ENC_SET_ASPECT_RATIO:
+               return  "SET_ASPECT_RATIO";
+       case CX2341X_ENC_SET_DNR_FILTER_MODE:
+               return  "SET_DNR_FILTER_PROPS";
+       case CX2341X_ENC_SET_DNR_FILTER_PROPS:
+               return  "SET_DNR_FILTER_PROPS";
+       case CX2341X_ENC_SET_CORING_LEVELS:
+               return  "SET_CORING_LEVELS";
+       case CX2341X_ENC_SET_SPATIAL_FILTER_TYPE:
+               return  "SET_SPATIAL_FILTER_TYPE";
+       case CX2341X_ENC_SET_VBI_LINE:
+               return  "SET_VBI_LINE";
+       case CX2341X_ENC_SET_STREAM_TYPE:
+               return  "SET_STREAM_TYPE";
+       case CX2341X_ENC_SET_OUTPUT_PORT:
+               return  "SET_OUTPUT_PORT";
+       case CX2341X_ENC_SET_AUDIO_PROPERTIES:
+               return  "SET_AUDIO_PROPERTIES";
+       case CX2341X_ENC_HALT_FW:
+               return  "HALT_FW";
+       case CX2341X_ENC_GET_VERSION:
+               return  "GET_VERSION";
+       case CX2341X_ENC_SET_GOP_CLOSURE:
+               return  "SET_GOP_CLOSURE";
+       case CX2341X_ENC_GET_SEQ_END:
+               return  "GET_SEQ_END";
+       case CX2341X_ENC_SET_PGM_INDEX_INFO:
+               return  "SET_PGM_INDEX_INFO";
+       case CX2341X_ENC_SET_VBI_CONFIG:
+               return  "SET_VBI_CONFIG";
+       case CX2341X_ENC_SET_DMA_BLOCK_SIZE:
+               return  "SET_DMA_BLOCK_SIZE";
+       case CX2341X_ENC_GET_PREV_DMA_INFO_MB_10:
+               return  "GET_PREV_DMA_INFO_MB_10";
+       case CX2341X_ENC_GET_PREV_DMA_INFO_MB_9:
+               return  "GET_PREV_DMA_INFO_MB_9";
+       case CX2341X_ENC_SCHED_DMA_TO_HOST:
+               return  "SCHED_DMA_TO_HOST";
+       case CX2341X_ENC_INITIALIZE_INPUT:
+               return  "INITIALIZE_INPUT";
+       case CX2341X_ENC_SET_FRAME_DROP_RATE:
+               return  "SET_FRAME_DROP_RATE";
+       case CX2341X_ENC_PAUSE_ENCODER:
+               return  "PAUSE_ENCODER";
+       case CX2341X_ENC_REFRESH_INPUT:
+               return  "REFRESH_INPUT";
+       case CX2341X_ENC_SET_COPYRIGHT:
+               return  "SET_COPYRIGHT";
+       case CX2341X_ENC_SET_EVENT_NOTIFICATION:
+               return  "SET_EVENT_NOTIFICATION";
+       case CX2341X_ENC_SET_NUM_VSYNC_LINES:
+               return  "SET_NUM_VSYNC_LINES";
+       case CX2341X_ENC_SET_PLACEHOLDER:
+               return  "SET_PLACEHOLDER";
+       case CX2341X_ENC_MUTE_VIDEO:
+               return  "MUTE_VIDEO";
+       case CX2341X_ENC_MUTE_AUDIO:
+               return  "MUTE_AUDIO";
+       case CX2341X_ENC_MISC:
+               return  "MISC";
+       default:
+               return "UNKNOWN";
+       }
+}
+
+static int cx231xx_mbox_func(void *priv,
+                            u32 command,
+                            int in,
+                            int out,
+                            u32 data[CX2341X_MBOX_MAX_DATA])
+{
+       struct cx231xx *dev = priv;
+       unsigned long timeout;
+       u32 value, flag, retval = 0;
+       int i;
+
+       dprintk(3, "%s: command(0x%X) = %s\n", __func__, command,
+               cmd_to_str(command));
+
+       /* this may not be 100% safe if we can't read any memory location
+          without side effects */
+       mc417_memory_read(dev, dev->cx23417_mailbox - 4, &value);
+       if (value != 0x12345678) {
+               dprintk(3,
+                       "Firmware and/or mailbox pointer not initialized "
+                       "or corrupted, signature = 0x%x, cmd = %s\n", value,
+                       cmd_to_str(command));
+               return -1;
+       }
+
+       /* This read looks at 32 bits, but flag is only 8 bits.
+        * Seems we also bail if CMD or TIMEOUT bytes are set???
+        */
+       mc417_memory_read(dev, dev->cx23417_mailbox, &flag);
+       if (flag) {
+               dprintk(3, "ERROR: Mailbox appears to be in use "
+                       "(%x), cmd = %s\n", flag, cmd_to_str(command));
+               return -1;
+       }
+
+       flag |= 1; /* tell 'em we're working on it */
+       mc417_memory_write(dev, dev->cx23417_mailbox, flag);
+
+       /* write command + args + fill remaining with zeros */
+       /* command code */
+       mc417_memory_write(dev, dev->cx23417_mailbox + 1, command);
+       mc417_memory_write(dev, dev->cx23417_mailbox + 3,
+               IVTV_API_STD_TIMEOUT); /* timeout */
+       for (i = 0; i < in; i++) {
+               mc417_memory_write(dev, dev->cx23417_mailbox + 4 + i, data[i]);
+               dprintk(3, "API Input %d = %d\n", i, data[i]);
+       }
+       for (; i < CX2341X_MBOX_MAX_DATA; i++)
+               mc417_memory_write(dev, dev->cx23417_mailbox + 4 + i, 0);
+
+       flag |= 3; /* tell 'em we're done writing */
+       mc417_memory_write(dev, dev->cx23417_mailbox, flag);
+
+       /* wait for firmware to handle the API command */
+       timeout = jiffies + msecs_to_jiffies(10);
+       for (;;) {
+               mc417_memory_read(dev, dev->cx23417_mailbox, &flag);
+               if (0 != (flag & 4))
+                       break;
+               if (time_after(jiffies, timeout)) {
+                       dprintk(3, "ERROR: API Mailbox timeout\n");
+                       return -1;
+               }
+               udelay(10);
+       }
+
+       /* read output values */
+       for (i = 0; i < out; i++) {
+               mc417_memory_read(dev, dev->cx23417_mailbox + 4 + i, data + i);
+               dprintk(3, "API Output %d = %d\n", i, data[i]);
+       }
+
+       mc417_memory_read(dev, dev->cx23417_mailbox + 2, &retval);
+       dprintk(3, "API result = %d\n", retval);
+
+       flag = 0;
+       mc417_memory_write(dev, dev->cx23417_mailbox, flag);
+
+       return retval;
+}
+
+/* We don't need to call the API often, so using just one
+ * mailbox will probably suffice
+ */
+static int cx231xx_api_cmd(struct cx231xx *dev,
+                          u32 command,
+                          u32 inputcnt,
+                          u32 outputcnt,
+                          ...)
+{
+       u32 data[CX2341X_MBOX_MAX_DATA];
+       va_list vargs;
+       int i, err;
+
+       dprintk(3, "%s() cmds = 0x%08x\n", __func__, command);
+
+       va_start(vargs, outputcnt);
+       for (i = 0; i < inputcnt; i++)
+               data[i] = va_arg(vargs, int);
+
+       err = cx231xx_mbox_func(dev, command, inputcnt, outputcnt, data);
+       for (i = 0; i < outputcnt; i++) {
+               int *vptr = va_arg(vargs, int *);
+               *vptr = data[i];
+       }
+       va_end(vargs);
+
+       return err;
+}
+
+static int cx231xx_find_mailbox(struct cx231xx *dev)
+{
+       u32 signature[4] = {
+               0x12345678, 0x34567812, 0x56781234, 0x78123456
+       };
+       int signaturecnt = 0;
+       u32 value;
+       int i;
+       int ret = 0;
+
+       dprintk(2, "%s()\n", __func__);
+
+       for (i = 0; i < 0x100; i++) {/*CX231xx_FIRM_IMAGE_SIZE*/
+               ret = mc417_memory_read(dev, i, &value);
+               if (ret < 0)
+                       return ret;
+               if (value == signature[signaturecnt])
+                       signaturecnt++;
+               else
+                       signaturecnt = 0;
+               if (4 == signaturecnt) {
+                       dprintk(1, "Mailbox signature found at 0x%x\n", i+1);
+                       return i+1;
+               }
+       }
+       dprintk(3, "Mailbox signature values not found!\n");
+       return -1;
+}
+void mciWriteMemoryToGPIO(struct cx231xx *dev, u32 address, u32 value,
+               u32 *p_fw_image)
+{
+
+       u32 temp = 0;
+       int i = 0;
+
+    temp = 0x82|MCI_MEMORY_DATA_BYTE0|((value&0x000000FF)<<8);
+    temp = temp<<10;
+    *p_fw_image = temp;
+    p_fw_image++;
+    temp = temp|((0x05)<<10);
+    *p_fw_image = temp;
+    p_fw_image++;
+
+    /*write data byte 1;*/
+    temp = 0x82|MCI_MEMORY_DATA_BYTE1|(value&0x0000FF00);
+    temp = temp<<10;
+    *p_fw_image = temp;
+    p_fw_image++;
+    temp = temp|((0x05)<<10);
+    *p_fw_image = temp;
+    p_fw_image++;
+
+    /*write data byte 2;*/
+    temp = 0x82|MCI_MEMORY_DATA_BYTE2|((value&0x00FF0000)>>8);
+    temp = temp<<10;
+    *p_fw_image = temp;
+    p_fw_image++;
+    temp = temp|((0x05)<<10);
+    *p_fw_image = temp;
+    p_fw_image++;
+
+    /*write data byte 3;*/
+    temp = 0x82|MCI_MEMORY_DATA_BYTE3|((value&0xFF000000)>>16);
+    temp = temp<<10;
+    *p_fw_image = temp;
+    p_fw_image++;
+    temp = temp|((0x05)<<10);
+    *p_fw_image = temp;
+    p_fw_image++;
+
+    /* write address byte 2;*/
+    temp = 0x82|MCI_MEMORY_ADDRESS_BYTE2 | MCI_MODE_MEMORY_WRITE |
+       ((address & 0x003F0000)>>8);
+    temp = temp<<10;
+    *p_fw_image = temp;
+    p_fw_image++;
+    temp = temp|((0x05)<<10);
+    *p_fw_image = temp;
+    p_fw_image++;
+
+    /* write address byte 1;*/
+    temp = 0x82|MCI_MEMORY_ADDRESS_BYTE1 | (address & 0xFF00);
+    temp = temp<<10;
+    *p_fw_image = temp;
+    p_fw_image++;
+    temp = temp|((0x05)<<10);
+    *p_fw_image = temp;
+    p_fw_image++;
+
+    /* write address byte 0;*/
+    temp = 0x82|MCI_MEMORY_ADDRESS_BYTE0|((address & 0x00FF)<<8);
+    temp = temp<<10;
+    *p_fw_image = temp;
+    p_fw_image++;
+    temp = temp|((0x05)<<10);
+    *p_fw_image = temp;
+    p_fw_image++;
+
+    for (i = 0; i < 6; i++) {
+       *p_fw_image = 0xFFFFFFFF;
+       p_fw_image++;
+       }
+
+}
+
+
+static int cx231xx_load_firmware(struct cx231xx *dev)
+{
+       static const unsigned char magic[8] = {
+               0xa7, 0x0d, 0x00, 0x00, 0x66, 0xbb, 0x55, 0xaa
+       };
+       const struct firmware *firmware;
+       int i, retval = 0;
+       u32 value = 0;
+       u32 gpio_output = 0;
+       /*u32 checksum = 0;*/
+       /*u32 *dataptr;*/
+       u32 transfer_size = 0;
+       u32 fw_data = 0;
+       u32 address = 0;
+       /*u32 current_fw[800];*/
+       u32 *p_current_fw, *p_fw;
+       u32 *p_fw_data;
+       int frame = 0;
+       u16 _buffer_size = 4096;
+       u8 *p_buffer;
+
+       p_current_fw = (u32 *)vmalloc(1884180*4);
+       p_fw = p_current_fw;
+       if (p_current_fw == 0) {
+               dprintk(2, "FAIL!!!\n");
+               return -1;
+       }
+
+       p_buffer = (u8 *)vmalloc(4096);
+       if (p_buffer == 0) {
+               dprintk(2, "FAIL!!!\n");
+               return -1;
+       }
+
+       dprintk(2, "%s()\n", __func__);
+
+       /* Save GPIO settings before reset of APU */
+       retval |= mc417_memory_read(dev, 0x9020, &gpio_output);
+       retval |= mc417_memory_read(dev, 0x900C, &value);
+
+       retval  = mc417_register_write(dev,
+               IVTV_REG_VPU, 0xFFFFFFED);
+       retval |= mc417_register_write(dev,
+               IVTV_REG_HW_BLOCKS, IVTV_CMD_HW_BLOCKS_RST);
+       retval |= mc417_register_write(dev,
+               IVTV_REG_ENC_SDRAM_REFRESH, 0x80000800);
+       retval |= mc417_register_write(dev,
+               IVTV_REG_ENC_SDRAM_PRECHARGE, 0x1A);
+       retval |= mc417_register_write(dev,
+               IVTV_REG_APU, 0);
+
+       if (retval != 0) {
+               printk(KERN_ERR "%s: Error with mc417_register_write\n",
+                       __func__);
+               return -1;
+       }
+
+       retval = request_firmware(&firmware, CX231xx_FIRM_IMAGE_NAME,
+                                 &dev->udev->dev);
+
+       if (retval != 0) {
+               printk(KERN_ERR
+                       "ERROR: Hotplug firmware request failed (%s).\n",
+                       CX231xx_FIRM_IMAGE_NAME);
+               printk(KERN_ERR "Please fix your hotplug setup, the board will "
+                       "not work without firmware loaded!\n");
+               return -1;
+       }
+
+       if (firmware->size != CX231xx_FIRM_IMAGE_SIZE) {
+               printk(KERN_ERR "ERROR: Firmware size mismatch "
+                       "(have %zd, expected %d)\n",
+                       firmware->size, CX231xx_FIRM_IMAGE_SIZE);
+               release_firmware(firmware);
+               return -1;
+       }
+
+       if (0 != memcmp(firmware->data, magic, 8)) {
+               printk(KERN_ERR
+                       "ERROR: Firmware magic mismatch, wrong file?\n");
+               release_firmware(firmware);
+               return -1;
+       }
+
+       initGPIO(dev);
+
+       /* transfer to the chip */
+       dprintk(2, "Loading firmware to GPIO...\n");
+       p_fw_data = (u32 *)firmware->data;
+       dprintk(2, "firmware->size=%d\n", firmware->size);
+       for (transfer_size = 0; transfer_size < firmware->size;
+                transfer_size += 4) {
+               fw_data = *p_fw_data;
+
+                mciWriteMemoryToGPIO(dev, address, fw_data, p_current_fw);
+               address = address + 1;
+               p_current_fw += 20;
+               p_fw_data += 1;
+       }
+
+/*download the firmware by ep5-out*/
+
+       for (frame = 0; frame < (int)(CX231xx_FIRM_IMAGE_SIZE*20/_buffer_size);
+               frame++) {
+               for (i = 0; i < _buffer_size; i++) {
+                       *(p_buffer+i) =
+                       (u8)(*(p_fw+(frame*128*8+(i++/4))) & 0x000000FF);
+                       *(p_buffer+i) =
+                       (u8)((*(p_fw+(frame*128*8+(i++/4))) & 0x0000FF00)>>8);
+                       *(p_buffer+i) =
+                       (u8)((*(p_fw+(frame*128*8+(i++/4))) & 0x00FF0000)>>16);
+                       *(p_buffer+i) =
+                       (u8)((*(p_fw+(frame*128*8+(i/4))) & 0xFF000000)>>24);
+               }
+               cx231xx_ep5_bulkout(dev, p_buffer, _buffer_size);
+       }
+
+       p_current_fw = p_fw;
+       vfree(p_current_fw);
+       p_current_fw = NULL;
+       uninitGPIO(dev);
+       release_firmware(firmware);
+       dprintk(1, "Firmware upload successful.\n");
+
+       retval |= mc417_register_write(dev, IVTV_REG_HW_BLOCKS,
+               IVTV_CMD_HW_BLOCKS_RST);
+       if (retval < 0) {
+               printk(KERN_ERR "%s: Error with mc417_register_write\n",
+                       __func__);
+               return retval;
+       }
+       /* F/W power up disturbs the GPIOs, restore state */
+       retval |= mc417_register_write(dev, 0x9020, gpio_output);
+       retval |= mc417_register_write(dev, 0x900C, value);
+
+       retval |= mc417_register_read(dev, IVTV_REG_VPU, &value);
+       retval |= mc417_register_write(dev, IVTV_REG_VPU, value & 0xFFFFFFE8);
+
+       if (retval < 0) {
+               printk(KERN_ERR "%s: Error with mc417_register_write\n",
+                       __func__);
+               return retval;
+       }
+       return 0;
+}
+
+void cx231xx_417_check_encoder(struct cx231xx *dev)
+{
+       u32 status, seq;
+
+       status = 0;
+       seq = 0;
+       cx231xx_api_cmd(dev, CX2341X_ENC_GET_SEQ_END, 0, 2, &status, &seq);
+       dprintk(1, "%s() status = %d, seq = %d\n", __func__, status, seq);
+}
+
+static void cx231xx_codec_settings(struct cx231xx *dev)
+{
+       dprintk(1, "%s()\n", __func__);
+
+       /* assign frame size */
+       cx231xx_api_cmd(dev, CX2341X_ENC_SET_FRAME_SIZE, 2, 0,
+                               dev->ts1.height, dev->ts1.width);
+
+       dev->mpeg_params.width = dev->ts1.width;
+       dev->mpeg_params.height = dev->ts1.height;
+
+       cx2341x_update(dev, cx231xx_mbox_func, NULL, &dev->mpeg_params);
+
+       cx231xx_api_cmd(dev, CX2341X_ENC_MISC, 2, 0, 3, 1);
+       cx231xx_api_cmd(dev, CX2341X_ENC_MISC, 2, 0, 4, 1);
+}
+
+static int cx231xx_initialize_codec(struct cx231xx *dev)
+{
+       int version;
+       int retval;
+       u32 i, data[7];
+       u32 val = 0;
+
+       dprintk(1, "%s()\n", __func__);
+       cx231xx_disable656(dev);
+       retval = cx231xx_api_cmd(dev, CX2341X_ENC_PING_FW, 0, 0); /* ping */
+       if (retval < 0) {
+               dprintk(2, "%s() PING OK\n", __func__);
+               retval = cx231xx_load_firmware(dev);
+               if (retval < 0) {
+                       printk(KERN_ERR "%s() f/w load failed\n", __func__);
+                       return retval;
+               }
+               retval = cx231xx_find_mailbox(dev);
+               if (retval < 0) {
+                       printk(KERN_ERR "%s() mailbox < 0, error\n",
+                               __func__);
+                       return -1;
+               }
+               dev->cx23417_mailbox = retval;
+               retval = cx231xx_api_cmd(dev, CX2341X_ENC_PING_FW, 0, 0);
+               if (retval < 0) {
+                       printk(KERN_ERR
+                               "ERROR: cx23417 firmware ping failed!\n");
+                       return -1;
+               }
+               retval = cx231xx_api_cmd(dev, CX2341X_ENC_GET_VERSION, 0, 1,
+                       &version);
+               if (retval < 0) {
+                       printk(KERN_ERR "ERROR: cx23417 firmware get encoder :"
+                               "version failed!\n");
+                       return -1;
+               }
+               dprintk(1, "cx23417 firmware version is 0x%08x\n", version);
+               msleep(200);
+       }
+
+       for (i = 0; i < 1; i++) {
+               retval = mc417_register_read(dev, 0x20f8, &val);
+               dprintk(3, "***before enable656() VIM Capture Lines =%d ***\n",
+                                val);
+               if (retval < 0)
+                       return retval;
+       }
+
+       cx231xx_enable656(dev);
+                       /* stop mpeg capture */
+                       cx231xx_api_cmd(dev, CX2341X_ENC_STOP_CAPTURE,
+                                3, 0, 1, 3, 4);
+
+       cx231xx_codec_settings(dev);
+       msleep(60);
+
+/*     cx231xx_api_cmd(dev, CX2341X_ENC_SET_NUM_VSYNC_LINES, 2, 0,
+               CX231xx_FIELD1_SAA7115, CX231xx_FIELD2_SAA7115);
+       cx231xx_api_cmd(dev, CX2341X_ENC_SET_PLACEHOLDER, 12, 0,
+               CX231xx_CUSTOM_EXTENSION_USR_DATA, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0);
+*/
+       /* Setup to capture VBI */
+       data[0] = 0x0001BD00;
+       data[1] = 1;          /* frames per interrupt */
+       data[2] = 4;          /* total bufs */
+       data[3] = 0x91559155; /* start codes */
+       data[4] = 0x206080C0; /* stop codes */
+       data[5] = 6;          /* lines */
+       data[6] = 64;         /* BPL */
+/*
+       cx231xx_api_cmd(dev, CX2341X_ENC_SET_VBI_CONFIG, 7, 0, data[0], data[1],
+               data[2], data[3], data[4], data[5], data[6]);
+
+       for (i = 2; i <= 24; i++) {
+               int valid;
+
+               valid = ((i >= 19) && (i <= 21));
+               cx231xx_api_cmd(dev, CX2341X_ENC_SET_VBI_LINE, 5, 0, i,
+                               valid, 0 , 0, 0);
+               cx231xx_api_cmd(dev, CX2341X_ENC_SET_VBI_LINE, 5, 0,
+                               i | 0x80000000, valid, 0, 0, 0);
+       }
+*/
+/*     cx231xx_api_cmd(dev, CX2341X_ENC_MUTE_AUDIO, 1, 0, CX231xx_UNMUTE);
+       msleep(60);
+*/
+       /* initialize the video input */
+       retval = cx231xx_api_cmd(dev, CX2341X_ENC_INITIALIZE_INPUT, 0, 0);
+       if (retval < 0)
+               return retval;
+       msleep(60);
+
+       /* Enable VIP style pixel invalidation so we work with scaled mode */
+       mc417_memory_write(dev, 2120, 0x00000080);
+
+       /* start capturing to the host interface */
+       retval = cx231xx_api_cmd(dev, CX2341X_ENC_START_CAPTURE, 2, 0,
+               CX231xx_MPEG_CAPTURE, CX231xx_RAW_BITS_NONE);
+       if (retval < 0)
+               return retval;
+       msleep(10);
+
+       for (i = 0; i < 1; i++) {
+               mc417_register_read(dev, 0x20f8, &val);
+       dprintk(3, "***VIM Capture Lines =%d ***\n", val);
+       }
+
+       return 0;
+}
+
+/* ------------------------------------------------------------------ */
+
+static int bb_buf_setup(struct videobuf_queue *q,
+       unsigned int *count, unsigned int *size)
+{
+       struct cx231xx_fh *fh = q->priv_data;
+
+       fh->dev->ts1.ts_packet_size  = mpeglinesize;
+       fh->dev->ts1.ts_packet_count = mpeglines;
+
+       *size = fh->dev->ts1.ts_packet_size * fh->dev->ts1.ts_packet_count;
+       *count = mpegbufs;
+
+       return 0;
+}
+static void free_buffer(struct videobuf_queue *vq, struct cx231xx_buffer *buf)
+{
+       struct cx231xx_fh *fh = vq->priv_data;
+       struct cx231xx *dev = fh->dev;
+       unsigned long flags = 0;
+
+       if (in_interrupt())
+               BUG();
+
+       spin_lock_irqsave(&dev->video_mode.slock, flags);
+       if (dev->USE_ISO) {
+               if (dev->video_mode.isoc_ctl.buf == buf)
+                       dev->video_mode.isoc_ctl.buf = NULL;
+       } else {
+               if (dev->video_mode.bulk_ctl.buf == buf)
+                       dev->video_mode.bulk_ctl.buf = NULL;
+       }
+       spin_unlock_irqrestore(&dev->video_mode.slock, flags);
+       videobuf_waiton(vq, &buf->vb, 0, 0);
+       videobuf_vmalloc_free(&buf->vb);
+       buf->vb.state = VIDEOBUF_NEEDS_INIT;
+}
+
+void buffer_copy(struct cx231xx *dev, char *data, int len, struct urb *urb,
+               struct cx231xx_dmaqueue *dma_q)
+{
+               void *vbuf;
+               struct cx231xx_buffer *buf;
+               u32 tail_data = 0;
+               char *p_data;
+
+               if (dma_q->mpeg_buffer_done == 0) {
+                       if (list_empty(&dma_q->active))
+                               return;
+
+                       buf = list_entry(dma_q->active.next,
+                                       struct cx231xx_buffer, vb.queue);
+                       dev->video_mode.isoc_ctl.buf = buf;
+                       dma_q->mpeg_buffer_done = 1;
+               }
+               /* Fill buffer */
+               buf = dev->video_mode.isoc_ctl.buf;
+               vbuf = videobuf_to_vmalloc(&buf->vb);
+
+               if ((dma_q->mpeg_buffer_completed+len) <
+                  mpeglines*mpeglinesize) {
+                       if (dma_q->add_ps_package_head ==
+                          CX231XX_NEED_ADD_PS_PACKAGE_HEAD) {
+                               memcpy(vbuf+dma_q->mpeg_buffer_completed,
+                                      dma_q->ps_head, 3);
+                               dma_q->mpeg_buffer_completed =
+                                 dma_q->mpeg_buffer_completed + 3;
+                               dma_q->add_ps_package_head =
+                                 CX231XX_NONEED_PS_PACKAGE_HEAD;
+                       }
+                       memcpy(vbuf+dma_q->mpeg_buffer_completed, data, len);
+                       dma_q->mpeg_buffer_completed =
+                         dma_q->mpeg_buffer_completed + len;
+               } else {
+                       dma_q->mpeg_buffer_done = 0;
+
+                       tail_data =
+                         mpeglines*mpeglinesize - dma_q->mpeg_buffer_completed;
+                       memcpy(vbuf+dma_q->mpeg_buffer_completed,
+                              data, tail_data);
+
+                       buf->vb.state = VIDEOBUF_DONE;
+                       buf->vb.field_count++;
+                       do_gettimeofday(&buf->vb.ts);
+                       list_del(&buf->vb.queue);
+                       wake_up(&buf->vb.done);
+                       dma_q->mpeg_buffer_completed = 0;
+
+                       if (len - tail_data > 0) {
+                               p_data = data + tail_data;
+                               dma_q->left_data_count = len - tail_data;
+                               memcpy(dma_q->p_left_data,
+                                      p_data, len - tail_data);
+                       }
+
+               }
+
+           return;
+}
+
+void buffer_filled(char *data, int len, struct urb *urb,
+               struct cx231xx_dmaqueue *dma_q)
+{
+               void *vbuf;
+               struct cx231xx_buffer *buf;
+
+               if (list_empty(&dma_q->active))
+                       return;
+
+
+               buf = list_entry(dma_q->active.next,
+                                struct cx231xx_buffer, vb.queue);
+
+
+               /* Fill buffer */
+               vbuf = videobuf_to_vmalloc(&buf->vb);
+               memcpy(vbuf, data, len);
+               buf->vb.state = VIDEOBUF_DONE;
+               buf->vb.field_count++;
+               do_gettimeofday(&buf->vb.ts);
+               list_del(&buf->vb.queue);
+               wake_up(&buf->vb.done);
+
+           return;
+}
+static inline int cx231xx_isoc_copy(struct cx231xx *dev, struct urb *urb)
+{
+       struct cx231xx_dmaqueue *dma_q = urb->context;
+       unsigned char *p_buffer;
+       u32 buffer_size = 0;
+       u32 i = 0;
+
+       for (i = 0; i < urb->number_of_packets; i++) {
+               if (dma_q->left_data_count > 0) {
+                       buffer_copy(dev, dma_q->p_left_data,
+                                   dma_q->left_data_count, urb, dma_q);
+                       dma_q->mpeg_buffer_completed = dma_q->left_data_count;
+                       dma_q->left_data_count = 0;
+               }
+
+               p_buffer = urb->transfer_buffer +
+                               urb->iso_frame_desc[i].offset;
+               buffer_size = urb->iso_frame_desc[i].actual_length;
+
+               if (buffer_size > 0)
+                       buffer_copy(dev, p_buffer, buffer_size, urb, dma_q);
+       }
+
+       return 0;
+}
+static inline int cx231xx_bulk_copy(struct cx231xx *dev, struct urb *urb)
+{
+
+       /*char *outp;*/
+       /*struct cx231xx_buffer *buf;*/
+       struct cx231xx_dmaqueue *dma_q = urb->context;
+       unsigned char *p_buffer, *buffer;
+       u32 buffer_size = 0;
+
+       p_buffer = urb->transfer_buffer;
+       buffer_size = urb->actual_length;
+
+       buffer = kmalloc(buffer_size, GFP_ATOMIC);
+
+       memcpy(buffer, dma_q->ps_head, 3);
+       memcpy(buffer+3, p_buffer, buffer_size-3);
+       memcpy(dma_q->ps_head, p_buffer+buffer_size-3, 3);
+
+       p_buffer = buffer;
+       buffer_filled(p_buffer, buffer_size, urb, dma_q);
+
+       kfree(buffer);
+       return 0;
+}
+
+static int bb_buf_prepare(struct videobuf_queue *q,
+       struct videobuf_buffer *vb, enum v4l2_field field)
+{
+       struct cx231xx_fh *fh = q->priv_data;
+       struct cx231xx_buffer *buf =
+           container_of(vb, struct cx231xx_buffer, vb);
+       struct cx231xx *dev = fh->dev;
+       int rc = 0, urb_init = 0;
+       int size = fh->dev->ts1.ts_packet_size * fh->dev->ts1.ts_packet_count;
+
+       dma_qq = &dev->video_mode.vidq;
+
+       if (0 != buf->vb.baddr  &&  buf->vb.bsize < size)
+               return -EINVAL;
+       buf->vb.width = fh->dev->ts1.ts_packet_size;
+       buf->vb.height = fh->dev->ts1.ts_packet_count;
+       buf->vb.size = size;
+       buf->vb.field = field;
+
+       if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
+               rc = videobuf_iolock(q, &buf->vb, NULL);
+               if (rc < 0)
+                       goto fail;
+       }
+
+       if (dev->USE_ISO) {
+               if (!dev->video_mode.isoc_ctl.num_bufs)
+                       urb_init = 1;
+       } else {
+               if (!dev->video_mode.bulk_ctl.num_bufs)
+                       urb_init = 1;
+       }
+       /*cx231xx_info("urb_init=%d dev->video_mode.max_pkt_size=%d\n",
+               urb_init, dev->video_mode.max_pkt_size);*/
+       dev->mode_tv = 1;
+
+       if (urb_init) {
+               rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
+               rc = cx231xx_unmute_audio(dev);
+               if (dev->USE_ISO) {
+                       cx231xx_set_alt_setting(dev, INDEX_TS1, 4);
+                       rc = cx231xx_init_isoc(dev, mpeglines,
+                                      mpegbufs,
+                                      dev->ts1_mode.max_pkt_size,
+                                      cx231xx_isoc_copy);
+               } else {
+                       cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
+                       rc = cx231xx_init_bulk(dev, mpeglines,
+                                      mpegbufs,
+                                      dev->ts1_mode.max_pkt_size,
+                                      cx231xx_bulk_copy);
+               }
+               if (rc < 0)
+                       goto fail;
+       }
+
+       buf->vb.state = VIDEOBUF_PREPARED;
+       return 0;
+
+fail:
+       free_buffer(q, buf);
+       return rc;
+}
+
+static void bb_buf_queue(struct videobuf_queue *q,
+       struct videobuf_buffer *vb)
+{
+       struct cx231xx_fh *fh = q->priv_data;
+
+       struct cx231xx_buffer *buf =
+           container_of(vb, struct cx231xx_buffer, vb);
+       struct cx231xx *dev = fh->dev;
+       struct cx231xx_dmaqueue *vidq = &dev->video_mode.vidq;
+
+       buf->vb.state = VIDEOBUF_QUEUED;
+       list_add_tail(&buf->vb.queue, &vidq->active);
+
+}
+
+static void bb_buf_release(struct videobuf_queue *q,
+       struct videobuf_buffer *vb)
+{
+       struct cx231xx_buffer *buf =
+           container_of(vb, struct cx231xx_buffer, vb);
+       /*struct cx231xx_fh *fh = q->priv_data;*/
+       /*struct cx231xx *dev = (struct cx231xx *)fh->dev;*/
+
+       free_buffer(q, buf);
+}
+
+static struct videobuf_queue_ops cx231xx_qops = {
+       .buf_setup    = bb_buf_setup,
+       .buf_prepare  = bb_buf_prepare,
+       .buf_queue    = bb_buf_queue,
+       .buf_release  = bb_buf_release,
+};
+
+/* ------------------------------------------------------------------ */
+
+static const u32 *ctrl_classes[] = {
+       cx2341x_mpeg_ctrls,
+       NULL
+};
+
+static int cx231xx_queryctrl(struct cx231xx *dev,
+       struct v4l2_queryctrl *qctrl)
+{
+       qctrl->id = v4l2_ctrl_next(ctrl_classes, qctrl->id);
+       if (qctrl->id == 0)
+               return -EINVAL;
+
+       /* MPEG V4L2 controls */
+       if (cx2341x_ctrl_query(&dev->mpeg_params, qctrl))
+               qctrl->flags |= V4L2_CTRL_FLAG_DISABLED;
+
+       return 0;
+}
+
+static int cx231xx_querymenu(struct cx231xx *dev,
+       struct v4l2_querymenu *qmenu)
+{
+       struct v4l2_queryctrl qctrl;
+
+       qctrl.id = qmenu->id;
+       cx231xx_queryctrl(dev, &qctrl);
+       return v4l2_ctrl_query_menu(qmenu, &qctrl,
+               cx2341x_ctrl_get_menu(&dev->mpeg_params, qmenu->id));
+}
+
+static int vidioc_g_std(struct file *file, void *fh0, v4l2_std_id *norm)
+{
+       struct cx231xx_fh  *fh  = file->private_data;
+       struct cx231xx *dev = fh->dev;
+
+       *norm = dev->encodernorm.id;
+       return 0;
+}
+static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *id)
+{
+       struct cx231xx_fh  *fh  = file->private_data;
+       struct cx231xx *dev = fh->dev;
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(cx231xx_tvnorms); i++)
+               if (*id & cx231xx_tvnorms[i].id)
+                       break;
+       if (i == ARRAY_SIZE(cx231xx_tvnorms))
+               return -EINVAL;
+       dev->encodernorm = cx231xx_tvnorms[i];
+
+       if (dev->encodernorm.id & 0xb000) {
+               dprintk(3, "encodernorm set to NTSC\n");
+               dev->norm = V4L2_STD_NTSC;
+               dev->ts1.height = 480;
+               dev->mpeg_params.is_50hz = 0;
+       } else {
+               dprintk(3, "encodernorm set to PAL\n");
+               dev->norm = V4L2_STD_PAL_B;
+               dev->ts1.height = 576;
+               dev->mpeg_params.is_50hz = 1;
+       }
+       call_all(dev, core, s_std, dev->norm);
+       /* do mode control overrides */
+       cx231xx_do_mode_ctrl_overrides(dev);
+
+       dprintk(3, "exit vidioc_s_std() i=0x%x\n", i);
+       return 0;
+}
+static int vidioc_g_audio(struct file *file, void *fh,
+                                       struct v4l2_audio *a)
+{
+               struct v4l2_audio *vin = a;
+
+               int ret = -EINVAL;
+               if (vin->index > 0)
+                       return ret;
+               strncpy(vin->name, "VideoGrabber Audio", 14);
+               vin->capability = V4L2_AUDCAP_STEREO;
+return 0;
+}
+static int vidioc_enumaudio(struct file *file, void *fh,
+                                       struct v4l2_audio *a)
+{
+               struct v4l2_audio *vin = a;
+
+               int ret = -EINVAL;
+
+               if (vin->index > 0)
+                       return ret;
+               strncpy(vin->name, "VideoGrabber Audio", 14);
+               vin->capability = V4L2_AUDCAP_STEREO;
+
+
+return 0;
+}
+static const char *iname[] = {
+       [CX231XX_VMUX_COMPOSITE1] = "Composite1",
+       [CX231XX_VMUX_SVIDEO]     = "S-Video",
+       [CX231XX_VMUX_TELEVISION] = "Television",
+       [CX231XX_VMUX_CABLE]      = "Cable TV",
+       [CX231XX_VMUX_DVB]        = "DVB",
+       [CX231XX_VMUX_DEBUG]      = "for debug only",
+};
+static int vidioc_enum_input(struct file *file, void *priv,
+                               struct v4l2_input *i)
+{
+       struct cx231xx_fh  *fh  = file->private_data;
+       struct cx231xx *dev = fh->dev;
+       struct cx231xx_input *input;
+       int n;
+       dprintk(3, "enter vidioc_enum_input()i->index=%d\n", i->index);
+
+       if (i->index >= 4)
+               return -EINVAL;
+
+
+       input = &cx231xx_boards[dev->model].input[i->index];
+
+       if (input->type == 0)
+               return -EINVAL;
+
+       /* FIXME
+        * strcpy(i->name, input->name); */
+
+       n = i->index;
+       strcpy(i->name, iname[INPUT(n)->type]);
+
+       if (input->type == CX231XX_VMUX_TELEVISION ||
+           input->type == CX231XX_VMUX_CABLE)
+               i->type = V4L2_INPUT_TYPE_TUNER;
+       else
+               i->type  = V4L2_INPUT_TYPE_CAMERA;
+
+
+       return 0;
+}
+
+static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
+{
+       *i = 0;
+       return  0;
+}
+
+static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
+{
+       struct cx231xx_fh  *fh  = file->private_data;
+       struct cx231xx *dev = fh->dev;
+
+       dprintk(3, "enter vidioc_s_input() i=%d\n", i);
+
+       mutex_lock(&dev->lock);
+
+       video_mux(dev, i);
+
+       mutex_unlock(&dev->lock);
+
+       if (i >= 4)
+               return -EINVAL;
+       dev->input = i;
+       dprintk(3, "exit vidioc_s_input()\n");
+       return 0;
+}
+
+static int vidioc_g_tuner(struct file *file, void *priv,
+                               struct v4l2_tuner *t)
+{
+       return 0;
+}
+
+static int vidioc_s_tuner(struct file *file, void *priv,
+                               struct v4l2_tuner *t)
+{
+       return 0;
+}
+
+static int vidioc_g_frequency(struct file *file, void *priv,
+                               struct v4l2_frequency *f)
+{
+       return 0;
+}
+
+static int vidioc_s_frequency(struct file *file, void *priv,
+                               struct v4l2_frequency *f)
+{
+
+
+       return 0;
+}
+
+static int vidioc_s_ctrl(struct file *file, void *priv,
+                               struct v4l2_control *ctl)
+{
+       struct cx231xx_fh  *fh  = file->private_data;
+       struct cx231xx *dev = fh->dev;
+       dprintk(3, "enter vidioc_s_ctrl()\n");
+       /* Update the A/V core */
+       call_all(dev, core, s_ctrl, ctl);
+       dprintk(3, "exit vidioc_s_ctrl()\n");
+       return 0;
+}
+static struct v4l2_capability pvr_capability = {
+       .driver         = "cx231xx",
+       .card           = "VideoGrabber",
+       .bus_info       = "usb",
+       .version        = 1,
+       .capabilities   = (V4L2_CAP_VIDEO_CAPTURE |
+                          V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_RADIO |
+                        V4L2_CAP_STREAMING | V4L2_CAP_READWRITE),
+       .reserved       = {0, 0, 0, 0}
+};
+static int vidioc_querycap(struct file *file, void  *priv,
+                               struct v4l2_capability *cap)
+{
+
+
+
+               memcpy(cap, &pvr_capability, sizeof(struct v4l2_capability));
+       return 0;
+}
+
+static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
+                                       struct v4l2_fmtdesc *f)
+{
+
+       if (f->index != 0)
+               return -EINVAL;
+
+       strlcpy(f->description, "MPEG", sizeof(f->description));
+       f->pixelformat = V4L2_PIX_FMT_MPEG;
+
+       return 0;
+}
+
+static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
+                               struct v4l2_format *f)
+{
+       struct cx231xx_fh  *fh  = file->private_data;
+       struct cx231xx *dev = fh->dev;
+       dprintk(3, "enter vidioc_g_fmt_vid_cap()\n");
+       f->fmt.pix.pixelformat  = V4L2_PIX_FMT_MPEG;
+       f->fmt.pix.bytesperline = 0;
+       f->fmt.pix.sizeimage    =
+               dev->ts1.ts_packet_size * dev->ts1.ts_packet_count;
+       f->fmt.pix.colorspace   = 0;
+       f->fmt.pix.width        = dev->ts1.width;
+       f->fmt.pix.height       = dev->ts1.height;
+       f->fmt.pix.field        = fh->vidq.field;
+       dprintk(1, "VIDIOC_G_FMT: w: %d, h: %d, f: %d\n",
+               dev->ts1.width, dev->ts1.height, fh->vidq.field);
+       dprintk(3, "exit vidioc_g_fmt_vid_cap()\n");
+       return 0;
+}
+
+static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
+                               struct v4l2_format *f)
+{
+       struct cx231xx_fh  *fh  = file->private_data;
+       struct cx231xx *dev = fh->dev;
+       dprintk(3, "enter vidioc_try_fmt_vid_cap()\n");
+       f->fmt.pix.pixelformat  = V4L2_PIX_FMT_MPEG;
+       f->fmt.pix.bytesperline = 0;
+       f->fmt.pix.sizeimage    =
+               dev->ts1.ts_packet_size * dev->ts1.ts_packet_count;
+       f->fmt.pix.colorspace   = 0;
+       dprintk(1, "VIDIOC_TRY_FMT: w: %d, h: %d, f: %d\n",
+               dev->ts1.width, dev->ts1.height, fh->vidq.field);
+       dprintk(3, "exit vidioc_try_fmt_vid_cap()\n");
+       return 0;
+}
+
+static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
+                               struct v4l2_format *f)
+{
+
+       return 0;
+}
+
+static int vidioc_reqbufs(struct file *file, void *priv,
+                               struct v4l2_requestbuffers *p)
+{
+       struct cx231xx_fh  *fh  = file->private_data;
+
+       return videobuf_reqbufs(&fh->vidq, p);
+}
+
+static int vidioc_querybuf(struct file *file, void *priv,
+                               struct v4l2_buffer *p)
+{
+       struct cx231xx_fh  *fh  = file->private_data;
+
+       return videobuf_querybuf(&fh->vidq, p);
+}
+
+static int vidioc_qbuf(struct file *file, void *priv,
+                               struct v4l2_buffer *p)
+{
+       struct cx231xx_fh  *fh  = file->private_data;
+
+       return videobuf_qbuf(&fh->vidq, p);
+}
+
+static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
+{
+       struct cx231xx_fh  *fh  = priv;
+
+       return videobuf_dqbuf(&fh->vidq, b, file->f_flags & O_NONBLOCK);
+}
+
+
+static int vidioc_streamon(struct file *file, void *priv,
+                               enum v4l2_buf_type i)
+{
+       struct cx231xx_fh  *fh  = file->private_data;
+
+       struct cx231xx *dev = fh->dev;
+       int rc = 0;
+       dprintk(3, "enter vidioc_streamon()\n");
+               cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
+               rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
+               if (dev->USE_ISO)
+                       rc = cx231xx_init_isoc(dev, CX231XX_NUM_PACKETS,
+                                      CX231XX_NUM_BUFS,
+                                      dev->video_mode.max_pkt_size,
+                                      cx231xx_isoc_copy);
+               else {
+                       rc = cx231xx_init_bulk(dev, 320,
+                                      5,
+                                      dev->ts1_mode.max_pkt_size,
+                                      cx231xx_bulk_copy);
+               }
+       dprintk(3, "exit vidioc_streamon()\n");
+       return videobuf_streamon(&fh->vidq);
+}
+
+static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
+{
+       struct cx231xx_fh  *fh  = file->private_data;
+
+       return videobuf_streamoff(&fh->vidq);
+}
+
+static int vidioc_g_ext_ctrls(struct file *file, void *priv,
+                               struct v4l2_ext_controls *f)
+{
+       struct cx231xx_fh  *fh  = priv;
+       struct cx231xx *dev = fh->dev;
+       dprintk(3, "enter vidioc_g_ext_ctrls()\n");
+       if (f->ctrl_class != V4L2_CTRL_CLASS_MPEG)
+               return -EINVAL;
+       dprintk(3, "exit vidioc_g_ext_ctrls()\n");
+       return cx2341x_ext_ctrls(&dev->mpeg_params, 0, f, VIDIOC_G_EXT_CTRLS);
+}
+
+static int vidioc_s_ext_ctrls(struct file *file, void *priv,
+                               struct v4l2_ext_controls *f)
+{
+       struct cx231xx_fh  *fh  = priv;
+       struct cx231xx *dev = fh->dev;
+       struct cx2341x_mpeg_params p;
+       int err;
+       dprintk(3, "enter vidioc_s_ext_ctrls()\n");
+       if (f->ctrl_class != V4L2_CTRL_CLASS_MPEG)
+               return -EINVAL;
+
+       p = dev->mpeg_params;
+       err = cx2341x_ext_ctrls(&p, 0, f, VIDIOC_TRY_EXT_CTRLS);
+       if (err == 0) {
+               err = cx2341x_update(dev, cx231xx_mbox_func,
+                       &dev->mpeg_params, &p);
+               dev->mpeg_params = p;
+       }
+
+       return err;
+
+
+return 0;
+}
+
+static int vidioc_try_ext_ctrls(struct file *file, void *priv,
+                               struct v4l2_ext_controls *f)
+{
+       struct cx231xx_fh  *fh  = priv;
+       struct cx231xx *dev = fh->dev;
+       struct cx2341x_mpeg_params p;
+       int err;
+       dprintk(3, "enter vidioc_try_ext_ctrls()\n");
+       if (f->ctrl_class != V4L2_CTRL_CLASS_MPEG)
+               return -EINVAL;
+
+       p = dev->mpeg_params;
+       err = cx2341x_ext_ctrls(&p, 0, f, VIDIOC_TRY_EXT_CTRLS);
+       dprintk(3, "exit vidioc_try_ext_ctrls() err=%d\n", err);
+       return err;
+}
+
+static int vidioc_log_status(struct file *file, void *priv)
+{
+       struct cx231xx_fh  *fh  = priv;
+       struct cx231xx *dev = fh->dev;
+       char name[32 + 2];
+
+       snprintf(name, sizeof(name), "%s/2", dev->name);
+       dprintk(3,
+               "%s/2: ============  START LOG STATUS  ============\n",
+              dev->name);
+       call_all(dev, core, log_status);
+       cx2341x_log_status(&dev->mpeg_params, name);
+       dprintk(3,
+               "%s/2: =============  END LOG STATUS  =============\n",
+              dev->name);
+       return 0;
+}
+
+static int vidioc_querymenu(struct file *file, void *priv,
+                               struct v4l2_querymenu *a)
+{
+       struct cx231xx_fh  *fh  = priv;
+       struct cx231xx *dev = fh->dev;
+       dprintk(3, "enter vidioc_querymenu()\n");
+       dprintk(3, "exit vidioc_querymenu()\n");
+       return cx231xx_querymenu(dev, a);
+}
+
+static int vidioc_queryctrl(struct file *file, void *priv,
+                               struct v4l2_queryctrl *c)
+{
+       struct cx231xx_fh  *fh  = priv;
+       struct cx231xx *dev = fh->dev;
+       dprintk(3, "enter vidioc_queryctrl()\n");
+       dprintk(3, "exit vidioc_queryctrl()\n");
+       return cx231xx_queryctrl(dev, c);
+}
+
+static int mpeg_open(struct file *file)
+{
+       int minor = video_devdata(file)->minor;
+       struct cx231xx *h, *dev = NULL;
+       /*struct list_head *list;*/
+       struct cx231xx_fh *fh;
+       /*u32 value = 0;*/
+
+       dprintk(2, "%s()\n", __func__);
+
+       list_for_each_entry(h, &cx231xx_devlist, devlist) {
+               if (h->v4l_device->minor == minor)
+                       dev = h;
+       }
+
+       if (dev == NULL) {
+               unlock_kernel();
+               return -ENODEV;
+       }
+       mutex_lock(&dev->lock);
+
+       /* allocate + initialize per filehandle data */
+       fh = kzalloc(sizeof(*fh), GFP_KERNEL);
+       if (NULL == fh) {
+               mutex_unlock(&dev->lock);
+               return -ENOMEM;
+       }
+
+       file->private_data = fh;
+       fh->dev      = dev;
+
+
+       videobuf_queue_vmalloc_init(&fh->vidq, &cx231xx_qops,
+                           NULL, &dev->video_mode.slock,
+                           V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_INTERLACED,
+                           sizeof(struct cx231xx_buffer), fh, NULL);
+/*
+       videobuf_queue_sg_init(&fh->vidq, &cx231xx_qops,
+                           &dev->udev->dev, &dev->ts1.slock,
+                           V4L2_BUF_TYPE_VIDEO_CAPTURE,
+                           V4L2_FIELD_INTERLACED,
+                           sizeof(struct cx231xx_buffer),
+                           fh, NULL);
+*/
+
+
+       cx231xx_set_alt_setting(dev, INDEX_VANC, 1);
+       cx231xx_set_gpio_value(dev, 2, 0);
+
+       cx231xx_initialize_codec(dev);
+
+       mutex_unlock(&dev->lock);
+       cx231xx_start_TS1(dev);
+
+       return 0;
+}
+
+static int mpeg_release(struct file *file)
+{
+       struct cx231xx_fh  *fh  = file->private_data;
+       struct cx231xx *dev = fh->dev;
+
+       dprintk(3, "mpeg_release()! dev=0x%x\n", dev);
+
+       if (!dev) {
+               dprintk(3, "abort!!!\n");
+               return 0;
+       }
+
+       mutex_lock(&dev->lock);
+
+       cx231xx_stop_TS1(dev);
+
+               /* do this before setting alternate! */
+               if (dev->USE_ISO)
+                       cx231xx_uninit_isoc(dev);
+               else
+                       cx231xx_uninit_bulk(dev);
+               cx231xx_set_mode(dev, CX231XX_SUSPEND);
+
+               cx231xx_api_cmd(fh->dev, CX2341X_ENC_STOP_CAPTURE, 3, 0,
+                               CX231xx_END_NOW, CX231xx_MPEG_CAPTURE,
+                               CX231xx_RAW_BITS_NONE);
+
+       /* FIXME: Review this crap */
+       /* Shut device down on last close */
+       if (atomic_cmpxchg(&fh->v4l_reading, 1, 0) == 1) {
+               if (atomic_dec_return(&dev->v4l_reader_count) == 0) {
+                       /* stop mpeg capture */
+
+                       msleep(500);
+                       cx231xx_417_check_encoder(dev);
+
+               }
+       }
+
+       if (fh->vidq.streaming)
+               videobuf_streamoff(&fh->vidq);
+       if (fh->vidq.reading)
+               videobuf_read_stop(&fh->vidq);
+
+       videobuf_mmap_free(&fh->vidq);
+       file->private_data = NULL;
+       kfree(fh);
+       mutex_unlock(&dev->lock);
+       return 0;
+}
+
+static ssize_t mpeg_read(struct file *file, char __user *data,
+       size_t count, loff_t *ppos)
+{
+       struct cx231xx_fh *fh = file->private_data;
+       struct cx231xx *dev = fh->dev;
+
+
+       /* Deal w/ A/V decoder * and mpeg encoder sync issues. */
+       /* Start mpeg encoder on first read. */
+       if (atomic_cmpxchg(&fh->v4l_reading, 0, 1) == 0) {
+               if (atomic_inc_return(&dev->v4l_reader_count) == 1) {
+                       if (cx231xx_initialize_codec(dev) < 0)
+                               return -EINVAL;
+               }
+       }
+
+       return videobuf_read_stream(&fh->vidq, data, count, ppos, 0,
+                                   file->f_flags & O_NONBLOCK);
+}
+
+static unsigned int mpeg_poll(struct file *file,
+       struct poll_table_struct *wait)
+{
+       struct cx231xx_fh *fh = file->private_data;
+       /*struct cx231xx *dev = fh->dev;*/
+
+       /*dprintk(2, "%s\n", __func__);*/
+
+       return videobuf_poll_stream(file, &fh->vidq, wait);
+}
+
+static int mpeg_mmap(struct file *file, struct vm_area_struct *vma)
+{
+       struct cx231xx_fh *fh = file->private_data;
+       struct cx231xx *dev = fh->dev;
+
+       dprintk(2, "%s()\n", __func__);
+
+       return videobuf_mmap_mapper(&fh->vidq, vma);
+}
+
+static struct v4l2_file_operations mpeg_fops = {
+       .owner         = THIS_MODULE,
+       .open          = mpeg_open,
+       .release       = mpeg_release,
+       .read          = mpeg_read,
+       .poll          = mpeg_poll,
+       .mmap          = mpeg_mmap,
+       .ioctl         = video_ioctl2,
+};
+
+static const struct v4l2_ioctl_ops mpeg_ioctl_ops = {
+       .vidioc_s_std            = vidioc_s_std,
+       .vidioc_g_std            = vidioc_g_std,
+       .vidioc_enum_input       = vidioc_enum_input,
+       .vidioc_enumaudio        = vidioc_enumaudio,
+       .vidioc_g_audio          = vidioc_g_audio,
+       .vidioc_g_input          = vidioc_g_input,
+       .vidioc_s_input          = vidioc_s_input,
+       .vidioc_g_tuner          = vidioc_g_tuner,
+       .vidioc_s_tuner          = vidioc_s_tuner,
+       .vidioc_g_frequency      = vidioc_g_frequency,
+       .vidioc_s_frequency      = vidioc_s_frequency,
+       .vidioc_s_ctrl           = vidioc_s_ctrl,
+       .vidioc_querycap         = vidioc_querycap,
+       .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
+       .vidioc_g_fmt_vid_cap    = vidioc_g_fmt_vid_cap,
+       .vidioc_try_fmt_vid_cap  = vidioc_try_fmt_vid_cap,
+       .vidioc_s_fmt_vid_cap    = vidioc_s_fmt_vid_cap,
+       .vidioc_reqbufs          = vidioc_reqbufs,
+       .vidioc_querybuf         = vidioc_querybuf,
+       .vidioc_qbuf             = vidioc_qbuf,
+       .vidioc_dqbuf            = vidioc_dqbuf,
+       .vidioc_streamon         = vidioc_streamon,
+       .vidioc_streamoff        = vidioc_streamoff,
+       .vidioc_g_ext_ctrls      = vidioc_g_ext_ctrls,
+       .vidioc_s_ext_ctrls      = vidioc_s_ext_ctrls,
+       .vidioc_try_ext_ctrls    = vidioc_try_ext_ctrls,
+       .vidioc_log_status       = vidioc_log_status,
+       .vidioc_querymenu        = vidioc_querymenu,
+       .vidioc_queryctrl        = vidioc_queryctrl,
+/*     .vidioc_g_chip_ident     = cx231xx_g_chip_ident,*/
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+/*     .vidioc_g_register       = cx231xx_g_register,*/
+/*     .vidioc_s_register       = cx231xx_s_register,*/
+#endif
+};
+
+static struct video_device cx231xx_mpeg_template = {
+       .name          = "cx231xx",
+       .fops          = &mpeg_fops,
+       .ioctl_ops     = &mpeg_ioctl_ops,
+       .minor         = -1,
+       .tvnorms       = CX231xx_NORMS,
+       .current_norm  = V4L2_STD_NTSC_M,
+};
+
+void cx231xx_417_unregister(struct cx231xx *dev)
+{
+       dprintk(1, "%s()\n", __func__);
+       dprintk(3, "%s()\n", __func__);
+
+       if (dev->v4l_device) {
+               if (-1 != dev->v4l_device->minor)
+                       video_unregister_device(dev->v4l_device);
+               else
+                       video_device_release(dev->v4l_device);
+               dev->v4l_device = NULL;
+       }
+}
+
+static struct video_device *cx231xx_video_dev_alloc(
+       struct cx231xx *dev,
+       struct usb_device *usbdev,
+       struct video_device *template,
+       char *type)
+{
+       struct video_device *vfd;
+
+       dprintk(1, "%s()\n", __func__);
+       vfd = video_device_alloc();
+       if (NULL == vfd)
+               return NULL;
+       *vfd = *template;
+       vfd->minor = -1;
+       snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)", dev->name,
+               type, cx231xx_boards[dev->model].name);
+
+       vfd->v4l2_dev = &dev->v4l2_dev;
+       vfd->release = video_device_release;
+
+       return vfd;
+
+}
+
+int cx231xx_417_register(struct cx231xx *dev)
+{
+       /* FIXME: Port1 hardcoded here */
+       int err = -ENODEV;
+       struct cx231xx_tsport *tsport = &dev->ts1;
+
+       dprintk(1, "%s()\n", __func__);
+
+       /* Set default TV standard */
+       dev->encodernorm = cx231xx_tvnorms[0];
+
+       if (dev->encodernorm.id & V4L2_STD_525_60)
+               tsport->height = 480;
+       else
+               tsport->height = 576;
+
+       tsport->width = 720;
+       cx2341x_fill_defaults(&dev->mpeg_params);
+       dev->norm = V4L2_STD_NTSC;
+
+       dev->mpeg_params.port = CX2341X_PORT_SERIAL;
+
+       /* Allocate and initialize V4L video device */
+       dev->v4l_device = cx231xx_video_dev_alloc(dev,
+               dev->udev, &cx231xx_mpeg_template, "mpeg");
+       err = video_register_device(dev->v4l_device,
+               VFL_TYPE_GRABBER, -1);
+       if (err < 0) {
+               dprintk(3, "%s: can't register mpeg device\n", dev->name);
+               return err;
+       }
+
+       dprintk(3, "%s: registered device video%d [mpeg]\n",
+              dev->name, dev->v4l_device->num);
+
+       return 0;
+}
index 7cae95a..6ac418c 100644 (file)
@@ -75,6 +75,30 @@ static int cx231xx_isoc_audio_deinit(struct cx231xx *dev)
        return 0;
 }
 
+static int cx231xx_bulk_audio_deinit(struct cx231xx *dev)
+{
+       int i;
+
+       dprintk("Stopping bulk\n");
+
+       for (i = 0; i < CX231XX_AUDIO_BUFS; i++) {
+               if (dev->adev.urb[i]) {
+                       if (!irqs_disabled())
+                               usb_kill_urb(dev->adev.urb[i]);
+                       else
+                               usb_unlink_urb(dev->adev.urb[i]);
+
+                       usb_free_urb(dev->adev.urb[i]);
+                       dev->adev.urb[i] = NULL;
+
+                       kfree(dev->adev.transfer_buffer[i]);
+                       dev->adev.transfer_buffer[i] = NULL;
+               }
+       }
+
+       return 0;
+}
+
 static void cx231xx_audio_isocirq(struct urb *urb)
 {
        struct cx231xx *dev = urb->context;
@@ -158,14 +182,92 @@ static void cx231xx_audio_isocirq(struct urb *urb)
        return;
 }
 
+static void cx231xx_audio_bulkirq(struct urb *urb)
+{
+       struct cx231xx *dev = urb->context;
+       unsigned int oldptr;
+       int period_elapsed = 0;
+       int status;
+       unsigned char *cp;
+       unsigned int stride;
+       struct snd_pcm_substream *substream;
+       struct snd_pcm_runtime *runtime;
+
+       switch (urb->status) {
+       case 0:         /* success */
+       case -ETIMEDOUT:        /* NAK */
+               break;
+       case -ECONNRESET:       /* kill */
+       case -ENOENT:
+       case -ESHUTDOWN:
+               return;
+       default:                /* error */
+               dprintk("urb completition error %d.\n", urb->status);
+               break;
+       }
+
+       if (dev->adev.capture_pcm_substream) {
+               substream = dev->adev.capture_pcm_substream;
+               runtime = substream->runtime;
+               stride = runtime->frame_bits >> 3;
+
+               if (1) {
+                       int length = urb->actual_length /
+                                    stride;
+                       cp = (unsigned char *)urb->transfer_buffer;
+
+                       oldptr = dev->adev.hwptr_done_capture;
+                       if (oldptr + length >= runtime->buffer_size) {
+                               unsigned int cnt;
+
+                               cnt = runtime->buffer_size - oldptr;
+                               memcpy(runtime->dma_area + oldptr * stride, cp,
+                                      cnt * stride);
+                               memcpy(runtime->dma_area, cp + cnt * stride,
+                                      length * stride - cnt * stride);
+                       } else {
+                               memcpy(runtime->dma_area + oldptr * stride, cp,
+                                      length * stride);
+                       }
+
+                       snd_pcm_stream_lock(substream);
+
+                       dev->adev.hwptr_done_capture += length;
+                       if (dev->adev.hwptr_done_capture >=
+                                               runtime->buffer_size)
+                               dev->adev.hwptr_done_capture -=
+                                               runtime->buffer_size;
+
+                       dev->adev.capture_transfer_done += length;
+                       if (dev->adev.capture_transfer_done >=
+                               runtime->period_size) {
+                               dev->adev.capture_transfer_done -=
+                                               runtime->period_size;
+                               period_elapsed = 1;
+                       }
+                       snd_pcm_stream_unlock(substream);
+               }
+               if (period_elapsed)
+                       snd_pcm_period_elapsed(substream);
+       }
+       urb->status = 0;
+
+       status = usb_submit_urb(urb, GFP_ATOMIC);
+       if (status < 0) {
+               cx231xx_errdev("resubmit of audio urb failed (error=%i)\n",
+                              status);
+       }
+       return;
+}
+
 static int cx231xx_init_audio_isoc(struct cx231xx *dev)
 {
        int i, errCode;
        int sb_size;
 
-       cx231xx_info("%s: Starting AUDIO transfers\n", __func__);
+       cx231xx_info("%s: Starting ISO AUDIO transfers\n", __func__);
 
-       sb_size = CX231XX_NUM_AUDIO_PACKETS * dev->adev.max_pkt_size;
+       sb_size = CX231XX_ISO_NUM_AUDIO_PACKETS * dev->adev.max_pkt_size;
 
        for (i = 0; i < CX231XX_AUDIO_BUFS; i++) {
                struct urb *urb;
@@ -176,7 +278,7 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev)
                        return -ENOMEM;
 
                memset(dev->adev.transfer_buffer[i], 0x80, sb_size);
-               urb = usb_alloc_urb(CX231XX_NUM_AUDIO_PACKETS, GFP_ATOMIC);
+               urb = usb_alloc_urb(CX231XX_ISO_NUM_AUDIO_PACKETS, GFP_ATOMIC);
                if (!urb) {
                        cx231xx_errdev("usb_alloc_urb failed!\n");
                        for (j = 0; j < i; j++) {
@@ -194,10 +296,10 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev)
                urb->transfer_buffer = dev->adev.transfer_buffer[i];
                urb->interval = 1;
                urb->complete = cx231xx_audio_isocirq;
-               urb->number_of_packets = CX231XX_NUM_AUDIO_PACKETS;
+               urb->number_of_packets = CX231XX_ISO_NUM_AUDIO_PACKETS;
                urb->transfer_buffer_length = sb_size;
 
-               for (j = k = 0; j < CX231XX_NUM_AUDIO_PACKETS;
+               for (j = k = 0; j < CX231XX_ISO_NUM_AUDIO_PACKETS;
                        j++, k += dev->adev.max_pkt_size) {
                        urb->iso_frame_desc[j].offset = k;
                        urb->iso_frame_desc[j].length = dev->adev.max_pkt_size;
@@ -216,6 +318,59 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev)
        return errCode;
 }
 
+static int cx231xx_init_audio_bulk(struct cx231xx *dev)
+{
+       int i, errCode;
+       int sb_size;
+
+       cx231xx_info("%s: Starting BULK AUDIO transfers\n", __func__);
+
+       sb_size = CX231XX_NUM_AUDIO_PACKETS * dev->adev.max_pkt_size;
+
+       for (i = 0; i < CX231XX_AUDIO_BUFS; i++) {
+               struct urb *urb;
+               int j;
+
+               dev->adev.transfer_buffer[i] = kmalloc(sb_size, GFP_ATOMIC);
+               if (!dev->adev.transfer_buffer[i])
+                       return -ENOMEM;
+
+               memset(dev->adev.transfer_buffer[i], 0x80, sb_size);
+               urb = usb_alloc_urb(CX231XX_NUM_AUDIO_PACKETS, GFP_ATOMIC);
+               if (!urb) {
+                       cx231xx_errdev("usb_alloc_urb failed!\n");
+                       for (j = 0; j < i; j++) {
+                               usb_free_urb(dev->adev.urb[j]);
+                               kfree(dev->adev.transfer_buffer[j]);
+                       }
+                       return -ENOMEM;
+               }
+
+               urb->dev = dev->udev;
+               urb->context = dev;
+               urb->pipe = usb_rcvbulkpipe(dev->udev,
+                                               dev->adev.end_point_addr);
+               urb->transfer_flags = 0;
+               urb->transfer_buffer = dev->adev.transfer_buffer[i];
+               urb->complete = cx231xx_audio_bulkirq;
+               urb->transfer_buffer_length = sb_size;
+
+               dev->adev.urb[i] = urb;
+
+       }
+
+       for (i = 0; i < CX231XX_AUDIO_BUFS; i++) {
+               errCode = usb_submit_urb(dev->adev.urb[i], GFP_ATOMIC);
+               if (errCode < 0) {
+                       cx231xx_bulk_audio_deinit(dev);
+                       return errCode;
+               }
+       }
+
+       return errCode;
+}
+
+
 static int cx231xx_cmd(struct cx231xx *dev, int cmd, int arg)
 {
        dprintk("%s transfer\n", (dev->adev.capture_stream == STREAM_ON) ?
@@ -225,7 +380,12 @@ static int cx231xx_cmd(struct cx231xx *dev, int cmd, int arg)
        case CX231XX_CAPTURE_STREAM_EN:
                if (dev->adev.capture_stream == STREAM_OFF && arg == 1) {
                        dev->adev.capture_stream = STREAM_ON;
-                       cx231xx_init_audio_isoc(dev);
+                       if (is_fw_load(dev) == 0)
+                               cx25840_call(dev, core, load_fw);
+                       if (dev->USE_ISO)
+                               cx231xx_init_audio_isoc(dev);
+                       else
+                               cx231xx_init_audio_bulk(dev);
                } else if (dev->adev.capture_stream == STREAM_ON && arg == 0) {
                        dev->adev.capture_stream = STREAM_OFF;
                        cx231xx_isoc_audio_deinit(dev);
@@ -300,7 +460,10 @@ static int snd_cx231xx_capture_open(struct snd_pcm_substream *substream)
 
        /* set alternate setting for audio interface */
        /* 1 - 48000 samples per sec */
-       ret = cx231xx_set_alt_setting(dev, INDEX_AUDIO, 1);
+       if (dev->USE_ISO)
+               ret = cx231xx_set_alt_setting(dev, INDEX_AUDIO, 1);
+       else
+               ret = cx231xx_set_alt_setting(dev, INDEX_AUDIO, 0);
        if (ret < 0) {
                cx231xx_errdev("failed to set alternate setting !\n");
 
@@ -330,6 +493,9 @@ static int snd_cx231xx_pcm_close(struct snd_pcm_substream *substream)
 
        dprintk("closing device\n");
 
+       /* inform hardware to start streaming */
+       ret = cx231xx_capture_start(dev, 0, Audio);
+
        /* set alternate setting for audio interface */
        /* 1 - 48000 samples per sec */
        ret = cx231xx_set_alt_setting(dev, INDEX_AUDIO, 0);
@@ -339,9 +505,6 @@ static int snd_cx231xx_pcm_close(struct snd_pcm_substream *substream)
                return ret;
        }
 
-       /* inform hardware to start streaming */
-       ret = cx231xx_capture_start(dev, 0, Audio);
-
        dev->mute = 1;
        mutex_lock(&dev->lock);
        dev->adev.users--;
@@ -391,6 +554,11 @@ static int snd_cx231xx_hw_capture_free(struct snd_pcm_substream *substream)
 
 static int snd_cx231xx_prepare(struct snd_pcm_substream *substream)
 {
+       struct cx231xx *dev = snd_pcm_substream_chip(substream);
+
+       dev->adev.hwptr_done_capture = 0;
+       dev->adev.capture_transfer_done = 0;
+
        return 0;
 }
 
@@ -495,6 +663,7 @@ static int cx231xx_audio_init(struct cx231xx *dev)
        pcm->info_flags = 0;
        pcm->private_data = dev;
        strcpy(pcm->name, "Conexant cx231xx Capture");
+       snd_card_set_dev(card, &dev->udev->dev);
        strcpy(card->driver, "Cx231xx-Audio");
        strcpy(card->shortname, "Cx231xx Audio");
        strcpy(card->longname, "Conexant cx231xx Audio");
index c217441..3e467ce 100644 (file)
 #include <linux/i2c.h>
 #include <linux/mm.h>
 #include <linux/mutex.h>
+#include <media/tuner.h>
 
 #include <media/v4l2-common.h>
 #include <media/v4l2-ioctl.h>
 #include <media/v4l2-chip-ident.h>
 
 #include "cx231xx.h"
+#include "cx231xx-dif.h"
 
+#define TUNER_MODE_FM_RADIO 0
 /******************************************************************************
                        -: BLOCK ARRANGEMENT :-
        I2S block ----------------------|
                                            [Video]
 
 *******************************************************************************/
+/******************************************************************************
+ *                    VERVE REGISTER                                          *
+       *                                                                     *
+ ******************************************************************************/
+static int verve_write_byte(struct cx231xx *dev, u8 saddr, u8 data)
+{
+       return cx231xx_write_i2c_data(dev, VERVE_I2C_ADDRESS,
+                                       saddr, 1, data, 1);
+}
+
+static int verve_read_byte(struct cx231xx *dev, u8 saddr, u8 *data)
+{
+       int status;
+       u32 temp = 0;
+
+       status = cx231xx_read_i2c_data(dev, VERVE_I2C_ADDRESS,
+                                       saddr, 1, &temp, 1);
+       *data = (u8) temp;
+       return status;
+}
+void initGPIO(struct cx231xx *dev)
+{
+       u32 _gpio_direction = 0;
+       u32 value = 0;
+       u8 val = 0;
+
+       _gpio_direction = _gpio_direction & 0xFC0003FF;
+       _gpio_direction = _gpio_direction | 0x03FDFC00;
+       cx231xx_send_gpio_cmd(dev, _gpio_direction, (u8 *)&value, 4, 0, 0);
+
+       verve_read_byte(dev, 0x07, &val);
+       cx231xx_info(" verve_read_byte address0x07=0x%x\n", val);
+       verve_write_byte(dev, 0x07, 0xF4);
+       verve_read_byte(dev, 0x07, &val);
+       cx231xx_info(" verve_read_byte address0x07=0x%x\n", val);
+
+       cx231xx_capture_start(dev, 1, 2);
+
+       cx231xx_mode_register(dev, EP_MODE_SET, 0x0500FE00);
+       cx231xx_mode_register(dev, GBULK_BIT_EN, 0xFFFDFFFF);
+
+}
+void uninitGPIO(struct cx231xx *dev)
+{
+       u8 value[4] = { 0, 0, 0, 0 };
+
+       cx231xx_capture_start(dev, 0, 2);
+       verve_write_byte(dev, 0x07, 0x14);
+       cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                       0x68, value, 4);
+}
 
 /******************************************************************************
  *                    A F E - B L O C K    C O N T R O L   functions          *
@@ -258,7 +312,7 @@ int cx231xx_afe_set_mode(struct cx231xx *dev, enum AFE_MODE mode)
 
        switch (mode) {
        case AFE_MODE_LOW_IF:
-               /* SetupAFEforLowIF();  */
+               cx231xx_Setup_AFE_for_LowIF(dev);
                break;
        case AFE_MODE_BASEBAND:
                status = cx231xx_afe_setup_AFE_for_baseband(dev);
@@ -291,8 +345,13 @@ int cx231xx_afe_update_power_control(struct cx231xx *dev,
        int status = 0;
 
        switch (dev->model) {
+       case CX231XX_BOARD_CNXT_CARRAERA:
        case CX231XX_BOARD_CNXT_RDE_250:
+       case CX231XX_BOARD_CNXT_SHELBY:
        case CX231XX_BOARD_CNXT_RDU_250:
+       case CX231XX_BOARD_CNXT_RDE_253S:
+       case CX231XX_BOARD_CNXT_RDU_253S:
+       case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
                if (avmode == POLARIS_AVMODE_ANALOGT_TV) {
                        while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
                                                FLD_PWRDN_ENABLE_PLL)) {
@@ -483,6 +542,17 @@ static int vid_blk_read_word(struct cx231xx *dev, u16 saddr, u32 *data)
        return cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
                                        saddr, 2, data, 4);
 }
+int cx231xx_check_fw(struct cx231xx *dev)
+{
+       u8 temp = 0;
+       int status = 0;
+       status = vid_blk_read_byte(dev, DL_CTL_ADDRESS_LOW, &temp);
+       if (status < 0)
+               return status;
+       else
+               return temp;
+
+}
 
 int cx231xx_set_video_input_mux(struct cx231xx *dev, u8 input)
 {
@@ -521,9 +591,15 @@ int cx231xx_set_video_input_mux(struct cx231xx *dev, u8 input)
                                return status;
                        }
                }
-               status = cx231xx_set_decoder_video_input(dev,
+               if (dev->tuner_type == TUNER_NXP_TDA18271)
+                       status = cx231xx_set_decoder_video_input(dev,
+                                                       CX231XX_VMUX_TELEVISION,
+                                                       INPUT(input)->vmux);
+               else
+                       status = cx231xx_set_decoder_video_input(dev,
                                                        CX231XX_VMUX_COMPOSITE1,
                                                        INPUT(input)->vmux);
+
                break;
        default:
                cx231xx_errdev("%s: set_power_mode : Unknown Input %d !\n",
@@ -681,7 +757,9 @@ int cx231xx_set_decoder_video_input(struct cx231xx *dev,
        case CX231XX_VMUX_CABLE:
        default:
                switch (dev->model) {
+               case CX231XX_BOARD_CNXT_CARRAERA:
                case CX231XX_BOARD_CNXT_RDE_250:
+               case CX231XX_BOARD_CNXT_SHELBY:
                case CX231XX_BOARD_CNXT_RDU_250:
                        /* Disable the use of  DIF   */
 
@@ -816,9 +894,21 @@ int cx231xx_set_decoder_video_input(struct cx231xx *dev,
                        /* Set VGA_SEL (for audio control)       (bit 7-8) */
                        status = vid_blk_read_word(dev, AFE_CTRL, &value);
 
+                       /*Set Func mode:01-DIF 10-baseband 11-YUV*/
+                       value &= (~(FLD_FUNC_MODE));
+                       value |= 0x800000;
+
                        value |= FLD_VGA_SEL_CH3 | FLD_VGA_SEL_CH2;
 
                        status = vid_blk_write_word(dev, AFE_CTRL, value);
+
+                       if (dev->tuner_type == TUNER_NXP_TDA18271) {
+                               status = vid_blk_read_word(dev, PIN_CTRL,
+                                &value);
+                               status = vid_blk_write_word(dev, PIN_CTRL,
+                                (value & 0xFFFFFFEF));
+                       }
+
                        break;
 
                }
@@ -840,6 +930,39 @@ int cx231xx_set_decoder_video_input(struct cx231xx *dev,
        return status;
 }
 
+void cx231xx_enable656(struct cx231xx *dev)
+{
+       u8 temp = 0;
+       int status;
+    /*enable TS1 data[0:7] as output to export 656*/
+
+       status = vid_blk_write_byte(dev, TS1_PIN_CTL0, 0xFF);
+
+    /*enable TS1 clock as output to export 656*/
+
+       status = vid_blk_read_byte(dev, TS1_PIN_CTL1, &temp);
+       temp = temp|0x04;
+
+       status = vid_blk_write_byte(dev, TS1_PIN_CTL1, temp);
+
+}
+EXPORT_SYMBOL_GPL(cx231xx_enable656);
+
+void cx231xx_disable656(struct cx231xx *dev)
+{
+       u8 temp = 0;
+       int status;
+
+
+       status = vid_blk_write_byte(dev, TS1_PIN_CTL0, 0x00);
+
+       status = vid_blk_read_byte(dev, TS1_PIN_CTL1, &temp);
+       temp = temp&0xFB;
+
+       status = vid_blk_write_byte(dev, TS1_PIN_CTL1, temp);
+}
+EXPORT_SYMBOL_GPL(cx231xx_disable656);
+
 /*
  * Handle any video-mode specific overrides that are different
  * on a per video standards basis after touching the MODE_CTRL
@@ -873,7 +996,7 @@ int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev)
                                                        VID_BLK_I2C_ADDRESS,
                                                        VERT_TIM_CTRL,
                                                        FLD_V656BLANK_CNT,
-                                                       0x1E000000);
+                                                       0x1C000000);
 
                status = cx231xx_read_modify_write_i2c_dword(dev,
                                                        VID_BLK_I2C_ADDRESS,
@@ -881,12 +1004,20 @@ int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev)
                                                        FLD_HBLANK_CNT,
                                                        cx231xx_set_field
                                                        (FLD_HBLANK_CNT, 0x79));
+
        } else if (dev->norm & V4L2_STD_SECAM) {
                cx231xx_info("do_mode_ctrl_overrides SECAM\n");
                status =  cx231xx_read_modify_write_i2c_dword(dev,
                                                        VID_BLK_I2C_ADDRESS,
                                                        VERT_TIM_CTRL,
                                                        FLD_VBLANK_CNT, 0x24);
+               status = cx231xx_read_modify_write_i2c_dword(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       VERT_TIM_CTRL,
+                                                       FLD_V656BLANK_CNT,
+                                                       cx231xx_set_field
+                                                       (FLD_V656BLANK_CNT,
+                                                       0x28));
                /* Adjust the active video horizontal start point */
                status = cx231xx_read_modify_write_i2c_dword(dev,
                                                        VID_BLK_I2C_ADDRESS,
@@ -900,6 +1031,13 @@ int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev)
                                                        VID_BLK_I2C_ADDRESS,
                                                        VERT_TIM_CTRL,
                                                        FLD_VBLANK_CNT, 0x24);
+               status = cx231xx_read_modify_write_i2c_dword(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       VERT_TIM_CTRL,
+                                                       FLD_V656BLANK_CNT,
+                                                       cx231xx_set_field
+                                                       (FLD_V656BLANK_CNT,
+                                                       0x28));
                /* Adjust the active video horizontal start point */
                status = cx231xx_read_modify_write_i2c_dword(dev,
                                                        VID_BLK_I2C_ADDRESS,
@@ -907,11 +1045,28 @@ int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev)
                                                        FLD_HBLANK_CNT,
                                                        cx231xx_set_field
                                                        (FLD_HBLANK_CNT, 0x85));
+
        }
 
        return status;
 }
 
+int cx231xx_unmute_audio(struct cx231xx *dev)
+{
+       return vid_blk_write_byte(dev, PATH1_VOL_CTL, 0x24);
+}
+EXPORT_SYMBOL_GPL(cx231xx_unmute_audio);
+
+int stopAudioFirmware(struct cx231xx *dev)
+{
+       return vid_blk_write_byte(dev, DL_CTL_CONTROL, 0x03);
+}
+
+int restartAudioFirmware(struct cx231xx *dev)
+{
+       return vid_blk_write_byte(dev, DL_CTL_CONTROL, 0x13);
+}
+
 int cx231xx_set_audio_input(struct cx231xx *dev, u8 input)
 {
        int status = 0;
@@ -970,6 +1125,7 @@ int cx231xx_set_audio_decoder_input(struct cx231xx *dev,
 
                /* unmute all, AC97 in, independence mode
                   adr 08d0, data 0x00063073 */
+               status = vid_blk_write_word(dev, DL_CTL, 0x3000001);
                status = vid_blk_write_word(dev, PATH1_CTL1, 0x00063073);
 
                /* set AVC maximum threshold, adr 08d4, dat ffff0024 */
@@ -985,7 +1141,7 @@ int cx231xx_set_audio_decoder_input(struct cx231xx *dev,
 
        case AUDIO_INPUT_TUNER_TV:
        default:
-
+               status = stopAudioFirmware(dev);
                /* Setup SRC sources and clocks */
                status = vid_blk_write_word(dev, BAND_OUT_SEL,
                        cx231xx_set_field(FLD_SRC6_IN_SEL, 0x00)         |
@@ -1013,17 +1169,30 @@ int cx231xx_set_audio_decoder_input(struct cx231xx *dev,
                status = vid_blk_write_word(dev, PATH1_CTL1, 0x1F063870);
 
                /* setAudioStandard(_audio_standard); */
-
                status = vid_blk_write_word(dev, PATH1_CTL1, 0x00063870);
+
+               status = restartAudioFirmware(dev);
+
                switch (dev->model) {
+               case CX231XX_BOARD_CNXT_CARRAERA:
                case CX231XX_BOARD_CNXT_RDE_250:
+               case CX231XX_BOARD_CNXT_SHELBY:
                case CX231XX_BOARD_CNXT_RDU_250:
+               case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
                        status = cx231xx_read_modify_write_i2c_dword(dev,
                                        VID_BLK_I2C_ADDRESS,
                                        CHIP_CTRL,
                                        FLD_SIF_EN,
                                        cx231xx_set_field(FLD_SIF_EN, 1));
                        break;
+               case CX231XX_BOARD_CNXT_RDE_253S:
+               case CX231XX_BOARD_CNXT_RDU_253S:
+                       status = cx231xx_read_modify_write_i2c_dword(dev,
+                                       VID_BLK_I2C_ADDRESS,
+                                       CHIP_CTRL,
+                                       FLD_SIF_EN,
+                                       cx231xx_set_field(FLD_SIF_EN, 0));
+                       break;
                default:
                        break;
                }
@@ -1058,7 +1227,9 @@ int cx231xx_resolution_set(struct cx231xx *dev)
                return status;
 
        /* set vertical scale */
-       return vid_blk_write_word(dev, VSCALE_CTRL, dev->vscale);
+       status = vid_blk_write_word(dev, VSCALE_CTRL, dev->vscale);
+
+       return status;
 }
 
 /******************************************************************************
@@ -1122,6 +1293,346 @@ int cx231xx_enable_i2c_for_tuner(struct cx231xx *dev, u8 I2CIndex)
 
        return status;
 
+}
+EXPORT_SYMBOL_GPL(cx231xx_enable_i2c_for_tuner);
+void update_HH_register_after_set_DIF(struct cx231xx *dev)
+{
+/*
+       u8 status = 0;
+       u32 value = 0;
+
+       vid_blk_write_word(dev, PIN_CTRL, 0xA0FFF82F);
+       vid_blk_write_word(dev, DIF_MISC_CTRL, 0x0A203F11);
+       vid_blk_write_word(dev, DIF_SRC_PHASE_INC, 0x1BEFBF06);
+
+       status = vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL, &value);
+       vid_blk_write_word(dev, AFE_CTRL_C2HH_SRC_CTRL, 0x4485D390);
+       status = vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL,  &value);
+*/
+}
+
+void cx231xx_dump_HH_reg(struct cx231xx *dev)
+{
+       u8 status = 0;
+       u32 value = 0;
+       u16  i = 0;
+
+       value = 0x45005390;
+       status = vid_blk_write_word(dev, 0x104, value);
+
+       for (i = 0x100; i < 0x140; i++) {
+               status = vid_blk_read_word(dev, i, &value);
+               cx231xx_info("reg0x%x=0x%x\n", i, value);
+               i = i+3;
+       }
+
+       for (i = 0x300; i < 0x400; i++) {
+               status = vid_blk_read_word(dev, i, &value);
+               cx231xx_info("reg0x%x=0x%x\n", i, value);
+               i = i+3;
+       }
+
+       for (i = 0x400; i < 0x440; i++) {
+               status = vid_blk_read_word(dev, i,  &value);
+               cx231xx_info("reg0x%x=0x%x\n", i, value);
+               i = i+3;
+       }
+
+   status = vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL, &value);
+   cx231xx_info("AFE_CTRL_C2HH_SRC_CTRL=0x%x\n", value);
+   vid_blk_write_word(dev, AFE_CTRL_C2HH_SRC_CTRL, 0x4485D390);
+   status = vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL, &value);
+   cx231xx_info("AFE_CTRL_C2HH_SRC_CTRL=0x%x\n", value);
+
+}
+void cx231xx_dump_SC_reg(struct cx231xx *dev)
+{
+       u8 value[4] = { 0, 0, 0, 0 };
+       int status = 0;
+       cx231xx_info("cx231xx_dump_SC_reg %s!\n", __TIME__);
+
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, BOARD_CFG_STAT,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", BOARD_CFG_STAT, value[0],
+                                value[1], value[2], value[3]);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS_MODE_REG,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS_MODE_REG, value[0],
+                                value[1], value[2], value[3]);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS1_CFG_REG,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS1_CFG_REG, value[0],
+                                value[1], value[2], value[3]);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS1_LENGTH_REG,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS1_LENGTH_REG, value[0],
+                                value[1], value[2], value[3]);
+
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS2_CFG_REG,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS2_CFG_REG, value[0],
+                                value[1], value[2], value[3]);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS2_LENGTH_REG,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS2_LENGTH_REG, value[0],
+                                value[1], value[2], value[3]);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, EP_MODE_SET,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", EP_MODE_SET, value[0],
+                                value[1], value[2], value[3]);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_PTN1,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_PTN1, value[0],
+                                value[1], value[2], value[3]);
+
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_PTN2,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_PTN2, value[0],
+                                value[1], value[2], value[3]);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_PTN3,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_PTN3, value[0],
+                                value[1], value[2], value[3]);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_MASK0,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_MASK0, value[0],
+                                value[1], value[2], value[3]);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_MASK1,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_MASK1, value[0],
+                                value[1], value[2], value[3]);
+
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_MASK2,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_MASK2, value[0],
+                                value[1], value[2], value[3]);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_GAIN,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_GAIN, value[0],
+                                value[1], value[2], value[3]);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_CAR_REG,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_CAR_REG, value[0],
+                                value[1], value[2], value[3]);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_OT_CFG1,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_OT_CFG1, value[0],
+                                value[1], value[2], value[3]);
+
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_OT_CFG2,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_OT_CFG2, value[0],
+                                value[1], value[2], value[3]);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", PWR_CTL_EN, value[0],
+                                value[1], value[2], value[3]);
+
+
+}
+
+void cx231xx_Setup_AFE_for_LowIF(struct cx231xx *dev)
+
+{
+       u8 status = 0;
+       u8 value = 0;
+
+
+
+       status = afe_read_byte(dev, ADC_STATUS2_CH3, &value);
+       value = (value & 0xFE)|0x01;
+       status = afe_write_byte(dev, ADC_STATUS2_CH3, value);
+
+       status = afe_read_byte(dev, ADC_STATUS2_CH3, &value);
+       value = (value & 0xFE)|0x00;
+       status = afe_write_byte(dev, ADC_STATUS2_CH3, value);
+
+
+/*
+     config colibri to lo-if mode
+
+     FIXME: ntf_mode = 2'b00 by default. But set 0x1 would reduce
+        the diff IF input by half,
+
+           for low-if agc defect
+*/
+
+       status = afe_read_byte(dev, ADC_NTF_PRECLMP_EN_CH3, &value);
+       value = (value & 0xFC)|0x00;
+       status = afe_write_byte(dev, ADC_NTF_PRECLMP_EN_CH3, value);
+
+       status = afe_read_byte(dev, ADC_INPUT_CH3, &value);
+       value = (value & 0xF9)|0x02;
+       status = afe_write_byte(dev, ADC_INPUT_CH3, value);
+
+       status = afe_read_byte(dev, ADC_FB_FRCRST_CH3, &value);
+       value = (value & 0xFB)|0x04;
+       status = afe_write_byte(dev, ADC_FB_FRCRST_CH3, value);
+
+       status = afe_read_byte(dev, ADC_DCSERVO_DEM_CH3, &value);
+       value = (value & 0xFC)|0x03;
+       status = afe_write_byte(dev, ADC_DCSERVO_DEM_CH3, value);
+
+       status = afe_read_byte(dev, ADC_CTRL_DAC1_CH3, &value);
+       value = (value & 0xFB)|0x04;
+       status = afe_write_byte(dev, ADC_CTRL_DAC1_CH3, value);
+
+       status = afe_read_byte(dev, ADC_CTRL_DAC23_CH3, &value);
+       value = (value & 0xF8)|0x06;
+       status = afe_write_byte(dev, ADC_CTRL_DAC23_CH3, value);
+
+       status = afe_read_byte(dev, ADC_CTRL_DAC23_CH3, &value);
+       value = (value & 0x8F)|0x40;
+       status = afe_write_byte(dev, ADC_CTRL_DAC23_CH3, value);
+
+       status = afe_read_byte(dev, ADC_PWRDN_CLAMP_CH3, &value);
+       value = (value & 0xDF)|0x20;
+       status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3, value);
+}
+
+void cx231xx_set_Colibri_For_LowIF(struct cx231xx *dev, u32 if_freq,
+                u8 spectral_invert, u32 mode)
+{
+
+    u32 colibri_carrier_offset = 0;
+    u8 status = 0;
+    u32 func_mode = 0;
+    u32 standard = 0;
+       u8 value[4] = { 0, 0, 0, 0 };
+
+       switch (dev->model) {
+       case CX231XX_BOARD_CNXT_CARRAERA:
+       case CX231XX_BOARD_CNXT_RDE_250:
+       case CX231XX_BOARD_CNXT_SHELBY:
+       case CX231XX_BOARD_CNXT_RDU_250:
+       case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
+               func_mode = 0x03;
+               break;
+       case CX231XX_BOARD_CNXT_RDE_253S:
+       case CX231XX_BOARD_CNXT_RDU_253S:
+               func_mode = 0x01;
+               break;
+
+       default:
+               func_mode = 0x01;
+       }
+
+       cx231xx_info("Enter cx231xx_set_Colibri_For_LowIF()\n");
+               value[0] = (u8) 0x6F;
+               value[1] = (u8) 0x6F;
+               value[2] = (u8) 0x6F;
+               value[3] = (u8) 0x6F;
+               status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                               PWR_CTL_EN, value, 4);
+    if (1) {
+
+       /*Set colibri for low IF*/
+       status = cx231xx_afe_set_mode(dev, AFE_MODE_LOW_IF);
+
+
+       /* Set C2HH for low IF operation.*/
+       standard = dev->norm;
+       status = cx231xx_dif_configure_C2HH_for_low_IF(dev, dev->active_mode,
+                                                 func_mode, standard);
+
+
+       /* Get colibri offsets.*/
+       colibri_carrier_offset = cx231xx_Get_Colibri_CarrierOffset(mode,
+                                        standard);
+
+       cx231xx_info("colibri_carrier_offset=%d, standard=0x%x\n",
+                                colibri_carrier_offset, standard);
+
+       /* Set the band Pass filter for DIF*/
+       cx231xx_set_DIF_bandpass(dev, (if_freq+colibri_carrier_offset)
+                , spectral_invert, mode);
+    }
+}
+
+u32 cx231xx_Get_Colibri_CarrierOffset(u32 mode, u32 standerd)
+{
+    u32 colibri_carrier_offset = 0;
+
+
+    if (mode == TUNER_MODE_FM_RADIO) {
+               colibri_carrier_offset = 1100000;
+       } else if (standerd & (V4L2_STD_NTSC | V4L2_STD_NTSC_M_JP)) {
+               colibri_carrier_offset = 4832000;  /*4.83MHz    */
+       } else if (standerd & (V4L2_STD_PAL_B | V4L2_STD_PAL_G)) {
+               colibri_carrier_offset = 2700000;  /*2.70MHz       */
+       } else if (standerd & (V4L2_STD_PAL_D | V4L2_STD_PAL_I
+                       | V4L2_STD_SECAM)) {
+               colibri_carrier_offset = 2100000;  /*2.10MHz    */
+       }
+
+
+    return colibri_carrier_offset;
+}
+
+void cx231xx_set_DIF_bandpass(struct cx231xx *dev, u32 if_freq,
+                u8 spectral_invert, u32 mode)
+{
+
+    unsigned long pll_freq_word;
+    int status = 0;
+    u32 dif_misc_ctrl_value = 0;
+    u64 pll_freq_u64 = 0;
+    u32 i = 0;
+
+
+       cx231xx_info("if_freq=%d;spectral_invert=0x%x;mode=0x%x\n",
+                        if_freq, spectral_invert, mode);
+
+
+    if (mode == TUNER_MODE_FM_RADIO) {
+       pll_freq_word = 0x905A1CAC;
+       status = vid_blk_write_word(dev, DIF_PLL_FREQ_WORD,  pll_freq_word);
+
+    } else /*KSPROPERTY_TUNER_MODE_TV*/{
+       /* Calculate the PLL frequency word based on the adjusted if_freq*/
+       pll_freq_word = if_freq;
+       pll_freq_u64 = (u64)pll_freq_word << 28L;
+       do_div(pll_freq_u64, 50000000);
+       pll_freq_word = (u32)pll_freq_u64;
+       /*pll_freq_word = 0x3463497;*/
+       status = vid_blk_write_word(dev, DIF_PLL_FREQ_WORD,  pll_freq_word);
+
+    if (spectral_invert) {
+       if_freq -= 400000;
+       /* Enable Spectral Invert*/
+       status = vid_blk_read_word(dev, DIF_MISC_CTRL,
+                                &dif_misc_ctrl_value);
+       dif_misc_ctrl_value = dif_misc_ctrl_value | 0x00200000;
+       status = vid_blk_write_word(dev, DIF_MISC_CTRL,
+                                dif_misc_ctrl_value);
+    } else {
+       if_freq += 400000;
+       /* Disable Spectral Invert*/
+       status = vid_blk_read_word(dev, DIF_MISC_CTRL,
+                                &dif_misc_ctrl_value);
+       dif_misc_ctrl_value = dif_misc_ctrl_value & 0xFFDFFFFF;
+       status = vid_blk_write_word(dev, DIF_MISC_CTRL,
+                                dif_misc_ctrl_value);
+    }
+
+       if_freq = (if_freq/100000)*100000;
+
+    if (if_freq < 3000000)
+       if_freq = 3000000;
+
+    if (if_freq > 16000000)
+       if_freq = 16000000;
+    }
+
+    cx231xx_info("Enter IF=%d\n",
+                sizeof(Dif_set_array)/sizeof(struct dif_settings));
+    for (i = 0; i < sizeof(Dif_set_array)/sizeof(struct dif_settings); i++) {
+       if (Dif_set_array[i].if_freq == if_freq) {
+               status = vid_blk_write_word(dev,
+                Dif_set_array[i].register_address, Dif_set_array[i].value);
+       }
+    }
+
 }
 
 /******************************************************************************
@@ -1132,6 +1643,7 @@ int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode,
 {
        int status = 0;
 
+
        if (mode == V4L2_TUNER_RADIO) {
                /* C2HH */
                /* lo if big signal */
@@ -1174,6 +1686,7 @@ int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode,
                                        VID_BLK_I2C_ADDRESS, 32,
                                        AUD_IO_CTRL, 0, 31, 0x00000003);
                } else if ((standard == V4L2_STD_PAL_I) |
+                       (standard & V4L2_STD_PAL_D) |
                        (standard & V4L2_STD_SECAM)) {
                        /* C2HH setup */
                        /* lo if big signal */
@@ -1232,10 +1745,17 @@ int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard)
                dev->norm = standard;
 
        switch (dev->model) {
+       case CX231XX_BOARD_CNXT_CARRAERA:
        case CX231XX_BOARD_CNXT_RDE_250:
+       case CX231XX_BOARD_CNXT_SHELBY:
        case CX231XX_BOARD_CNXT_RDU_250:
+       case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
                func_mode = 0x03;
                break;
+       case CX231XX_BOARD_CNXT_RDE_253S:
+       case CX231XX_BOARD_CNXT_RDU_253S:
+               func_mode = 0x01;
+               break;
        default:
                func_mode = 0x01;
        }
@@ -1617,17 +2137,27 @@ int cx231xx_tuner_post_channel_change(struct cx231xx *dev)
 {
        int status = 0;
        u32 dwval;
-
+   cx231xx_info("cx231xx_tuner_post_channel_change  dev->tuner_type =0%d\n",
+                        dev->tuner_type);
        /* Set the RF and IF k_agc values to 4 for PAL/NTSC and 8 for
         * SECAM L/B/D standards */
        status = vid_blk_read_word(dev, DIF_AGC_IF_REF, &dwval);
        dwval &= ~(FLD_DIF_K_AGC_RF | FLD_DIF_K_AGC_IF);
 
        if (dev->norm & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_B |
-                        V4L2_STD_SECAM_D))
-               dwval |= 0x88000000;
-       else
-               dwval |= 0x44000000;
+                        V4L2_STD_SECAM_D)) {
+                       if (dev->tuner_type == TUNER_NXP_TDA18271) {
+                               dwval &= ~FLD_DIF_IF_REF;
+                               dwval |= 0x88000300;
+                       } else
+                               dwval |= 0x88000000;
+               } else {
+                       if (dev->tuner_type == TUNER_NXP_TDA18271) {
+                               dwval &= ~FLD_DIF_IF_REF;
+                               dwval |= 0xCC000300;
+                       } else
+                               dwval |= 0x44000000;
+               }
 
        status = vid_blk_write_word(dev, DIF_AGC_IF_REF, dwval);
 
@@ -1714,8 +2244,6 @@ int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode)
                return 0;
        }
 
-       cx231xx_info(" setPowerMode::mode = %d\n", mode);
-
        status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN, value,
                                       4);
        if (status < 0)
@@ -1761,7 +2289,7 @@ int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode)
 
        case POLARIS_AVMODE_ANALOGT_TV:
 
-               tmp &= (~PWR_DEMOD_EN);
+               tmp |= PWR_DEMOD_EN;
                tmp |= (I2C_DEMOD_EN);
                value[0] = (u8) tmp;
                value[1] = (u8) (tmp >> 8);
@@ -1814,14 +2342,27 @@ int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode)
                        msleep(PWR_SLEEP_INTERVAL);
                }
 
-               if ((dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
+               if ((dev->model == CX231XX_BOARD_CNXT_CARRAERA) ||
+                   (dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
+                   (dev->model == CX231XX_BOARD_CNXT_SHELBY) ||
                    (dev->model == CX231XX_BOARD_CNXT_RDU_250)) {
                        /* tuner path to channel 1 from port 3 */
                        cx231xx_enable_i2c_for_tuner(dev, I2C_3);
 
+                       /* reset the Tuner */
+                       cx231xx_gpio_set(dev, dev->board.tuner_gpio);
+
+                       if (dev->cx231xx_reset_analog_tuner)
+                               dev->cx231xx_reset_analog_tuner(dev);
+               } else if ((dev->model == CX231XX_BOARD_CNXT_RDE_253S) ||
+                   (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) ||
+                   (dev->model == CX231XX_BOARD_CNXT_RDU_253S)) {
+                       /* tuner path to channel 1 from port 3 */
+                       cx231xx_enable_i2c_for_tuner(dev, I2C_3);
                        if (dev->cx231xx_reset_analog_tuner)
                                dev->cx231xx_reset_analog_tuner(dev);
                }
+
                break;
 
        case POLARIS_AVMODE_DIGITAL:
@@ -1876,14 +2417,27 @@ int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode)
                        msleep(PWR_SLEEP_INTERVAL);
                }
 
-               if ((dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
+               if ((dev->model == CX231XX_BOARD_CNXT_CARRAERA) ||
+                   (dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
+                   (dev->model == CX231XX_BOARD_CNXT_SHELBY) ||
                    (dev->model == CX231XX_BOARD_CNXT_RDU_250)) {
                        /* tuner path to channel 1 from port 3 */
                        cx231xx_enable_i2c_for_tuner(dev, I2C_3);
 
+                       /* reset the Tuner */
+                       cx231xx_gpio_set(dev, dev->board.tuner_gpio);
+
+                       if (dev->cx231xx_reset_analog_tuner)
+                               dev->cx231xx_reset_analog_tuner(dev);
+               } else if ((dev->model == CX231XX_BOARD_CNXT_RDE_253S) ||
+                   (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) ||
+                   (dev->model == CX231XX_BOARD_CNXT_RDU_253S)) {
+                       /* tuner path to channel 1 from port 3 */
+                       cx231xx_enable_i2c_for_tuner(dev, I2C_3);
                        if (dev->cx231xx_reset_analog_tuner)
                                dev->cx231xx_reset_analog_tuner(dev);
                }
+
                break;
 
        default:
@@ -1913,9 +2467,6 @@ int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode)
 
        status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN, value,
                                       4);
-       cx231xx_info(" The data of PWR_CTL_EN register 0x74"
-                                "=0x%0x,0x%0x,0x%0x,0x%0x\n",
-                    value[0], value[1], value[2], value[3]);
 
        return status;
 }
@@ -2000,6 +2551,8 @@ int cx231xx_stop_stream(struct cx231xx *dev, u32 ep_mask)
 int cx231xx_initialize_stream_xfer(struct cx231xx *dev, u32 media_type)
 {
        int status = 0;
+       u32 value = 0;
+       u8 val[4] = { 0, 0, 0, 0 };
 
        if (dev->udev->speed == USB_SPEED_HIGH) {
                switch (media_type) {
@@ -2026,10 +2579,36 @@ int cx231xx_initialize_stream_xfer(struct cx231xx *dev, u32 media_type)
                        break;
 
                case 4: /* ts1 */
-                       cx231xx_info("%s: set ts1 registers\n", __func__);
+                       cx231xx_info("%s: set ts1 registers", __func__);
+
+               if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
+                       cx231xx_info(" MPEG\n");
+                       value &= 0xFFFFFFFC;
+                       value |= 0x3;
+
+                       status = cx231xx_mode_register(dev, TS_MODE_REG, value);
+
+                       val[0] = 0x04;
+                       val[1] = 0xA3;
+                       val[2] = 0x3B;
+                       val[3] = 0x00;
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                TS1_CFG_REG, val, 4);
+
+                       val[0] = 0x00;
+                       val[1] = 0x08;
+                       val[2] = 0x00;
+                       val[3] = 0x08;
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                TS1_LENGTH_REG, val, 4);
+
+               } else {
+                       cx231xx_info(" BDA\n");
                        status = cx231xx_mode_register(dev, TS_MODE_REG, 0x101);
-                       status = cx231xx_mode_register(dev, TS1_CFG_REG, 0x400);
+                       status = cx231xx_mode_register(dev, TS1_CFG_REG, 0x010);
+               }
                        break;
+
                case 6: /* ts1 parallel mode */
                        cx231xx_info("%s: set ts1 parrallel mode registers\n",
                                     __func__);
@@ -2128,7 +2707,7 @@ EXPORT_SYMBOL_GPL(cx231xx_capture_start);
 /*****************************************************************************
 *                   G P I O   B I T control functions                        *
 ******************************************************************************/
-int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 * gpio_val)
+int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val)
 {
        int status = 0;
 
@@ -2137,7 +2716,7 @@ int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 * gpio_val)
        return status;
 }
 
-int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 * gpio_val)
+int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val)
 {
        int status = 0;
 
@@ -2344,7 +2923,7 @@ int cx231xx_gpio_i2c_write_byte(struct cx231xx *dev, u8 data)
        return status;
 }
 
-int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 * buf)
+int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 *buf)
 {
        u8 value = 0;
        int status = 0;
@@ -2494,7 +3073,7 @@ int cx231xx_gpio_i2c_write_nak(struct cx231xx *dev)
 /* cx231xx_gpio_i2c_read
  * Function to read data from gpio based I2C interface
  */
-int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 * buf, u8 len)
+int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len)
 {
        int status = 0;
        int i = 0;
@@ -2538,7 +3117,7 @@ int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 * buf, u8 len)
 /* cx231xx_gpio_i2c_write
  * Function to write data to gpio based I2C interface
  */
-int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 * buf, u8 len)
+int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len)
 {
        int status = 0;
        int i = 0;
index f2a4900..59e2733 100644 (file)
@@ -41,6 +41,10 @@ static int tuner = -1;
 module_param(tuner, int, 0444);
 MODULE_PARM_DESC(tuner, "tuner type");
 
+static int transfer_mode = 1;
+module_param(transfer_mode, int, 0444);
+MODULE_PARM_DESC(transfer_mode, "transfer mode (1-ISO or 0-BULK)");
+
 static unsigned int disable_ir;
 module_param(disable_ir, int, 0444);
 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
@@ -86,8 +90,8 @@ struct cx231xx_board cx231xx_boards[] = {
                        }
                },
        },
-       [CX231XX_BOARD_CNXT_RDE_250] = {
-               .name = "Conexant Hybrid TV - RDE250",
+       [CX231XX_BOARD_CNXT_CARRAERA] = {
+               .name = "Conexant Hybrid TV - CARRAERA",
                .tuner_type = TUNER_XC5000,
                .tuner_addr = 0x61,
                .tuner_gpio = RDE250_XCV_TUNER,
@@ -125,9 +129,8 @@ struct cx231xx_board cx231xx_boards[] = {
                        }
                },
        },
-
-       [CX231XX_BOARD_CNXT_RDU_250] = {
-               .name = "Conexant Hybrid TV - RDU250",
+       [CX231XX_BOARD_CNXT_SHELBY] = {
+               .name = "Conexant Hybrid TV - SHELBY",
                .tuner_type = TUNER_XC5000,
                .tuner_addr = 0x61,
                .tuner_gpio = RDE250_XCV_TUNER,
@@ -165,6 +168,183 @@ struct cx231xx_board cx231xx_boards[] = {
                        }
                },
        },
+       [CX231XX_BOARD_CNXT_RDE_253S] = {
+               .name = "Conexant Hybrid TV - RDE253S",
+               .tuner_type = TUNER_NXP_TDA18271,
+               .tuner_addr = 0x60,
+               .tuner_gpio = RDE250_XCV_TUNER,
+               .tuner_sif_gpio = 0x05,
+               .tuner_scl_gpio = 0x1a,
+               .tuner_sda_gpio = 0x1b,
+               .decoder = CX231XX_AVDECODER,
+               .demod_xfer_mode = 0,
+               .ctl_pin_status_mask = 0xFFFFFFC4,
+               .agc_analog_digital_select_gpio = 0x1c,
+               .gpio_pin_status_mask = 0x4001000,
+               .tuner_i2c_master = 1,
+               .demod_i2c_master = 2,
+               .has_dvb = 1,
+               .demod_addr = 0x02,
+               .norm = V4L2_STD_PAL,
+
+               .input = {{
+                               .type = CX231XX_VMUX_TELEVISION,
+                               .vmux = CX231XX_VIN_3_1,
+                               .amux = CX231XX_AMUX_VIDEO,
+                               .gpio = NULL,
+                       }, {
+                               .type = CX231XX_VMUX_COMPOSITE1,
+                               .vmux = CX231XX_VIN_2_1,
+                               .amux = CX231XX_AMUX_LINE_IN,
+                               .gpio = NULL,
+                       }, {
+                               .type = CX231XX_VMUX_SVIDEO,
+                               .vmux = CX231XX_VIN_1_1 |
+                                       (CX231XX_VIN_1_2 << 8) |
+                                       CX25840_SVIDEO_ON,
+                               .amux = CX231XX_AMUX_LINE_IN,
+                               .gpio = NULL,
+                       }
+               },
+       },
+
+       [CX231XX_BOARD_CNXT_RDU_253S] = {
+               .name = "Conexant Hybrid TV - RDU253S",
+               .tuner_type = TUNER_NXP_TDA18271,
+               .tuner_addr = 0x60,
+               .tuner_gpio = RDE250_XCV_TUNER,
+               .tuner_sif_gpio = 0x05,
+               .tuner_scl_gpio = 0x1a,
+               .tuner_sda_gpio = 0x1b,
+               .decoder = CX231XX_AVDECODER,
+               .demod_xfer_mode = 0,
+               .ctl_pin_status_mask = 0xFFFFFFC4,
+               .agc_analog_digital_select_gpio = 0x1c,
+               .gpio_pin_status_mask = 0x4001000,
+               .tuner_i2c_master = 1,
+               .demod_i2c_master = 2,
+               .has_dvb = 1,
+               .demod_addr = 0x02,
+               .norm = V4L2_STD_PAL,
+
+               .input = {{
+                               .type = CX231XX_VMUX_TELEVISION,
+                               .vmux = CX231XX_VIN_3_1,
+                               .amux = CX231XX_AMUX_VIDEO,
+                               .gpio = NULL,
+                       }, {
+                               .type = CX231XX_VMUX_COMPOSITE1,
+                               .vmux = CX231XX_VIN_2_1,
+                               .amux = CX231XX_AMUX_LINE_IN,
+                               .gpio = NULL,
+                       }, {
+                               .type = CX231XX_VMUX_SVIDEO,
+                               .vmux = CX231XX_VIN_1_1 |
+                                       (CX231XX_VIN_1_2 << 8) |
+                                       CX25840_SVIDEO_ON,
+                               .amux = CX231XX_AMUX_LINE_IN,
+                               .gpio = NULL,
+                       }
+               },
+       },
+       [CX231XX_BOARD_CNXT_VIDEO_GRABBER] = {
+               .name = "Conexant VIDEO GRABBER",
+               .tuner_type = TUNER_NXP_TDA18271,
+               .tuner_addr = 0x60,
+               .tuner_gpio = RDE250_XCV_TUNER,
+               .tuner_sif_gpio = 0x05,
+               .tuner_scl_gpio = 0x1a,
+               .tuner_sda_gpio = 0x1b,
+               .decoder = CX231XX_AVDECODER,
+               .demod_xfer_mode = 0,
+               .ctl_pin_status_mask = 0xFFFFFFC4,
+               .agc_analog_digital_select_gpio = 0x1c,
+               .gpio_pin_status_mask = 0x4001000,
+               .tuner_i2c_master = 1,
+               .demod_i2c_master = 2,
+               .has_dvb = 0,
+               .demod_addr = 0x02,
+               .norm = V4L2_STD_PAL,
+
+               .input = {{
+                               .type = CX231XX_VMUX_COMPOSITE1,
+                               .vmux = CX231XX_VIN_2_1,
+                               .amux = CX231XX_AMUX_LINE_IN,
+                               .gpio = NULL,
+                       }, {
+                               .type = CX231XX_VMUX_SVIDEO,
+                               .vmux = CX231XX_VIN_1_1 |
+                                       (CX231XX_VIN_1_2 << 8) |
+                                       CX25840_SVIDEO_ON,
+                               .amux = CX231XX_AMUX_LINE_IN,
+                               .gpio = NULL,
+                       }, {
+                               .type = CX231XX_VMUX_TELEVISION,
+                               .vmux = CX231XX_VIN_3_1,
+                               .amux = CX231XX_AMUX_VIDEO,
+                               .gpio = NULL,
+                       }
+               },
+       },
+       [CX231XX_BOARD_CNXT_RDE_250] = {
+               .name = "Conexant Hybrid TV - rde 250",
+               .tuner_type = TUNER_XC5000,
+               .tuner_addr = 0x61,
+               .tuner_gpio = RDE250_XCV_TUNER,
+               .tuner_sif_gpio = 0x05,
+               .tuner_scl_gpio = 0x1a,
+               .tuner_sda_gpio = 0x1b,
+               .decoder = CX231XX_AVDECODER,
+               .demod_xfer_mode = 0,
+               .ctl_pin_status_mask = 0xFFFFFFC4,
+               .agc_analog_digital_select_gpio = 0x0c,
+               .gpio_pin_status_mask = 0x4001000,
+               .tuner_i2c_master = 1,
+               .demod_i2c_master = 2,
+               .has_dvb = 1,
+               .demod_addr = 0x02,
+               .norm = V4L2_STD_PAL,
+
+               .input = {{
+                               .type = CX231XX_VMUX_TELEVISION,
+                               .vmux = CX231XX_VIN_2_1,
+                               .amux = CX231XX_AMUX_VIDEO,
+                               .gpio = NULL,
+                       }
+               },
+       },
+       [CX231XX_BOARD_CNXT_RDU_250] = {
+               .name = "Conexant Hybrid TV - RDU 250",
+               .tuner_type = TUNER_XC5000,
+               .tuner_addr = 0x61,
+               .tuner_gpio = RDE250_XCV_TUNER,
+               .tuner_sif_gpio = 0x05,
+               .tuner_scl_gpio = 0x1a,
+               .tuner_sda_gpio = 0x1b,
+               .decoder = CX231XX_AVDECODER,
+               .demod_xfer_mode = 0,
+               .ctl_pin_status_mask = 0xFFFFFFC4,
+               .agc_analog_digital_select_gpio = 0x0c,
+               .gpio_pin_status_mask = 0x4001000,
+               .tuner_i2c_master = 1,
+               .demod_i2c_master = 2,
+               .has_dvb = 1,
+               .demod_addr = 0x32,
+               .norm = V4L2_STD_NTSC,
+
+               .input = {{
+                               .type = CX231XX_VMUX_TELEVISION,
+                               .vmux = CX231XX_VIN_2_1,
+                               .amux = CX231XX_AMUX_VIDEO,
+                               .gpio = NULL,
+                       }
+               },
+       },
+
+
+
+
+
 };
 const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
 
@@ -173,8 +353,18 @@ struct usb_device_id cx231xx_id_table[] = {
        {USB_DEVICE(0x0572, 0x5A3C),
         .driver_info = CX231XX_BOARD_UNKNOWN},
        {USB_DEVICE(0x0572, 0x58A2),
-        .driver_info = CX231XX_BOARD_CNXT_RDE_250},
+        .driver_info = CX231XX_BOARD_CNXT_CARRAERA},
        {USB_DEVICE(0x0572, 0x58A1),
+        .driver_info = CX231XX_BOARD_CNXT_SHELBY},
+       {USB_DEVICE(0x0572, 0x58A4),
+        .driver_info = CX231XX_BOARD_CNXT_RDE_253S},
+       {USB_DEVICE(0x0572, 0x58A5),
+        .driver_info = CX231XX_BOARD_CNXT_RDU_253S},
+       {USB_DEVICE(0x0572, 0x58A6),
+        .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER},
+       {USB_DEVICE(0x0572, 0x589E),
+        .driver_info = CX231XX_BOARD_CNXT_RDE_250},
+       {USB_DEVICE(0x0572, 0x58A0),
         .driver_info = CX231XX_BOARD_CNXT_RDU_250},
        {USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000,0x4fff),
         .driver_info = CX231XX_BOARD_UNKNOWN},
@@ -212,6 +402,23 @@ int cx231xx_tuner_callback(void *ptr, int component, int command, int arg)
 }
 EXPORT_SYMBOL_GPL(cx231xx_tuner_callback);
 
+void cx231xx_reset_out(struct cx231xx *dev)
+{
+       cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
+       msleep(200);
+       cx231xx_set_gpio_value(dev, CX23417_RESET, 0);
+       msleep(200);
+       cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
+}
+void cx231xx_enable_OSC(struct cx231xx *dev)
+{
+       cx231xx_set_gpio_value(dev, CX23417_OSC_EN, 1);
+}
+void cx231xx_sleep_s5h1432(struct cx231xx *dev)
+{
+       cx231xx_set_gpio_value(dev, SLEEP_S5H1432, 0);
+}
+
 static inline void cx231xx_set_model(struct cx231xx *dev)
 {
        memcpy(&dev->board, &cx231xx_boards[dev->model], sizeof(dev->board));
@@ -235,9 +442,6 @@ void cx231xx_pre_card_setup(struct cx231xx *dev)
                cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
 
                /* request some modules if any required */
-
-               /* reset the Tuner */
-               cx231xx_gpio_set(dev, dev->board.tuner_gpio);
        }
 
        /* set the mode to Analog mode initially */
@@ -297,10 +501,20 @@ void cx231xx_register_i2c_ir(struct cx231xx *dev)
        /* detect & configure */
        switch (dev->model) {
 
+       case CX231XX_BOARD_CNXT_CARRAERA:
+               break;
        case CX231XX_BOARD_CNXT_RDE_250:
                break;
+       case CX231XX_BOARD_CNXT_SHELBY:
+               break;
        case CX231XX_BOARD_CNXT_RDU_250:
                break;
+       case CX231XX_BOARD_CNXT_RDE_253S:
+               break;
+       case CX231XX_BOARD_CNXT_RDU_253S:
+               break;
+       case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
+               break;
        default:
                break;
        }
@@ -326,14 +540,38 @@ void cx231xx_card_setup(struct cx231xx *dev)
 
        }
 
-       if (dev->board.tuner_type != TUNER_ABSENT) {
-               dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
-                               &dev->i2c_bus[1].i2c_adap,
-                               "tuner", "tuner", 0xc2 >> 1, NULL);
-               if (dev->sd_tuner == NULL)
-                       cx231xx_info("tuner subdev registration failure\n");
-
-               cx231xx_config_tuner(dev);
+       switch (dev->model) {
+       case CX231XX_BOARD_CNXT_CARRAERA:
+       case CX231XX_BOARD_CNXT_RDE_250:
+       case CX231XX_BOARD_CNXT_SHELBY:
+       case CX231XX_BOARD_CNXT_RDU_250:
+               if (dev->board.tuner_type != TUNER_ABSENT) {
+                       dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
+                                       &dev->i2c_bus[1].i2c_adap,
+                                       "tuner", "tuner", 0xc2 >> 1, NULL);
+                       if (dev->sd_tuner == NULL)
+                               cx231xx_info(
+                               "tuner subdev registration failure\n");
+
+                       cx231xx_config_tuner(dev);
+               }
+               break;
+       case CX231XX_BOARD_CNXT_RDE_253S:
+       case CX231XX_BOARD_CNXT_RDU_253S:
+       case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
+               if (dev->board.tuner_type != TUNER_ABSENT) {
+                       dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
+                                       &dev->i2c_bus[1].i2c_adap,
+                                       "tuner", "tuner", 0xc0 >> 1, NULL);
+                       if (dev->sd_tuner == NULL)
+                               cx231xx_info(
+                               "tuner subdev registration failure\n");
+
+                       cx231xx_config_tuner(dev);
+               }
+               break;
+       default:
+               break;
        }
 
        cx231xx_config_tuner(dev);
@@ -409,6 +647,7 @@ static int cx231xx_init_dev(struct cx231xx **devhandle, struct usb_device *udev,
        mutex_init(&dev->lock);
        mutex_init(&dev->ctrl_urb_lock);
        mutex_init(&dev->gpio_i2c_lock);
+       mutex_init(&dev->i2c_lock);
 
        spin_lock_init(&dev->video_mode.slock);
        spin_lock_init(&dev->vbi_mode.slock);
@@ -427,6 +666,12 @@ static int cx231xx_init_dev(struct cx231xx **devhandle, struct usb_device *udev,
        /* Query cx231xx to find what pcb config it is related to */
        initialize_cx231xx(dev);
 
+       /*To workaround error number=-71 on EP0 for VideoGrabber,
+                need set alt here.*/
+       if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
+               cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
+               cx231xx_set_alt_setting(dev, INDEX_VANC, 1);
+       }
        /* Cx231xx pre card setup */
        cx231xx_pre_card_setup(dev);
 
@@ -442,6 +687,7 @@ static int cx231xx_init_dev(struct cx231xx **devhandle, struct usb_device *udev,
        /* register i2c bus */
        errCode = cx231xx_dev_init(dev);
        if (errCode < 0) {
+               cx231xx_dev_uninit(dev);
                cx231xx_errdev("%s: cx231xx_i2c_register - errCode [%d]!\n",
                               __func__, errCode);
                return errCode;
@@ -480,9 +726,17 @@ static int cx231xx_init_dev(struct cx231xx **devhandle, struct usb_device *udev,
        INIT_LIST_HEAD(&dev->vbi_mode.vidq.queued);
 
        /* Reset other chips required if they are tied up with GPIO pins */
-
        cx231xx_add_into_devlist(dev);
 
+       printk(KERN_INFO "attach 417 %d\n", dev->model);
+       if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
+               if (cx231xx_417_register(dev) < 0) {
+                       printk(KERN_ERR
+                               "%s() Failed to register 417 on VID_B\n",
+                              __func__);
+               }
+       }
+
        retval = cx231xx_register_analog_devices(dev);
        if (retval < 0) {
                cx231xx_release_resources(dev);
@@ -552,8 +806,8 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
                cx231xx_devused |= 1 << nr;
 
                if (nr >= CX231XX_MAXBOARDS) {
-                       cx231xx_err(DRIVER_NAME ": Supports only %i cx231xx boards.\n",
-                                    CX231XX_MAXBOARDS);
+                       cx231xx_err(DRIVER_NAME
+                ": Supports only %i cx231xx boards.\n", CX231XX_MAXBOARDS);
                        cx231xx_devused &= ~(1 << nr);
                        return -ENOMEM;
                }
@@ -578,6 +832,7 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
                dev->xc_fw_load_done = 0;
                dev->has_alsa_audio = 1;
                dev->power_mode = -1;
+               atomic_set(&dev->devlist_count, 0);
 
                /* 0 - vbi ; 1 -sliced cc mode */
                dev->vbi_or_sliced_cc_mode = 0;
@@ -591,6 +846,11 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
                /* store the current interface */
                lif = interface;
 
+               /*mode_tv: digital=1 or analog=0*/
+               dev->mode_tv = 0;
+
+               dev->USE_ISO = transfer_mode;
+
                switch (udev->speed) {
                case USB_SPEED_LOW:
                        speed = "1.5";
@@ -645,7 +905,7 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
                 * set skip interface, for all interfaces but
                 * interface 1 and the last one
                 */
-               if ((ifnum != 1) && ((dev->interface_count - 1)
+               if ((ifnum != 1) && ((ifnum)
                                     != dev->max_iad_interface_count))
                        skip_interface = 1;
 
@@ -667,7 +927,7 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
        /* save our data pointer in this interface device */
        usb_set_intfdata(lif, dev);
 
-       if ((dev->interface_count - 1) != dev->max_iad_interface_count)
+       if ((ifnum) != dev->max_iad_interface_count)
                return 0;
 
        /*
@@ -680,15 +940,18 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
                cx231xx_errdev("v4l2_device_register failed\n");
                cx231xx_devused &= ~(1 << nr);
                kfree(dev);
+               dev = NULL;
                return -EIO;
        }
-
        /* allocate device struct */
        retval = cx231xx_init_dev(&dev, udev, nr);
        if (retval) {
                cx231xx_devused &= ~(1 << dev->devno);
                v4l2_device_unregister(&dev->v4l2_dev);
                kfree(dev);
+               dev = NULL;
+               usb_set_intfdata(lif, NULL);
+
                return retval;
        }
 
@@ -711,6 +974,7 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
                cx231xx_devused &= ~(1 << nr);
                v4l2_device_unregister(&dev->v4l2_dev);
                kfree(dev);
+               dev = NULL;
                return -ENOMEM;
        }
 
@@ -744,6 +1008,7 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
                cx231xx_devused &= ~(1 << nr);
                v4l2_device_unregister(&dev->v4l2_dev);
                kfree(dev);
+               dev = NULL;
                return -ENOMEM;
        }
 
@@ -778,6 +1043,7 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
                cx231xx_devused &= ~(1 << nr);
                v4l2_device_unregister(&dev->v4l2_dev);
                kfree(dev);
+               dev = NULL;
                return -ENOMEM;
        }
 
@@ -813,6 +1079,7 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
                        cx231xx_devused &= ~(1 << nr);
                        v4l2_device_unregister(&dev->v4l2_dev);
                        kfree(dev);
+                       dev = NULL;
                        return -ENOMEM;
                }
 
@@ -827,6 +1094,15 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
                }
        }
 
+       if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
+               cx231xx_enable_OSC(dev);
+               cx231xx_reset_out(dev);
+               cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
+       }
+
+       if (dev->model == CX231XX_BOARD_CNXT_RDE_253S)
+               cx231xx_sleep_s5h1432(dev);
+
        /* load other modules required */
        request_modules(dev);
 
@@ -867,7 +1143,10 @@ static void cx231xx_usb_disconnect(struct usb_interface *interface)
                     video_device_node_name(dev->vdev));
 
                dev->state |= DEV_MISCONFIGURED;
-               cx231xx_uninit_isoc(dev);
+               if (dev->USE_ISO)
+                       cx231xx_uninit_isoc(dev);
+               else
+                       cx231xx_uninit_bulk(dev);
                dev->state |= DEV_DISCONNECTED;
                wake_up_interruptible(&dev->wait_frame);
                wake_up_interruptible(&dev->wait_stream);
@@ -886,6 +1165,7 @@ static void cx231xx_usb_disconnect(struct usb_interface *interface)
                kfree(dev->sliced_cc_mode.alt_max_pkt_size);
                kfree(dev->ts1_mode.alt_max_pkt_size);
                kfree(dev);
+               dev = NULL;
        }
 }
 
index 31a8759..25593f2 100644 (file)
@@ -39,6 +39,7 @@
 #define CIR_CAR_REG             0x38
 #define CIR_OT_CFG1             0x40
 #define CIR_OT_CFG2             0x44
+#define GBULK_BIT_EN            0x68
 #define PWR_CTL_EN              0x74
 
 /* Polaris Endpoints capture mask for register EP_MODE_SET */
index 912a4d7..e258a62 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/usb.h>
 #include <linux/vmalloc.h>
 #include <media/v4l2-common.h>
+#include <media/tuner.h>
 
 #include "cx231xx.h"
 #include "cx231xx-reg.h"
@@ -64,7 +65,7 @@ MODULE_PARM_DESC(alt, "alternate setting to use for video endpoint");
 *             Device control list functions                                     *
 ******************************************************************/
 
-static LIST_HEAD(cx231xx_devlist);
+LIST_HEAD(cx231xx_devlist);
 static DEFINE_MUTEX(cx231xx_devlist_mutex);
 
 /*
@@ -74,15 +75,24 @@ static DEFINE_MUTEX(cx231xx_devlist_mutex);
 */
 void cx231xx_remove_from_devlist(struct cx231xx *dev)
 {
-       mutex_lock(&cx231xx_devlist_mutex);
-       list_del(&dev->devlist);
-       mutex_unlock(&cx231xx_devlist_mutex);
+       if (dev == NULL)
+               return;
+       if (dev->udev == NULL)
+               return;
+
+       if (atomic_read(&dev->devlist_count) > 0) {
+               mutex_lock(&cx231xx_devlist_mutex);
+               list_del(&dev->devlist);
+               atomic_dec(&dev->devlist_count);
+               mutex_unlock(&cx231xx_devlist_mutex);
+       }
 };
 
 void cx231xx_add_into_devlist(struct cx231xx *dev)
 {
        mutex_lock(&cx231xx_devlist_mutex);
        list_add_tail(&dev->devlist, &cx231xx_devlist);
+       atomic_inc(&dev->devlist_count);
        mutex_unlock(&cx231xx_devlist_mutex);
 };
 
@@ -114,6 +124,7 @@ void cx231xx_unregister_extension(struct cx231xx_ops *ops)
        list_for_each_entry(dev, &cx231xx_devlist, devlist)
                ops->fini(dev);
 
+
        mutex_lock(&cx231xx_extension_devlist_lock);
        printk(KERN_INFO DRIVER_NAME ": %s removed\n", ops->name);
        list_del(&ops->next);
@@ -285,7 +296,7 @@ int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
                              val, reg, dev->urb_buf, len, HZ);
        if (ret < 0) {
                cx231xx_isocdbg(" failed!\n");
-               /* mutex_unlock(&dev->ctrl_urb_lock); */
+               mutex_unlock(&dev->ctrl_urb_lock);
                return ret;
        }
 
@@ -311,6 +322,8 @@ int cx231xx_send_vendor_cmd(struct cx231xx *dev,
 {
        int ret;
        int pipe = 0;
+       int unsend_size = 0;
+       u8 *pdata;
 
        if (dev->state & DEV_DISCONNECTED)
                return -ENODEV;
@@ -340,13 +353,86 @@ int cx231xx_send_vendor_cmd(struct cx231xx *dev,
                cx231xx_isocdbg("\n");
        }
 
-       mutex_lock(&dev->ctrl_urb_lock);
-       ret = usb_control_msg(dev->udev, pipe, ven_req->bRequest,
-                             ven_req->
-                             direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
-                             ven_req->wValue, ven_req->wIndex, ven_req->pBuff,
-                             ven_req->wLength, HZ);
-       mutex_unlock(&dev->ctrl_urb_lock);
+
+/*
+If the cx23102 read more than 4 bytes with i2c bus,
+need chop to 4 byte per request
+*/
+       if ((ven_req->wLength > 4) && ((ven_req->bRequest == 0x4) ||
+                                       (ven_req->bRequest == 0x5) ||
+                                       (ven_req->bRequest == 0x6))) {
+               unsend_size = 0;
+               pdata = ven_req->pBuff;
+
+
+               unsend_size = ven_req->wLength;
+
+               mutex_lock(&dev->ctrl_urb_lock);
+               /* the first package*/
+               ven_req->wValue = ven_req->wValue & 0xFFFB;
+               ven_req->wValue = (ven_req->wValue & 0xFFBD) | 0x2;
+               /*printk(KERN_INFO " !!!!! 0x%x 0x%x 0x%x 0x%x \n",
+                       ven_req->bRequest,
+                       ven_req->direction | USB_TYPE_VENDOR |
+                       USB_RECIP_DEVICE,ven_req->wValue,ven_req->wIndex);*/
+               ret = usb_control_msg(dev->udev, pipe, ven_req->bRequest,
+                       ven_req->
+                       direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+                       ven_req->wValue, ven_req->wIndex, pdata,
+                       0x0004, HZ);
+               unsend_size = unsend_size - 4;
+               mutex_unlock(&dev->ctrl_urb_lock);
+
+               /* the middle package*/
+               ven_req->wValue = (ven_req->wValue & 0xFFBD) | 0x42;
+               while (unsend_size - 4 > 0) {
+                       pdata = pdata + 4;
+                       /*printk(KERN_INFO " !!!!! 0x%x 0x%x 0x%x 0x%x \n",
+                               ven_req->bRequest,
+                               ven_req->direction | USB_TYPE_VENDOR |
+                               USB_RECIP_DEVICE,
+                               ven_req->wValue,ven_req->wIndex);*/
+                       mutex_lock(&dev->ctrl_urb_lock);
+                       ret = usb_control_msg(dev->udev, pipe,
+                                ven_req->bRequest,
+                               ven_req->
+                               direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+                               ven_req->wValue, ven_req->wIndex, pdata,
+                               0x0004, HZ);
+                       mutex_unlock(&dev->ctrl_urb_lock);
+                       unsend_size = unsend_size - 4;
+               }
+
+
+               /* the last package*/
+               ven_req->wValue = (ven_req->wValue & 0xFFBD) | 0x40;
+               pdata = pdata + 4;
+               /*printk(KERN_INFO " !!!!! 0x%x 0x%x 0x%x 0x%x \n",
+                       ven_req->bRequest,
+                       ven_req->direction | USB_TYPE_VENDOR |
+                       USB_RECIP_DEVICE,ven_req->wValue,ven_req->wIndex);*/
+               mutex_lock(&dev->ctrl_urb_lock);
+               ret = usb_control_msg(dev->udev, pipe, ven_req->bRequest,
+                       ven_req->
+                       direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+                       ven_req->wValue, ven_req->wIndex, pdata,
+                       unsend_size, HZ);
+               mutex_unlock(&dev->ctrl_urb_lock);
+               /*printk(KERN_INFO " @@@@@ temp_buffer[0]=0x%x 0x%x 0x%x 0x%x
+                         0x%x 0x%x\n",ven_req->pBuff[0],ven_req->pBuff[1],
+                       ven_req->pBuff[2], ven_req->pBuff[3],ven_req->pBuff[4],
+                       ven_req->pBuff[5]);*/
+
+       } else {
+               mutex_lock(&dev->ctrl_urb_lock);
+               ret = usb_control_msg(dev->udev, pipe, ven_req->bRequest,
+                               ven_req->
+                               direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+                               ven_req->wValue, ven_req->wIndex,
+                                ven_req->pBuff, ven_req->wLength, HZ);
+               mutex_unlock(&dev->ctrl_urb_lock);
+
+       }
 
        return ret;
 }
@@ -444,6 +530,11 @@ int cx231xx_set_video_alternate(struct cx231xx *dev)
                dev->video_mode.alt = 0;
        }
 
+       if (dev->USE_ISO == 0)
+               dev->video_mode.alt = 0;
+
+       cx231xx_info("dev->video_mode.alt= %d\n", dev->video_mode.alt);
+
        /* Get the correct video interface Index */
        usb_interface_index =
            dev->current_pcb_config.hs_config_info[0].interface_info.
@@ -452,8 +543,10 @@ int cx231xx_set_video_alternate(struct cx231xx *dev)
        if (dev->video_mode.alt != prev_alt) {
                cx231xx_coredbg("minimum isoc packet size: %u (alt=%d)\n",
                                min_pkt_size, dev->video_mode.alt);
-               dev->video_mode.max_pkt_size =
-                   dev->video_mode.alt_max_pkt_size[dev->video_mode.alt];
+
+               if (dev->video_mode.alt_max_pkt_size != NULL)
+                       dev->video_mode.max_pkt_size =
+                       dev->video_mode.alt_max_pkt_size[dev->video_mode.alt];
                cx231xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n",
                                dev->video_mode.alt,
                                dev->video_mode.max_pkt_size);
@@ -485,7 +578,7 @@ int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt)
                usb_interface_index =
                    dev->current_pcb_config.hs_config_info[0].interface_info.
                    ts1_index + 1;
-               dev->video_mode.alt = alt;
+               dev->ts1_mode.alt = alt;
                if (dev->ts1_mode.alt_max_pkt_size != NULL)
                        max_pkt_size = dev->ts1_mode.max_pkt_size =
                            dev->ts1_mode.alt_max_pkt_size[dev->ts1_mode.alt];
@@ -542,7 +635,10 @@ int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt)
                cx231xx_errdev
                ("can't change interface %d alt no. to %d: Max. Pkt size = 0\n",
                usb_interface_index, alt);
-               return -1;
+               /*To workaround error number=-71 on EP0 for videograbber,
+                need add following codes.*/
+               if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER)
+                       return -1;
        }
 
        cx231xx_info
@@ -584,8 +680,53 @@ int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio)
        return rc;
 }
 
+int cx231xx_demod_reset(struct cx231xx *dev)
+{
+
+       u8 status = 0;
+       u8 value[4] = { 0, 0, 0, 0 };
+
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", PWR_CTL_EN, value[0],
+                                value[1], value[2], value[3]);
+
+       cx231xx_info("Enter cx231xx_demod_reset()\n");
+               value[1] = (u8) 0x3;
+               status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                               PWR_CTL_EN, value, 4);
+                       msleep(10);
+
+               value[1] = (u8) 0x0;
+               status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                               PWR_CTL_EN, value, 4);
+                       msleep(10);
+
+               value[1] = (u8) 0x3;
+               status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                               PWR_CTL_EN, value, 4);
+                       msleep(10);
+
+
+
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
+                                value, 4);
+       cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", PWR_CTL_EN, value[0],
+                                value[1], value[2], value[3]);
+
+       return status;
+}
+EXPORT_SYMBOL_GPL(cx231xx_demod_reset);
+int is_fw_load(struct cx231xx *dev)
+{
+       return cx231xx_check_fw(dev);
+}
+EXPORT_SYMBOL_GPL(is_fw_load);
+
 int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode)
 {
+       int errCode = 0;
+
        if (dev->mode == set_mode)
                return 0;
 
@@ -600,15 +741,70 @@ int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode)
 
        dev->mode = set_mode;
 
-       if (dev->mode == CX231XX_DIGITAL_MODE)
-               ;/* Set Digital power mode */
-       else
-               ;/* Set Analog Power mode */
+       if (dev->mode == CX231XX_DIGITAL_MODE)/* Set Digital power mode */ {
+       /* set AGC mode to Digital */
+               switch (dev->model) {
+               case CX231XX_BOARD_CNXT_CARRAERA:
+               case CX231XX_BOARD_CNXT_RDE_250:
+               case CX231XX_BOARD_CNXT_SHELBY:
+               case CX231XX_BOARD_CNXT_RDU_250:
+               errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
+                       break;
+               case CX231XX_BOARD_CNXT_RDE_253S:
+               case CX231XX_BOARD_CNXT_RDU_253S:
+               errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
+                       break;
+               default:
+                       break;
+               }
+       } else/* Set Analog Power mode */ {
+       /* set AGC mode to Analog */
+               switch (dev->model) {
+               case CX231XX_BOARD_CNXT_CARRAERA:
+               case CX231XX_BOARD_CNXT_RDE_250:
+               case CX231XX_BOARD_CNXT_SHELBY:
+               case CX231XX_BOARD_CNXT_RDU_250:
+               errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
+                       break;
+               case CX231XX_BOARD_CNXT_RDE_253S:
+               case CX231XX_BOARD_CNXT_RDU_253S:
+               errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
+                       break;
+               default:
+                       break;
+               }
+       }
 
        return 0;
 }
 EXPORT_SYMBOL_GPL(cx231xx_set_mode);
 
+int cx231xx_ep5_bulkout(struct cx231xx *dev, u8 *firmware, u16 size)
+{
+       int errCode = 0;
+       int actlen, ret = -ENOMEM;
+       u32 *buffer;
+
+buffer = kzalloc(4096, GFP_KERNEL);
+       if (buffer == NULL) {
+               cx231xx_info("out of mem\n");
+               return -ENOMEM;
+       }
+       memcpy(&buffer[0], firmware, 4096);
+
+       ret = usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 5),
+                                buffer, 4096, &actlen, 2000);
+
+       if (ret)
+               cx231xx_info("bulk message failed: %d (%d/%d)", ret,
+                                size, actlen);
+       else {
+               errCode = actlen != size ? -1 : 0;
+       }
+kfree(buffer);
+       return 0;
+}
+
 /*****************************************************************
 *                URB Streaming functions                         *
 ******************************************************************/
@@ -616,7 +812,7 @@ EXPORT_SYMBOL_GPL(cx231xx_set_mode);
 /*
  * IRQ callback, called by URB callback
  */
-static void cx231xx_irq_callback(struct urb *urb)
+static void cx231xx_isoc_irq_callback(struct urb *urb)
 {
        struct cx231xx_dmaqueue *dma_q = urb->context;
        struct cx231xx_video_mode *vmode =
@@ -655,12 +851,54 @@ static void cx231xx_irq_callback(struct urb *urb)
                                urb->status);
        }
 }
+/*****************************************************************
+*                URB Streaming functions                         *
+******************************************************************/
 
+/*
+ * IRQ callback, called by URB callback
+ */
+static void cx231xx_bulk_irq_callback(struct urb *urb)
+{
+       struct cx231xx_dmaqueue *dma_q = urb->context;
+       struct cx231xx_video_mode *vmode =
+           container_of(dma_q, struct cx231xx_video_mode, vidq);
+       struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
+       int rc;
+
+       switch (urb->status) {
+       case 0:         /* success */
+       case -ETIMEDOUT:        /* NAK */
+               break;
+       case -ECONNRESET:       /* kill */
+       case -ENOENT:
+       case -ESHUTDOWN:
+               return;
+       default:                /* error */
+               cx231xx_isocdbg("urb completition error %d.\n", urb->status);
+               break;
+       }
+
+       /* Copy data from URB */
+       spin_lock(&dev->video_mode.slock);
+       rc = dev->video_mode.bulk_ctl.bulk_copy(dev, urb);
+       spin_unlock(&dev->video_mode.slock);
+
+       /* Reset urb buffers */
+       urb->status = 0;
+
+       urb->status = usb_submit_urb(urb, GFP_ATOMIC);
+       if (urb->status) {
+               cx231xx_isocdbg("urb resubmit failed (error=%i)\n",
+                               urb->status);
+       }
+}
 /*
  * Stop and Deallocate URBs
  */
 void cx231xx_uninit_isoc(struct cx231xx *dev)
 {
+       struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
        struct urb *urb;
        int i;
 
@@ -690,15 +928,70 @@ void cx231xx_uninit_isoc(struct cx231xx *dev)
 
        kfree(dev->video_mode.isoc_ctl.urb);
        kfree(dev->video_mode.isoc_ctl.transfer_buffer);
+       kfree(dma_q->p_left_data);
 
        dev->video_mode.isoc_ctl.urb = NULL;
        dev->video_mode.isoc_ctl.transfer_buffer = NULL;
        dev->video_mode.isoc_ctl.num_bufs = 0;
+       dma_q->p_left_data = NULL;
+
+       if (dev->mode_tv == 0)
+               cx231xx_capture_start(dev, 0, Raw_Video);
+       else
+               cx231xx_capture_start(dev, 0, TS1_serial_mode);
+
 
-       cx231xx_capture_start(dev, 0, Raw_Video);
 }
 EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc);
 
+/*
+ * Stop and Deallocate URBs
+ */
+void cx231xx_uninit_bulk(struct cx231xx *dev)
+{
+       struct urb *urb;
+       int i;
+
+       cx231xx_isocdbg("cx231xx: called cx231xx_uninit_bulk\n");
+
+       dev->video_mode.bulk_ctl.nfields = -1;
+       for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
+               urb = dev->video_mode.bulk_ctl.urb[i];
+               if (urb) {
+                       if (!irqs_disabled())
+                               usb_kill_urb(urb);
+                       else
+                               usb_unlink_urb(urb);
+
+                       if (dev->video_mode.bulk_ctl.transfer_buffer[i]) {
+                               usb_free_coherent(dev->udev,
+                                               urb->transfer_buffer_length,
+                                               dev->video_mode.isoc_ctl.
+                                               transfer_buffer[i],
+                                               urb->transfer_dma);
+                       }
+                       usb_free_urb(urb);
+                       dev->video_mode.bulk_ctl.urb[i] = NULL;
+               }
+               dev->video_mode.bulk_ctl.transfer_buffer[i] = NULL;
+       }
+
+       kfree(dev->video_mode.bulk_ctl.urb);
+       kfree(dev->video_mode.bulk_ctl.transfer_buffer);
+
+       dev->video_mode.bulk_ctl.urb = NULL;
+       dev->video_mode.bulk_ctl.transfer_buffer = NULL;
+       dev->video_mode.bulk_ctl.num_bufs = 0;
+
+       if (dev->mode_tv == 0)
+               cx231xx_capture_start(dev, 0, Raw_Video);
+       else
+               cx231xx_capture_start(dev, 0, TS1_serial_mode);
+
+
+}
+EXPORT_SYMBOL_GPL(cx231xx_uninit_bulk);
+
 /*
  * Allocate URBs and start IRQ
  */
@@ -713,8 +1006,6 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
        int j, k;
        int rc;
 
-       cx231xx_isocdbg("cx231xx: called cx231xx_prepare_isoc\n");
-
        dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
 
        cx231xx_info("Setting Video mux to %d\n", dev->video_input);
@@ -723,6 +1014,14 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
        /* De-allocates all pending stuff */
        cx231xx_uninit_isoc(dev);
 
+       dma_q->p_left_data = kzalloc(4096, GFP_KERNEL);
+       if (dma_q->p_left_data == NULL) {
+               cx231xx_info("out of mem\n");
+               return -ENOMEM;
+       }
+
+
+
        dev->video_mode.isoc_ctl.isoc_copy = isoc_copy;
        dev->video_mode.isoc_ctl.num_bufs = num_bufs;
        dma_q->pos = 0;
@@ -733,6 +1032,14 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
        dma_q->lines_per_field = dev->height / 2;
        dma_q->bytes_left_in_line = dev->width << 1;
        dma_q->lines_completed = 0;
+       dma_q->mpeg_buffer_done = 0;
+       dma_q->left_data_count = 0;
+       dma_q->mpeg_buffer_completed = 0;
+       dma_q->add_ps_package_head = CX231XX_NEED_ADD_PS_PACKAGE_HEAD;
+       dma_q->ps_head[0] = 0x00;
+       dma_q->ps_head[1] = 0x00;
+       dma_q->ps_head[2] = 0x01;
+       dma_q->ps_head[3] = 0xBA;
        for (i = 0; i < 8; i++)
                dma_q->partial_buf[i] = 0;
 
@@ -756,6 +1063,12 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
 
        sb_size = max_packets * dev->video_mode.isoc_ctl.max_pkt_size;
 
+       if (dev->mode_tv == 1)
+               dev->video_mode.end_point_addr = 0x81;
+       else
+               dev->video_mode.end_point_addr = 0x84;
+
+
        /* allocate urbs and transfer buffers */
        for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
                urb = usb_alloc_urb(max_packets, GFP_KERNEL);
@@ -784,7 +1097,7 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
 
                usb_fill_int_urb(urb, dev->udev, pipe,
                                 dev->video_mode.isoc_ctl.transfer_buffer[i],
-                                sb_size, cx231xx_irq_callback, dma_q, 1);
+                                sb_size, cx231xx_isoc_irq_callback, dma_q, 1);
 
                urb->number_of_packets = max_packets;
                urb->transfer_flags = URB_ISO_ASAP;
@@ -812,12 +1125,175 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
                }
        }
 
-       cx231xx_capture_start(dev, 1, Raw_Video);
+       if (dev->mode_tv == 0)
+               cx231xx_capture_start(dev, 1, Raw_Video);
+       else
+               cx231xx_capture_start(dev, 1, TS1_serial_mode);
 
        return 0;
 }
 EXPORT_SYMBOL_GPL(cx231xx_init_isoc);
 
+/*
+ * Allocate URBs and start IRQ
+ */
+int cx231xx_init_bulk(struct cx231xx *dev, int max_packets,
+                     int num_bufs, int max_pkt_size,
+                     int (*bulk_copy) (struct cx231xx *dev, struct urb *urb))
+{
+       struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
+       int i;
+       int sb_size, pipe;
+       struct urb *urb;
+       int rc;
+
+       dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
+
+       cx231xx_info("Setting Video mux to %d\n", dev->video_input);
+       video_mux(dev, dev->video_input);
+
+       /* De-allocates all pending stuff */
+       cx231xx_uninit_bulk(dev);
+
+       dev->video_mode.bulk_ctl.bulk_copy = bulk_copy;
+       dev->video_mode.bulk_ctl.num_bufs = num_bufs;
+       dma_q->pos = 0;
+       dma_q->is_partial_line = 0;
+       dma_q->last_sav = 0;
+       dma_q->current_field = -1;
+       dma_q->field1_done = 0;
+       dma_q->lines_per_field = dev->height / 2;
+       dma_q->bytes_left_in_line = dev->width << 1;
+       dma_q->lines_completed = 0;
+       dma_q->mpeg_buffer_done = 0;
+       dma_q->left_data_count = 0;
+       dma_q->mpeg_buffer_completed = 0;
+       dma_q->ps_head[0] = 0x00;
+       dma_q->ps_head[1] = 0x00;
+       dma_q->ps_head[2] = 0x01;
+       dma_q->ps_head[3] = 0xBA;
+       for (i = 0; i < 8; i++)
+               dma_q->partial_buf[i] = 0;
+
+       dev->video_mode.bulk_ctl.urb =
+           kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
+       if (!dev->video_mode.bulk_ctl.urb) {
+               cx231xx_errdev("cannot alloc memory for usb buffers\n");
+               return -ENOMEM;
+       }
+
+       dev->video_mode.bulk_ctl.transfer_buffer =
+           kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
+       if (!dev->video_mode.bulk_ctl.transfer_buffer) {
+               cx231xx_errdev("cannot allocate memory for usbtransfer\n");
+               kfree(dev->video_mode.bulk_ctl.urb);
+               return -ENOMEM;
+       }
+
+       dev->video_mode.bulk_ctl.max_pkt_size = max_pkt_size;
+       dev->video_mode.bulk_ctl.buf = NULL;
+
+       sb_size = max_packets * dev->video_mode.bulk_ctl.max_pkt_size;
+
+       if (dev->mode_tv == 1)
+               dev->video_mode.end_point_addr = 0x81;
+       else
+               dev->video_mode.end_point_addr = 0x84;
+
+
+       /* allocate urbs and transfer buffers */
+       for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
+               urb = usb_alloc_urb(0, GFP_KERNEL);
+               if (!urb) {
+                       cx231xx_err("cannot alloc bulk_ctl.urb %i\n", i);
+                       cx231xx_uninit_bulk(dev);
+                       return -ENOMEM;
+               }
+               dev->video_mode.bulk_ctl.urb[i] = urb;
+               urb->transfer_flags = 0;
+
+               dev->video_mode.bulk_ctl.transfer_buffer[i] =
+                   usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL,
+                                    &urb->transfer_dma);
+               if (!dev->video_mode.bulk_ctl.transfer_buffer[i]) {
+                       cx231xx_err("unable to allocate %i bytes for transfer"
+                                   " buffer %i%s\n",
+                                   sb_size, i,
+                                   in_interrupt() ? " while in int" : "");
+                       cx231xx_uninit_bulk(dev);
+                       return -ENOMEM;
+               }
+               memset(dev->video_mode.bulk_ctl.transfer_buffer[i], 0, sb_size);
+
+               pipe = usb_rcvbulkpipe(dev->udev,
+                                dev->video_mode.end_point_addr);
+               usb_fill_bulk_urb(urb, dev->udev, pipe,
+                                 dev->video_mode.bulk_ctl.transfer_buffer[i],
+                                 sb_size, cx231xx_bulk_irq_callback, dma_q);
+       }
+
+       init_waitqueue_head(&dma_q->wq);
+
+       /* submit urbs and enables IRQ */
+       for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
+               rc = usb_submit_urb(dev->video_mode.bulk_ctl.urb[i],
+                                   GFP_ATOMIC);
+               if (rc) {
+                       cx231xx_err("submit of urb %i failed (error=%i)\n", i,
+                                   rc);
+                       cx231xx_uninit_bulk(dev);
+                       return rc;
+               }
+       }
+
+       if (dev->mode_tv == 0)
+               cx231xx_capture_start(dev, 1, Raw_Video);
+       else
+               cx231xx_capture_start(dev, 1, TS1_serial_mode);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(cx231xx_init_bulk);
+void cx231xx_stop_TS1(struct cx231xx *dev)
+{
+       int status = 0;
+       u8 val[4] = { 0, 0, 0, 0 };
+
+                       val[0] = 0x00;
+                       val[1] = 0x03;
+                       val[2] = 0x00;
+                       val[3] = 0x00;
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                TS_MODE_REG, val, 4);
+
+                       val[0] = 0x00;
+                       val[1] = 0x70;
+                       val[2] = 0x04;
+                       val[3] = 0x00;
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                TS1_CFG_REG, val, 4);
+}
+/* EXPORT_SYMBOL_GPL(cx231xx_stop_TS1); */
+void cx231xx_start_TS1(struct cx231xx *dev)
+{
+       int status = 0;
+       u8 val[4] = { 0, 0, 0, 0 };
+
+                       val[0] = 0x03;
+                       val[1] = 0x03;
+                       val[2] = 0x00;
+                       val[3] = 0x00;
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                TS_MODE_REG, val, 4);
+
+                       val[0] = 0x04;
+                       val[1] = 0xA3;
+                       val[2] = 0x3B;
+                       val[3] = 0x00;
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                TS1_CFG_REG, val, 4);
+}
+/* EXPORT_SYMBOL_GPL(cx231xx_start_TS1); */
 /*****************************************************************
 *             Device Init/UnInit functions                       *
 ******************************************************************/
@@ -856,14 +1332,33 @@ int cx231xx_dev_init(struct cx231xx *dev)
        /* init hardware */
        /* Note : with out calling set power mode function,
        afe can not be set up correctly */
-       errCode = cx231xx_set_power_mode(dev, POLARIS_AVMODE_ANALOGT_TV);
-       if (errCode < 0) {
-               cx231xx_errdev
-                   ("%s: Failed to set Power - errCode [%d]!\n",
-                    __func__, errCode);
-               return errCode;
+       if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
+               errCode = cx231xx_set_power_mode(dev,
+                                POLARIS_AVMODE_ENXTERNAL_AV);
+               if (errCode < 0) {
+                       cx231xx_errdev
+                       ("%s: Failed to set Power - errCode [%d]!\n",
+                       __func__, errCode);
+                       return errCode;
+               }
+       } else {
+               errCode = cx231xx_set_power_mode(dev,
+                                POLARIS_AVMODE_ANALOGT_TV);
+               if (errCode < 0) {
+                       cx231xx_errdev
+                       ("%s: Failed to set Power - errCode [%d]!\n",
+                       __func__, errCode);
+                       return errCode;
+               }
        }
 
+       /* reset the Tuner */
+       if ((dev->model == CX231XX_BOARD_CNXT_CARRAERA) ||
+               (dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
+               (dev->model == CX231XX_BOARD_CNXT_SHELBY) ||
+               (dev->model == CX231XX_BOARD_CNXT_RDU_250))
+                       cx231xx_gpio_set(dev, dev->board.tuner_gpio);
+
        /* initialize Colibri block */
        errCode = cx231xx_afe_init_super_block(dev, 0x23c);
        if (errCode < 0) {
@@ -907,7 +1402,20 @@ int cx231xx_dev_init(struct cx231xx *dev)
        }
 
        /* set AGC mode to Analog */
+       switch (dev->model) {
+       case CX231XX_BOARD_CNXT_CARRAERA:
+       case CX231XX_BOARD_CNXT_RDE_250:
+       case CX231XX_BOARD_CNXT_SHELBY:
+       case CX231XX_BOARD_CNXT_RDU_250:
        errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
+               break;
+       case CX231XX_BOARD_CNXT_RDE_253S:
+       case CX231XX_BOARD_CNXT_RDU_253S:
+       errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
+               break;
+       default:
+               break;
+       }
        if (errCode < 0) {
                cx231xx_errdev
                    ("%s: cx231xx_AGC mode to Analog - errCode [%d]!\n",
@@ -923,7 +1431,8 @@ int cx231xx_dev_init(struct cx231xx *dev)
                cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
 
        /* set the I2C master port to 3 on channel 1 */
-       errCode = cx231xx_enable_i2c_for_tuner(dev, I2C_3);
+       if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER)
+               errCode = cx231xx_enable_i2c_for_tuner(dev, I2C_3);
 
        return errCode;
 }
@@ -941,7 +1450,7 @@ EXPORT_SYMBOL_GPL(cx231xx_dev_uninit);
 /*****************************************************************
 *              G P I O related functions                         *
 ******************************************************************/
-int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 * gpio_val,
+int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val,
                          u8 len, u8 request, u8 direction)
 {
        int status = 0;
@@ -1026,6 +1535,91 @@ int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode)
 /*****************************************************************
  *            I 2 C Internal C O N T R O L   functions           *
  *****************************************************************/
+int cx231xx_read_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
+                         u8 saddr_len, u32 *data, u8 data_len, int master)
+{
+       int status = 0;
+       struct cx231xx_i2c_xfer_data req_data;
+       u8 value[64] = "0";
+
+       if (saddr_len == 0)
+               saddr = 0;
+       else if (saddr_len == 0)
+               saddr &= 0xff;
+
+       /* prepare xfer_data struct */
+       req_data.dev_addr = dev_addr >> 1;
+       req_data.direction = I2C_M_RD;
+       req_data.saddr_len = saddr_len;
+       req_data.saddr_dat = saddr;
+       req_data.buf_size = data_len;
+       req_data.p_buffer = (u8 *) value;
+
+       /* usb send command */
+       if (master == 0)
+               status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0],
+                                        &req_data);
+       else if (master == 1)
+               status = dev->cx231xx_send_usb_command(&dev->i2c_bus[1],
+                                        &req_data);
+       else if (master == 2)
+               status = dev->cx231xx_send_usb_command(&dev->i2c_bus[2],
+                                        &req_data);
+
+       if (status >= 0) {
+               /* Copy the data read back to main buffer */
+               if (data_len == 1)
+                       *data = value[0];
+               else if (data_len == 4)
+                       *data =
+                           value[0] | value[1] << 8 | value[2] << 16 | value[3]
+                           << 24;
+               else if (data_len > 4)
+                       *data = value[saddr];
+       }
+
+       return status;
+}
+
+int cx231xx_write_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
+                          u8 saddr_len, u32 data, u8 data_len, int master)
+{
+       int status = 0;
+       u8 value[4] = { 0, 0, 0, 0 };
+       struct cx231xx_i2c_xfer_data req_data;
+
+       value[0] = (u8) data;
+       value[1] = (u8) (data >> 8);
+       value[2] = (u8) (data >> 16);
+       value[3] = (u8) (data >> 24);
+
+       if (saddr_len == 0)
+               saddr = 0;
+       else if (saddr_len == 0)
+               saddr &= 0xff;
+
+       /* prepare xfer_data struct */
+       req_data.dev_addr = dev_addr >> 1;
+       req_data.direction = 0;
+       req_data.saddr_len = saddr_len;
+       req_data.saddr_dat = saddr;
+       req_data.buf_size = data_len;
+       req_data.p_buffer = value;
+
+       /* usb send command */
+       if (master == 0)
+               status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0],
+                                &req_data);
+       else if (master == 1)
+               status = dev->cx231xx_send_usb_command(&dev->i2c_bus[1],
+                                &req_data);
+       else if (master == 2)
+               status = dev->cx231xx_send_usb_command(&dev->i2c_bus[2],
+                                &req_data);
+
+       return status;
+}
+
 int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
                          u8 saddr_len, u32 *data, u8 data_len)
 {
diff --git a/drivers/media/video/cx231xx/cx231xx-dif.h b/drivers/media/video/cx231xx/cx231xx-dif.h
new file mode 100644 (file)
index 0000000..8187afc
--- /dev/null
@@ -0,0 +1,3178 @@
+/*
+   cx231xx-dif.h - driver for Conexant Cx23100/101/102 USB video capture devices
+
+   Copyright {C} 2009 <Bill.Liu@conexant.com>
+
+   This program is free software, you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY, without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program, if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef _CX231XX_DIF_H
+#define _CX231XX_DIF_H
+
+#include "cx231xx-reg.h"
+
+struct dif_settings{
+       u32 if_freq;
+       u32 register_address;
+       u32 value;
+};
+
+static struct dif_settings Dif_set_array[] = {
+
+/*case 3000000:*/
+/* BEGIN - DIF BPF register values from 30_quant.dat*/
+{3000000, DIF_BPF_COEFF01,    0x00000002},
+{3000000, DIF_BPF_COEFF23,    0x00080012},
+{3000000, DIF_BPF_COEFF45,    0x001e0024},
+{3000000, DIF_BPF_COEFF67,    0x001bfff8},
+{3000000, DIF_BPF_COEFF89,    0xffb4ff50},
+{3000000, DIF_BPF_COEFF1011,  0xfed8fe68},
+{3000000, DIF_BPF_COEFF1213,  0xfe24fe34},
+{3000000, DIF_BPF_COEFF1415,  0xfebaffc7},
+{3000000, DIF_BPF_COEFF1617,  0x014d031f},
+{3000000, DIF_BPF_COEFF1819,  0x04f0065d},
+{3000000, DIF_BPF_COEFF2021,  0x07010688},
+{3000000, DIF_BPF_COEFF2223,  0x04c901d6},
+{3000000, DIF_BPF_COEFF2425,  0xfe00f9d3},
+{3000000, DIF_BPF_COEFF2627,  0xf600f342},
+{3000000, DIF_BPF_COEFF2829,  0xf235f337},
+{3000000, DIF_BPF_COEFF3031,  0xf64efb22},
+{3000000, DIF_BPF_COEFF3233,  0x0105070f},
+{3000000, DIF_BPF_COEFF3435,  0x0c460fce},
+{3000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 30_quant.dat*/
+
+
+/*case 3100000:*/
+/* BEGIN - DIF BPF register values from 31_quant.dat*/
+{3100000, DIF_BPF_COEFF01,    0x00000001},
+{3100000, DIF_BPF_COEFF23,    0x00070012},
+{3100000, DIF_BPF_COEFF45,    0x00220032},
+{3100000, DIF_BPF_COEFF67,    0x00370026},
+{3100000, DIF_BPF_COEFF89,    0xfff0ff91},
+{3100000, DIF_BPF_COEFF1011,  0xff0efe7c},
+{3100000, DIF_BPF_COEFF1213,  0xfe01fdcc},
+{3100000, DIF_BPF_COEFF1415,  0xfe0afedb},
+{3100000, DIF_BPF_COEFF1617,  0x00440224},
+{3100000, DIF_BPF_COEFF1819,  0x0434060c},
+{3100000, DIF_BPF_COEFF2021,  0x0738074e},
+{3100000, DIF_BPF_COEFF2223,  0x06090361},
+{3100000, DIF_BPF_COEFF2425,  0xff99fb39},
+{3100000, DIF_BPF_COEFF2627,  0xf6fef3b6},
+{3100000, DIF_BPF_COEFF2829,  0xf21af2a5},
+{3100000, DIF_BPF_COEFF3031,  0xf573fa33},
+{3100000, DIF_BPF_COEFF3233,  0x0034067d},
+{3100000, DIF_BPF_COEFF3435,  0x0bfb0fb9},
+{3100000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 31_quant.dat*/
+
+
+/*case 3200000:*/
+/* BEGIN - DIF BPF register values from 32_quant.dat*/
+{3200000, DIF_BPF_COEFF01,    0x00000000},
+{3200000, DIF_BPF_COEFF23,    0x0004000e},
+{3200000, DIF_BPF_COEFF45,    0x00200038},
+{3200000, DIF_BPF_COEFF67,    0x004c004f},
+{3200000, DIF_BPF_COEFF89,    0x002fffdf},
+{3200000, DIF_BPF_COEFF1011,  0xff5cfeb6},
+{3200000, DIF_BPF_COEFF1213,  0xfe0dfd92},
+{3200000, DIF_BPF_COEFF1415,  0xfd7ffe03},
+{3200000, DIF_BPF_COEFF1617,  0xff36010a},
+{3200000, DIF_BPF_COEFF1819,  0x03410575},
+{3200000, DIF_BPF_COEFF2021,  0x072607d2},
+{3200000, DIF_BPF_COEFF2223,  0x071804d5},
+{3200000, DIF_BPF_COEFF2425,  0x0134fcb7},
+{3200000, DIF_BPF_COEFF2627,  0xf81ff451},
+{3200000, DIF_BPF_COEFF2829,  0xf223f22e},
+{3200000, DIF_BPF_COEFF3031,  0xf4a7f94b},
+{3200000, DIF_BPF_COEFF3233,  0xff6405e8},
+{3200000, DIF_BPF_COEFF3435,  0x0bae0fa4},
+{3200000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 32_quant.dat*/
+
+
+/*case 3300000:*/
+/* BEGIN - DIF BPF register values from 33_quant.dat*/
+{3300000, DIF_BPF_COEFF01,    0x0000ffff},
+{3300000, DIF_BPF_COEFF23,    0x00000008},
+{3300000, DIF_BPF_COEFF45,    0x001a0036},
+{3300000, DIF_BPF_COEFF67,    0x0056006d},
+{3300000, DIF_BPF_COEFF89,    0x00670030},
+{3300000, DIF_BPF_COEFF1011,  0xffbdff10},
+{3300000, DIF_BPF_COEFF1213,  0xfe46fd8d},
+{3300000, DIF_BPF_COEFF1415,  0xfd25fd4f},
+{3300000, DIF_BPF_COEFF1617,  0xfe35ffe0},
+{3300000, DIF_BPF_COEFF1819,  0x0224049f},
+{3300000, DIF_BPF_COEFF2021,  0x06c9080e},
+{3300000, DIF_BPF_COEFF2223,  0x07ef0627},
+{3300000, DIF_BPF_COEFF2425,  0x02c9fe45},
+{3300000, DIF_BPF_COEFF2627,  0xf961f513},
+{3300000, DIF_BPF_COEFF2829,  0xf250f1d2},
+{3300000, DIF_BPF_COEFF3031,  0xf3ecf869},
+{3300000, DIF_BPF_COEFF3233,  0xfe930552},
+{3300000, DIF_BPF_COEFF3435,  0x0b5f0f8f},
+{3300000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 33_quant.dat*/
+
+
+/*case 3400000:*/
+/* BEGIN - DIF BPF register values from 34_quant.dat*/
+{3400000, DIF_BPF_COEFF01,    0xfffffffe},
+{3400000, DIF_BPF_COEFF23,    0xfffd0001},
+{3400000, DIF_BPF_COEFF45,    0x000f002c},
+{3400000, DIF_BPF_COEFF67,    0x0054007d},
+{3400000, DIF_BPF_COEFF89,    0x0093007c},
+{3400000, DIF_BPF_COEFF1011,  0x0024ff82},
+{3400000, DIF_BPF_COEFF1213,  0xfea6fdbb},
+{3400000, DIF_BPF_COEFF1415,  0xfd03fcca},
+{3400000, DIF_BPF_COEFF1617,  0xfd51feb9},
+{3400000, DIF_BPF_COEFF1819,  0x00eb0392},
+{3400000, DIF_BPF_COEFF2021,  0x06270802},
+{3400000, DIF_BPF_COEFF2223,  0x08880750},
+{3400000, DIF_BPF_COEFF2425,  0x044dffdb},
+{3400000, DIF_BPF_COEFF2627,  0xfabdf5f8},
+{3400000, DIF_BPF_COEFF2829,  0xf2a0f193},
+{3400000, DIF_BPF_COEFF3031,  0xf342f78f},
+{3400000, DIF_BPF_COEFF3233,  0xfdc404b9},
+{3400000, DIF_BPF_COEFF3435,  0x0b0e0f78},
+{3400000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 34_quant.dat*/
+
+
+/*case 3500000:*/
+/* BEGIN - DIF BPF register values from 35_quant.dat*/
+{3500000, DIF_BPF_COEFF01,    0xfffffffd},
+{3500000, DIF_BPF_COEFF23,    0xfffafff9},
+{3500000, DIF_BPF_COEFF45,    0x0002001b},
+{3500000, DIF_BPF_COEFF67,    0x0046007d},
+{3500000, DIF_BPF_COEFF89,    0x00ad00ba},
+{3500000, DIF_BPF_COEFF1011,  0x00870000},
+{3500000, DIF_BPF_COEFF1213,  0xff26fe1a},
+{3500000, DIF_BPF_COEFF1415,  0xfd1bfc7e},
+{3500000, DIF_BPF_COEFF1617,  0xfc99fda4},
+{3500000, DIF_BPF_COEFF1819,  0xffa5025c},
+{3500000, DIF_BPF_COEFF2021,  0x054507ad},
+{3500000, DIF_BPF_COEFF2223,  0x08dd0847},
+{3500000, DIF_BPF_COEFF2425,  0x05b80172},
+{3500000, DIF_BPF_COEFF2627,  0xfc2ef6ff},
+{3500000, DIF_BPF_COEFF2829,  0xf313f170},
+{3500000, DIF_BPF_COEFF3031,  0xf2abf6bd},
+{3500000, DIF_BPF_COEFF3233,  0xfcf6041f},
+{3500000, DIF_BPF_COEFF3435,  0x0abc0f61},
+{3500000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 35_quant.dat*/
+
+
+/*case 3600000:*/
+/* BEGIN - DIF BPF register values from 36_quant.dat*/
+{3600000, DIF_BPF_COEFF01,    0xfffffffd},
+{3600000, DIF_BPF_COEFF23,    0xfff8fff3},
+{3600000, DIF_BPF_COEFF45,    0xfff50006},
+{3600000, DIF_BPF_COEFF67,    0x002f006c},
+{3600000, DIF_BPF_COEFF89,    0x00b200e3},
+{3600000, DIF_BPF_COEFF1011,  0x00dc007e},
+{3600000, DIF_BPF_COEFF1213,  0xffb9fea0},
+{3600000, DIF_BPF_COEFF1415,  0xfd6bfc71},
+{3600000, DIF_BPF_COEFF1617,  0xfc17fcb1},
+{3600000, DIF_BPF_COEFF1819,  0xfe65010b},
+{3600000, DIF_BPF_COEFF2021,  0x042d0713},
+{3600000, DIF_BPF_COEFF2223,  0x08ec0906},
+{3600000, DIF_BPF_COEFF2425,  0x07020302},
+{3600000, DIF_BPF_COEFF2627,  0xfdaff823},
+{3600000, DIF_BPF_COEFF2829,  0xf3a7f16a},
+{3600000, DIF_BPF_COEFF3031,  0xf228f5f5},
+{3600000, DIF_BPF_COEFF3233,  0xfc2a0384},
+{3600000, DIF_BPF_COEFF3435,  0x0a670f4a},
+{3600000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 36_quant.dat*/
+
+
+/*case 3700000:*/
+/* BEGIN - DIF BPF register values from 37_quant.dat*/
+{3700000, DIF_BPF_COEFF01,    0x0000fffd},
+{3700000, DIF_BPF_COEFF23,    0xfff7ffef},
+{3700000, DIF_BPF_COEFF45,    0xffe9fff1},
+{3700000, DIF_BPF_COEFF67,    0x0010004d},
+{3700000, DIF_BPF_COEFF89,    0x00a100f2},
+{3700000, DIF_BPF_COEFF1011,  0x011a00f0},
+{3700000, DIF_BPF_COEFF1213,  0x0053ff44},
+{3700000, DIF_BPF_COEFF1415,  0xfdedfca2},
+{3700000, DIF_BPF_COEFF1617,  0xfbd3fbef},
+{3700000, DIF_BPF_COEFF1819,  0xfd39ffae},
+{3700000, DIF_BPF_COEFF2021,  0x02ea0638},
+{3700000, DIF_BPF_COEFF2223,  0x08b50987},
+{3700000, DIF_BPF_COEFF2425,  0x08230483},
+{3700000, DIF_BPF_COEFF2627,  0xff39f960},
+{3700000, DIF_BPF_COEFF2829,  0xf45bf180},
+{3700000, DIF_BPF_COEFF3031,  0xf1b8f537},
+{3700000, DIF_BPF_COEFF3233,  0xfb6102e7},
+{3700000, DIF_BPF_COEFF3435,  0x0a110f32},
+{3700000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 37_quant.dat*/
+
+
+/*case 3800000:*/
+/* BEGIN - DIF BPF register values from 38_quant.dat*/
+{3800000, DIF_BPF_COEFF01,    0x0000fffe},
+{3800000, DIF_BPF_COEFF23,    0xfff9ffee},
+{3800000, DIF_BPF_COEFF45,    0xffe1ffdd},
+{3800000, DIF_BPF_COEFF67,    0xfff00024},
+{3800000, DIF_BPF_COEFF89,    0x007c00e5},
+{3800000, DIF_BPF_COEFF1011,  0x013a014a},
+{3800000, DIF_BPF_COEFF1213,  0x00e6fff8},
+{3800000, DIF_BPF_COEFF1415,  0xfe98fd0f},
+{3800000, DIF_BPF_COEFF1617,  0xfbd3fb67},
+{3800000, DIF_BPF_COEFF1819,  0xfc32fe54},
+{3800000, DIF_BPF_COEFF2021,  0x01880525},
+{3800000, DIF_BPF_COEFF2223,  0x083909c7},
+{3800000, DIF_BPF_COEFF2425,  0x091505ee},
+{3800000, DIF_BPF_COEFF2627,  0x00c7fab3},
+{3800000, DIF_BPF_COEFF2829,  0xf52df1b4},
+{3800000, DIF_BPF_COEFF3031,  0xf15df484},
+{3800000, DIF_BPF_COEFF3233,  0xfa9b0249},
+{3800000, DIF_BPF_COEFF3435,  0x09ba0f19},
+{3800000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 38_quant.dat*/
+
+
+/*case 3900000:*/
+/* BEGIN - DIF BPF register values from 39_quant.dat*/
+{3900000, DIF_BPF_COEFF01,    0x00000000},
+{3900000, DIF_BPF_COEFF23,    0xfffbfff0},
+{3900000, DIF_BPF_COEFF45,    0xffdeffcf},
+{3900000, DIF_BPF_COEFF67,    0xffd1fff6},
+{3900000, DIF_BPF_COEFF89,    0x004800be},
+{3900000, DIF_BPF_COEFF1011,  0x01390184},
+{3900000, DIF_BPF_COEFF1213,  0x016300ac},
+{3900000, DIF_BPF_COEFF1415,  0xff5efdb1},
+{3900000, DIF_BPF_COEFF1617,  0xfc17fb23},
+{3900000, DIF_BPF_COEFF1819,  0xfb5cfd0d},
+{3900000, DIF_BPF_COEFF2021,  0x001703e4},
+{3900000, DIF_BPF_COEFF2223,  0x077b09c4},
+{3900000, DIF_BPF_COEFF2425,  0x09d2073c},
+{3900000, DIF_BPF_COEFF2627,  0x0251fc18},
+{3900000, DIF_BPF_COEFF2829,  0xf61cf203},
+{3900000, DIF_BPF_COEFF3031,  0xf118f3dc},
+{3900000, DIF_BPF_COEFF3233,  0xf9d801aa},
+{3900000, DIF_BPF_COEFF3435,  0x09600eff},
+{3900000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 39_quant.dat*/
+
+
+/*case 4000000:*/
+/* BEGIN - DIF BPF register values from 40_quant.dat*/
+{4000000, DIF_BPF_COEFF01,    0x00000001},
+{4000000, DIF_BPF_COEFF23,    0xfffefff4},
+{4000000, DIF_BPF_COEFF45,    0xffe1ffc8},
+{4000000, DIF_BPF_COEFF67,    0xffbaffca},
+{4000000, DIF_BPF_COEFF89,    0x000b0082},
+{4000000, DIF_BPF_COEFF1011,  0x01170198},
+{4000000, DIF_BPF_COEFF1213,  0x01c10152},
+{4000000, DIF_BPF_COEFF1415,  0x0030fe7b},
+{4000000, DIF_BPF_COEFF1617,  0xfc99fb24},
+{4000000, DIF_BPF_COEFF1819,  0xfac3fbe9},
+{4000000, DIF_BPF_COEFF2021,  0xfea5027f},
+{4000000, DIF_BPF_COEFF2223,  0x0683097f},
+{4000000, DIF_BPF_COEFF2425,  0x0a560867},
+{4000000, DIF_BPF_COEFF2627,  0x03d2fd89},
+{4000000, DIF_BPF_COEFF2829,  0xf723f26f},
+{4000000, DIF_BPF_COEFF3031,  0xf0e8f341},
+{4000000, DIF_BPF_COEFF3233,  0xf919010a},
+{4000000, DIF_BPF_COEFF3435,  0x09060ee5},
+{4000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 40_quant.dat*/
+
+
+/*case 4100000:*/
+/* BEGIN - DIF BPF register values from 41_quant.dat*/
+{4100000, DIF_BPF_COEFF01,    0x00010002},
+{4100000, DIF_BPF_COEFF23,    0x0002fffb},
+{4100000, DIF_BPF_COEFF45,    0xffe8ffca},
+{4100000, DIF_BPF_COEFF67,    0xffacffa4},
+{4100000, DIF_BPF_COEFF89,    0xffcd0036},
+{4100000, DIF_BPF_COEFF1011,  0x00d70184},
+{4100000, DIF_BPF_COEFF1213,  0x01f601dc},
+{4100000, DIF_BPF_COEFF1415,  0x00ffff60},
+{4100000, DIF_BPF_COEFF1617,  0xfd51fb6d},
+{4100000, DIF_BPF_COEFF1819,  0xfa6efaf5},
+{4100000, DIF_BPF_COEFF2021,  0xfd410103},
+{4100000, DIF_BPF_COEFF2223,  0x055708f9},
+{4100000, DIF_BPF_COEFF2425,  0x0a9e0969},
+{4100000, DIF_BPF_COEFF2627,  0x0543ff02},
+{4100000, DIF_BPF_COEFF2829,  0xf842f2f5},
+{4100000, DIF_BPF_COEFF3031,  0xf0cef2b2},
+{4100000, DIF_BPF_COEFF3233,  0xf85e006b},
+{4100000, DIF_BPF_COEFF3435,  0x08aa0ecb},
+{4100000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 41_quant.dat*/
+
+
+/*case 4200000:*/
+/* BEGIN - DIF BPF register values from 42_quant.dat*/
+{4200000, DIF_BPF_COEFF01,    0x00010003},
+{4200000, DIF_BPF_COEFF23,    0x00050003},
+{4200000, DIF_BPF_COEFF45,    0xfff3ffd3},
+{4200000, DIF_BPF_COEFF67,    0xffaaff8b},
+{4200000, DIF_BPF_COEFF89,    0xff95ffe5},
+{4200000, DIF_BPF_COEFF1011,  0x0080014a},
+{4200000, DIF_BPF_COEFF1213,  0x01fe023f},
+{4200000, DIF_BPF_COEFF1415,  0x01ba0050},
+{4200000, DIF_BPF_COEFF1617,  0xfe35fbf8},
+{4200000, DIF_BPF_COEFF1819,  0xfa62fa3b},
+{4200000, DIF_BPF_COEFF2021,  0xfbf9ff7e},
+{4200000, DIF_BPF_COEFF2223,  0x04010836},
+{4200000, DIF_BPF_COEFF2425,  0x0aa90a3d},
+{4200000, DIF_BPF_COEFF2627,  0x069f007f},
+{4200000, DIF_BPF_COEFF2829,  0xf975f395},
+{4200000, DIF_BPF_COEFF3031,  0xf0cbf231},
+{4200000, DIF_BPF_COEFF3233,  0xf7a9ffcb},
+{4200000, DIF_BPF_COEFF3435,  0x084c0eaf},
+{4200000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 42_quant.dat*/
+
+
+/*case 4300000:*/
+/* BEGIN - DIF BPF register values from 43_quant.dat*/
+{4300000, DIF_BPF_COEFF01,    0x00010003},
+{4300000, DIF_BPF_COEFF23,    0x0008000a},
+{4300000, DIF_BPF_COEFF45,    0x0000ffe4},
+{4300000, DIF_BPF_COEFF67,    0xffb4ff81},
+{4300000, DIF_BPF_COEFF89,    0xff6aff96},
+{4300000, DIF_BPF_COEFF1011,  0x001c00f0},
+{4300000, DIF_BPF_COEFF1213,  0x01d70271},
+{4300000, DIF_BPF_COEFF1415,  0x0254013b},
+{4300000, DIF_BPF_COEFF1617,  0xff36fcbd},
+{4300000, DIF_BPF_COEFF1819,  0xfa9ff9c5},
+{4300000, DIF_BPF_COEFF2021,  0xfadbfdfe},
+{4300000, DIF_BPF_COEFF2223,  0x028c073b},
+{4300000, DIF_BPF_COEFF2425,  0x0a750adf},
+{4300000, DIF_BPF_COEFF2627,  0x07e101fa},
+{4300000, DIF_BPF_COEFF2829,  0xfab8f44e},
+{4300000, DIF_BPF_COEFF3031,  0xf0ddf1be},
+{4300000, DIF_BPF_COEFF3233,  0xf6f9ff2b},
+{4300000, DIF_BPF_COEFF3435,  0x07ed0e94},
+{4300000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 43_quant.dat*/
+
+
+/*case 4400000:*/
+/* BEGIN - DIF BPF register values from 44_quant.dat*/
+{4400000, DIF_BPF_COEFF01,    0x00000003},
+{4400000, DIF_BPF_COEFF23,    0x0009000f},
+{4400000, DIF_BPF_COEFF45,    0x000efff8},
+{4400000, DIF_BPF_COEFF67,    0xffc9ff87},
+{4400000, DIF_BPF_COEFF89,    0xff52ff54},
+{4400000, DIF_BPF_COEFF1011,  0xffb5007e},
+{4400000, DIF_BPF_COEFF1213,  0x01860270},
+{4400000, DIF_BPF_COEFF1415,  0x02c00210},
+{4400000, DIF_BPF_COEFF1617,  0x0044fdb2},
+{4400000, DIF_BPF_COEFF1819,  0xfb22f997},
+{4400000, DIF_BPF_COEFF2021,  0xf9f2fc90},
+{4400000, DIF_BPF_COEFF2223,  0x0102060f},
+{4400000, DIF_BPF_COEFF2425,  0x0a050b4c},
+{4400000, DIF_BPF_COEFF2627,  0x0902036e},
+{4400000, DIF_BPF_COEFF2829,  0xfc0af51e},
+{4400000, DIF_BPF_COEFF3031,  0xf106f15a},
+{4400000, DIF_BPF_COEFF3233,  0xf64efe8b},
+{4400000, DIF_BPF_COEFF3435,  0x078d0e77},
+{4400000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 44_quant.dat*/
+
+
+/*case 4500000:*/
+/* BEGIN - DIF BPF register values from 45_quant.dat*/
+{4500000, DIF_BPF_COEFF01,    0x00000002},
+{4500000, DIF_BPF_COEFF23,    0x00080012},
+{4500000, DIF_BPF_COEFF45,    0x0019000e},
+{4500000, DIF_BPF_COEFF67,    0xffe5ff9e},
+{4500000, DIF_BPF_COEFF89,    0xff4fff25},
+{4500000, DIF_BPF_COEFF1011,  0xff560000},
+{4500000, DIF_BPF_COEFF1213,  0x0112023b},
+{4500000, DIF_BPF_COEFF1415,  0x02f702c0},
+{4500000, DIF_BPF_COEFF1617,  0x014dfec8},
+{4500000, DIF_BPF_COEFF1819,  0xfbe5f9b3},
+{4500000, DIF_BPF_COEFF2021,  0xf947fb41},
+{4500000, DIF_BPF_COEFF2223,  0xff7004b9},
+{4500000, DIF_BPF_COEFF2425,  0x095a0b81},
+{4500000, DIF_BPF_COEFF2627,  0x0a0004d8},
+{4500000, DIF_BPF_COEFF2829,  0xfd65f603},
+{4500000, DIF_BPF_COEFF3031,  0xf144f104},
+{4500000, DIF_BPF_COEFF3233,  0xf5aafdec},
+{4500000, DIF_BPF_COEFF3435,  0x072b0e5a},
+{4500000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 45_quant.dat*/
+
+
+/*case 4600000:*/
+/* BEGIN - DIF BPF register values from 46_quant.dat*/
+{4600000, DIF_BPF_COEFF01,    0x00000001},
+{4600000, DIF_BPF_COEFF23,    0x00060012},
+{4600000, DIF_BPF_COEFF45,    0x00200022},
+{4600000, DIF_BPF_COEFF67,    0x0005ffc1},
+{4600000, DIF_BPF_COEFF89,    0xff61ff10},
+{4600000, DIF_BPF_COEFF1011,  0xff09ff82},
+{4600000, DIF_BPF_COEFF1213,  0x008601d7},
+{4600000, DIF_BPF_COEFF1415,  0x02f50340},
+{4600000, DIF_BPF_COEFF1617,  0x0241fff0},
+{4600000, DIF_BPF_COEFF1819,  0xfcddfa19},
+{4600000, DIF_BPF_COEFF2021,  0xf8e2fa1e},
+{4600000, DIF_BPF_COEFF2223,  0xfde30343},
+{4600000, DIF_BPF_COEFF2425,  0x08790b7f},
+{4600000, DIF_BPF_COEFF2627,  0x0ad50631},
+{4600000, DIF_BPF_COEFF2829,  0xfec7f6fc},
+{4600000, DIF_BPF_COEFF3031,  0xf198f0bd},
+{4600000, DIF_BPF_COEFF3233,  0xf50dfd4e},
+{4600000, DIF_BPF_COEFF3435,  0x06c90e3d},
+{4600000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 46_quant.dat*/
+
+
+/*case 4700000:*/
+/* BEGIN - DIF BPF register values from 47_quant.dat*/
+{4700000, DIF_BPF_COEFF01,    0x0000ffff},
+{4700000, DIF_BPF_COEFF23,    0x0003000f},
+{4700000, DIF_BPF_COEFF45,    0x00220030},
+{4700000, DIF_BPF_COEFF67,    0x0025ffed},
+{4700000, DIF_BPF_COEFF89,    0xff87ff15},
+{4700000, DIF_BPF_COEFF1011,  0xfed6ff10},
+{4700000, DIF_BPF_COEFF1213,  0xffed014c},
+{4700000, DIF_BPF_COEFF1415,  0x02b90386},
+{4700000, DIF_BPF_COEFF1617,  0x03110119},
+{4700000, DIF_BPF_COEFF1819,  0xfdfefac4},
+{4700000, DIF_BPF_COEFF2021,  0xf8c6f92f},
+{4700000, DIF_BPF_COEFF2223,  0xfc6701b7},
+{4700000, DIF_BPF_COEFF2425,  0x07670b44},
+{4700000, DIF_BPF_COEFF2627,  0x0b7e0776},
+{4700000, DIF_BPF_COEFF2829,  0x002df807},
+{4700000, DIF_BPF_COEFF3031,  0xf200f086},
+{4700000, DIF_BPF_COEFF3233,  0xf477fcb1},
+{4700000, DIF_BPF_COEFF3435,  0x06650e1e},
+{4700000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 47_quant.dat*/
+
+
+/*case 4800000:*/
+/* BEGIN - DIF BPF register values from 48_quant.dat*/
+{4800000, DIF_BPF_COEFF01,    0xfffffffe},
+{4800000, DIF_BPF_COEFF23,    0xffff0009},
+{4800000, DIF_BPF_COEFF45,    0x001e0038},
+{4800000, DIF_BPF_COEFF67,    0x003f001b},
+{4800000, DIF_BPF_COEFF89,    0xffbcff36},
+{4800000, DIF_BPF_COEFF1011,  0xfec2feb6},
+{4800000, DIF_BPF_COEFF1213,  0xff5600a5},
+{4800000, DIF_BPF_COEFF1415,  0x0248038d},
+{4800000, DIF_BPF_COEFF1617,  0x03b00232},
+{4800000, DIF_BPF_COEFF1819,  0xff39fbab},
+{4800000, DIF_BPF_COEFF2021,  0xf8f4f87f},
+{4800000, DIF_BPF_COEFF2223,  0xfb060020},
+{4800000, DIF_BPF_COEFF2425,  0x062a0ad2},
+{4800000, DIF_BPF_COEFF2627,  0x0bf908a3},
+{4800000, DIF_BPF_COEFF2829,  0x0192f922},
+{4800000, DIF_BPF_COEFF3031,  0xf27df05e},
+{4800000, DIF_BPF_COEFF3233,  0xf3e8fc14},
+{4800000, DIF_BPF_COEFF3435,  0x06000e00},
+{4800000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 48_quant.dat*/
+
+
+/*case 4900000:*/
+/* BEGIN - DIF BPF register values from 49_quant.dat*/
+{4900000, DIF_BPF_COEFF01,    0xfffffffd},
+{4900000, DIF_BPF_COEFF23,    0xfffc0002},
+{4900000, DIF_BPF_COEFF45,    0x00160037},
+{4900000, DIF_BPF_COEFF67,    0x00510046},
+{4900000, DIF_BPF_COEFF89,    0xfff9ff6d},
+{4900000, DIF_BPF_COEFF1011,  0xfed0fe7c},
+{4900000, DIF_BPF_COEFF1213,  0xfecefff0},
+{4900000, DIF_BPF_COEFF1415,  0x01aa0356},
+{4900000, DIF_BPF_COEFF1617,  0x0413032b},
+{4900000, DIF_BPF_COEFF1819,  0x007ffcc5},
+{4900000, DIF_BPF_COEFF2021,  0xf96cf812},
+{4900000, DIF_BPF_COEFF2223,  0xf9cefe87},
+{4900000, DIF_BPF_COEFF2425,  0x04c90a2c},
+{4900000, DIF_BPF_COEFF2627,  0x0c4309b4},
+{4900000, DIF_BPF_COEFF2829,  0x02f3fa4a},
+{4900000, DIF_BPF_COEFF3031,  0xf30ef046},
+{4900000, DIF_BPF_COEFF3233,  0xf361fb7a},
+{4900000, DIF_BPF_COEFF3435,  0x059b0de0},
+{4900000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 49_quant.dat*/
+
+
+/*case 5000000:*/
+/* BEGIN - DIF BPF register values from 50_quant.dat*/
+{5000000, DIF_BPF_COEFF01,    0xfffffffd},
+{5000000, DIF_BPF_COEFF23,    0xfff9fffa},
+{5000000, DIF_BPF_COEFF45,    0x000a002d},
+{5000000, DIF_BPF_COEFF67,    0x00570067},
+{5000000, DIF_BPF_COEFF89,    0x0037ffb5},
+{5000000, DIF_BPF_COEFF1011,  0xfefffe68},
+{5000000, DIF_BPF_COEFF1213,  0xfe62ff3d},
+{5000000, DIF_BPF_COEFF1415,  0x00ec02e3},
+{5000000, DIF_BPF_COEFF1617,  0x043503f6},
+{5000000, DIF_BPF_COEFF1819,  0x01befe05},
+{5000000, DIF_BPF_COEFF2021,  0xfa27f7ee},
+{5000000, DIF_BPF_COEFF2223,  0xf8c6fcf8},
+{5000000, DIF_BPF_COEFF2425,  0x034c0954},
+{5000000, DIF_BPF_COEFF2627,  0x0c5c0aa4},
+{5000000, DIF_BPF_COEFF2829,  0x044cfb7e},
+{5000000, DIF_BPF_COEFF3031,  0xf3b1f03f},
+{5000000, DIF_BPF_COEFF3233,  0xf2e2fae1},
+{5000000, DIF_BPF_COEFF3435,  0x05340dc0},
+{5000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 50_quant.dat*/
+
+
+/*case 5100000:*/
+/* BEGIN - DIF BPF register values from 51_quant.dat*/
+{5100000, DIF_BPF_COEFF01,    0x0000fffd},
+{5100000, DIF_BPF_COEFF23,    0xfff8fff4},
+{5100000, DIF_BPF_COEFF45,    0xfffd001e},
+{5100000, DIF_BPF_COEFF67,    0x0051007b},
+{5100000, DIF_BPF_COEFF89,    0x006e0006},
+{5100000, DIF_BPF_COEFF1011,  0xff48fe7c},
+{5100000, DIF_BPF_COEFF1213,  0xfe1bfe9a},
+{5100000, DIF_BPF_COEFF1415,  0x001d023e},
+{5100000, DIF_BPF_COEFF1617,  0x04130488},
+{5100000, DIF_BPF_COEFF1819,  0x02e6ff5b},
+{5100000, DIF_BPF_COEFF2021,  0xfb1ef812},
+{5100000, DIF_BPF_COEFF2223,  0xf7f7fb7f},
+{5100000, DIF_BPF_COEFF2425,  0x01bc084e},
+{5100000, DIF_BPF_COEFF2627,  0x0c430b72},
+{5100000, DIF_BPF_COEFF2829,  0x059afcba},
+{5100000, DIF_BPF_COEFF3031,  0xf467f046},
+{5100000, DIF_BPF_COEFF3233,  0xf26cfa4a},
+{5100000, DIF_BPF_COEFF3435,  0x04cd0da0},
+{5100000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 51_quant.dat*/
+
+
+/*case 5200000:*/
+/* BEGIN - DIF BPF register values from 52_quant.dat*/
+{5200000, DIF_BPF_COEFF01,    0x0000fffe},
+{5200000, DIF_BPF_COEFF23,    0xfff8ffef},
+{5200000, DIF_BPF_COEFF45,    0xfff00009},
+{5200000, DIF_BPF_COEFF67,    0x003f007f},
+{5200000, DIF_BPF_COEFF89,    0x00980056},
+{5200000, DIF_BPF_COEFF1011,  0xffa5feb6},
+{5200000, DIF_BPF_COEFF1213,  0xfe00fe15},
+{5200000, DIF_BPF_COEFF1415,  0xff4b0170},
+{5200000, DIF_BPF_COEFF1617,  0x03b004d7},
+{5200000, DIF_BPF_COEFF1819,  0x03e800b9},
+{5200000, DIF_BPF_COEFF2021,  0xfc48f87f},
+{5200000, DIF_BPF_COEFF2223,  0xf768fa23},
+{5200000, DIF_BPF_COEFF2425,  0x0022071f},
+{5200000, DIF_BPF_COEFF2627,  0x0bf90c1b},
+{5200000, DIF_BPF_COEFF2829,  0x06dafdfd},
+{5200000, DIF_BPF_COEFF3031,  0xf52df05e},
+{5200000, DIF_BPF_COEFF3233,  0xf1fef9b5},
+{5200000, DIF_BPF_COEFF3435,  0x04640d7f},
+{5200000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 52_quant.dat*/
+
+
+/*case 5300000:*/
+/* BEGIN - DIF BPF register values from 53_quant.dat*/
+{5300000, DIF_BPF_COEFF01,    0x0000ffff},
+{5300000, DIF_BPF_COEFF23,    0xfff9ffee},
+{5300000, DIF_BPF_COEFF45,    0xffe6fff3},
+{5300000, DIF_BPF_COEFF67,    0x00250072},
+{5300000, DIF_BPF_COEFF89,    0x00af009c},
+{5300000, DIF_BPF_COEFF1011,  0x000cff10},
+{5300000, DIF_BPF_COEFF1213,  0xfe13fdb8},
+{5300000, DIF_BPF_COEFF1415,  0xfe870089},
+{5300000, DIF_BPF_COEFF1617,  0x031104e1},
+{5300000, DIF_BPF_COEFF1819,  0x04b8020f},
+{5300000, DIF_BPF_COEFF2021,  0xfd98f92f},
+{5300000, DIF_BPF_COEFF2223,  0xf71df8f0},
+{5300000, DIF_BPF_COEFF2425,  0xfe8805ce},
+{5300000, DIF_BPF_COEFF2627,  0x0b7e0c9c},
+{5300000, DIF_BPF_COEFF2829,  0x0808ff44},
+{5300000, DIF_BPF_COEFF3031,  0xf603f086},
+{5300000, DIF_BPF_COEFF3233,  0xf19af922},
+{5300000, DIF_BPF_COEFF3435,  0x03fb0d5e},
+{5300000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 53_quant.dat*/
+
+
+/*case 5400000:*/
+/* BEGIN - DIF BPF register values from 54_quant.dat*/
+{5400000, DIF_BPF_COEFF01,    0x00000001},
+{5400000, DIF_BPF_COEFF23,    0xfffcffef},
+{5400000, DIF_BPF_COEFF45,    0xffe0ffe0},
+{5400000, DIF_BPF_COEFF67,    0x00050056},
+{5400000, DIF_BPF_COEFF89,    0x00b000d1},
+{5400000, DIF_BPF_COEFF1011,  0x0071ff82},
+{5400000, DIF_BPF_COEFF1213,  0xfe53fd8c},
+{5400000, DIF_BPF_COEFF1415,  0xfddfff99},
+{5400000, DIF_BPF_COEFF1617,  0x024104a3},
+{5400000, DIF_BPF_COEFF1819,  0x054a034d},
+{5400000, DIF_BPF_COEFF2021,  0xff01fa1e},
+{5400000, DIF_BPF_COEFF2223,  0xf717f7ed},
+{5400000, DIF_BPF_COEFF2425,  0xfcf50461},
+{5400000, DIF_BPF_COEFF2627,  0x0ad50cf4},
+{5400000, DIF_BPF_COEFF2829,  0x0921008d},
+{5400000, DIF_BPF_COEFF3031,  0xf6e7f0bd},
+{5400000, DIF_BPF_COEFF3233,  0xf13ff891},
+{5400000, DIF_BPF_COEFF3435,  0x03920d3b},
+{5400000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 54_quant.dat*/
+
+
+/*case 5500000:*/
+/* BEGIN - DIF BPF register values from 55_quant.dat*/
+{5500000, DIF_BPF_COEFF01,    0x00010002},
+{5500000, DIF_BPF_COEFF23,    0xfffffff3},
+{5500000, DIF_BPF_COEFF45,    0xffdeffd1},
+{5500000, DIF_BPF_COEFF67,    0xffe5002f},
+{5500000, DIF_BPF_COEFF89,    0x009c00ed},
+{5500000, DIF_BPF_COEFF1011,  0x00cb0000},
+{5500000, DIF_BPF_COEFF1213,  0xfebafd94},
+{5500000, DIF_BPF_COEFF1415,  0xfd61feb0},
+{5500000, DIF_BPF_COEFF1617,  0x014d0422},
+{5500000, DIF_BPF_COEFF1819,  0x05970464},
+{5500000, DIF_BPF_COEFF2021,  0x0074fb41},
+{5500000, DIF_BPF_COEFF2223,  0xf759f721},
+{5500000, DIF_BPF_COEFF2425,  0xfb7502de},
+{5500000, DIF_BPF_COEFF2627,  0x0a000d21},
+{5500000, DIF_BPF_COEFF2829,  0x0a2201d4},
+{5500000, DIF_BPF_COEFF3031,  0xf7d9f104},
+{5500000, DIF_BPF_COEFF3233,  0xf0edf804},
+{5500000, DIF_BPF_COEFF3435,  0x03280d19},
+{5500000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 55_quant.dat*/
+
+
+/*case 5600000:*/
+/* BEGIN - DIF BPF register values from 56_quant.dat*/
+{5600000, DIF_BPF_COEFF01,    0x00010003},
+{5600000, DIF_BPF_COEFF23,    0x0003fffa},
+{5600000, DIF_BPF_COEFF45,    0xffe3ffc9},
+{5600000, DIF_BPF_COEFF67,    0xffc90002},
+{5600000, DIF_BPF_COEFF89,    0x007500ef},
+{5600000, DIF_BPF_COEFF1011,  0x010e007e},
+{5600000, DIF_BPF_COEFF1213,  0xff3dfdcf},
+{5600000, DIF_BPF_COEFF1415,  0xfd16fddd},
+{5600000, DIF_BPF_COEFF1617,  0x00440365},
+{5600000, DIF_BPF_COEFF1819,  0x059b0548},
+{5600000, DIF_BPF_COEFF2021,  0x01e3fc90},
+{5600000, DIF_BPF_COEFF2223,  0xf7dff691},
+{5600000, DIF_BPF_COEFF2425,  0xfa0f014d},
+{5600000, DIF_BPF_COEFF2627,  0x09020d23},
+{5600000, DIF_BPF_COEFF2829,  0x0b0a0318},
+{5600000, DIF_BPF_COEFF3031,  0xf8d7f15a},
+{5600000, DIF_BPF_COEFF3233,  0xf0a5f779},
+{5600000, DIF_BPF_COEFF3435,  0x02bd0cf6},
+{5600000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 56_quant.dat*/
+
+
+/*case 5700000:*/
+/* BEGIN - DIF BPF register values from 57_quant.dat*/
+{5700000, DIF_BPF_COEFF01,    0x00010003},
+{5700000, DIF_BPF_COEFF23,    0x00060001},
+{5700000, DIF_BPF_COEFF45,    0xffecffc9},
+{5700000, DIF_BPF_COEFF67,    0xffb4ffd4},
+{5700000, DIF_BPF_COEFF89,    0x004000d5},
+{5700000, DIF_BPF_COEFF1011,  0x013600f0},
+{5700000, DIF_BPF_COEFF1213,  0xffd3fe39},
+{5700000, DIF_BPF_COEFF1415,  0xfd04fd31},
+{5700000, DIF_BPF_COEFF1617,  0xff360277},
+{5700000, DIF_BPF_COEFF1819,  0x055605ef},
+{5700000, DIF_BPF_COEFF2021,  0x033efdfe},
+{5700000, DIF_BPF_COEFF2223,  0xf8a5f642},
+{5700000, DIF_BPF_COEFF2425,  0xf8cbffb6},
+{5700000, DIF_BPF_COEFF2627,  0x07e10cfb},
+{5700000, DIF_BPF_COEFF2829,  0x0bd50456},
+{5700000, DIF_BPF_COEFF3031,  0xf9dff1be},
+{5700000, DIF_BPF_COEFF3233,  0xf067f6f2},
+{5700000, DIF_BPF_COEFF3435,  0x02520cd2},
+{5700000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 57_quant.dat*/
+
+
+/*case 5800000:*/
+/* BEGIN - DIF BPF register values from 58_quant.dat*/
+{5800000, DIF_BPF_COEFF01,    0x00000003},
+{5800000, DIF_BPF_COEFF23,    0x00080009},
+{5800000, DIF_BPF_COEFF45,    0xfff8ffd2},
+{5800000, DIF_BPF_COEFF67,    0xffaaffac},
+{5800000, DIF_BPF_COEFF89,    0x000200a3},
+{5800000, DIF_BPF_COEFF1011,  0x013c014a},
+{5800000, DIF_BPF_COEFF1213,  0x006dfec9},
+{5800000, DIF_BPF_COEFF1415,  0xfd2bfcb7},
+{5800000, DIF_BPF_COEFF1617,  0xfe350165},
+{5800000, DIF_BPF_COEFF1819,  0x04cb0651},
+{5800000, DIF_BPF_COEFF2021,  0x0477ff7e},
+{5800000, DIF_BPF_COEFF2223,  0xf9a5f635},
+{5800000, DIF_BPF_COEFF2425,  0xf7b1fe20},
+{5800000, DIF_BPF_COEFF2627,  0x069f0ca8},
+{5800000, DIF_BPF_COEFF2829,  0x0c81058b},
+{5800000, DIF_BPF_COEFF3031,  0xfaf0f231},
+{5800000, DIF_BPF_COEFF3233,  0xf033f66d},
+{5800000, DIF_BPF_COEFF3435,  0x01e60cae},
+{5800000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 58_quant.dat*/
+
+
+/*case 5900000:*/
+/* BEGIN - DIF BPF register values from 59_quant.dat*/
+{5900000, DIF_BPF_COEFF01,    0x00000002},
+{5900000, DIF_BPF_COEFF23,    0x0009000e},
+{5900000, DIF_BPF_COEFF45,    0x0005ffe1},
+{5900000, DIF_BPF_COEFF67,    0xffacff90},
+{5900000, DIF_BPF_COEFF89,    0xffc5005f},
+{5900000, DIF_BPF_COEFF1011,  0x01210184},
+{5900000, DIF_BPF_COEFF1213,  0x00fcff72},
+{5900000, DIF_BPF_COEFF1415,  0xfd8afc77},
+{5900000, DIF_BPF_COEFF1617,  0xfd51003f},
+{5900000, DIF_BPF_COEFF1819,  0x04020669},
+{5900000, DIF_BPF_COEFF2021,  0x05830103},
+{5900000, DIF_BPF_COEFF2223,  0xfad7f66b},
+{5900000, DIF_BPF_COEFF2425,  0xf6c8fc93},
+{5900000, DIF_BPF_COEFF2627,  0x05430c2b},
+{5900000, DIF_BPF_COEFF2829,  0x0d0d06b5},
+{5900000, DIF_BPF_COEFF3031,  0xfc08f2b2},
+{5900000, DIF_BPF_COEFF3233,  0xf00af5ec},
+{5900000, DIF_BPF_COEFF3435,  0x017b0c89},
+{5900000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 59_quant.dat*/
+
+
+/*case 6000000:*/
+/* BEGIN - DIF BPF register values from 60_quant.dat*/
+{6000000, DIF_BPF_COEFF01,    0x00000001},
+{6000000, DIF_BPF_COEFF23,    0x00070012},
+{6000000, DIF_BPF_COEFF45,    0x0012fff5},
+{6000000, DIF_BPF_COEFF67,    0xffbaff82},
+{6000000, DIF_BPF_COEFF89,    0xff8e000f},
+{6000000, DIF_BPF_COEFF1011,  0x00e80198},
+{6000000, DIF_BPF_COEFF1213,  0x01750028},
+{6000000, DIF_BPF_COEFF1415,  0xfe18fc75},
+{6000000, DIF_BPF_COEFF1617,  0xfc99ff15},
+{6000000, DIF_BPF_COEFF1819,  0x03050636},
+{6000000, DIF_BPF_COEFF2021,  0x0656027f},
+{6000000, DIF_BPF_COEFF2223,  0xfc32f6e2},
+{6000000, DIF_BPF_COEFF2425,  0xf614fb17},
+{6000000, DIF_BPF_COEFF2627,  0x03d20b87},
+{6000000, DIF_BPF_COEFF2829,  0x0d7707d2},
+{6000000, DIF_BPF_COEFF3031,  0xfd26f341},
+{6000000, DIF_BPF_COEFF3233,  0xefeaf56f},
+{6000000, DIF_BPF_COEFF3435,  0x010f0c64},
+{6000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 60_quant.dat*/
+
+
+/*case 6100000:*/
+/* BEGIN - DIF BPF register values from 61_quant.dat*/
+{6100000, DIF_BPF_COEFF01,    0xffff0000},
+{6100000, DIF_BPF_COEFF23,    0x00050012},
+{6100000, DIF_BPF_COEFF45,    0x001c000b},
+{6100000, DIF_BPF_COEFF67,    0xffd1ff84},
+{6100000, DIF_BPF_COEFF89,    0xff66ffbe},
+{6100000, DIF_BPF_COEFF1011,  0x00960184},
+{6100000, DIF_BPF_COEFF1213,  0x01cd00da},
+{6100000, DIF_BPF_COEFF1415,  0xfeccfcb2},
+{6100000, DIF_BPF_COEFF1617,  0xfc17fdf9},
+{6100000, DIF_BPF_COEFF1819,  0x01e005bc},
+{6100000, DIF_BPF_COEFF2021,  0x06e703e4},
+{6100000, DIF_BPF_COEFF2223,  0xfdabf798},
+{6100000, DIF_BPF_COEFF2425,  0xf599f9b3},
+{6100000, DIF_BPF_COEFF2627,  0x02510abd},
+{6100000, DIF_BPF_COEFF2829,  0x0dbf08df},
+{6100000, DIF_BPF_COEFF3031,  0xfe48f3dc},
+{6100000, DIF_BPF_COEFF3233,  0xefd5f4f6},
+{6100000, DIF_BPF_COEFF3435,  0x00a20c3e},
+{6100000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 61_quant.dat*/
+
+
+/*case 6200000:*/
+/* BEGIN - DIF BPF register values from 62_quant.dat*/
+{6200000, DIF_BPF_COEFF01,    0xfffffffe},
+{6200000, DIF_BPF_COEFF23,    0x0002000f},
+{6200000, DIF_BPF_COEFF45,    0x0021001f},
+{6200000, DIF_BPF_COEFF67,    0xfff0ff97},
+{6200000, DIF_BPF_COEFF89,    0xff50ff74},
+{6200000, DIF_BPF_COEFF1011,  0x0034014a},
+{6200000, DIF_BPF_COEFF1213,  0x01fa0179},
+{6200000, DIF_BPF_COEFF1415,  0xff97fd2a},
+{6200000, DIF_BPF_COEFF1617,  0xfbd3fcfa},
+{6200000, DIF_BPF_COEFF1819,  0x00a304fe},
+{6200000, DIF_BPF_COEFF2021,  0x07310525},
+{6200000, DIF_BPF_COEFF2223,  0xff37f886},
+{6200000, DIF_BPF_COEFF2425,  0xf55cf86e},
+{6200000, DIF_BPF_COEFF2627,  0x00c709d0},
+{6200000, DIF_BPF_COEFF2829,  0x0de209db},
+{6200000, DIF_BPF_COEFF3031,  0xff6df484},
+{6200000, DIF_BPF_COEFF3233,  0xefcbf481},
+{6200000, DIF_BPF_COEFF3435,  0x00360c18},
+{6200000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 62_quant.dat*/
+
+
+/*case 6300000:*/
+/* BEGIN - DIF BPF register values from 63_quant.dat*/
+{6300000, DIF_BPF_COEFF01,    0xfffffffd},
+{6300000, DIF_BPF_COEFF23,    0xfffe000a},
+{6300000, DIF_BPF_COEFF45,    0x0021002f},
+{6300000, DIF_BPF_COEFF67,    0x0010ffb8},
+{6300000, DIF_BPF_COEFF89,    0xff50ff3b},
+{6300000, DIF_BPF_COEFF1011,  0xffcc00f0},
+{6300000, DIF_BPF_COEFF1213,  0x01fa01fa},
+{6300000, DIF_BPF_COEFF1415,  0x0069fdd4},
+{6300000, DIF_BPF_COEFF1617,  0xfbd3fc26},
+{6300000, DIF_BPF_COEFF1819,  0xff5d0407},
+{6300000, DIF_BPF_COEFF2021,  0x07310638},
+{6300000, DIF_BPF_COEFF2223,  0x00c9f9a8},
+{6300000, DIF_BPF_COEFF2425,  0xf55cf74e},
+{6300000, DIF_BPF_COEFF2627,  0xff3908c3},
+{6300000, DIF_BPF_COEFF2829,  0x0de20ac3},
+{6300000, DIF_BPF_COEFF3031,  0x0093f537},
+{6300000, DIF_BPF_COEFF3233,  0xefcbf410},
+{6300000, DIF_BPF_COEFF3435,  0xffca0bf2},
+{6300000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 63_quant.dat*/
+
+
+/*case 6400000:*/
+/* BEGIN - DIF BPF register values from 64_quant.dat*/
+{6400000, DIF_BPF_COEFF01,    0xfffffffd},
+{6400000, DIF_BPF_COEFF23,    0xfffb0003},
+{6400000, DIF_BPF_COEFF45,    0x001c0037},
+{6400000, DIF_BPF_COEFF67,    0x002fffe2},
+{6400000, DIF_BPF_COEFF89,    0xff66ff17},
+{6400000, DIF_BPF_COEFF1011,  0xff6a007e},
+{6400000, DIF_BPF_COEFF1213,  0x01cd0251},
+{6400000, DIF_BPF_COEFF1415,  0x0134fea5},
+{6400000, DIF_BPF_COEFF1617,  0xfc17fb8b},
+{6400000, DIF_BPF_COEFF1819,  0xfe2002e0},
+{6400000, DIF_BPF_COEFF2021,  0x06e70713},
+{6400000, DIF_BPF_COEFF2223,  0x0255faf5},
+{6400000, DIF_BPF_COEFF2425,  0xf599f658},
+{6400000, DIF_BPF_COEFF2627,  0xfdaf0799},
+{6400000, DIF_BPF_COEFF2829,  0x0dbf0b96},
+{6400000, DIF_BPF_COEFF3031,  0x01b8f5f5},
+{6400000, DIF_BPF_COEFF3233,  0xefd5f3a3},
+{6400000, DIF_BPF_COEFF3435,  0xff5e0bca},
+{6400000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 64_quant.dat*/
+
+
+/*case 6500000:*/
+/* BEGIN - DIF BPF register values from 65_quant.dat*/
+{6500000, DIF_BPF_COEFF01,    0x0000fffd},
+{6500000, DIF_BPF_COEFF23,    0xfff9fffb},
+{6500000, DIF_BPF_COEFF45,    0x00120037},
+{6500000, DIF_BPF_COEFF67,    0x00460010},
+{6500000, DIF_BPF_COEFF89,    0xff8eff0f},
+{6500000, DIF_BPF_COEFF1011,  0xff180000},
+{6500000, DIF_BPF_COEFF1213,  0x01750276},
+{6500000, DIF_BPF_COEFF1415,  0x01e8ff8d},
+{6500000, DIF_BPF_COEFF1617,  0xfc99fb31},
+{6500000, DIF_BPF_COEFF1819,  0xfcfb0198},
+{6500000, DIF_BPF_COEFF2021,  0x065607ad},
+{6500000, DIF_BPF_COEFF2223,  0x03cefc64},
+{6500000, DIF_BPF_COEFF2425,  0xf614f592},
+{6500000, DIF_BPF_COEFF2627,  0xfc2e0656},
+{6500000, DIF_BPF_COEFF2829,  0x0d770c52},
+{6500000, DIF_BPF_COEFF3031,  0x02daf6bd},
+{6500000, DIF_BPF_COEFF3233,  0xefeaf33b},
+{6500000, DIF_BPF_COEFF3435,  0xfef10ba3},
+{6500000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 65_quant.dat*/
+
+
+/*case 6600000:*/
+/* BEGIN - DIF BPF register values from 66_quant.dat*/
+{6600000, DIF_BPF_COEFF01,    0x0000fffe},
+{6600000, DIF_BPF_COEFF23,    0xfff7fff5},
+{6600000, DIF_BPF_COEFF45,    0x0005002f},
+{6600000, DIF_BPF_COEFF67,    0x0054003c},
+{6600000, DIF_BPF_COEFF89,    0xffc5ff22},
+{6600000, DIF_BPF_COEFF1011,  0xfedfff82},
+{6600000, DIF_BPF_COEFF1213,  0x00fc0267},
+{6600000, DIF_BPF_COEFF1415,  0x0276007e},
+{6600000, DIF_BPF_COEFF1617,  0xfd51fb1c},
+{6600000, DIF_BPF_COEFF1819,  0xfbfe003e},
+{6600000, DIF_BPF_COEFF2021,  0x05830802},
+{6600000, DIF_BPF_COEFF2223,  0x0529fdec},
+{6600000, DIF_BPF_COEFF2425,  0xf6c8f4fe},
+{6600000, DIF_BPF_COEFF2627,  0xfabd04ff},
+{6600000, DIF_BPF_COEFF2829,  0x0d0d0cf6},
+{6600000, DIF_BPF_COEFF3031,  0x03f8f78f},
+{6600000, DIF_BPF_COEFF3233,  0xf00af2d7},
+{6600000, DIF_BPF_COEFF3435,  0xfe850b7b},
+{6600000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 66_quant.dat*/
+
+
+/*case 6700000:*/
+/* BEGIN - DIF BPF register values from 67_quant.dat*/
+{6700000, DIF_BPF_COEFF01,    0x0000ffff},
+{6700000, DIF_BPF_COEFF23,    0xfff8fff0},
+{6700000, DIF_BPF_COEFF45,    0xfff80020},
+{6700000, DIF_BPF_COEFF67,    0x00560060},
+{6700000, DIF_BPF_COEFF89,    0x0002ff4e},
+{6700000, DIF_BPF_COEFF1011,  0xfec4ff10},
+{6700000, DIF_BPF_COEFF1213,  0x006d0225},
+{6700000, DIF_BPF_COEFF1415,  0x02d50166},
+{6700000, DIF_BPF_COEFF1617,  0xfe35fb4e},
+{6700000, DIF_BPF_COEFF1819,  0xfb35fee1},
+{6700000, DIF_BPF_COEFF2021,  0x0477080e},
+{6700000, DIF_BPF_COEFF2223,  0x065bff82},
+{6700000, DIF_BPF_COEFF2425,  0xf7b1f4a0},
+{6700000, DIF_BPF_COEFF2627,  0xf9610397},
+{6700000, DIF_BPF_COEFF2829,  0x0c810d80},
+{6700000, DIF_BPF_COEFF3031,  0x0510f869},
+{6700000, DIF_BPF_COEFF3233,  0xf033f278},
+{6700000, DIF_BPF_COEFF3435,  0xfe1a0b52},
+{6700000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 67_quant.dat*/
+
+
+/*case 6800000:*/
+/* BEGIN - DIF BPF register values from 68_quant.dat*/
+{6800000, DIF_BPF_COEFF01,    0x00010000},
+{6800000, DIF_BPF_COEFF23,    0xfffaffee},
+{6800000, DIF_BPF_COEFF45,    0xffec000c},
+{6800000, DIF_BPF_COEFF67,    0x004c0078},
+{6800000, DIF_BPF_COEFF89,    0x0040ff8e},
+{6800000, DIF_BPF_COEFF1011,  0xfecafeb6},
+{6800000, DIF_BPF_COEFF1213,  0xffd301b6},
+{6800000, DIF_BPF_COEFF1415,  0x02fc0235},
+{6800000, DIF_BPF_COEFF1617,  0xff36fbc5},
+{6800000, DIF_BPF_COEFF1819,  0xfaaafd90},
+{6800000, DIF_BPF_COEFF2021,  0x033e07d2},
+{6800000, DIF_BPF_COEFF2223,  0x075b011b},
+{6800000, DIF_BPF_COEFF2425,  0xf8cbf47a},
+{6800000, DIF_BPF_COEFF2627,  0xf81f0224},
+{6800000, DIF_BPF_COEFF2829,  0x0bd50def},
+{6800000, DIF_BPF_COEFF3031,  0x0621f94b},
+{6800000, DIF_BPF_COEFF3233,  0xf067f21e},
+{6800000, DIF_BPF_COEFF3435,  0xfdae0b29},
+{6800000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 68_quant.dat*/
+
+
+/*case 6900000:*/
+/* BEGIN - DIF BPF register values from 69_quant.dat*/
+{6900000, DIF_BPF_COEFF01,    0x00010001},
+{6900000, DIF_BPF_COEFF23,    0xfffdffef},
+{6900000, DIF_BPF_COEFF45,    0xffe3fff6},
+{6900000, DIF_BPF_COEFF67,    0x0037007f},
+{6900000, DIF_BPF_COEFF89,    0x0075ffdc},
+{6900000, DIF_BPF_COEFF1011,  0xfef2fe7c},
+{6900000, DIF_BPF_COEFF1213,  0xff3d0122},
+{6900000, DIF_BPF_COEFF1415,  0x02ea02dd},
+{6900000, DIF_BPF_COEFF1617,  0x0044fc79},
+{6900000, DIF_BPF_COEFF1819,  0xfa65fc5d},
+{6900000, DIF_BPF_COEFF2021,  0x01e3074e},
+{6900000, DIF_BPF_COEFF2223,  0x082102ad},
+{6900000, DIF_BPF_COEFF2425,  0xfa0ff48c},
+{6900000, DIF_BPF_COEFF2627,  0xf6fe00a9},
+{6900000, DIF_BPF_COEFF2829,  0x0b0a0e43},
+{6900000, DIF_BPF_COEFF3031,  0x0729fa33},
+{6900000, DIF_BPF_COEFF3233,  0xf0a5f1c9},
+{6900000, DIF_BPF_COEFF3435,  0xfd430b00},
+{6900000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 69_quant.dat*/
+
+
+/*case 7000000:*/
+/* BEGIN - DIF BPF register values from 70_quant.dat*/
+{7000000, DIF_BPF_COEFF01,    0x00010002},
+{7000000, DIF_BPF_COEFF23,    0x0001fff3},
+{7000000, DIF_BPF_COEFF45,    0xffdeffe2},
+{7000000, DIF_BPF_COEFF67,    0x001b0076},
+{7000000, DIF_BPF_COEFF89,    0x009c002d},
+{7000000, DIF_BPF_COEFF1011,  0xff35fe68},
+{7000000, DIF_BPF_COEFF1213,  0xfeba0076},
+{7000000, DIF_BPF_COEFF1415,  0x029f0352},
+{7000000, DIF_BPF_COEFF1617,  0x014dfd60},
+{7000000, DIF_BPF_COEFF1819,  0xfa69fb53},
+{7000000, DIF_BPF_COEFF2021,  0x00740688},
+{7000000, DIF_BPF_COEFF2223,  0x08a7042d},
+{7000000, DIF_BPF_COEFF2425,  0xfb75f4d6},
+{7000000, DIF_BPF_COEFF2627,  0xf600ff2d},
+{7000000, DIF_BPF_COEFF2829,  0x0a220e7a},
+{7000000, DIF_BPF_COEFF3031,  0x0827fb22},
+{7000000, DIF_BPF_COEFF3233,  0xf0edf17a},
+{7000000, DIF_BPF_COEFF3435,  0xfcd80ad6},
+{7000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 70_quant.dat*/
+
+
+/*case 7100000:*/
+/* BEGIN - DIF BPF register values from 71_quant.dat*/
+{7100000, DIF_BPF_COEFF01,    0x00000003},
+{7100000, DIF_BPF_COEFF23,    0x0004fff9},
+{7100000, DIF_BPF_COEFF45,    0xffe0ffd2},
+{7100000, DIF_BPF_COEFF67,    0xfffb005e},
+{7100000, DIF_BPF_COEFF89,    0x00b0007a},
+{7100000, DIF_BPF_COEFF1011,  0xff8ffe7c},
+{7100000, DIF_BPF_COEFF1213,  0xfe53ffc1},
+{7100000, DIF_BPF_COEFF1415,  0x0221038c},
+{7100000, DIF_BPF_COEFF1617,  0x0241fe6e},
+{7100000, DIF_BPF_COEFF1819,  0xfab6fa80},
+{7100000, DIF_BPF_COEFF2021,  0xff010587},
+{7100000, DIF_BPF_COEFF2223,  0x08e90590},
+{7100000, DIF_BPF_COEFF2425,  0xfcf5f556},
+{7100000, DIF_BPF_COEFF2627,  0xf52bfdb3},
+{7100000, DIF_BPF_COEFF2829,  0x09210e95},
+{7100000, DIF_BPF_COEFF3031,  0x0919fc15},
+{7100000, DIF_BPF_COEFF3233,  0xf13ff12f},
+{7100000, DIF_BPF_COEFF3435,  0xfc6e0aab},
+{7100000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 71_quant.dat*/
+
+
+/*case 7200000:*/
+/* BEGIN - DIF BPF register values from 72_quant.dat*/
+{7200000, DIF_BPF_COEFF01,    0x00000003},
+{7200000, DIF_BPF_COEFF23,    0x00070000},
+{7200000, DIF_BPF_COEFF45,    0xffe6ffc9},
+{7200000, DIF_BPF_COEFF67,    0xffdb0039},
+{7200000, DIF_BPF_COEFF89,    0x00af00b8},
+{7200000, DIF_BPF_COEFF1011,  0xfff4feb6},
+{7200000, DIF_BPF_COEFF1213,  0xfe13ff10},
+{7200000, DIF_BPF_COEFF1415,  0x01790388},
+{7200000, DIF_BPF_COEFF1617,  0x0311ff92},
+{7200000, DIF_BPF_COEFF1819,  0xfb48f9ed},
+{7200000, DIF_BPF_COEFF2021,  0xfd980453},
+{7200000, DIF_BPF_COEFF2223,  0x08e306cd},
+{7200000, DIF_BPF_COEFF2425,  0xfe88f60a},
+{7200000, DIF_BPF_COEFF2627,  0xf482fc40},
+{7200000, DIF_BPF_COEFF2829,  0x08080e93},
+{7200000, DIF_BPF_COEFF3031,  0x09fdfd0c},
+{7200000, DIF_BPF_COEFF3233,  0xf19af0ea},
+{7200000, DIF_BPF_COEFF3435,  0xfc050a81},
+{7200000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 72_quant.dat*/
+
+
+/*case 7300000:*/
+/* BEGIN - DIF BPF register values from 73_quant.dat*/
+{7300000, DIF_BPF_COEFF01,    0x00000002},
+{7300000, DIF_BPF_COEFF23,    0x00080008},
+{7300000, DIF_BPF_COEFF45,    0xfff0ffc9},
+{7300000, DIF_BPF_COEFF67,    0xffc1000d},
+{7300000, DIF_BPF_COEFF89,    0x009800e2},
+{7300000, DIF_BPF_COEFF1011,  0x005bff10},
+{7300000, DIF_BPF_COEFF1213,  0xfe00fe74},
+{7300000, DIF_BPF_COEFF1415,  0x00b50345},
+{7300000, DIF_BPF_COEFF1617,  0x03b000bc},
+{7300000, DIF_BPF_COEFF1819,  0xfc18f9a1},
+{7300000, DIF_BPF_COEFF2021,  0xfc4802f9},
+{7300000, DIF_BPF_COEFF2223,  0x089807dc},
+{7300000, DIF_BPF_COEFF2425,  0x0022f6f0},
+{7300000, DIF_BPF_COEFF2627,  0xf407fada},
+{7300000, DIF_BPF_COEFF2829,  0x06da0e74},
+{7300000, DIF_BPF_COEFF3031,  0x0ad3fe06},
+{7300000, DIF_BPF_COEFF3233,  0xf1fef0ab},
+{7300000, DIF_BPF_COEFF3435,  0xfb9c0a55},
+{7300000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 73_quant.dat*/
+
+
+/*case 7400000:*/
+/* BEGIN - DIF BPF register values from 74_quant.dat*/
+{7400000, DIF_BPF_COEFF01,    0x00000001},
+{7400000, DIF_BPF_COEFF23,    0x0008000e},
+{7400000, DIF_BPF_COEFF45,    0xfffdffd0},
+{7400000, DIF_BPF_COEFF67,    0xffafffdf},
+{7400000, DIF_BPF_COEFF89,    0x006e00f2},
+{7400000, DIF_BPF_COEFF1011,  0x00b8ff82},
+{7400000, DIF_BPF_COEFF1213,  0xfe1bfdf8},
+{7400000, DIF_BPF_COEFF1415,  0xffe302c8},
+{7400000, DIF_BPF_COEFF1617,  0x041301dc},
+{7400000, DIF_BPF_COEFF1819,  0xfd1af99e},
+{7400000, DIF_BPF_COEFF2021,  0xfb1e0183},
+{7400000, DIF_BPF_COEFF2223,  0x080908b5},
+{7400000, DIF_BPF_COEFF2425,  0x01bcf801},
+{7400000, DIF_BPF_COEFF2627,  0xf3bdf985},
+{7400000, DIF_BPF_COEFF2829,  0x059a0e38},
+{7400000, DIF_BPF_COEFF3031,  0x0b99ff03},
+{7400000, DIF_BPF_COEFF3233,  0xf26cf071},
+{7400000, DIF_BPF_COEFF3435,  0xfb330a2a},
+{7400000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 74_quant.dat*/
+
+
+/*case 7500000:*/
+/* BEGIN - DIF BPF register values from 75_quant.dat*/
+{7500000, DIF_BPF_COEFF01,    0xffff0000},
+{7500000, DIF_BPF_COEFF23,    0x00070011},
+{7500000, DIF_BPF_COEFF45,    0x000affdf},
+{7500000, DIF_BPF_COEFF67,    0xffa9ffb5},
+{7500000, DIF_BPF_COEFF89,    0x003700e6},
+{7500000, DIF_BPF_COEFF1011,  0x01010000},
+{7500000, DIF_BPF_COEFF1213,  0xfe62fda8},
+{7500000, DIF_BPF_COEFF1415,  0xff140219},
+{7500000, DIF_BPF_COEFF1617,  0x043502e1},
+{7500000, DIF_BPF_COEFF1819,  0xfe42f9e6},
+{7500000, DIF_BPF_COEFF2021,  0xfa270000},
+{7500000, DIF_BPF_COEFF2223,  0x073a0953},
+{7500000, DIF_BPF_COEFF2425,  0x034cf939},
+{7500000, DIF_BPF_COEFF2627,  0xf3a4f845},
+{7500000, DIF_BPF_COEFF2829,  0x044c0de1},
+{7500000, DIF_BPF_COEFF3031,  0x0c4f0000},
+{7500000, DIF_BPF_COEFF3233,  0xf2e2f03c},
+{7500000, DIF_BPF_COEFF3435,  0xfacc09fe},
+{7500000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 75_quant.dat*/
+
+
+/*case 7600000:*/
+/* BEGIN - DIF BPF register values from 76_quant.dat*/
+{7600000, DIF_BPF_COEFF01,    0xffffffff},
+{7600000, DIF_BPF_COEFF23,    0x00040012},
+{7600000, DIF_BPF_COEFF45,    0x0016fff3},
+{7600000, DIF_BPF_COEFF67,    0xffafff95},
+{7600000, DIF_BPF_COEFF89,    0xfff900c0},
+{7600000, DIF_BPF_COEFF1011,  0x0130007e},
+{7600000, DIF_BPF_COEFF1213,  0xfecefd89},
+{7600000, DIF_BPF_COEFF1415,  0xfe560146},
+{7600000, DIF_BPF_COEFF1617,  0x041303bc},
+{7600000, DIF_BPF_COEFF1819,  0xff81fa76},
+{7600000, DIF_BPF_COEFF2021,  0xf96cfe7d},
+{7600000, DIF_BPF_COEFF2223,  0x063209b1},
+{7600000, DIF_BPF_COEFF2425,  0x04c9fa93},
+{7600000, DIF_BPF_COEFF2627,  0xf3bdf71e},
+{7600000, DIF_BPF_COEFF2829,  0x02f30d6e},
+{7600000, DIF_BPF_COEFF3031,  0x0cf200fd},
+{7600000, DIF_BPF_COEFF3233,  0xf361f00e},
+{7600000, DIF_BPF_COEFF3435,  0xfa6509d1},
+{7600000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 76_quant.dat*/
+
+
+/*case 7700000:*/
+/* BEGIN - DIF BPF register values from 77_quant.dat*/
+{7700000, DIF_BPF_COEFF01,    0xfffffffe},
+{7700000, DIF_BPF_COEFF23,    0x00010010},
+{7700000, DIF_BPF_COEFF45,    0x001e0008},
+{7700000, DIF_BPF_COEFF67,    0xffc1ff84},
+{7700000, DIF_BPF_COEFF89,    0xffbc0084},
+{7700000, DIF_BPF_COEFF1011,  0x013e00f0},
+{7700000, DIF_BPF_COEFF1213,  0xff56fd9f},
+{7700000, DIF_BPF_COEFF1415,  0xfdb8005c},
+{7700000, DIF_BPF_COEFF1617,  0x03b00460},
+{7700000, DIF_BPF_COEFF1819,  0x00c7fb45},
+{7700000, DIF_BPF_COEFF2021,  0xf8f4fd07},
+{7700000, DIF_BPF_COEFF2223,  0x04fa09ce},
+{7700000, DIF_BPF_COEFF2425,  0x062afc07},
+{7700000, DIF_BPF_COEFF2627,  0xf407f614},
+{7700000, DIF_BPF_COEFF2829,  0x01920ce0},
+{7700000, DIF_BPF_COEFF3031,  0x0d8301fa},
+{7700000, DIF_BPF_COEFF3233,  0xf3e8efe5},
+{7700000, DIF_BPF_COEFF3435,  0xfa0009a4},
+{7700000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 77_quant.dat*/
+
+
+/*case 7800000:*/
+/* BEGIN - DIF BPF register values from 78_quant.dat*/
+{7800000, DIF_BPF_COEFF01,    0x0000fffd},
+{7800000, DIF_BPF_COEFF23,    0xfffd000b},
+{7800000, DIF_BPF_COEFF45,    0x0022001d},
+{7800000, DIF_BPF_COEFF67,    0xffdbff82},
+{7800000, DIF_BPF_COEFF89,    0xff870039},
+{7800000, DIF_BPF_COEFF1011,  0x012a014a},
+{7800000, DIF_BPF_COEFF1213,  0xffedfde7},
+{7800000, DIF_BPF_COEFF1415,  0xfd47ff6b},
+{7800000, DIF_BPF_COEFF1617,  0x031104c6},
+{7800000, DIF_BPF_COEFF1819,  0x0202fc4c},
+{7800000, DIF_BPF_COEFF2021,  0xf8c6fbad},
+{7800000, DIF_BPF_COEFF2223,  0x039909a7},
+{7800000, DIF_BPF_COEFF2425,  0x0767fd8e},
+{7800000, DIF_BPF_COEFF2627,  0xf482f52b},
+{7800000, DIF_BPF_COEFF2829,  0x002d0c39},
+{7800000, DIF_BPF_COEFF3031,  0x0e0002f4},
+{7800000, DIF_BPF_COEFF3233,  0xf477efc2},
+{7800000, DIF_BPF_COEFF3435,  0xf99b0977},
+{7800000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 78_quant.dat*/
+
+
+/*case 7900000:*/
+/* BEGIN - DIF BPF register values from 79_quant.dat*/
+{7900000, DIF_BPF_COEFF01,    0x0000fffd},
+{7900000, DIF_BPF_COEFF23,    0xfffa0004},
+{7900000, DIF_BPF_COEFF45,    0x0020002d},
+{7900000, DIF_BPF_COEFF67,    0xfffbff91},
+{7900000, DIF_BPF_COEFF89,    0xff61ffe8},
+{7900000, DIF_BPF_COEFF1011,  0x00f70184},
+{7900000, DIF_BPF_COEFF1213,  0x0086fe5c},
+{7900000, DIF_BPF_COEFF1415,  0xfd0bfe85},
+{7900000, DIF_BPF_COEFF1617,  0x024104e5},
+{7900000, DIF_BPF_COEFF1819,  0x0323fd7d},
+{7900000, DIF_BPF_COEFF2021,  0xf8e2fa79},
+{7900000, DIF_BPF_COEFF2223,  0x021d093f},
+{7900000, DIF_BPF_COEFF2425,  0x0879ff22},
+{7900000, DIF_BPF_COEFF2627,  0xf52bf465},
+{7900000, DIF_BPF_COEFF2829,  0xfec70b79},
+{7900000, DIF_BPF_COEFF3031,  0x0e6803eb},
+{7900000, DIF_BPF_COEFF3233,  0xf50defa5},
+{7900000, DIF_BPF_COEFF3435,  0xf937094a},
+{7900000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 79_quant.dat*/
+
+
+/*case 8000000:*/
+/* BEGIN - DIF BPF register values from 80_quant.dat*/
+{8000000, DIF_BPF_COEFF01,    0x0000fffe},
+{8000000, DIF_BPF_COEFF23,    0xfff8fffd},
+{8000000, DIF_BPF_COEFF45,    0x00190036},
+{8000000, DIF_BPF_COEFF67,    0x001bffaf},
+{8000000, DIF_BPF_COEFF89,    0xff4fff99},
+{8000000, DIF_BPF_COEFF1011,  0x00aa0198},
+{8000000, DIF_BPF_COEFF1213,  0x0112fef3},
+{8000000, DIF_BPF_COEFF1415,  0xfd09fdb9},
+{8000000, DIF_BPF_COEFF1617,  0x014d04be},
+{8000000, DIF_BPF_COEFF1819,  0x041bfecc},
+{8000000, DIF_BPF_COEFF2021,  0xf947f978},
+{8000000, DIF_BPF_COEFF2223,  0x00900897},
+{8000000, DIF_BPF_COEFF2425,  0x095a00b9},
+{8000000, DIF_BPF_COEFF2627,  0xf600f3c5},
+{8000000, DIF_BPF_COEFF2829,  0xfd650aa3},
+{8000000, DIF_BPF_COEFF3031,  0x0ebc04de},
+{8000000, DIF_BPF_COEFF3233,  0xf5aaef8e},
+{8000000, DIF_BPF_COEFF3435,  0xf8d5091c},
+{8000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 80_quant.dat*/
+
+
+/*case 8100000:*/
+/* BEGIN - DIF BPF register values from 81_quant.dat*/
+{8100000, DIF_BPF_COEFF01,    0x0000ffff},
+{8100000, DIF_BPF_COEFF23,    0xfff7fff6},
+{8100000, DIF_BPF_COEFF45,    0x000e0038},
+{8100000, DIF_BPF_COEFF67,    0x0037ffd7},
+{8100000, DIF_BPF_COEFF89,    0xff52ff56},
+{8100000, DIF_BPF_COEFF1011,  0x004b0184},
+{8100000, DIF_BPF_COEFF1213,  0x0186ffa1},
+{8100000, DIF_BPF_COEFF1415,  0xfd40fd16},
+{8100000, DIF_BPF_COEFF1617,  0x00440452},
+{8100000, DIF_BPF_COEFF1819,  0x04de0029},
+{8100000, DIF_BPF_COEFF2021,  0xf9f2f8b2},
+{8100000, DIF_BPF_COEFF2223,  0xfefe07b5},
+{8100000, DIF_BPF_COEFF2425,  0x0a05024d},
+{8100000, DIF_BPF_COEFF2627,  0xf6fef34d},
+{8100000, DIF_BPF_COEFF2829,  0xfc0a09b8},
+{8100000, DIF_BPF_COEFF3031,  0x0efa05cd},
+{8100000, DIF_BPF_COEFF3233,  0xf64eef7d},
+{8100000, DIF_BPF_COEFF3435,  0xf87308ed},
+{8100000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 81_quant.dat*/
+
+
+/*case 8200000:*/
+/* BEGIN - DIF BPF register values from 82_quant.dat*/
+{8200000, DIF_BPF_COEFF01,    0x00010000},
+{8200000, DIF_BPF_COEFF23,    0xfff8fff0},
+{8200000, DIF_BPF_COEFF45,    0x00000031},
+{8200000, DIF_BPF_COEFF67,    0x004c0005},
+{8200000, DIF_BPF_COEFF89,    0xff6aff27},
+{8200000, DIF_BPF_COEFF1011,  0xffe4014a},
+{8200000, DIF_BPF_COEFF1213,  0x01d70057},
+{8200000, DIF_BPF_COEFF1415,  0xfdacfca6},
+{8200000, DIF_BPF_COEFF1617,  0xff3603a7},
+{8200000, DIF_BPF_COEFF1819,  0x05610184},
+{8200000, DIF_BPF_COEFF2021,  0xfadbf82e},
+{8200000, DIF_BPF_COEFF2223,  0xfd74069f},
+{8200000, DIF_BPF_COEFF2425,  0x0a7503d6},
+{8200000, DIF_BPF_COEFF2627,  0xf81ff2ff},
+{8200000, DIF_BPF_COEFF2829,  0xfab808b9},
+{8200000, DIF_BPF_COEFF3031,  0x0f2306b5},
+{8200000, DIF_BPF_COEFF3233,  0xf6f9ef72},
+{8200000, DIF_BPF_COEFF3435,  0xf81308bf},
+{8200000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 82_quant.dat*/
+
+
+/*case 8300000:*/
+/* BEGIN - DIF BPF register values from 83_quant.dat*/
+{8300000, DIF_BPF_COEFF01,    0x00010001},
+{8300000, DIF_BPF_COEFF23,    0xfffbffee},
+{8300000, DIF_BPF_COEFF45,    0xfff30022},
+{8300000, DIF_BPF_COEFF67,    0x00560032},
+{8300000, DIF_BPF_COEFF89,    0xff95ff10},
+{8300000, DIF_BPF_COEFF1011,  0xff8000f0},
+{8300000, DIF_BPF_COEFF1213,  0x01fe0106},
+{8300000, DIF_BPF_COEFF1415,  0xfe46fc71},
+{8300000, DIF_BPF_COEFF1617,  0xfe3502c7},
+{8300000, DIF_BPF_COEFF1819,  0x059e02ce},
+{8300000, DIF_BPF_COEFF2021,  0xfbf9f7f2},
+{8300000, DIF_BPF_COEFF2223,  0xfbff055b},
+{8300000, DIF_BPF_COEFF2425,  0x0aa9054c},
+{8300000, DIF_BPF_COEFF2627,  0xf961f2db},
+{8300000, DIF_BPF_COEFF2829,  0xf97507aa},
+{8300000, DIF_BPF_COEFF3031,  0x0f350797},
+{8300000, DIF_BPF_COEFF3233,  0xf7a9ef6d},
+{8300000, DIF_BPF_COEFF3435,  0xf7b40890},
+{8300000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 83_quant.dat*/
+
+
+/*case 8400000:*/
+/* BEGIN - DIF BPF register values from 84_quant.dat*/
+{8400000, DIF_BPF_COEFF01,    0x00010002},
+{8400000, DIF_BPF_COEFF23,    0xfffeffee},
+{8400000, DIF_BPF_COEFF45,    0xffe8000f},
+{8400000, DIF_BPF_COEFF67,    0x00540058},
+{8400000, DIF_BPF_COEFF89,    0xffcdff14},
+{8400000, DIF_BPF_COEFF1011,  0xff29007e},
+{8400000, DIF_BPF_COEFF1213,  0x01f6019e},
+{8400000, DIF_BPF_COEFF1415,  0xff01fc7c},
+{8400000, DIF_BPF_COEFF1617,  0xfd5101bf},
+{8400000, DIF_BPF_COEFF1819,  0x059203f6},
+{8400000, DIF_BPF_COEFF2021,  0xfd41f7fe},
+{8400000, DIF_BPF_COEFF2223,  0xfaa903f3},
+{8400000, DIF_BPF_COEFF2425,  0x0a9e06a9},
+{8400000, DIF_BPF_COEFF2627,  0xfabdf2e2},
+{8400000, DIF_BPF_COEFF2829,  0xf842068b},
+{8400000, DIF_BPF_COEFF3031,  0x0f320871},
+{8400000, DIF_BPF_COEFF3233,  0xf85eef6e},
+{8400000, DIF_BPF_COEFF3435,  0xf7560860},
+{8400000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 84_quant.dat*/
+
+
+/*case 8500000:*/
+/* BEGIN - DIF BPF register values from 85_quant.dat*/
+{8500000, DIF_BPF_COEFF01,    0x00000003},
+{8500000, DIF_BPF_COEFF23,    0x0002fff2},
+{8500000, DIF_BPF_COEFF45,    0xffe1fff9},
+{8500000, DIF_BPF_COEFF67,    0x00460073},
+{8500000, DIF_BPF_COEFF89,    0x000bff34},
+{8500000, DIF_BPF_COEFF1011,  0xfee90000},
+{8500000, DIF_BPF_COEFF1213,  0x01c10215},
+{8500000, DIF_BPF_COEFF1415,  0xffd0fcc5},
+{8500000, DIF_BPF_COEFF1617,  0xfc99009d},
+{8500000, DIF_BPF_COEFF1819,  0x053d04f1},
+{8500000, DIF_BPF_COEFF2021,  0xfea5f853},
+{8500000, DIF_BPF_COEFF2223,  0xf97d0270},
+{8500000, DIF_BPF_COEFF2425,  0x0a5607e4},
+{8500000, DIF_BPF_COEFF2627,  0xfc2ef314},
+{8500000, DIF_BPF_COEFF2829,  0xf723055f},
+{8500000, DIF_BPF_COEFF3031,  0x0f180943},
+{8500000, DIF_BPF_COEFF3233,  0xf919ef75},
+{8500000, DIF_BPF_COEFF3435,  0xf6fa0830},
+{8500000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 85_quant.dat*/
+
+
+/*case 8600000:*/
+/* BEGIN - DIF BPF register values from 86_quant.dat*/
+{8600000, DIF_BPF_COEFF01,    0x00000003},
+{8600000, DIF_BPF_COEFF23,    0x0005fff8},
+{8600000, DIF_BPF_COEFF45,    0xffdeffe4},
+{8600000, DIF_BPF_COEFF67,    0x002f007f},
+{8600000, DIF_BPF_COEFF89,    0x0048ff6b},
+{8600000, DIF_BPF_COEFF1011,  0xfec7ff82},
+{8600000, DIF_BPF_COEFF1213,  0x0163025f},
+{8600000, DIF_BPF_COEFF1415,  0x00a2fd47},
+{8600000, DIF_BPF_COEFF1617,  0xfc17ff73},
+{8600000, DIF_BPF_COEFF1819,  0x04a405b2},
+{8600000, DIF_BPF_COEFF2021,  0x0017f8ed},
+{8600000, DIF_BPF_COEFF2223,  0xf88500dc},
+{8600000, DIF_BPF_COEFF2425,  0x09d208f9},
+{8600000, DIF_BPF_COEFF2627,  0xfdaff370},
+{8600000, DIF_BPF_COEFF2829,  0xf61c0429},
+{8600000, DIF_BPF_COEFF3031,  0x0ee80a0b},
+{8600000, DIF_BPF_COEFF3233,  0xf9d8ef82},
+{8600000, DIF_BPF_COEFF3435,  0xf6a00800},
+{8600000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 86_quant.dat*/
+
+
+/*case 8700000:*/
+/* BEGIN - DIF BPF register values from 87_quant.dat*/
+{8700000, DIF_BPF_COEFF01,    0x00000003},
+{8700000, DIF_BPF_COEFF23,    0x0007ffff},
+{8700000, DIF_BPF_COEFF45,    0xffe1ffd4},
+{8700000, DIF_BPF_COEFF67,    0x0010007a},
+{8700000, DIF_BPF_COEFF89,    0x007cffb2},
+{8700000, DIF_BPF_COEFF1011,  0xfec6ff10},
+{8700000, DIF_BPF_COEFF1213,  0x00e60277},
+{8700000, DIF_BPF_COEFF1415,  0x0168fdf9},
+{8700000, DIF_BPF_COEFF1617,  0xfbd3fe50},
+{8700000, DIF_BPF_COEFF1819,  0x03ce0631},
+{8700000, DIF_BPF_COEFF2021,  0x0188f9c8},
+{8700000, DIF_BPF_COEFF2223,  0xf7c7ff43},
+{8700000, DIF_BPF_COEFF2425,  0x091509e3},
+{8700000, DIF_BPF_COEFF2627,  0xff39f3f6},
+{8700000, DIF_BPF_COEFF2829,  0xf52d02ea},
+{8700000, DIF_BPF_COEFF3031,  0x0ea30ac9},
+{8700000, DIF_BPF_COEFF3233,  0xfa9bef95},
+{8700000, DIF_BPF_COEFF3435,  0xf64607d0},
+{8700000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 87_quant.dat*/
+
+
+/*case 8800000:*/
+/* BEGIN - DIF BPF register values from 88_quant.dat*/
+{8800000, DIF_BPF_COEFF01,    0x00000002},
+{8800000, DIF_BPF_COEFF23,    0x00090007},
+{8800000, DIF_BPF_COEFF45,    0xffe9ffca},
+{8800000, DIF_BPF_COEFF67,    0xfff00065},
+{8800000, DIF_BPF_COEFF89,    0x00a10003},
+{8800000, DIF_BPF_COEFF1011,  0xfee6feb6},
+{8800000, DIF_BPF_COEFF1213,  0x0053025b},
+{8800000, DIF_BPF_COEFF1415,  0x0213fed0},
+{8800000, DIF_BPF_COEFF1617,  0xfbd3fd46},
+{8800000, DIF_BPF_COEFF1819,  0x02c70668},
+{8800000, DIF_BPF_COEFF2021,  0x02eafadb},
+{8800000, DIF_BPF_COEFF2223,  0xf74bfdae},
+{8800000, DIF_BPF_COEFF2425,  0x08230a9c},
+{8800000, DIF_BPF_COEFF2627,  0x00c7f4a3},
+{8800000, DIF_BPF_COEFF2829,  0xf45b01a6},
+{8800000, DIF_BPF_COEFF3031,  0x0e480b7c},
+{8800000, DIF_BPF_COEFF3233,  0xfb61efae},
+{8800000, DIF_BPF_COEFF3435,  0xf5ef079f},
+{8800000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 88_quant.dat*/
+
+
+/*case 8900000:*/
+/* BEGIN - DIF BPF register values from 89_quant.dat*/
+{8900000, DIF_BPF_COEFF01,    0xffff0000},
+{8900000, DIF_BPF_COEFF23,    0x0008000d},
+{8900000, DIF_BPF_COEFF45,    0xfff5ffc8},
+{8900000, DIF_BPF_COEFF67,    0xffd10043},
+{8900000, DIF_BPF_COEFF89,    0x00b20053},
+{8900000, DIF_BPF_COEFF1011,  0xff24fe7c},
+{8900000, DIF_BPF_COEFF1213,  0xffb9020c},
+{8900000, DIF_BPF_COEFF1415,  0x0295ffbb},
+{8900000, DIF_BPF_COEFF1617,  0xfc17fc64},
+{8900000, DIF_BPF_COEFF1819,  0x019b0654},
+{8900000, DIF_BPF_COEFF2021,  0x042dfc1c},
+{8900000, DIF_BPF_COEFF2223,  0xf714fc2a},
+{8900000, DIF_BPF_COEFF2425,  0x07020b21},
+{8900000, DIF_BPF_COEFF2627,  0x0251f575},
+{8900000, DIF_BPF_COEFF2829,  0xf3a7005e},
+{8900000, DIF_BPF_COEFF3031,  0x0dd80c24},
+{8900000, DIF_BPF_COEFF3233,  0xfc2aefcd},
+{8900000, DIF_BPF_COEFF3435,  0xf599076e},
+{8900000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 89_quant.dat*/
+
+
+/*case 9000000:*/
+/* BEGIN - DIF BPF register values from 90_quant.dat*/
+{9000000, DIF_BPF_COEFF01,    0xffffffff},
+{9000000, DIF_BPF_COEFF23,    0x00060011},
+{9000000, DIF_BPF_COEFF45,    0x0002ffcf},
+{9000000, DIF_BPF_COEFF67,    0xffba0018},
+{9000000, DIF_BPF_COEFF89,    0x00ad009a},
+{9000000, DIF_BPF_COEFF1011,  0xff79fe68},
+{9000000, DIF_BPF_COEFF1213,  0xff260192},
+{9000000, DIF_BPF_COEFF1415,  0x02e500ab},
+{9000000, DIF_BPF_COEFF1617,  0xfc99fbb6},
+{9000000, DIF_BPF_COEFF1819,  0x005b05f7},
+{9000000, DIF_BPF_COEFF2021,  0x0545fd81},
+{9000000, DIF_BPF_COEFF2223,  0xf723fabf},
+{9000000, DIF_BPF_COEFF2425,  0x05b80b70},
+{9000000, DIF_BPF_COEFF2627,  0x03d2f669},
+{9000000, DIF_BPF_COEFF2829,  0xf313ff15},
+{9000000, DIF_BPF_COEFF3031,  0x0d550cbf},
+{9000000, DIF_BPF_COEFF3233,  0xfcf6eff2},
+{9000000, DIF_BPF_COEFF3435,  0xf544073d},
+{9000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 90_quant.dat*/
+
+
+/*case 9100000:*/
+/* BEGIN - DIF BPF register values from 91_quant.dat*/
+{9100000, DIF_BPF_COEFF01,    0xfffffffe},
+{9100000, DIF_BPF_COEFF23,    0x00030012},
+{9100000, DIF_BPF_COEFF45,    0x000fffdd},
+{9100000, DIF_BPF_COEFF67,    0xffacffea},
+{9100000, DIF_BPF_COEFF89,    0x009300cf},
+{9100000, DIF_BPF_COEFF1011,  0xffdcfe7c},
+{9100000, DIF_BPF_COEFF1213,  0xfea600f7},
+{9100000, DIF_BPF_COEFF1415,  0x02fd0190},
+{9100000, DIF_BPF_COEFF1617,  0xfd51fb46},
+{9100000, DIF_BPF_COEFF1819,  0xff150554},
+{9100000, DIF_BPF_COEFF2021,  0x0627fefd},
+{9100000, DIF_BPF_COEFF2223,  0xf778f978},
+{9100000, DIF_BPF_COEFF2425,  0x044d0b87},
+{9100000, DIF_BPF_COEFF2627,  0x0543f77d},
+{9100000, DIF_BPF_COEFF2829,  0xf2a0fdcf},
+{9100000, DIF_BPF_COEFF3031,  0x0cbe0d4e},
+{9100000, DIF_BPF_COEFF3233,  0xfdc4f01d},
+{9100000, DIF_BPF_COEFF3435,  0xf4f2070b},
+{9100000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 91_quant.dat*/
+
+
+/*case 9200000:*/
+/* BEGIN - DIF BPF register values from 92_quant.dat*/
+{9200000, DIF_BPF_COEFF01,    0x0000fffd},
+{9200000, DIF_BPF_COEFF23,    0x00000010},
+{9200000, DIF_BPF_COEFF45,    0x001afff0},
+{9200000, DIF_BPF_COEFF67,    0xffaaffbf},
+{9200000, DIF_BPF_COEFF89,    0x006700ed},
+{9200000, DIF_BPF_COEFF1011,  0x0043feb6},
+{9200000, DIF_BPF_COEFF1213,  0xfe460047},
+{9200000, DIF_BPF_COEFF1415,  0x02db0258},
+{9200000, DIF_BPF_COEFF1617,  0xfe35fb1b},
+{9200000, DIF_BPF_COEFF1819,  0xfddc0473},
+{9200000, DIF_BPF_COEFF2021,  0x06c90082},
+{9200000, DIF_BPF_COEFF2223,  0xf811f85e},
+{9200000, DIF_BPF_COEFF2425,  0x02c90b66},
+{9200000, DIF_BPF_COEFF2627,  0x069ff8ad},
+{9200000, DIF_BPF_COEFF2829,  0xf250fc8d},
+{9200000, DIF_BPF_COEFF3031,  0x0c140dcf},
+{9200000, DIF_BPF_COEFF3233,  0xfe93f04d},
+{9200000, DIF_BPF_COEFF3435,  0xf4a106d9},
+{9200000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 92_quant.dat*/
+
+
+/*case 9300000:*/
+/* BEGIN - DIF BPF register values from 93_quant.dat*/
+{9300000, DIF_BPF_COEFF01,    0x0000fffd},
+{9300000, DIF_BPF_COEFF23,    0xfffc000c},
+{9300000, DIF_BPF_COEFF45,    0x00200006},
+{9300000, DIF_BPF_COEFF67,    0xffb4ff9c},
+{9300000, DIF_BPF_COEFF89,    0x002f00ef},
+{9300000, DIF_BPF_COEFF1011,  0x00a4ff10},
+{9300000, DIF_BPF_COEFF1213,  0xfe0dff92},
+{9300000, DIF_BPF_COEFF1415,  0x028102f7},
+{9300000, DIF_BPF_COEFF1617,  0xff36fb37},
+{9300000, DIF_BPF_COEFF1819,  0xfcbf035e},
+{9300000, DIF_BPF_COEFF2021,  0x07260202},
+{9300000, DIF_BPF_COEFF2223,  0xf8e8f778},
+{9300000, DIF_BPF_COEFF2425,  0x01340b0d},
+{9300000, DIF_BPF_COEFF2627,  0x07e1f9f4},
+{9300000, DIF_BPF_COEFF2829,  0xf223fb51},
+{9300000, DIF_BPF_COEFF3031,  0x0b590e42},
+{9300000, DIF_BPF_COEFF3233,  0xff64f083},
+{9300000, DIF_BPF_COEFF3435,  0xf45206a7},
+{9300000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 93_quant.dat*/
+
+
+/*case 9400000:*/
+/* BEGIN - DIF BPF register values from 94_quant.dat*/
+{9400000, DIF_BPF_COEFF01,    0x0000fffd},
+{9400000, DIF_BPF_COEFF23,    0xfff90005},
+{9400000, DIF_BPF_COEFF45,    0x0022001a},
+{9400000, DIF_BPF_COEFF67,    0xffc9ff86},
+{9400000, DIF_BPF_COEFF89,    0xfff000d7},
+{9400000, DIF_BPF_COEFF1011,  0x00f2ff82},
+{9400000, DIF_BPF_COEFF1213,  0xfe01fee5},
+{9400000, DIF_BPF_COEFF1415,  0x01f60362},
+{9400000, DIF_BPF_COEFF1617,  0x0044fb99},
+{9400000, DIF_BPF_COEFF1819,  0xfbcc0222},
+{9400000, DIF_BPF_COEFF2021,  0x07380370},
+{9400000, DIF_BPF_COEFF2223,  0xf9f7f6cc},
+{9400000, DIF_BPF_COEFF2425,  0xff990a7e},
+{9400000, DIF_BPF_COEFF2627,  0x0902fb50},
+{9400000, DIF_BPF_COEFF2829,  0xf21afa1f},
+{9400000, DIF_BPF_COEFF3031,  0x0a8d0ea6},
+{9400000, DIF_BPF_COEFF3233,  0x0034f0bf},
+{9400000, DIF_BPF_COEFF3435,  0xf4050675},
+{9400000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 94_quant.dat*/
+
+
+/*case 9500000:*/
+/* BEGIN - DIF BPF register values from 95_quant.dat*/
+{9500000, DIF_BPF_COEFF01,    0x0000fffe},
+{9500000, DIF_BPF_COEFF23,    0xfff8fffe},
+{9500000, DIF_BPF_COEFF45,    0x001e002b},
+{9500000, DIF_BPF_COEFF67,    0xffe5ff81},
+{9500000, DIF_BPF_COEFF89,    0xffb400a5},
+{9500000, DIF_BPF_COEFF1011,  0x01280000},
+{9500000, DIF_BPF_COEFF1213,  0xfe24fe50},
+{9500000, DIF_BPF_COEFF1415,  0x01460390},
+{9500000, DIF_BPF_COEFF1617,  0x014dfc3a},
+{9500000, DIF_BPF_COEFF1819,  0xfb1000ce},
+{9500000, DIF_BPF_COEFF2021,  0x070104bf},
+{9500000, DIF_BPF_COEFF2223,  0xfb37f65f},
+{9500000, DIF_BPF_COEFF2425,  0xfe0009bc},
+{9500000, DIF_BPF_COEFF2627,  0x0a00fcbb},
+{9500000, DIF_BPF_COEFF2829,  0xf235f8f8},
+{9500000, DIF_BPF_COEFF3031,  0x09b20efc},
+{9500000, DIF_BPF_COEFF3233,  0x0105f101},
+{9500000, DIF_BPF_COEFF3435,  0xf3ba0642},
+{9500000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 95_quant.dat*/
+
+
+/*case 9600000:*/
+/* BEGIN - DIF BPF register values from 96_quant.dat*/
+{9600000, DIF_BPF_COEFF01,    0x0001ffff},
+{9600000, DIF_BPF_COEFF23,    0xfff8fff7},
+{9600000, DIF_BPF_COEFF45,    0x00150036},
+{9600000, DIF_BPF_COEFF67,    0x0005ff8c},
+{9600000, DIF_BPF_COEFF89,    0xff810061},
+{9600000, DIF_BPF_COEFF1011,  0x013d007e},
+{9600000, DIF_BPF_COEFF1213,  0xfe71fddf},
+{9600000, DIF_BPF_COEFF1415,  0x007c0380},
+{9600000, DIF_BPF_COEFF1617,  0x0241fd13},
+{9600000, DIF_BPF_COEFF1819,  0xfa94ff70},
+{9600000, DIF_BPF_COEFF2021,  0x068005e2},
+{9600000, DIF_BPF_COEFF2223,  0xfc9bf633},
+{9600000, DIF_BPF_COEFF2425,  0xfc7308ca},
+{9600000, DIF_BPF_COEFF2627,  0x0ad5fe30},
+{9600000, DIF_BPF_COEFF2829,  0xf274f7e0},
+{9600000, DIF_BPF_COEFF3031,  0x08c90f43},
+{9600000, DIF_BPF_COEFF3233,  0x01d4f147},
+{9600000, DIF_BPF_COEFF3435,  0xf371060f},
+{9600000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 96_quant.dat*/
+
+
+/*case 9700000:*/
+/* BEGIN - DIF BPF register values from 97_quant.dat*/
+{9700000, DIF_BPF_COEFF01,    0x00010001},
+{9700000, DIF_BPF_COEFF23,    0xfff9fff1},
+{9700000, DIF_BPF_COEFF45,    0x00090038},
+{9700000, DIF_BPF_COEFF67,    0x0025ffa7},
+{9700000, DIF_BPF_COEFF89,    0xff5e0012},
+{9700000, DIF_BPF_COEFF1011,  0x013200f0},
+{9700000, DIF_BPF_COEFF1213,  0xfee3fd9b},
+{9700000, DIF_BPF_COEFF1415,  0xffaa0331},
+{9700000, DIF_BPF_COEFF1617,  0x0311fe15},
+{9700000, DIF_BPF_COEFF1819,  0xfa60fe18},
+{9700000, DIF_BPF_COEFF2021,  0x05bd06d1},
+{9700000, DIF_BPF_COEFF2223,  0xfe1bf64a},
+{9700000, DIF_BPF_COEFF2425,  0xfafa07ae},
+{9700000, DIF_BPF_COEFF2627,  0x0b7effab},
+{9700000, DIF_BPF_COEFF2829,  0xf2d5f6d7},
+{9700000, DIF_BPF_COEFF3031,  0x07d30f7a},
+{9700000, DIF_BPF_COEFF3233,  0x02a3f194},
+{9700000, DIF_BPF_COEFF3435,  0xf32905dc},
+{9700000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 97_quant.dat*/
+
+
+/*case 9800000:*/
+/* BEGIN - DIF BPF register values from 98_quant.dat*/
+{9800000, DIF_BPF_COEFF01,    0x00010002},
+{9800000, DIF_BPF_COEFF23,    0xfffcffee},
+{9800000, DIF_BPF_COEFF45,    0xfffb0032},
+{9800000, DIF_BPF_COEFF67,    0x003fffcd},
+{9800000, DIF_BPF_COEFF89,    0xff4effc1},
+{9800000, DIF_BPF_COEFF1011,  0x0106014a},
+{9800000, DIF_BPF_COEFF1213,  0xff6efd8a},
+{9800000, DIF_BPF_COEFF1415,  0xfedd02aa},
+{9800000, DIF_BPF_COEFF1617,  0x03b0ff34},
+{9800000, DIF_BPF_COEFF1819,  0xfa74fcd7},
+{9800000, DIF_BPF_COEFF2021,  0x04bf0781},
+{9800000, DIF_BPF_COEFF2223,  0xffaaf6a3},
+{9800000, DIF_BPF_COEFF2425,  0xf99e066b},
+{9800000, DIF_BPF_COEFF2627,  0x0bf90128},
+{9800000, DIF_BPF_COEFF2829,  0xf359f5e1},
+{9800000, DIF_BPF_COEFF3031,  0x06d20fa2},
+{9800000, DIF_BPF_COEFF3233,  0x0370f1e5},
+{9800000, DIF_BPF_COEFF3435,  0xf2e405a8},
+{9800000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 98_quant.dat*/
+
+
+/*case 9900000:*/
+/* BEGIN - DIF BPF register values from 99_quant.dat*/
+{9900000, DIF_BPF_COEFF01,    0x00000003},
+{9900000, DIF_BPF_COEFF23,    0xffffffee},
+{9900000, DIF_BPF_COEFF45,    0xffef0024},
+{9900000, DIF_BPF_COEFF67,    0x0051fffa},
+{9900000, DIF_BPF_COEFF89,    0xff54ff77},
+{9900000, DIF_BPF_COEFF1011,  0x00be0184},
+{9900000, DIF_BPF_COEFF1213,  0x0006fdad},
+{9900000, DIF_BPF_COEFF1415,  0xfe2701f3},
+{9900000, DIF_BPF_COEFF1617,  0x0413005e},
+{9900000, DIF_BPF_COEFF1819,  0xfad1fbba},
+{9900000, DIF_BPF_COEFF2021,  0x039007ee},
+{9900000, DIF_BPF_COEFF2223,  0x013bf73d},
+{9900000, DIF_BPF_COEFF2425,  0xf868050a},
+{9900000, DIF_BPF_COEFF2627,  0x0c4302a1},
+{9900000, DIF_BPF_COEFF2829,  0xf3fdf4fe},
+{9900000, DIF_BPF_COEFF3031,  0x05c70fba},
+{9900000, DIF_BPF_COEFF3233,  0x043bf23c},
+{9900000, DIF_BPF_COEFF3435,  0xf2a10575},
+{9900000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 99_quant.dat*/
+
+
+/*case 10000000:*/
+/* BEGIN - DIF BPF register values from 100_quant.dat*/
+{10000000, DIF_BPF_COEFF01,    0x00000003},
+{10000000, DIF_BPF_COEFF23,    0x0003fff1},
+{10000000, DIF_BPF_COEFF45,    0xffe50011},
+{10000000, DIF_BPF_COEFF67,    0x00570027},
+{10000000, DIF_BPF_COEFF89,    0xff70ff3c},
+{10000000, DIF_BPF_COEFF1011,  0x00620198},
+{10000000, DIF_BPF_COEFF1213,  0x009efe01},
+{10000000, DIF_BPF_COEFF1415,  0xfd95011a},
+{10000000, DIF_BPF_COEFF1617,  0x04350183},
+{10000000, DIF_BPF_COEFF1819,  0xfb71fad0},
+{10000000, DIF_BPF_COEFF2021,  0x023c0812},
+{10000000, DIF_BPF_COEFF2223,  0x02c3f811},
+{10000000, DIF_BPF_COEFF2425,  0xf75e0390},
+{10000000, DIF_BPF_COEFF2627,  0x0c5c0411},
+{10000000, DIF_BPF_COEFF2829,  0xf4c1f432},
+{10000000, DIF_BPF_COEFF3031,  0x04b30fc1},
+{10000000, DIF_BPF_COEFF3233,  0x0503f297},
+{10000000, DIF_BPF_COEFF3435,  0xf2610541},
+{10000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 100_quant.dat*/
+
+
+/*case 10100000:*/
+/* BEGIN - DIF BPF register values from 101_quant.dat*/
+{10100000, DIF_BPF_COEFF01,    0x00000003},
+{10100000, DIF_BPF_COEFF23,    0x0006fff7},
+{10100000, DIF_BPF_COEFF45,    0xffdffffc},
+{10100000, DIF_BPF_COEFF67,    0x00510050},
+{10100000, DIF_BPF_COEFF89,    0xff9dff18},
+{10100000, DIF_BPF_COEFF1011,  0xfffc0184},
+{10100000, DIF_BPF_COEFF1213,  0x0128fe80},
+{10100000, DIF_BPF_COEFF1415,  0xfd32002e},
+{10100000, DIF_BPF_COEFF1617,  0x04130292},
+{10100000, DIF_BPF_COEFF1819,  0xfc4dfa21},
+{10100000, DIF_BPF_COEFF2021,  0x00d107ee},
+{10100000, DIF_BPF_COEFF2223,  0x0435f91c},
+{10100000, DIF_BPF_COEFF2425,  0xf6850205},
+{10100000, DIF_BPF_COEFF2627,  0x0c430573},
+{10100000, DIF_BPF_COEFF2829,  0xf5a1f37d},
+{10100000, DIF_BPF_COEFF3031,  0x03990fba},
+{10100000, DIF_BPF_COEFF3233,  0x05c7f2f8},
+{10100000, DIF_BPF_COEFF3435,  0xf222050d},
+{10100000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 101_quant.dat*/
+
+
+/*case 10200000:*/
+/* BEGIN - DIF BPF register values from 102_quant.dat*/
+{10200000, DIF_BPF_COEFF01,    0x00000002},
+{10200000, DIF_BPF_COEFF23,    0x0008fffe},
+{10200000, DIF_BPF_COEFF45,    0xffdfffe7},
+{10200000, DIF_BPF_COEFF67,    0x003f006e},
+{10200000, DIF_BPF_COEFF89,    0xffd6ff0f},
+{10200000, DIF_BPF_COEFF1011,  0xff96014a},
+{10200000, DIF_BPF_COEFF1213,  0x0197ff1f},
+{10200000, DIF_BPF_COEFF1415,  0xfd05ff3e},
+{10200000, DIF_BPF_COEFF1617,  0x03b0037c},
+{10200000, DIF_BPF_COEFF1819,  0xfd59f9b7},
+{10200000, DIF_BPF_COEFF2021,  0xff5d0781},
+{10200000, DIF_BPF_COEFF2223,  0x0585fa56},
+{10200000, DIF_BPF_COEFF2425,  0xf5e4006f},
+{10200000, DIF_BPF_COEFF2627,  0x0bf906c4},
+{10200000, DIF_BPF_COEFF2829,  0xf69df2e0},
+{10200000, DIF_BPF_COEFF3031,  0x02790fa2},
+{10200000, DIF_BPF_COEFF3233,  0x0688f35d},
+{10200000, DIF_BPF_COEFF3435,  0xf1e604d8},
+{10200000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 102_quant.dat*/
+
+
+/*case 10300000:*/
+/* BEGIN - DIF BPF register values from 103_quant.dat*/
+{10300000, DIF_BPF_COEFF01,    0xffff0001},
+{10300000, DIF_BPF_COEFF23,    0x00090005},
+{10300000, DIF_BPF_COEFF45,    0xffe4ffd6},
+{10300000, DIF_BPF_COEFF67,    0x0025007e},
+{10300000, DIF_BPF_COEFF89,    0x0014ff20},
+{10300000, DIF_BPF_COEFF1011,  0xff3c00f0},
+{10300000, DIF_BPF_COEFF1213,  0x01e1ffd0},
+{10300000, DIF_BPF_COEFF1415,  0xfd12fe5c},
+{10300000, DIF_BPF_COEFF1617,  0x03110433},
+{10300000, DIF_BPF_COEFF1819,  0xfe88f996},
+{10300000, DIF_BPF_COEFF2021,  0xfdf106d1},
+{10300000, DIF_BPF_COEFF2223,  0x06aafbb7},
+{10300000, DIF_BPF_COEFF2425,  0xf57efed8},
+{10300000, DIF_BPF_COEFF2627,  0x0b7e07ff},
+{10300000, DIF_BPF_COEFF2829,  0xf7b0f25e},
+{10300000, DIF_BPF_COEFF3031,  0x01560f7a},
+{10300000, DIF_BPF_COEFF3233,  0x0745f3c7},
+{10300000, DIF_BPF_COEFF3435,  0xf1ac04a4},
+{10300000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 103_quant.dat*/
+
+
+/*case 10400000:*/
+/* BEGIN - DIF BPF register values from 104_quant.dat*/
+{10400000, DIF_BPF_COEFF01,    0xffffffff},
+{10400000, DIF_BPF_COEFF23,    0x0008000c},
+{10400000, DIF_BPF_COEFF45,    0xffedffcb},
+{10400000, DIF_BPF_COEFF67,    0x0005007d},
+{10400000, DIF_BPF_COEFF89,    0x0050ff4c},
+{10400000, DIF_BPF_COEFF1011,  0xfef6007e},
+{10400000, DIF_BPF_COEFF1213,  0x01ff0086},
+{10400000, DIF_BPF_COEFF1415,  0xfd58fd97},
+{10400000, DIF_BPF_COEFF1617,  0x024104ad},
+{10400000, DIF_BPF_COEFF1819,  0xffcaf9c0},
+{10400000, DIF_BPF_COEFF2021,  0xfc9905e2},
+{10400000, DIF_BPF_COEFF2223,  0x079afd35},
+{10400000, DIF_BPF_COEFF2425,  0xf555fd46},
+{10400000, DIF_BPF_COEFF2627,  0x0ad50920},
+{10400000, DIF_BPF_COEFF2829,  0xf8d9f1f6},
+{10400000, DIF_BPF_COEFF3031,  0x00310f43},
+{10400000, DIF_BPF_COEFF3233,  0x07fdf435},
+{10400000, DIF_BPF_COEFF3435,  0xf174046f},
+{10400000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 104_quant.dat*/
+
+
+/*case 10500000:*/
+/* BEGIN - DIF BPF register values from 105_quant.dat*/
+{10500000, DIF_BPF_COEFF01,    0xfffffffe},
+{10500000, DIF_BPF_COEFF23,    0x00050011},
+{10500000, DIF_BPF_COEFF45,    0xfffaffc8},
+{10500000, DIF_BPF_COEFF67,    0xffe5006b},
+{10500000, DIF_BPF_COEFF89,    0x0082ff8c},
+{10500000, DIF_BPF_COEFF1011,  0xfecc0000},
+{10500000, DIF_BPF_COEFF1213,  0x01f00130},
+{10500000, DIF_BPF_COEFF1415,  0xfdd2fcfc},
+{10500000, DIF_BPF_COEFF1617,  0x014d04e3},
+{10500000, DIF_BPF_COEFF1819,  0x010efa32},
+{10500000, DIF_BPF_COEFF2021,  0xfb6404bf},
+{10500000, DIF_BPF_COEFF2223,  0x084efec5},
+{10500000, DIF_BPF_COEFF2425,  0xf569fbc2},
+{10500000, DIF_BPF_COEFF2627,  0x0a000a23},
+{10500000, DIF_BPF_COEFF2829,  0xfa15f1ab},
+{10500000, DIF_BPF_COEFF3031,  0xff0b0efc},
+{10500000, DIF_BPF_COEFF3233,  0x08b0f4a7},
+{10500000, DIF_BPF_COEFF3435,  0xf13f043a},
+{10500000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 105_quant.dat*/
+
+
+/*case 10600000:*/
+/* BEGIN - DIF BPF register values from 106_quant.dat*/
+{10600000, DIF_BPF_COEFF01,    0x0000fffd},
+{10600000, DIF_BPF_COEFF23,    0x00020012},
+{10600000, DIF_BPF_COEFF45,    0x0007ffcd},
+{10600000, DIF_BPF_COEFF67,    0xffc9004c},
+{10600000, DIF_BPF_COEFF89,    0x00a4ffd9},
+{10600000, DIF_BPF_COEFF1011,  0xfec3ff82},
+{10600000, DIF_BPF_COEFF1213,  0x01b401c1},
+{10600000, DIF_BPF_COEFF1415,  0xfe76fc97},
+{10600000, DIF_BPF_COEFF1617,  0x004404d2},
+{10600000, DIF_BPF_COEFF1819,  0x0245fae8},
+{10600000, DIF_BPF_COEFF2021,  0xfa5f0370},
+{10600000, DIF_BPF_COEFF2223,  0x08c1005f},
+{10600000, DIF_BPF_COEFF2425,  0xf5bcfa52},
+{10600000, DIF_BPF_COEFF2627,  0x09020b04},
+{10600000, DIF_BPF_COEFF2829,  0xfb60f17b},
+{10600000, DIF_BPF_COEFF3031,  0xfde70ea6},
+{10600000, DIF_BPF_COEFF3233,  0x095df51e},
+{10600000, DIF_BPF_COEFF3435,  0xf10c0405},
+{10600000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 106_quant.dat*/
+
+
+/*case 10700000:*/
+/* BEGIN - DIF BPF register values from 107_quant.dat*/
+{10700000, DIF_BPF_COEFF01,    0x0000fffd},
+{10700000, DIF_BPF_COEFF23,    0xffff0011},
+{10700000, DIF_BPF_COEFF45,    0x0014ffdb},
+{10700000, DIF_BPF_COEFF67,    0xffb40023},
+{10700000, DIF_BPF_COEFF89,    0x00b2002a},
+{10700000, DIF_BPF_COEFF1011,  0xfedbff10},
+{10700000, DIF_BPF_COEFF1213,  0x0150022d},
+{10700000, DIF_BPF_COEFF1415,  0xff38fc6f},
+{10700000, DIF_BPF_COEFF1617,  0xff36047b},
+{10700000, DIF_BPF_COEFF1819,  0x035efbda},
+{10700000, DIF_BPF_COEFF2021,  0xf9940202},
+{10700000, DIF_BPF_COEFF2223,  0x08ee01f5},
+{10700000, DIF_BPF_COEFF2425,  0xf649f8fe},
+{10700000, DIF_BPF_COEFF2627,  0x07e10bc2},
+{10700000, DIF_BPF_COEFF2829,  0xfcb6f169},
+{10700000, DIF_BPF_COEFF3031,  0xfcc60e42},
+{10700000, DIF_BPF_COEFF3233,  0x0a04f599},
+{10700000, DIF_BPF_COEFF3435,  0xf0db03d0},
+{10700000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 107_quant.dat*/
+
+
+/*case 10800000:*/
+/* BEGIN - DIF BPF register values from 108_quant.dat*/
+{10800000, DIF_BPF_COEFF01,    0x0000fffd},
+{10800000, DIF_BPF_COEFF23,    0xfffb000d},
+{10800000, DIF_BPF_COEFF45,    0x001dffed},
+{10800000, DIF_BPF_COEFF67,    0xffaafff5},
+{10800000, DIF_BPF_COEFF89,    0x00aa0077},
+{10800000, DIF_BPF_COEFF1011,  0xff13feb6},
+{10800000, DIF_BPF_COEFF1213,  0x00ce026b},
+{10800000, DIF_BPF_COEFF1415,  0x000afc85},
+{10800000, DIF_BPF_COEFF1617,  0xfe3503e3},
+{10800000, DIF_BPF_COEFF1819,  0x044cfcfb},
+{10800000, DIF_BPF_COEFF2021,  0xf90c0082},
+{10800000, DIF_BPF_COEFF2223,  0x08d5037f},
+{10800000, DIF_BPF_COEFF2425,  0xf710f7cc},
+{10800000, DIF_BPF_COEFF2627,  0x069f0c59},
+{10800000, DIF_BPF_COEFF2829,  0xfe16f173},
+{10800000, DIF_BPF_COEFF3031,  0xfbaa0dcf},
+{10800000, DIF_BPF_COEFF3233,  0x0aa5f617},
+{10800000, DIF_BPF_COEFF3435,  0xf0ad039b},
+{10800000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 108_quant.dat*/
+
+
+/*case 10900000:*/
+/* BEGIN - DIF BPF register values from 109_quant.dat*/
+{10900000, DIF_BPF_COEFF01,    0x0000fffe},
+{10900000, DIF_BPF_COEFF23,    0xfff90006},
+{10900000, DIF_BPF_COEFF45,    0x00210003},
+{10900000, DIF_BPF_COEFF67,    0xffacffc8},
+{10900000, DIF_BPF_COEFF89,    0x008e00b6},
+{10900000, DIF_BPF_COEFF1011,  0xff63fe7c},
+{10900000, DIF_BPF_COEFF1213,  0x003a0275},
+{10900000, DIF_BPF_COEFF1415,  0x00dafcda},
+{10900000, DIF_BPF_COEFF1617,  0xfd510313},
+{10900000, DIF_BPF_COEFF1819,  0x0501fe40},
+{10900000, DIF_BPF_COEFF2021,  0xf8cbfefd},
+{10900000, DIF_BPF_COEFF2223,  0x087604f0},
+{10900000, DIF_BPF_COEFF2425,  0xf80af6c2},
+{10900000, DIF_BPF_COEFF2627,  0x05430cc8},
+{10900000, DIF_BPF_COEFF2829,  0xff7af19a},
+{10900000, DIF_BPF_COEFF3031,  0xfa940d4e},
+{10900000, DIF_BPF_COEFF3233,  0x0b3ff699},
+{10900000, DIF_BPF_COEFF3435,  0xf0810365},
+{10900000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 109_quant.dat*/
+
+
+/*case 11000000:*/
+/* BEGIN - DIF BPF register values from 110_quant.dat*/
+{11000000, DIF_BPF_COEFF01,    0x0001ffff},
+{11000000, DIF_BPF_COEFF23,    0xfff8ffff},
+{11000000, DIF_BPF_COEFF45,    0x00210018},
+{11000000, DIF_BPF_COEFF67,    0xffbaffa3},
+{11000000, DIF_BPF_COEFF89,    0x006000e1},
+{11000000, DIF_BPF_COEFF1011,  0xffc4fe68},
+{11000000, DIF_BPF_COEFF1213,  0xffa0024b},
+{11000000, DIF_BPF_COEFF1415,  0x019afd66},
+{11000000, DIF_BPF_COEFF1617,  0xfc990216},
+{11000000, DIF_BPF_COEFF1819,  0x0575ff99},
+{11000000, DIF_BPF_COEFF2021,  0xf8d4fd81},
+{11000000, DIF_BPF_COEFF2223,  0x07d40640},
+{11000000, DIF_BPF_COEFF2425,  0xf932f5e6},
+{11000000, DIF_BPF_COEFF2627,  0x03d20d0d},
+{11000000, DIF_BPF_COEFF2829,  0x00dff1de},
+{11000000, DIF_BPF_COEFF3031,  0xf9860cbf},
+{11000000, DIF_BPF_COEFF3233,  0x0bd1f71e},
+{11000000, DIF_BPF_COEFF3435,  0xf058032f},
+{11000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 110_quant.dat*/
+
+
+/*case 11100000:*/
+/* BEGIN - DIF BPF register values from 111_quant.dat*/
+{11100000, DIF_BPF_COEFF01,    0x00010000},
+{11100000, DIF_BPF_COEFF23,    0xfff8fff8},
+{11100000, DIF_BPF_COEFF45,    0x001b0029},
+{11100000, DIF_BPF_COEFF67,    0xffd1ff8a},
+{11100000, DIF_BPF_COEFF89,    0x002600f2},
+{11100000, DIF_BPF_COEFF1011,  0x002cfe7c},
+{11100000, DIF_BPF_COEFF1213,  0xff0f01f0},
+{11100000, DIF_BPF_COEFF1415,  0x023bfe20},
+{11100000, DIF_BPF_COEFF1617,  0xfc1700fa},
+{11100000, DIF_BPF_COEFF1819,  0x05a200f7},
+{11100000, DIF_BPF_COEFF2021,  0xf927fc1c},
+{11100000, DIF_BPF_COEFF2223,  0x06f40765},
+{11100000, DIF_BPF_COEFF2425,  0xfa82f53b},
+{11100000, DIF_BPF_COEFF2627,  0x02510d27},
+{11100000, DIF_BPF_COEFF2829,  0x0243f23d},
+{11100000, DIF_BPF_COEFF3031,  0xf8810c24},
+{11100000, DIF_BPF_COEFF3233,  0x0c5cf7a7},
+{11100000, DIF_BPF_COEFF3435,  0xf03102fa},
+{11100000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 111_quant.dat*/
+
+
+/*case 11200000:*/
+/* BEGIN - DIF BPF register values from 112_quant.dat*/
+{11200000, DIF_BPF_COEFF01,    0x00010002},
+{11200000, DIF_BPF_COEFF23,    0xfffafff2},
+{11200000, DIF_BPF_COEFF45,    0x00110035},
+{11200000, DIF_BPF_COEFF67,    0xfff0ff81},
+{11200000, DIF_BPF_COEFF89,    0xffe700e7},
+{11200000, DIF_BPF_COEFF1011,  0x008ffeb6},
+{11200000, DIF_BPF_COEFF1213,  0xfe94016d},
+{11200000, DIF_BPF_COEFF1415,  0x02b0fefb},
+{11200000, DIF_BPF_COEFF1617,  0xfbd3ffd1},
+{11200000, DIF_BPF_COEFF1819,  0x05850249},
+{11200000, DIF_BPF_COEFF2021,  0xf9c1fadb},
+{11200000, DIF_BPF_COEFF2223,  0x05de0858},
+{11200000, DIF_BPF_COEFF2425,  0xfbf2f4c4},
+{11200000, DIF_BPF_COEFF2627,  0x00c70d17},
+{11200000, DIF_BPF_COEFF2829,  0x03a0f2b8},
+{11200000, DIF_BPF_COEFF3031,  0xf7870b7c},
+{11200000, DIF_BPF_COEFF3233,  0x0cdff833},
+{11200000, DIF_BPF_COEFF3435,  0xf00d02c4},
+{11200000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 112_quant.dat*/
+
+
+/*case 11300000:*/
+/* BEGIN - DIF BPF register values from 113_quant.dat*/
+{11300000, DIF_BPF_COEFF01,    0x00000003},
+{11300000, DIF_BPF_COEFF23,    0xfffdffee},
+{11300000, DIF_BPF_COEFF45,    0x00040038},
+{11300000, DIF_BPF_COEFF67,    0x0010ff88},
+{11300000, DIF_BPF_COEFF89,    0xffac00c2},
+{11300000, DIF_BPF_COEFF1011,  0x00e2ff10},
+{11300000, DIF_BPF_COEFF1213,  0xfe3900cb},
+{11300000, DIF_BPF_COEFF1415,  0x02f1ffe9},
+{11300000, DIF_BPF_COEFF1617,  0xfbd3feaa},
+{11300000, DIF_BPF_COEFF1819,  0x05210381},
+{11300000, DIF_BPF_COEFF2021,  0xfa9cf9c8},
+{11300000, DIF_BPF_COEFF2223,  0x04990912},
+{11300000, DIF_BPF_COEFF2425,  0xfd7af484},
+{11300000, DIF_BPF_COEFF2627,  0xff390cdb},
+{11300000, DIF_BPF_COEFF2829,  0x04f4f34d},
+{11300000, DIF_BPF_COEFF3031,  0xf69a0ac9},
+{11300000, DIF_BPF_COEFF3233,  0x0d5af8c1},
+{11300000, DIF_BPF_COEFF3435,  0xefec028e},
+{11300000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 113_quant.dat*/
+
+
+/*case 11400000:*/
+/* BEGIN - DIF BPF register values from 114_quant.dat*/
+{11400000, DIF_BPF_COEFF01,    0x00000003},
+{11400000, DIF_BPF_COEFF23,    0x0000ffee},
+{11400000, DIF_BPF_COEFF45,    0xfff60033},
+{11400000, DIF_BPF_COEFF67,    0x002fff9f},
+{11400000, DIF_BPF_COEFF89,    0xff7b0087},
+{11400000, DIF_BPF_COEFF1011,  0x011eff82},
+{11400000, DIF_BPF_COEFF1213,  0xfe080018},
+{11400000, DIF_BPF_COEFF1415,  0x02f900d8},
+{11400000, DIF_BPF_COEFF1617,  0xfc17fd96},
+{11400000, DIF_BPF_COEFF1819,  0x04790490},
+{11400000, DIF_BPF_COEFF2021,  0xfbadf8ed},
+{11400000, DIF_BPF_COEFF2223,  0x032f098e},
+{11400000, DIF_BPF_COEFF2425,  0xff10f47d},
+{11400000, DIF_BPF_COEFF2627,  0xfdaf0c75},
+{11400000, DIF_BPF_COEFF2829,  0x063cf3fc},
+{11400000, DIF_BPF_COEFF3031,  0xf5ba0a0b},
+{11400000, DIF_BPF_COEFF3233,  0x0dccf952},
+{11400000, DIF_BPF_COEFF3435,  0xefcd0258},
+{11400000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 114_quant.dat*/
+
+
+/*case 11500000:*/
+/* BEGIN - DIF BPF register values from 115_quant.dat*/
+{11500000, DIF_BPF_COEFF01,    0x00000003},
+{11500000, DIF_BPF_COEFF23,    0x0004fff1},
+{11500000, DIF_BPF_COEFF45,    0xffea0026},
+{11500000, DIF_BPF_COEFF67,    0x0046ffc3},
+{11500000, DIF_BPF_COEFF89,    0xff5a003c},
+{11500000, DIF_BPF_COEFF1011,  0x013b0000},
+{11500000, DIF_BPF_COEFF1213,  0xfe04ff63},
+{11500000, DIF_BPF_COEFF1415,  0x02c801b8},
+{11500000, DIF_BPF_COEFF1617,  0xfc99fca6},
+{11500000, DIF_BPF_COEFF1819,  0x0397056a},
+{11500000, DIF_BPF_COEFF2021,  0xfcecf853},
+{11500000, DIF_BPF_COEFF2223,  0x01ad09c9},
+{11500000, DIF_BPF_COEFF2425,  0x00acf4ad},
+{11500000, DIF_BPF_COEFF2627,  0xfc2e0be7},
+{11500000, DIF_BPF_COEFF2829,  0x0773f4c2},
+{11500000, DIF_BPF_COEFF3031,  0xf4e90943},
+{11500000, DIF_BPF_COEFF3233,  0x0e35f9e6},
+{11500000, DIF_BPF_COEFF3435,  0xefb10221},
+{11500000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 115_quant.dat*/
+
+
+/*case 11600000:*/
+/* BEGIN - DIF BPF register values from 116_quant.dat*/
+{11600000, DIF_BPF_COEFF01,    0x00000002},
+{11600000, DIF_BPF_COEFF23,    0x0007fff6},
+{11600000, DIF_BPF_COEFF45,    0xffe20014},
+{11600000, DIF_BPF_COEFF67,    0x0054ffee},
+{11600000, DIF_BPF_COEFF89,    0xff4effeb},
+{11600000, DIF_BPF_COEFF1011,  0x0137007e},
+{11600000, DIF_BPF_COEFF1213,  0xfe2efebb},
+{11600000, DIF_BPF_COEFF1415,  0x0260027a},
+{11600000, DIF_BPF_COEFF1617,  0xfd51fbe6},
+{11600000, DIF_BPF_COEFF1819,  0x02870605},
+{11600000, DIF_BPF_COEFF2021,  0xfe4af7fe},
+{11600000, DIF_BPF_COEFF2223,  0x001d09c1},
+{11600000, DIF_BPF_COEFF2425,  0x0243f515},
+{11600000, DIF_BPF_COEFF2627,  0xfabd0b32},
+{11600000, DIF_BPF_COEFF2829,  0x0897f59e},
+{11600000, DIF_BPF_COEFF3031,  0xf4280871},
+{11600000, DIF_BPF_COEFF3233,  0x0e95fa7c},
+{11600000, DIF_BPF_COEFF3435,  0xef9701eb},
+{11600000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 116_quant.dat*/
+
+
+/*case 11700000:*/
+/* BEGIN - DIF BPF register values from 117_quant.dat*/
+{11700000, DIF_BPF_COEFF01,    0xffff0001},
+{11700000, DIF_BPF_COEFF23,    0x0008fffd},
+{11700000, DIF_BPF_COEFF45,    0xffdeffff},
+{11700000, DIF_BPF_COEFF67,    0x0056001d},
+{11700000, DIF_BPF_COEFF89,    0xff57ff9c},
+{11700000, DIF_BPF_COEFF1011,  0x011300f0},
+{11700000, DIF_BPF_COEFF1213,  0xfe82fe2e},
+{11700000, DIF_BPF_COEFF1415,  0x01ca0310},
+{11700000, DIF_BPF_COEFF1617,  0xfe35fb62},
+{11700000, DIF_BPF_COEFF1819,  0x0155065a},
+{11700000, DIF_BPF_COEFF2021,  0xffbaf7f2},
+{11700000, DIF_BPF_COEFF2223,  0xfe8c0977},
+{11700000, DIF_BPF_COEFF2425,  0x03cef5b2},
+{11700000, DIF_BPF_COEFF2627,  0xf9610a58},
+{11700000, DIF_BPF_COEFF2829,  0x09a5f68f},
+{11700000, DIF_BPF_COEFF3031,  0xf3790797},
+{11700000, DIF_BPF_COEFF3233,  0x0eebfb14},
+{11700000, DIF_BPF_COEFF3435,  0xef8001b5},
+{11700000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 117_quant.dat*/
+
+
+/*case 11800000:*/
+/* BEGIN - DIF BPF register values from 118_quant.dat*/
+{11800000, DIF_BPF_COEFF01,    0xffff0000},
+{11800000, DIF_BPF_COEFF23,    0x00080004},
+{11800000, DIF_BPF_COEFF45,    0xffe0ffe9},
+{11800000, DIF_BPF_COEFF67,    0x004c0047},
+{11800000, DIF_BPF_COEFF89,    0xff75ff58},
+{11800000, DIF_BPF_COEFF1011,  0x00d1014a},
+{11800000, DIF_BPF_COEFF1213,  0xfef9fdc8},
+{11800000, DIF_BPF_COEFF1415,  0x0111036f},
+{11800000, DIF_BPF_COEFF1617,  0xff36fb21},
+{11800000, DIF_BPF_COEFF1819,  0x00120665},
+{11800000, DIF_BPF_COEFF2021,  0x012df82e},
+{11800000, DIF_BPF_COEFF2223,  0xfd0708ec},
+{11800000, DIF_BPF_COEFF2425,  0x0542f682},
+{11800000, DIF_BPF_COEFF2627,  0xf81f095c},
+{11800000, DIF_BPF_COEFF2829,  0x0a9af792},
+{11800000, DIF_BPF_COEFF3031,  0xf2db06b5},
+{11800000, DIF_BPF_COEFF3233,  0x0f38fbad},
+{11800000, DIF_BPF_COEFF3435,  0xef6c017e},
+{11800000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 118_quant.dat*/
+
+
+/*case 11900000:*/
+/* BEGIN - DIF BPF register values from 119_quant.dat*/
+{11900000, DIF_BPF_COEFF01,    0xffffffff},
+{11900000, DIF_BPF_COEFF23,    0x0007000b},
+{11900000, DIF_BPF_COEFF45,    0xffe7ffd8},
+{11900000, DIF_BPF_COEFF67,    0x00370068},
+{11900000, DIF_BPF_COEFF89,    0xffa4ff28},
+{11900000, DIF_BPF_COEFF1011,  0x00790184},
+{11900000, DIF_BPF_COEFF1213,  0xff87fd91},
+{11900000, DIF_BPF_COEFF1415,  0x00430392},
+{11900000, DIF_BPF_COEFF1617,  0x0044fb26},
+{11900000, DIF_BPF_COEFF1819,  0xfece0626},
+{11900000, DIF_BPF_COEFF2021,  0x0294f8b2},
+{11900000, DIF_BPF_COEFF2223,  0xfb990825},
+{11900000, DIF_BPF_COEFF2425,  0x0698f77f},
+{11900000, DIF_BPF_COEFF2627,  0xf6fe0842},
+{11900000, DIF_BPF_COEFF2829,  0x0b73f8a7},
+{11900000, DIF_BPF_COEFF3031,  0xf25105cd},
+{11900000, DIF_BPF_COEFF3233,  0x0f7bfc48},
+{11900000, DIF_BPF_COEFF3435,  0xef5a0148},
+{11900000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 119_quant.dat*/
+
+
+/*case 12000000:*/
+/* BEGIN - DIF BPF register values from 120_quant.dat*/
+{12000000, DIF_BPF_COEFF01,    0x0000fffe},
+{12000000, DIF_BPF_COEFF23,    0x00050010},
+{12000000, DIF_BPF_COEFF45,    0xfff2ffcc},
+{12000000, DIF_BPF_COEFF67,    0x001b007b},
+{12000000, DIF_BPF_COEFF89,    0xffdfff10},
+{12000000, DIF_BPF_COEFF1011,  0x00140198},
+{12000000, DIF_BPF_COEFF1213,  0x0020fd8e},
+{12000000, DIF_BPF_COEFF1415,  0xff710375},
+{12000000, DIF_BPF_COEFF1617,  0x014dfb73},
+{12000000, DIF_BPF_COEFF1819,  0xfd9a059f},
+{12000000, DIF_BPF_COEFF2021,  0x03e0f978},
+{12000000, DIF_BPF_COEFF2223,  0xfa4e0726},
+{12000000, DIF_BPF_COEFF2425,  0x07c8f8a7},
+{12000000, DIF_BPF_COEFF2627,  0xf600070c},
+{12000000, DIF_BPF_COEFF2829,  0x0c2ff9c9},
+{12000000, DIF_BPF_COEFF3031,  0xf1db04de},
+{12000000, DIF_BPF_COEFF3233,  0x0fb4fce5},
+{12000000, DIF_BPF_COEFF3435,  0xef4b0111},
+{12000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 120_quant.dat*/
+
+
+/*case 12100000:*/
+/* BEGIN - DIF BPF register values from 121_quant.dat*/
+{12100000, DIF_BPF_COEFF01,    0x0000fffd},
+{12100000, DIF_BPF_COEFF23,    0x00010012},
+{12100000, DIF_BPF_COEFF45,    0xffffffc8},
+{12100000, DIF_BPF_COEFF67,    0xfffb007e},
+{12100000, DIF_BPF_COEFF89,    0x001dff14},
+{12100000, DIF_BPF_COEFF1011,  0xffad0184},
+{12100000, DIF_BPF_COEFF1213,  0x00b7fdbe},
+{12100000, DIF_BPF_COEFF1415,  0xfea9031b},
+{12100000, DIF_BPF_COEFF1617,  0x0241fc01},
+{12100000, DIF_BPF_COEFF1819,  0xfc8504d6},
+{12100000, DIF_BPF_COEFF2021,  0x0504fa79},
+{12100000, DIF_BPF_COEFF2223,  0xf93005f6},
+{12100000, DIF_BPF_COEFF2425,  0x08caf9f2},
+{12100000, DIF_BPF_COEFF2627,  0xf52b05c0},
+{12100000, DIF_BPF_COEFF2829,  0x0ccbfaf9},
+{12100000, DIF_BPF_COEFF3031,  0xf17903eb},
+{12100000, DIF_BPF_COEFF3233,  0x0fe3fd83},
+{12100000, DIF_BPF_COEFF3435,  0xef3f00db},
+{12100000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 121_quant.dat*/
+
+
+/*case 12200000:*/
+/* BEGIN - DIF BPF register values from 122_quant.dat*/
+{12200000, DIF_BPF_COEFF01,    0x0000fffd},
+{12200000, DIF_BPF_COEFF23,    0xfffe0011},
+{12200000, DIF_BPF_COEFF45,    0x000cffcc},
+{12200000, DIF_BPF_COEFF67,    0xffdb0071},
+{12200000, DIF_BPF_COEFF89,    0x0058ff32},
+{12200000, DIF_BPF_COEFF1011,  0xff4f014a},
+{12200000, DIF_BPF_COEFF1213,  0x013cfe1f},
+{12200000, DIF_BPF_COEFF1415,  0xfdfb028a},
+{12200000, DIF_BPF_COEFF1617,  0x0311fcc9},
+{12200000, DIF_BPF_COEFF1819,  0xfb9d03d6},
+{12200000, DIF_BPF_COEFF2021,  0x05f4fbad},
+{12200000, DIF_BPF_COEFF2223,  0xf848049d},
+{12200000, DIF_BPF_COEFF2425,  0x0999fb5b},
+{12200000, DIF_BPF_COEFF2627,  0xf4820461},
+{12200000, DIF_BPF_COEFF2829,  0x0d46fc32},
+{12200000, DIF_BPF_COEFF3031,  0xf12d02f4},
+{12200000, DIF_BPF_COEFF3233,  0x1007fe21},
+{12200000, DIF_BPF_COEFF3435,  0xef3600a4},
+{12200000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 122_quant.dat*/
+
+
+/*case 12300000:*/
+/* BEGIN - DIF BPF register values from 123_quant.dat*/
+{12300000, DIF_BPF_COEFF01,    0x0000fffe},
+{12300000, DIF_BPF_COEFF23,    0xfffa000e},
+{12300000, DIF_BPF_COEFF45,    0x0017ffd9},
+{12300000, DIF_BPF_COEFF67,    0xffc10055},
+{12300000, DIF_BPF_COEFF89,    0x0088ff68},
+{12300000, DIF_BPF_COEFF1011,  0xff0400f0},
+{12300000, DIF_BPF_COEFF1213,  0x01a6fea7},
+{12300000, DIF_BPF_COEFF1415,  0xfd7501cc},
+{12300000, DIF_BPF_COEFF1617,  0x03b0fdc0},
+{12300000, DIF_BPF_COEFF1819,  0xfaef02a8},
+{12300000, DIF_BPF_COEFF2021,  0x06a7fd07},
+{12300000, DIF_BPF_COEFF2223,  0xf79d0326},
+{12300000, DIF_BPF_COEFF2425,  0x0a31fcda},
+{12300000, DIF_BPF_COEFF2627,  0xf40702f3},
+{12300000, DIF_BPF_COEFF2829,  0x0d9ffd72},
+{12300000, DIF_BPF_COEFF3031,  0xf0f601fa},
+{12300000, DIF_BPF_COEFF3233,  0x1021fec0},
+{12300000, DIF_BPF_COEFF3435,  0xef2f006d},
+{12300000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 123_quant.dat*/
+
+
+/*case 12400000:*/
+/* BEGIN - DIF BPF register values from 124_quant.dat*/
+{12400000, DIF_BPF_COEFF01,    0x0001ffff},
+{12400000, DIF_BPF_COEFF23,    0xfff80007},
+{12400000, DIF_BPF_COEFF45,    0x001fffeb},
+{12400000, DIF_BPF_COEFF67,    0xffaf002d},
+{12400000, DIF_BPF_COEFF89,    0x00a8ffb0},
+{12400000, DIF_BPF_COEFF1011,  0xfed3007e},
+{12400000, DIF_BPF_COEFF1213,  0x01e9ff4c},
+{12400000, DIF_BPF_COEFF1415,  0xfd2000ee},
+{12400000, DIF_BPF_COEFF1617,  0x0413fed8},
+{12400000, DIF_BPF_COEFF1819,  0xfa82015c},
+{12400000, DIF_BPF_COEFF2021,  0x0715fe7d},
+{12400000, DIF_BPF_COEFF2223,  0xf7340198},
+{12400000, DIF_BPF_COEFF2425,  0x0a8dfe69},
+{12400000, DIF_BPF_COEFF2627,  0xf3bd017c},
+{12400000, DIF_BPF_COEFF2829,  0x0dd5feb8},
+{12400000, DIF_BPF_COEFF3031,  0xf0d500fd},
+{12400000, DIF_BPF_COEFF3233,  0x1031ff60},
+{12400000, DIF_BPF_COEFF3435,  0xef2b0037},
+{12400000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 124_quant.dat*/
+
+
+/*case 12500000:*/
+/* BEGIN - DIF BPF register values from 125_quant.dat*/
+{12500000, DIF_BPF_COEFF01,    0x00010000},
+{12500000, DIF_BPF_COEFF23,    0xfff70000},
+{12500000, DIF_BPF_COEFF45,    0x00220000},
+{12500000, DIF_BPF_COEFF67,    0xffa90000},
+{12500000, DIF_BPF_COEFF89,    0x00b30000},
+{12500000, DIF_BPF_COEFF1011,  0xfec20000},
+{12500000, DIF_BPF_COEFF1213,  0x02000000},
+{12500000, DIF_BPF_COEFF1415,  0xfd030000},
+{12500000, DIF_BPF_COEFF1617,  0x04350000},
+{12500000, DIF_BPF_COEFF1819,  0xfa5e0000},
+{12500000, DIF_BPF_COEFF2021,  0x073b0000},
+{12500000, DIF_BPF_COEFF2223,  0xf7110000},
+{12500000, DIF_BPF_COEFF2425,  0x0aac0000},
+{12500000, DIF_BPF_COEFF2627,  0xf3a40000},
+{12500000, DIF_BPF_COEFF2829,  0x0de70000},
+{12500000, DIF_BPF_COEFF3031,  0xf0c90000},
+{12500000, DIF_BPF_COEFF3233,  0x10360000},
+{12500000, DIF_BPF_COEFF3435,  0xef290000},
+{12500000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 125_quant.dat*/
+
+
+/*case 12600000:*/
+/* BEGIN - DIF BPF register values from 126_quant.dat*/
+{12600000, DIF_BPF_COEFF01,    0x00010001},
+{12600000, DIF_BPF_COEFF23,    0xfff8fff9},
+{12600000, DIF_BPF_COEFF45,    0x001f0015},
+{12600000, DIF_BPF_COEFF67,    0xffafffd3},
+{12600000, DIF_BPF_COEFF89,    0x00a80050},
+{12600000, DIF_BPF_COEFF1011,  0xfed3ff82},
+{12600000, DIF_BPF_COEFF1213,  0x01e900b4},
+{12600000, DIF_BPF_COEFF1415,  0xfd20ff12},
+{12600000, DIF_BPF_COEFF1617,  0x04130128},
+{12600000, DIF_BPF_COEFF1819,  0xfa82fea4},
+{12600000, DIF_BPF_COEFF2021,  0x07150183},
+{12600000, DIF_BPF_COEFF2223,  0xf734fe68},
+{12600000, DIF_BPF_COEFF2425,  0x0a8d0197},
+{12600000, DIF_BPF_COEFF2627,  0xf3bdfe84},
+{12600000, DIF_BPF_COEFF2829,  0x0dd50148},
+{12600000, DIF_BPF_COEFF3031,  0xf0d5ff03},
+{12600000, DIF_BPF_COEFF3233,  0x103100a0},
+{12600000, DIF_BPF_COEFF3435,  0xef2bffc9},
+{12600000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 126_quant.dat*/
+
+
+/*case 12700000:*/
+/* BEGIN - DIF BPF register values from 127_quant.dat*/
+{12700000, DIF_BPF_COEFF01,    0x00000002},
+{12700000, DIF_BPF_COEFF23,    0xfffafff2},
+{12700000, DIF_BPF_COEFF45,    0x00170027},
+{12700000, DIF_BPF_COEFF67,    0xffc1ffab},
+{12700000, DIF_BPF_COEFF89,    0x00880098},
+{12700000, DIF_BPF_COEFF1011,  0xff04ff10},
+{12700000, DIF_BPF_COEFF1213,  0x01a60159},
+{12700000, DIF_BPF_COEFF1415,  0xfd75fe34},
+{12700000, DIF_BPF_COEFF1617,  0x03b00240},
+{12700000, DIF_BPF_COEFF1819,  0xfaeffd58},
+{12700000, DIF_BPF_COEFF2021,  0x06a702f9},
+{12700000, DIF_BPF_COEFF2223,  0xf79dfcda},
+{12700000, DIF_BPF_COEFF2425,  0x0a310326},
+{12700000, DIF_BPF_COEFF2627,  0xf407fd0d},
+{12700000, DIF_BPF_COEFF2829,  0x0d9f028e},
+{12700000, DIF_BPF_COEFF3031,  0xf0f6fe06},
+{12700000, DIF_BPF_COEFF3233,  0x10210140},
+{12700000, DIF_BPF_COEFF3435,  0xef2fff93},
+{12700000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 127_quant.dat*/
+
+
+/*case 12800000:*/
+/* BEGIN - DIF BPF register values from 128_quant.dat*/
+{12800000, DIF_BPF_COEFF01,    0x00000003},
+{12800000, DIF_BPF_COEFF23,    0xfffeffef},
+{12800000, DIF_BPF_COEFF45,    0x000c0034},
+{12800000, DIF_BPF_COEFF67,    0xffdbff8f},
+{12800000, DIF_BPF_COEFF89,    0x005800ce},
+{12800000, DIF_BPF_COEFF1011,  0xff4ffeb6},
+{12800000, DIF_BPF_COEFF1213,  0x013c01e1},
+{12800000, DIF_BPF_COEFF1415,  0xfdfbfd76},
+{12800000, DIF_BPF_COEFF1617,  0x03110337},
+{12800000, DIF_BPF_COEFF1819,  0xfb9dfc2a},
+{12800000, DIF_BPF_COEFF2021,  0x05f40453},
+{12800000, DIF_BPF_COEFF2223,  0xf848fb63},
+{12800000, DIF_BPF_COEFF2425,  0x099904a5},
+{12800000, DIF_BPF_COEFF2627,  0xf482fb9f},
+{12800000, DIF_BPF_COEFF2829,  0x0d4603ce},
+{12800000, DIF_BPF_COEFF3031,  0xf12dfd0c},
+{12800000, DIF_BPF_COEFF3233,  0x100701df},
+{12800000, DIF_BPF_COEFF3435,  0xef36ff5c},
+{12800000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 128_quant.dat*/
+
+
+/*case 12900000:*/
+/* BEGIN - DIF BPF register values from 129_quant.dat*/
+{12900000, DIF_BPF_COEFF01,    0x00000003},
+{12900000, DIF_BPF_COEFF23,    0x0001ffee},
+{12900000, DIF_BPF_COEFF45,    0xffff0038},
+{12900000, DIF_BPF_COEFF67,    0xfffbff82},
+{12900000, DIF_BPF_COEFF89,    0x001d00ec},
+{12900000, DIF_BPF_COEFF1011,  0xffadfe7c},
+{12900000, DIF_BPF_COEFF1213,  0x00b70242},
+{12900000, DIF_BPF_COEFF1415,  0xfea9fce5},
+{12900000, DIF_BPF_COEFF1617,  0x024103ff},
+{12900000, DIF_BPF_COEFF1819,  0xfc85fb2a},
+{12900000, DIF_BPF_COEFF2021,  0x05040587},
+{12900000, DIF_BPF_COEFF2223,  0xf930fa0a},
+{12900000, DIF_BPF_COEFF2425,  0x08ca060e},
+{12900000, DIF_BPF_COEFF2627,  0xf52bfa40},
+{12900000, DIF_BPF_COEFF2829,  0x0ccb0507},
+{12900000, DIF_BPF_COEFF3031,  0xf179fc15},
+{12900000, DIF_BPF_COEFF3233,  0x0fe3027d},
+{12900000, DIF_BPF_COEFF3435,  0xef3fff25},
+{12900000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 129_quant.dat*/
+
+
+/*case 113000000:*/
+/* BEGIN - DIF BPF register values from 130_quant.dat*/
+{13000000, DIF_BPF_COEFF01,    0x00000002},
+{13000000, DIF_BPF_COEFF23,    0x0005fff0},
+{13000000, DIF_BPF_COEFF45,    0xfff20034},
+{13000000, DIF_BPF_COEFF67,    0x001bff85},
+{13000000, DIF_BPF_COEFF89,    0xffdf00f0},
+{13000000, DIF_BPF_COEFF1011,  0x0014fe68},
+{13000000, DIF_BPF_COEFF1213,  0x00200272},
+{13000000, DIF_BPF_COEFF1415,  0xff71fc8b},
+{13000000, DIF_BPF_COEFF1617,  0x014d048d},
+{13000000, DIF_BPF_COEFF1819,  0xfd9afa61},
+{13000000, DIF_BPF_COEFF2021,  0x03e00688},
+{13000000, DIF_BPF_COEFF2223,  0xfa4ef8da},
+{13000000, DIF_BPF_COEFF2425,  0x07c80759},
+{13000000, DIF_BPF_COEFF2627,  0xf600f8f4},
+{13000000, DIF_BPF_COEFF2829,  0x0c2f0637},
+{13000000, DIF_BPF_COEFF3031,  0xf1dbfb22},
+{13000000, DIF_BPF_COEFF3233,  0x0fb4031b},
+{13000000, DIF_BPF_COEFF3435,  0xef4bfeef},
+{13000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 130_quant.dat*/
+
+
+/*case 13100000:*/
+/* BEGIN - DIF BPF register values from 131_quant.dat*/
+{13100000, DIF_BPF_COEFF01,    0xffff0001},
+{13100000, DIF_BPF_COEFF23,    0x0007fff5},
+{13100000, DIF_BPF_COEFF45,    0xffe70028},
+{13100000, DIF_BPF_COEFF67,    0x0037ff98},
+{13100000, DIF_BPF_COEFF89,    0xffa400d8},
+{13100000, DIF_BPF_COEFF1011,  0x0079fe7c},
+{13100000, DIF_BPF_COEFF1213,  0xff87026f},
+{13100000, DIF_BPF_COEFF1415,  0x0043fc6e},
+{13100000, DIF_BPF_COEFF1617,  0x004404da},
+{13100000, DIF_BPF_COEFF1819,  0xfecef9da},
+{13100000, DIF_BPF_COEFF2021,  0x0294074e},
+{13100000, DIF_BPF_COEFF2223,  0xfb99f7db},
+{13100000, DIF_BPF_COEFF2425,  0x06980881},
+{13100000, DIF_BPF_COEFF2627,  0xf6fef7be},
+{13100000, DIF_BPF_COEFF2829,  0x0b730759},
+{13100000, DIF_BPF_COEFF3031,  0xf251fa33},
+{13100000, DIF_BPF_COEFF3233,  0x0f7b03b8},
+{13100000, DIF_BPF_COEFF3435,  0xef5afeb8},
+{13100000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 131_quant.dat*/
+
+
+/*case 13200000:*/
+/* BEGIN - DIF BPF register values from 132_quant.dat*/
+{13200000, DIF_BPF_COEFF01,    0xffff0000},
+{13200000, DIF_BPF_COEFF23,    0x0008fffc},
+{13200000, DIF_BPF_COEFF45,    0xffe00017},
+{13200000, DIF_BPF_COEFF67,    0x004cffb9},
+{13200000, DIF_BPF_COEFF89,    0xff7500a8},
+{13200000, DIF_BPF_COEFF1011,  0x00d1feb6},
+{13200000, DIF_BPF_COEFF1213,  0xfef90238},
+{13200000, DIF_BPF_COEFF1415,  0x0111fc91},
+{13200000, DIF_BPF_COEFF1617,  0xff3604df},
+{13200000, DIF_BPF_COEFF1819,  0x0012f99b},
+{13200000, DIF_BPF_COEFF2021,  0x012d07d2},
+{13200000, DIF_BPF_COEFF2223,  0xfd07f714},
+{13200000, DIF_BPF_COEFF2425,  0x0542097e},
+{13200000, DIF_BPF_COEFF2627,  0xf81ff6a4},
+{13200000, DIF_BPF_COEFF2829,  0x0a9a086e},
+{13200000, DIF_BPF_COEFF3031,  0xf2dbf94b},
+{13200000, DIF_BPF_COEFF3233,  0x0f380453},
+{13200000, DIF_BPF_COEFF3435,  0xef6cfe82},
+{13200000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 132_quant.dat*/
+
+
+/*case 13300000:*/
+/* BEGIN - DIF BPF register values from 133_quant.dat*/
+{13300000, DIF_BPF_COEFF01,    0xffffffff},
+{13300000, DIF_BPF_COEFF23,    0x00080003},
+{13300000, DIF_BPF_COEFF45,    0xffde0001},
+{13300000, DIF_BPF_COEFF67,    0x0056ffe3},
+{13300000, DIF_BPF_COEFF89,    0xff570064},
+{13300000, DIF_BPF_COEFF1011,  0x0113ff10},
+{13300000, DIF_BPF_COEFF1213,  0xfe8201d2},
+{13300000, DIF_BPF_COEFF1415,  0x01cafcf0},
+{13300000, DIF_BPF_COEFF1617,  0xfe35049e},
+{13300000, DIF_BPF_COEFF1819,  0x0155f9a6},
+{13300000, DIF_BPF_COEFF2021,  0xffba080e},
+{13300000, DIF_BPF_COEFF2223,  0xfe8cf689},
+{13300000, DIF_BPF_COEFF2425,  0x03ce0a4e},
+{13300000, DIF_BPF_COEFF2627,  0xf961f5a8},
+{13300000, DIF_BPF_COEFF2829,  0x09a50971},
+{13300000, DIF_BPF_COEFF3031,  0xf379f869},
+{13300000, DIF_BPF_COEFF3233,  0x0eeb04ec},
+{13300000, DIF_BPF_COEFF3435,  0xef80fe4b},
+{13300000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 133_quant.dat*/
+
+
+/*case 13400000:*/
+/* BEGIN - DIF BPF register values from 134_quant.dat*/
+{13400000, DIF_BPF_COEFF01,    0x0000fffe},
+{13400000, DIF_BPF_COEFF23,    0x0007000a},
+{13400000, DIF_BPF_COEFF45,    0xffe2ffec},
+{13400000, DIF_BPF_COEFF67,    0x00540012},
+{13400000, DIF_BPF_COEFF89,    0xff4e0015},
+{13400000, DIF_BPF_COEFF1011,  0x0137ff82},
+{13400000, DIF_BPF_COEFF1213,  0xfe2e0145},
+{13400000, DIF_BPF_COEFF1415,  0x0260fd86},
+{13400000, DIF_BPF_COEFF1617,  0xfd51041a},
+{13400000, DIF_BPF_COEFF1819,  0x0287f9fb},
+{13400000, DIF_BPF_COEFF2021,  0xfe4a0802},
+{13400000, DIF_BPF_COEFF2223,  0x001df63f},
+{13400000, DIF_BPF_COEFF2425,  0x02430aeb},
+{13400000, DIF_BPF_COEFF2627,  0xfabdf4ce},
+{13400000, DIF_BPF_COEFF2829,  0x08970a62},
+{13400000, DIF_BPF_COEFF3031,  0xf428f78f},
+{13400000, DIF_BPF_COEFF3233,  0x0e950584},
+{13400000, DIF_BPF_COEFF3435,  0xef97fe15},
+{13400000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 134_quant.dat*/
+
+
+/*case 13500000:*/
+/* BEGIN - DIF BPF register values from 135_quant.dat*/
+{13500000, DIF_BPF_COEFF01,    0x0000fffd},
+{13500000, DIF_BPF_COEFF23,    0x0004000f},
+{13500000, DIF_BPF_COEFF45,    0xffeaffda},
+{13500000, DIF_BPF_COEFF67,    0x0046003d},
+{13500000, DIF_BPF_COEFF89,    0xff5affc4},
+{13500000, DIF_BPF_COEFF1011,  0x013b0000},
+{13500000, DIF_BPF_COEFF1213,  0xfe04009d},
+{13500000, DIF_BPF_COEFF1415,  0x02c8fe48},
+{13500000, DIF_BPF_COEFF1617,  0xfc99035a},
+{13500000, DIF_BPF_COEFF1819,  0x0397fa96},
+{13500000, DIF_BPF_COEFF2021,  0xfcec07ad},
+{13500000, DIF_BPF_COEFF2223,  0x01adf637},
+{13500000, DIF_BPF_COEFF2425,  0x00ac0b53},
+{13500000, DIF_BPF_COEFF2627,  0xfc2ef419},
+{13500000, DIF_BPF_COEFF2829,  0x07730b3e},
+{13500000, DIF_BPF_COEFF3031,  0xf4e9f6bd},
+{13500000, DIF_BPF_COEFF3233,  0x0e35061a},
+{13500000, DIF_BPF_COEFF3435,  0xefb1fddf},
+{13500000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 135_quant.dat*/
+
+
+/*case 13600000:*/
+/* BEGIN - DIF BPF register values from 136_quant.dat*/
+{13600000, DIF_BPF_COEFF01,    0x0000fffd},
+{13600000, DIF_BPF_COEFF23,    0x00000012},
+{13600000, DIF_BPF_COEFF45,    0xfff6ffcd},
+{13600000, DIF_BPF_COEFF67,    0x002f0061},
+{13600000, DIF_BPF_COEFF89,    0xff7bff79},
+{13600000, DIF_BPF_COEFF1011,  0x011e007e},
+{13600000, DIF_BPF_COEFF1213,  0xfe08ffe8},
+{13600000, DIF_BPF_COEFF1415,  0x02f9ff28},
+{13600000, DIF_BPF_COEFF1617,  0xfc17026a},
+{13600000, DIF_BPF_COEFF1819,  0x0479fb70},
+{13600000, DIF_BPF_COEFF2021,  0xfbad0713},
+{13600000, DIF_BPF_COEFF2223,  0x032ff672},
+{13600000, DIF_BPF_COEFF2425,  0xff100b83},
+{13600000, DIF_BPF_COEFF2627,  0xfdaff38b},
+{13600000, DIF_BPF_COEFF2829,  0x063c0c04},
+{13600000, DIF_BPF_COEFF3031,  0xf5baf5f5},
+{13600000, DIF_BPF_COEFF3233,  0x0dcc06ae},
+{13600000, DIF_BPF_COEFF3435,  0xefcdfda8},
+{13600000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 136_quant.dat*/
+
+
+/*case 13700000:*/
+/* BEGIN - DIF BPF register values from 137_quant.dat*/
+{13700000, DIF_BPF_COEFF01,    0x0000fffd},
+{13700000, DIF_BPF_COEFF23,    0xfffd0012},
+{13700000, DIF_BPF_COEFF45,    0x0004ffc8},
+{13700000, DIF_BPF_COEFF67,    0x00100078},
+{13700000, DIF_BPF_COEFF89,    0xffacff3e},
+{13700000, DIF_BPF_COEFF1011,  0x00e200f0},
+{13700000, DIF_BPF_COEFF1213,  0xfe39ff35},
+{13700000, DIF_BPF_COEFF1415,  0x02f10017},
+{13700000, DIF_BPF_COEFF1617,  0xfbd30156},
+{13700000, DIF_BPF_COEFF1819,  0x0521fc7f},
+{13700000, DIF_BPF_COEFF2021,  0xfa9c0638},
+{13700000, DIF_BPF_COEFF2223,  0x0499f6ee},
+{13700000, DIF_BPF_COEFF2425,  0xfd7a0b7c},
+{13700000, DIF_BPF_COEFF2627,  0xff39f325},
+{13700000, DIF_BPF_COEFF2829,  0x04f40cb3},
+{13700000, DIF_BPF_COEFF3031,  0xf69af537},
+{13700000, DIF_BPF_COEFF3233,  0x0d5a073f},
+{13700000, DIF_BPF_COEFF3435,  0xefecfd72},
+{13700000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 137_quant.dat*/
+
+
+/*case 13800000:*/
+/* BEGIN - DIF BPF register values from 138_quant.dat*/
+{13800000, DIF_BPF_COEFF01,    0x0001fffe},
+{13800000, DIF_BPF_COEFF23,    0xfffa000e},
+{13800000, DIF_BPF_COEFF45,    0x0011ffcb},
+{13800000, DIF_BPF_COEFF67,    0xfff0007f},
+{13800000, DIF_BPF_COEFF89,    0xffe7ff19},
+{13800000, DIF_BPF_COEFF1011,  0x008f014a},
+{13800000, DIF_BPF_COEFF1213,  0xfe94fe93},
+{13800000, DIF_BPF_COEFF1415,  0x02b00105},
+{13800000, DIF_BPF_COEFF1617,  0xfbd3002f},
+{13800000, DIF_BPF_COEFF1819,  0x0585fdb7},
+{13800000, DIF_BPF_COEFF2021,  0xf9c10525},
+{13800000, DIF_BPF_COEFF2223,  0x05def7a8},
+{13800000, DIF_BPF_COEFF2425,  0xfbf20b3c},
+{13800000, DIF_BPF_COEFF2627,  0x00c7f2e9},
+{13800000, DIF_BPF_COEFF2829,  0x03a00d48},
+{13800000, DIF_BPF_COEFF3031,  0xf787f484},
+{13800000, DIF_BPF_COEFF3233,  0x0cdf07cd},
+{13800000, DIF_BPF_COEFF3435,  0xf00dfd3c},
+{13800000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 138_quant.dat*/
+
+
+/*case 13900000:*/
+/* BEGIN - DIF BPF register values from 139_quant.dat*/
+{13900000, DIF_BPF_COEFF01,    0x00010000},
+{13900000, DIF_BPF_COEFF23,    0xfff80008},
+{13900000, DIF_BPF_COEFF45,    0x001bffd7},
+{13900000, DIF_BPF_COEFF67,    0xffd10076},
+{13900000, DIF_BPF_COEFF89,    0x0026ff0e},
+{13900000, DIF_BPF_COEFF1011,  0x002c0184},
+{13900000, DIF_BPF_COEFF1213,  0xff0ffe10},
+{13900000, DIF_BPF_COEFF1415,  0x023b01e0},
+{13900000, DIF_BPF_COEFF1617,  0xfc17ff06},
+{13900000, DIF_BPF_COEFF1819,  0x05a2ff09},
+{13900000, DIF_BPF_COEFF2021,  0xf92703e4},
+{13900000, DIF_BPF_COEFF2223,  0x06f4f89b},
+{13900000, DIF_BPF_COEFF2425,  0xfa820ac5},
+{13900000, DIF_BPF_COEFF2627,  0x0251f2d9},
+{13900000, DIF_BPF_COEFF2829,  0x02430dc3},
+{13900000, DIF_BPF_COEFF3031,  0xf881f3dc},
+{13900000, DIF_BPF_COEFF3233,  0x0c5c0859},
+{13900000, DIF_BPF_COEFF3435,  0xf031fd06},
+{13900000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 139_quant.dat*/
+
+
+/*case 14000000:*/
+/* BEGIN - DIF BPF register values from 140_quant.dat*/
+{14000000, DIF_BPF_COEFF01,    0x00010001},
+{14000000, DIF_BPF_COEFF23,    0xfff80001},
+{14000000, DIF_BPF_COEFF45,    0x0021ffe8},
+{14000000, DIF_BPF_COEFF67,    0xffba005d},
+{14000000, DIF_BPF_COEFF89,    0x0060ff1f},
+{14000000, DIF_BPF_COEFF1011,  0xffc40198},
+{14000000, DIF_BPF_COEFF1213,  0xffa0fdb5},
+{14000000, DIF_BPF_COEFF1415,  0x019a029a},
+{14000000, DIF_BPF_COEFF1617,  0xfc99fdea},
+{14000000, DIF_BPF_COEFF1819,  0x05750067},
+{14000000, DIF_BPF_COEFF2021,  0xf8d4027f},
+{14000000, DIF_BPF_COEFF2223,  0x07d4f9c0},
+{14000000, DIF_BPF_COEFF2425,  0xf9320a1a},
+{14000000, DIF_BPF_COEFF2627,  0x03d2f2f3},
+{14000000, DIF_BPF_COEFF2829,  0x00df0e22},
+{14000000, DIF_BPF_COEFF3031,  0xf986f341},
+{14000000, DIF_BPF_COEFF3233,  0x0bd108e2},
+{14000000, DIF_BPF_COEFF3435,  0xf058fcd1},
+{14000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 140_quant.dat*/
+
+
+/*case 14100000:*/
+/* BEGIN - DIF BPF register values from 141_quant.dat*/
+{14100000, DIF_BPF_COEFF01,    0x00000002},
+{14100000, DIF_BPF_COEFF23,    0xfff9fffa},
+{14100000, DIF_BPF_COEFF45,    0x0021fffd},
+{14100000, DIF_BPF_COEFF67,    0xffac0038},
+{14100000, DIF_BPF_COEFF89,    0x008eff4a},
+{14100000, DIF_BPF_COEFF1011,  0xff630184},
+{14100000, DIF_BPF_COEFF1213,  0x003afd8b},
+{14100000, DIF_BPF_COEFF1415,  0x00da0326},
+{14100000, DIF_BPF_COEFF1617,  0xfd51fced},
+{14100000, DIF_BPF_COEFF1819,  0x050101c0},
+{14100000, DIF_BPF_COEFF2021,  0xf8cb0103},
+{14100000, DIF_BPF_COEFF2223,  0x0876fb10},
+{14100000, DIF_BPF_COEFF2425,  0xf80a093e},
+{14100000, DIF_BPF_COEFF2627,  0x0543f338},
+{14100000, DIF_BPF_COEFF2829,  0xff7a0e66},
+{14100000, DIF_BPF_COEFF3031,  0xfa94f2b2},
+{14100000, DIF_BPF_COEFF3233,  0x0b3f0967},
+{14100000, DIF_BPF_COEFF3435,  0xf081fc9b},
+{14100000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 141_quant.dat*/
+
+
+/*case 14200000:*/
+/* BEGIN - DIF BPF register values from 142_quant.dat*/
+{14200000, DIF_BPF_COEFF01,    0x00000003},
+{14200000, DIF_BPF_COEFF23,    0xfffbfff3},
+{14200000, DIF_BPF_COEFF45,    0x001d0013},
+{14200000, DIF_BPF_COEFF67,    0xffaa000b},
+{14200000, DIF_BPF_COEFF89,    0x00aaff89},
+{14200000, DIF_BPF_COEFF1011,  0xff13014a},
+{14200000, DIF_BPF_COEFF1213,  0x00cefd95},
+{14200000, DIF_BPF_COEFF1415,  0x000a037b},
+{14200000, DIF_BPF_COEFF1617,  0xfe35fc1d},
+{14200000, DIF_BPF_COEFF1819,  0x044c0305},
+{14200000, DIF_BPF_COEFF2021,  0xf90cff7e},
+{14200000, DIF_BPF_COEFF2223,  0x08d5fc81},
+{14200000, DIF_BPF_COEFF2425,  0xf7100834},
+{14200000, DIF_BPF_COEFF2627,  0x069ff3a7},
+{14200000, DIF_BPF_COEFF2829,  0xfe160e8d},
+{14200000, DIF_BPF_COEFF3031,  0xfbaaf231},
+{14200000, DIF_BPF_COEFF3233,  0x0aa509e9},
+{14200000, DIF_BPF_COEFF3435,  0xf0adfc65},
+{14200000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 142_quant.dat*/
+
+
+/*case 14300000:*/
+/* BEGIN - DIF BPF register values from 143_quant.dat*/
+{14300000, DIF_BPF_COEFF01,    0x00000003},
+{14300000, DIF_BPF_COEFF23,    0xffffffef},
+{14300000, DIF_BPF_COEFF45,    0x00140025},
+{14300000, DIF_BPF_COEFF67,    0xffb4ffdd},
+{14300000, DIF_BPF_COEFF89,    0x00b2ffd6},
+{14300000, DIF_BPF_COEFF1011,  0xfedb00f0},
+{14300000, DIF_BPF_COEFF1213,  0x0150fdd3},
+{14300000, DIF_BPF_COEFF1415,  0xff380391},
+{14300000, DIF_BPF_COEFF1617,  0xff36fb85},
+{14300000, DIF_BPF_COEFF1819,  0x035e0426},
+{14300000, DIF_BPF_COEFF2021,  0xf994fdfe},
+{14300000, DIF_BPF_COEFF2223,  0x08eefe0b},
+{14300000, DIF_BPF_COEFF2425,  0xf6490702},
+{14300000, DIF_BPF_COEFF2627,  0x07e1f43e},
+{14300000, DIF_BPF_COEFF2829,  0xfcb60e97},
+{14300000, DIF_BPF_COEFF3031,  0xfcc6f1be},
+{14300000, DIF_BPF_COEFF3233,  0x0a040a67},
+{14300000, DIF_BPF_COEFF3435,  0xf0dbfc30},
+{14300000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 143_quant.dat*/
+
+
+/*case 14400000:*/
+/* BEGIN - DIF BPF register values from 144_quant.dat*/
+{14400000, DIF_BPF_COEFF01,    0x00000003},
+{14400000, DIF_BPF_COEFF23,    0x0002ffee},
+{14400000, DIF_BPF_COEFF45,    0x00070033},
+{14400000, DIF_BPF_COEFF67,    0xffc9ffb4},
+{14400000, DIF_BPF_COEFF89,    0x00a40027},
+{14400000, DIF_BPF_COEFF1011,  0xfec3007e},
+{14400000, DIF_BPF_COEFF1213,  0x01b4fe3f},
+{14400000, DIF_BPF_COEFF1415,  0xfe760369},
+{14400000, DIF_BPF_COEFF1617,  0x0044fb2e},
+{14400000, DIF_BPF_COEFF1819,  0x02450518},
+{14400000, DIF_BPF_COEFF2021,  0xfa5ffc90},
+{14400000, DIF_BPF_COEFF2223,  0x08c1ffa1},
+{14400000, DIF_BPF_COEFF2425,  0xf5bc05ae},
+{14400000, DIF_BPF_COEFF2627,  0x0902f4fc},
+{14400000, DIF_BPF_COEFF2829,  0xfb600e85},
+{14400000, DIF_BPF_COEFF3031,  0xfde7f15a},
+{14400000, DIF_BPF_COEFF3233,  0x095d0ae2},
+{14400000, DIF_BPF_COEFF3435,  0xf10cfbfb},
+{14400000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 144_quant.dat*/
+
+
+/*case 14500000:*/
+/* BEGIN - DIF BPF register values from 145_quant.dat*/
+{14500000, DIF_BPF_COEFF01,    0xffff0002},
+{14500000, DIF_BPF_COEFF23,    0x0005ffef},
+{14500000, DIF_BPF_COEFF45,    0xfffa0038},
+{14500000, DIF_BPF_COEFF67,    0xffe5ff95},
+{14500000, DIF_BPF_COEFF89,    0x00820074},
+{14500000, DIF_BPF_COEFF1011,  0xfecc0000},
+{14500000, DIF_BPF_COEFF1213,  0x01f0fed0},
+{14500000, DIF_BPF_COEFF1415,  0xfdd20304},
+{14500000, DIF_BPF_COEFF1617,  0x014dfb1d},
+{14500000, DIF_BPF_COEFF1819,  0x010e05ce},
+{14500000, DIF_BPF_COEFF2021,  0xfb64fb41},
+{14500000, DIF_BPF_COEFF2223,  0x084e013b},
+{14500000, DIF_BPF_COEFF2425,  0xf569043e},
+{14500000, DIF_BPF_COEFF2627,  0x0a00f5dd},
+{14500000, DIF_BPF_COEFF2829,  0xfa150e55},
+{14500000, DIF_BPF_COEFF3031,  0xff0bf104},
+{14500000, DIF_BPF_COEFF3233,  0x08b00b59},
+{14500000, DIF_BPF_COEFF3435,  0xf13ffbc6},
+{14500000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 145_quant.dat*/
+
+
+/*case 14600000:*/
+/* BEGIN - DIF BPF register values from 146_quant.dat*/
+{14600000, DIF_BPF_COEFF01,    0xffff0001},
+{14600000, DIF_BPF_COEFF23,    0x0008fff4},
+{14600000, DIF_BPF_COEFF45,    0xffed0035},
+{14600000, DIF_BPF_COEFF67,    0x0005ff83},
+{14600000, DIF_BPF_COEFF89,    0x005000b4},
+{14600000, DIF_BPF_COEFF1011,  0xfef6ff82},
+{14600000, DIF_BPF_COEFF1213,  0x01ffff7a},
+{14600000, DIF_BPF_COEFF1415,  0xfd580269},
+{14600000, DIF_BPF_COEFF1617,  0x0241fb53},
+{14600000, DIF_BPF_COEFF1819,  0xffca0640},
+{14600000, DIF_BPF_COEFF2021,  0xfc99fa1e},
+{14600000, DIF_BPF_COEFF2223,  0x079a02cb},
+{14600000, DIF_BPF_COEFF2425,  0xf55502ba},
+{14600000, DIF_BPF_COEFF2627,  0x0ad5f6e0},
+{14600000, DIF_BPF_COEFF2829,  0xf8d90e0a},
+{14600000, DIF_BPF_COEFF3031,  0x0031f0bd},
+{14600000, DIF_BPF_COEFF3233,  0x07fd0bcb},
+{14600000, DIF_BPF_COEFF3435,  0xf174fb91},
+{14600000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 146_quant.dat*/
+
+
+/*case 14700000:*/
+/* BEGIN - DIF BPF register values from 147_quant.dat*/
+{14700000, DIF_BPF_COEFF01,    0xffffffff},
+{14700000, DIF_BPF_COEFF23,    0x0009fffb},
+{14700000, DIF_BPF_COEFF45,    0xffe4002a},
+{14700000, DIF_BPF_COEFF67,    0x0025ff82},
+{14700000, DIF_BPF_COEFF89,    0x001400e0},
+{14700000, DIF_BPF_COEFF1011,  0xff3cff10},
+{14700000, DIF_BPF_COEFF1213,  0x01e10030},
+{14700000, DIF_BPF_COEFF1415,  0xfd1201a4},
+{14700000, DIF_BPF_COEFF1617,  0x0311fbcd},
+{14700000, DIF_BPF_COEFF1819,  0xfe88066a},
+{14700000, DIF_BPF_COEFF2021,  0xfdf1f92f},
+{14700000, DIF_BPF_COEFF2223,  0x06aa0449},
+{14700000, DIF_BPF_COEFF2425,  0xf57e0128},
+{14700000, DIF_BPF_COEFF2627,  0x0b7ef801},
+{14700000, DIF_BPF_COEFF2829,  0xf7b00da2},
+{14700000, DIF_BPF_COEFF3031,  0x0156f086},
+{14700000, DIF_BPF_COEFF3233,  0x07450c39},
+{14700000, DIF_BPF_COEFF3435,  0xf1acfb5c},
+{14700000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 147_quant.dat*/
+
+
+/*case 14800000:*/
+/* BEGIN - DIF BPF register values from 148_quant.dat*/
+{14800000, DIF_BPF_COEFF01,    0x0000fffe},
+{14800000, DIF_BPF_COEFF23,    0x00080002},
+{14800000, DIF_BPF_COEFF45,    0xffdf0019},
+{14800000, DIF_BPF_COEFF67,    0x003fff92},
+{14800000, DIF_BPF_COEFF89,    0xffd600f1},
+{14800000, DIF_BPF_COEFF1011,  0xff96feb6},
+{14800000, DIF_BPF_COEFF1213,  0x019700e1},
+{14800000, DIF_BPF_COEFF1415,  0xfd0500c2},
+{14800000, DIF_BPF_COEFF1617,  0x03b0fc84},
+{14800000, DIF_BPF_COEFF1819,  0xfd590649},
+{14800000, DIF_BPF_COEFF2021,  0xff5df87f},
+{14800000, DIF_BPF_COEFF2223,  0x058505aa},
+{14800000, DIF_BPF_COEFF2425,  0xf5e4ff91},
+{14800000, DIF_BPF_COEFF2627,  0x0bf9f93c},
+{14800000, DIF_BPF_COEFF2829,  0xf69d0d20},
+{14800000, DIF_BPF_COEFF3031,  0x0279f05e},
+{14800000, DIF_BPF_COEFF3233,  0x06880ca3},
+{14800000, DIF_BPF_COEFF3435,  0xf1e6fb28},
+{14800000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 148_quant.dat*/
+
+
+/*case 14900000:*/
+/* BEGIN - DIF BPF register values from 149_quant.dat*/
+{14900000, DIF_BPF_COEFF01,    0x0000fffd},
+{14900000, DIF_BPF_COEFF23,    0x00060009},
+{14900000, DIF_BPF_COEFF45,    0xffdf0004},
+{14900000, DIF_BPF_COEFF67,    0x0051ffb0},
+{14900000, DIF_BPF_COEFF89,    0xff9d00e8},
+{14900000, DIF_BPF_COEFF1011,  0xfffcfe7c},
+{14900000, DIF_BPF_COEFF1213,  0x01280180},
+{14900000, DIF_BPF_COEFF1415,  0xfd32ffd2},
+{14900000, DIF_BPF_COEFF1617,  0x0413fd6e},
+{14900000, DIF_BPF_COEFF1819,  0xfc4d05df},
+{14900000, DIF_BPF_COEFF2021,  0x00d1f812},
+{14900000, DIF_BPF_COEFF2223,  0x043506e4},
+{14900000, DIF_BPF_COEFF2425,  0xf685fdfb},
+{14900000, DIF_BPF_COEFF2627,  0x0c43fa8d},
+{14900000, DIF_BPF_COEFF2829,  0xf5a10c83},
+{14900000, DIF_BPF_COEFF3031,  0x0399f046},
+{14900000, DIF_BPF_COEFF3233,  0x05c70d08},
+{14900000, DIF_BPF_COEFF3435,  0xf222faf3},
+{14900000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 149_quant.dat*/
+
+
+/*case 15000000:*/
+/* BEGIN - DIF BPF register values from 150_quant.dat*/
+{15000000, DIF_BPF_COEFF01,    0x0000fffd},
+{15000000, DIF_BPF_COEFF23,    0x0003000f},
+{15000000, DIF_BPF_COEFF45,    0xffe5ffef},
+{15000000, DIF_BPF_COEFF67,    0x0057ffd9},
+{15000000, DIF_BPF_COEFF89,    0xff7000c4},
+{15000000, DIF_BPF_COEFF1011,  0x0062fe68},
+{15000000, DIF_BPF_COEFF1213,  0x009e01ff},
+{15000000, DIF_BPF_COEFF1415,  0xfd95fee6},
+{15000000, DIF_BPF_COEFF1617,  0x0435fe7d},
+{15000000, DIF_BPF_COEFF1819,  0xfb710530},
+{15000000, DIF_BPF_COEFF2021,  0x023cf7ee},
+{15000000, DIF_BPF_COEFF2223,  0x02c307ef},
+{15000000, DIF_BPF_COEFF2425,  0xf75efc70},
+{15000000, DIF_BPF_COEFF2627,  0x0c5cfbef},
+{15000000, DIF_BPF_COEFF2829,  0xf4c10bce},
+{15000000, DIF_BPF_COEFF3031,  0x04b3f03f},
+{15000000, DIF_BPF_COEFF3233,  0x05030d69},
+{15000000, DIF_BPF_COEFF3435,  0xf261fabf},
+{15000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 150_quant.dat*/
+
+
+/*case 15100000:*/
+/* BEGIN - DIF BPF register values from 151_quant.dat*/
+{15100000, DIF_BPF_COEFF01,    0x0000fffd},
+{15100000, DIF_BPF_COEFF23,    0xffff0012},
+{15100000, DIF_BPF_COEFF45,    0xffefffdc},
+{15100000, DIF_BPF_COEFF67,    0x00510006},
+{15100000, DIF_BPF_COEFF89,    0xff540089},
+{15100000, DIF_BPF_COEFF1011,  0x00befe7c},
+{15100000, DIF_BPF_COEFF1213,  0x00060253},
+{15100000, DIF_BPF_COEFF1415,  0xfe27fe0d},
+{15100000, DIF_BPF_COEFF1617,  0x0413ffa2},
+{15100000, DIF_BPF_COEFF1819,  0xfad10446},
+{15100000, DIF_BPF_COEFF2021,  0x0390f812},
+{15100000, DIF_BPF_COEFF2223,  0x013b08c3},
+{15100000, DIF_BPF_COEFF2425,  0xf868faf6},
+{15100000, DIF_BPF_COEFF2627,  0x0c43fd5f},
+{15100000, DIF_BPF_COEFF2829,  0xf3fd0b02},
+{15100000, DIF_BPF_COEFF3031,  0x05c7f046},
+{15100000, DIF_BPF_COEFF3233,  0x043b0dc4},
+{15100000, DIF_BPF_COEFF3435,  0xf2a1fa8b},
+{15100000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 151_quant.dat*/
+
+
+/*case 15200000:*/
+/* BEGIN - DIF BPF register values from 152_quant.dat*/
+{15200000, DIF_BPF_COEFF01,    0x0001fffe},
+{15200000, DIF_BPF_COEFF23,    0xfffc0012},
+{15200000, DIF_BPF_COEFF45,    0xfffbffce},
+{15200000, DIF_BPF_COEFF67,    0x003f0033},
+{15200000, DIF_BPF_COEFF89,    0xff4e003f},
+{15200000, DIF_BPF_COEFF1011,  0x0106feb6},
+{15200000, DIF_BPF_COEFF1213,  0xff6e0276},
+{15200000, DIF_BPF_COEFF1415,  0xfeddfd56},
+{15200000, DIF_BPF_COEFF1617,  0x03b000cc},
+{15200000, DIF_BPF_COEFF1819,  0xfa740329},
+{15200000, DIF_BPF_COEFF2021,  0x04bff87f},
+{15200000, DIF_BPF_COEFF2223,  0xffaa095d},
+{15200000, DIF_BPF_COEFF2425,  0xf99ef995},
+{15200000, DIF_BPF_COEFF2627,  0x0bf9fed8},
+{15200000, DIF_BPF_COEFF2829,  0xf3590a1f},
+{15200000, DIF_BPF_COEFF3031,  0x06d2f05e},
+{15200000, DIF_BPF_COEFF3233,  0x03700e1b},
+{15200000, DIF_BPF_COEFF3435,  0xf2e4fa58},
+{15200000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 152_quant.dat*/
+
+
+/*case 115300000:*/
+/* BEGIN - DIF BPF register values from 153_quant.dat*/
+{15300000, DIF_BPF_COEFF01,    0x0001ffff},
+{15300000, DIF_BPF_COEFF23,    0xfff9000f},
+{15300000, DIF_BPF_COEFF45,    0x0009ffc8},
+{15300000, DIF_BPF_COEFF67,    0x00250059},
+{15300000, DIF_BPF_COEFF89,    0xff5effee},
+{15300000, DIF_BPF_COEFF1011,  0x0132ff10},
+{15300000, DIF_BPF_COEFF1213,  0xfee30265},
+{15300000, DIF_BPF_COEFF1415,  0xffaafccf},
+{15300000, DIF_BPF_COEFF1617,  0x031101eb},
+{15300000, DIF_BPF_COEFF1819,  0xfa6001e8},
+{15300000, DIF_BPF_COEFF2021,  0x05bdf92f},
+{15300000, DIF_BPF_COEFF2223,  0xfe1b09b6},
+{15300000, DIF_BPF_COEFF2425,  0xfafaf852},
+{15300000, DIF_BPF_COEFF2627,  0x0b7e0055},
+{15300000, DIF_BPF_COEFF2829,  0xf2d50929},
+{15300000, DIF_BPF_COEFF3031,  0x07d3f086},
+{15300000, DIF_BPF_COEFF3233,  0x02a30e6c},
+{15300000, DIF_BPF_COEFF3435,  0xf329fa24},
+{15300000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 153_quant.dat*/
+
+
+/*case 115400000:*/
+/* BEGIN - DIF BPF register values from 154_quant.dat*/
+{15400000, DIF_BPF_COEFF01,    0x00010001},
+{15400000, DIF_BPF_COEFF23,    0xfff80009},
+{15400000, DIF_BPF_COEFF45,    0x0015ffca},
+{15400000, DIF_BPF_COEFF67,    0x00050074},
+{15400000, DIF_BPF_COEFF89,    0xff81ff9f},
+{15400000, DIF_BPF_COEFF1011,  0x013dff82},
+{15400000, DIF_BPF_COEFF1213,  0xfe710221},
+{15400000, DIF_BPF_COEFF1415,  0x007cfc80},
+{15400000, DIF_BPF_COEFF1617,  0x024102ed},
+{15400000, DIF_BPF_COEFF1819,  0xfa940090},
+{15400000, DIF_BPF_COEFF2021,  0x0680fa1e},
+{15400000, DIF_BPF_COEFF2223,  0xfc9b09cd},
+{15400000, DIF_BPF_COEFF2425,  0xfc73f736},
+{15400000, DIF_BPF_COEFF2627,  0x0ad501d0},
+{15400000, DIF_BPF_COEFF2829,  0xf2740820},
+{15400000, DIF_BPF_COEFF3031,  0x08c9f0bd},
+{15400000, DIF_BPF_COEFF3233,  0x01d40eb9},
+{15400000, DIF_BPF_COEFF3435,  0xf371f9f1},
+{15400000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 154_quant.dat*/
+
+
+/*case 115500000:*/
+/* BEGIN - DIF BPF register values from 155_quant.dat*/
+{15500000, DIF_BPF_COEFF01,    0x00000002},
+{15500000, DIF_BPF_COEFF23,    0xfff80002},
+{15500000, DIF_BPF_COEFF45,    0x001effd5},
+{15500000, DIF_BPF_COEFF67,    0xffe5007f},
+{15500000, DIF_BPF_COEFF89,    0xffb4ff5b},
+{15500000, DIF_BPF_COEFF1011,  0x01280000},
+{15500000, DIF_BPF_COEFF1213,  0xfe2401b0},
+{15500000, DIF_BPF_COEFF1415,  0x0146fc70},
+{15500000, DIF_BPF_COEFF1617,  0x014d03c6},
+{15500000, DIF_BPF_COEFF1819,  0xfb10ff32},
+{15500000, DIF_BPF_COEFF2021,  0x0701fb41},
+{15500000, DIF_BPF_COEFF2223,  0xfb3709a1},
+{15500000, DIF_BPF_COEFF2425,  0xfe00f644},
+{15500000, DIF_BPF_COEFF2627,  0x0a000345},
+{15500000, DIF_BPF_COEFF2829,  0xf2350708},
+{15500000, DIF_BPF_COEFF3031,  0x09b2f104},
+{15500000, DIF_BPF_COEFF3233,  0x01050eff},
+{15500000, DIF_BPF_COEFF3435,  0xf3baf9be},
+{15500000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 155_quant.dat*/
+
+
+/*case 115600000:*/
+/* BEGIN - DIF BPF register values from 156_quant.dat*/
+{15600000, DIF_BPF_COEFF01,    0x00000003},
+{15600000, DIF_BPF_COEFF23,    0xfff9fffb},
+{15600000, DIF_BPF_COEFF45,    0x0022ffe6},
+{15600000, DIF_BPF_COEFF67,    0xffc9007a},
+{15600000, DIF_BPF_COEFF89,    0xfff0ff29},
+{15600000, DIF_BPF_COEFF1011,  0x00f2007e},
+{15600000, DIF_BPF_COEFF1213,  0xfe01011b},
+{15600000, DIF_BPF_COEFF1415,  0x01f6fc9e},
+{15600000, DIF_BPF_COEFF1617,  0x00440467},
+{15600000, DIF_BPF_COEFF1819,  0xfbccfdde},
+{15600000, DIF_BPF_COEFF2021,  0x0738fc90},
+{15600000, DIF_BPF_COEFF2223,  0xf9f70934},
+{15600000, DIF_BPF_COEFF2425,  0xff99f582},
+{15600000, DIF_BPF_COEFF2627,  0x090204b0},
+{15600000, DIF_BPF_COEFF2829,  0xf21a05e1},
+{15600000, DIF_BPF_COEFF3031,  0x0a8df15a},
+{15600000, DIF_BPF_COEFF3233,  0x00340f41},
+{15600000, DIF_BPF_COEFF3435,  0xf405f98b},
+{15600000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 156_quant.dat*/
+
+
+/*case 115700000:*/
+/* BEGIN - DIF BPF register values from 157_quant.dat*/
+{15700000, DIF_BPF_COEFF01,    0x00000003},
+{15700000, DIF_BPF_COEFF23,    0xfffcfff4},
+{15700000, DIF_BPF_COEFF45,    0x0020fffa},
+{15700000, DIF_BPF_COEFF67,    0xffb40064},
+{15700000, DIF_BPF_COEFF89,    0x002fff11},
+{15700000, DIF_BPF_COEFF1011,  0x00a400f0},
+{15700000, DIF_BPF_COEFF1213,  0xfe0d006e},
+{15700000, DIF_BPF_COEFF1415,  0x0281fd09},
+{15700000, DIF_BPF_COEFF1617,  0xff3604c9},
+{15700000, DIF_BPF_COEFF1819,  0xfcbffca2},
+{15700000, DIF_BPF_COEFF2021,  0x0726fdfe},
+{15700000, DIF_BPF_COEFF2223,  0xf8e80888},
+{15700000, DIF_BPF_COEFF2425,  0x0134f4f3},
+{15700000, DIF_BPF_COEFF2627,  0x07e1060c},
+{15700000, DIF_BPF_COEFF2829,  0xf22304af},
+{15700000, DIF_BPF_COEFF3031,  0x0b59f1be},
+{15700000, DIF_BPF_COEFF3233,  0xff640f7d},
+{15700000, DIF_BPF_COEFF3435,  0xf452f959},
+{15700000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 157_quant.dat*/
+
+
+/*case 115800000:*/
+/* BEGIN - DIF BPF register values from 158_quant.dat*/
+{15800000, DIF_BPF_COEFF01,    0x00000003},
+{15800000, DIF_BPF_COEFF23,    0x0000fff0},
+{15800000, DIF_BPF_COEFF45,    0x001a0010},
+{15800000, DIF_BPF_COEFF67,    0xffaa0041},
+{15800000, DIF_BPF_COEFF89,    0x0067ff13},
+{15800000, DIF_BPF_COEFF1011,  0x0043014a},
+{15800000, DIF_BPF_COEFF1213,  0xfe46ffb9},
+{15800000, DIF_BPF_COEFF1415,  0x02dbfda8},
+{15800000, DIF_BPF_COEFF1617,  0xfe3504e5},
+{15800000, DIF_BPF_COEFF1819,  0xfddcfb8d},
+{15800000, DIF_BPF_COEFF2021,  0x06c9ff7e},
+{15800000, DIF_BPF_COEFF2223,  0xf81107a2},
+{15800000, DIF_BPF_COEFF2425,  0x02c9f49a},
+{15800000, DIF_BPF_COEFF2627,  0x069f0753},
+{15800000, DIF_BPF_COEFF2829,  0xf2500373},
+{15800000, DIF_BPF_COEFF3031,  0x0c14f231},
+{15800000, DIF_BPF_COEFF3233,  0xfe930fb3},
+{15800000, DIF_BPF_COEFF3435,  0xf4a1f927},
+{15800000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 158_quant.dat*/
+
+
+/*case 115900000:*/
+/* BEGIN - DIF BPF register values from 159_quant.dat*/
+{15900000, DIF_BPF_COEFF01,    0xffff0002},
+{15900000, DIF_BPF_COEFF23,    0x0003ffee},
+{15900000, DIF_BPF_COEFF45,    0x000f0023},
+{15900000, DIF_BPF_COEFF67,    0xffac0016},
+{15900000, DIF_BPF_COEFF89,    0x0093ff31},
+{15900000, DIF_BPF_COEFF1011,  0xffdc0184},
+{15900000, DIF_BPF_COEFF1213,  0xfea6ff09},
+{15900000, DIF_BPF_COEFF1415,  0x02fdfe70},
+{15900000, DIF_BPF_COEFF1617,  0xfd5104ba},
+{15900000, DIF_BPF_COEFF1819,  0xff15faac},
+{15900000, DIF_BPF_COEFF2021,  0x06270103},
+{15900000, DIF_BPF_COEFF2223,  0xf7780688},
+{15900000, DIF_BPF_COEFF2425,  0x044df479},
+{15900000, DIF_BPF_COEFF2627,  0x05430883},
+{15900000, DIF_BPF_COEFF2829,  0xf2a00231},
+{15900000, DIF_BPF_COEFF3031,  0x0cbef2b2},
+{15900000, DIF_BPF_COEFF3233,  0xfdc40fe3},
+{15900000, DIF_BPF_COEFF3435,  0xf4f2f8f5},
+{15900000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 159_quant.dat*/
+
+
+/*case 116000000:*/
+/* BEGIN - DIF BPF register values from 160_quant.dat*/
+{16000000, DIF_BPF_COEFF01,    0xffff0001},
+{16000000, DIF_BPF_COEFF23,    0x0006ffef},
+{16000000, DIF_BPF_COEFF45,    0x00020031},
+{16000000, DIF_BPF_COEFF67,    0xffbaffe8},
+{16000000, DIF_BPF_COEFF89,    0x00adff66},
+{16000000, DIF_BPF_COEFF1011,  0xff790198},
+{16000000, DIF_BPF_COEFF1213,  0xff26fe6e},
+{16000000, DIF_BPF_COEFF1415,  0x02e5ff55},
+{16000000, DIF_BPF_COEFF1617,  0xfc99044a},
+{16000000, DIF_BPF_COEFF1819,  0x005bfa09},
+{16000000, DIF_BPF_COEFF2021,  0x0545027f},
+{16000000, DIF_BPF_COEFF2223,  0xf7230541},
+{16000000, DIF_BPF_COEFF2425,  0x05b8f490},
+{16000000, DIF_BPF_COEFF2627,  0x03d20997},
+{16000000, DIF_BPF_COEFF2829,  0xf31300eb},
+{16000000, DIF_BPF_COEFF3031,  0x0d55f341},
+{16000000, DIF_BPF_COEFF3233,  0xfcf6100e},
+{16000000, DIF_BPF_COEFF3435,  0xf544f8c3},
+{16000000, DIF_BPF_COEFF36,    0x110d0000},
+/* END - DIF BPF register values from 160_quant.dat*/
+};
+
+#endif
index 4ea3776..130794b 100644 (file)
@@ -29,6 +29,9 @@
 
 #include "xc5000.h"
 #include "dvb_dummy_fe.h"
+#include "s5h1432.h"
+#include "tda18271.h"
+#include "s5h1411.h"
 
 MODULE_DESCRIPTION("driver for cx231xx based DVB cards");
 MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>");
@@ -65,6 +68,48 @@ struct cx231xx_dvb {
        struct dvb_net net;
 };
 
+static struct s5h1432_config dvico_s5h1432_config = {
+       .output_mode   = S5H1432_SERIAL_OUTPUT,
+       .gpio          = S5H1432_GPIO_ON,
+       .qam_if        = S5H1432_IF_4000,
+       .vsb_if        = S5H1432_IF_4000,
+       .inversion     = S5H1432_INVERSION_OFF,
+       .status_mode   = S5H1432_DEMODLOCKING,
+       .mpeg_timing   = S5H1432_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
+};
+
+static struct tda18271_std_map cnxt_rde253s_tda18271_std_map = {
+       .dvbt_6   = { .if_freq = 4000, .agc_mode = 3, .std = 4,
+                     .if_lvl = 1, .rfagc_top = 0x37, },
+       .dvbt_7   = { .if_freq = 4000, .agc_mode = 3, .std = 5,
+                     .if_lvl = 1, .rfagc_top = 0x37, },
+       .dvbt_8   = { .if_freq = 4000, .agc_mode = 3, .std = 6,
+                     .if_lvl = 1, .rfagc_top = 0x37, },
+};
+
+static struct tda18271_config cnxt_rde253s_tunerconfig = {
+       .std_map = &cnxt_rde253s_tda18271_std_map,
+       .gate    = TDA18271_GATE_ANALOG,
+};
+
+static struct s5h1411_config tda18271_s5h1411_config = {
+       .output_mode   = S5H1411_SERIAL_OUTPUT,
+       .gpio          = S5H1411_GPIO_OFF,
+       .vsb_if        = S5H1411_IF_3250,
+       .qam_if        = S5H1411_IF_4000,
+       .inversion     = S5H1411_INVERSION_ON,
+       .status_mode   = S5H1411_DEMODLOCKING,
+       .mpeg_timing   = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
+};
+static struct s5h1411_config xc5000_s5h1411_config = {
+       .output_mode   = S5H1411_SERIAL_OUTPUT,
+       .gpio          = S5H1411_GPIO_OFF,
+       .vsb_if        = S5H1411_IF_3250,
+       .qam_if        = S5H1411_IF_3250,
+       .inversion     = S5H1411_INVERSION_OFF,
+       .status_mode   = S5H1411_DEMODLOCKING,
+       .mpeg_timing   = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
+};
 static inline void print_err_status(struct cx231xx *dev, int packet, int status)
 {
        char *errmsg = "Unknown";
@@ -128,34 +173,81 @@ static inline int dvb_isoc_copy(struct cx231xx *dev, struct urb *urb)
                                continue;
                }
 
-               dvb_dmx_swfilter(&dev->dvb->demux, urb->transfer_buffer +
-                                urb->iso_frame_desc[i].offset,
-                                urb->iso_frame_desc[i].actual_length);
+               dvb_dmx_swfilter(&dev->dvb->demux,
+                                urb->transfer_buffer +
+                               urb->iso_frame_desc[i].offset,
+                               urb->iso_frame_desc[i].actual_length);
        }
 
        return 0;
 }
 
+static inline int dvb_bulk_copy(struct cx231xx *dev, struct urb *urb)
+{
+       int i;
+
+       if (!dev)
+               return 0;
+
+       if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED))
+               return 0;
+
+       if (urb->status < 0) {
+               print_err_status(dev, -1, urb->status);
+               if (urb->status == -ENOENT)
+                       return 0;
+       }
+
+       /* Feed the transport payload into the kernel demux */
+       dvb_dmx_swfilter(&dev->dvb->demux,
+               urb->transfer_buffer, urb->actual_length);
+
+       return 0;
+}
+
 static int start_streaming(struct cx231xx_dvb *dvb)
 {
        int rc;
        struct cx231xx *dev = dvb->adapter.priv;
 
-       usb_set_interface(dev->udev, 0, 1);
-       rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
-       if (rc < 0)
-               return rc;
+       if (dev->USE_ISO) {
+               cx231xx_info("DVB transfer mode is ISO.\n");
+mutex_lock(&dev->i2c_lock);
+               cx231xx_enable_i2c_for_tuner(dev, I2C_1);
+               cx231xx_set_alt_setting(dev, INDEX_TS1, 4);
+               cx231xx_enable_i2c_for_tuner(dev, I2C_3);
+mutex_unlock(&dev->i2c_lock);
+               rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
+               if (rc < 0)
+                       return rc;
+               dev->mode_tv = 1;
+               return cx231xx_init_isoc(dev, CX231XX_DVB_MAX_PACKETS,
+                                       CX231XX_DVB_NUM_BUFS,
+                                       dev->ts1_mode.max_pkt_size,
+                                       dvb_isoc_copy);
+       } else {
+               cx231xx_info("DVB transfer mode is BULK.\n");
+               cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
+               rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
+               if (rc < 0)
+                       return rc;
+               dev->mode_tv = 1;
+               return cx231xx_init_bulk(dev, CX231XX_DVB_MAX_PACKETS,
+                                       CX231XX_DVB_NUM_BUFS,
+                                       dev->ts1_mode.max_pkt_size,
+                                       dvb_bulk_copy);
+       }
 
-       return cx231xx_init_isoc(dev, CX231XX_DVB_MAX_PACKETS,
-                                CX231XX_DVB_NUM_BUFS,
-                                CX231XX_DVB_MAX_PACKETSIZE, dvb_isoc_copy);
 }
 
 static int stop_streaming(struct cx231xx_dvb *dvb)
 {
        struct cx231xx *dev = dvb->adapter.priv;
 
-       cx231xx_uninit_isoc(dev);
+       if (dev->USE_ISO)
+               cx231xx_uninit_isoc(dev);
+       else
+               cx231xx_uninit_bulk(dev);
 
        cx231xx_set_mode(dev, CX231XX_SUSPEND);
 
@@ -216,7 +308,11 @@ static int cx231xx_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
 
 static struct xc5000_config cnxt_rde250_tunerconfig = {
        .i2c_address = 0x61,
-       .if_khz = 5380,
+       .if_khz = 4000,
+};
+static struct xc5000_config cnxt_rdu250_tunerconfig = {
+       .i2c_address = 0x61,
+       .if_khz = 3250,
 };
 
 /* ------------------------------------------------------------------ */
@@ -268,7 +364,6 @@ int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq)
                        /*params.audmode = ;       */
 
                        /* Set the analog parameters to set the frequency */
-                       cx231xx_info("Setting Frequency for XC5000\n");
                        dops->set_analog_params(dev->dvb->frontend, &params);
                }
 
@@ -446,18 +541,19 @@ static int dvb_init(struct cx231xx *dev)
        dev->cx231xx_reset_analog_tuner = cx231xx_reset_analog_tuner;
 
        cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
+       cx231xx_demod_reset(dev);
        /* init frontend */
        switch (dev->model) {
+       case CX231XX_BOARD_CNXT_CARRAERA:
        case CX231XX_BOARD_CNXT_RDE_250:
 
-               /* dev->dvb->frontend = dvb_attach(s5h1411_attach,
-                  &dvico_s5h1411_config,
-                  &dev->i2c_bus[1].i2c_adap); */
-               dev->dvb->frontend = dvb_attach(dvb_dummy_fe_ofdm_attach);
+               dev->dvb->frontend = dvb_attach(s5h1432_attach,
+                                       &dvico_s5h1432_config,
+                                       &dev->i2c_bus[2].i2c_adap);
 
                if (dev->dvb->frontend == NULL) {
                        printk(DRIVER_NAME
-                              ": Failed to attach dummy front end\n");
+                              ": Failed to attach s5h1432 front end\n");
                        result = -EINVAL;
                        goto out_free;
                }
@@ -473,9 +569,12 @@ static int dvb_init(struct cx231xx *dev)
                }
 
                break;
+       case CX231XX_BOARD_CNXT_SHELBY:
        case CX231XX_BOARD_CNXT_RDU_250:
 
-               dev->dvb->frontend = dvb_attach(dvb_dummy_fe_ofdm_attach);
+               dev->dvb->frontend = dvb_attach(s5h1411_attach,
+                                              &xc5000_s5h1411_config,
+                                              &dev->i2c_bus[2].i2c_adap);
 
                if (dev->dvb->frontend == NULL) {
                        printk(DRIVER_NAME
@@ -489,7 +588,53 @@ static int dvb_init(struct cx231xx *dev)
 
                if (!dvb_attach(xc5000_attach, dev->dvb->frontend,
                               &dev->i2c_bus[1].i2c_adap,
-                              &cnxt_rde250_tunerconfig)) {
+                              &cnxt_rdu250_tunerconfig)) {
+                       result = -EINVAL;
+                       goto out_free;
+               }
+               break;
+       case CX231XX_BOARD_CNXT_RDE_253S:
+
+               dev->dvb->frontend = dvb_attach(s5h1432_attach,
+                                       &dvico_s5h1432_config,
+                                       &dev->i2c_bus[2].i2c_adap);
+
+               if (dev->dvb->frontend == NULL) {
+                       printk(DRIVER_NAME
+                              ": Failed to attach s5h1432 front end\n");
+                       result = -EINVAL;
+                       goto out_free;
+               }
+
+               /* define general-purpose callback pointer */
+               dvb->frontend->callback = cx231xx_tuner_callback;
+
+               if (!dvb_attach(tda18271_attach, dev->dvb->frontend,
+                              0x60, &dev->i2c_bus[1].i2c_adap,
+                              &cnxt_rde253s_tunerconfig)) {
+                       result = -EINVAL;
+                       goto out_free;
+               }
+               break;
+       case CX231XX_BOARD_CNXT_RDU_253S:
+
+               dev->dvb->frontend = dvb_attach(s5h1411_attach,
+                                              &tda18271_s5h1411_config,
+                                              &dev->i2c_bus[2].i2c_adap);
+
+               if (dev->dvb->frontend == NULL) {
+                       printk(DRIVER_NAME
+                              ": Failed to attach dummy front end\n");
+                       result = -EINVAL;
+                       goto out_free;
+               }
+
+               /* define general-purpose callback pointer */
+               dvb->frontend->callback = cx231xx_tuner_callback;
+
+               if (!dvb_attach(tda18271_attach, dev->dvb->frontend,
+                              0x60, &dev->i2c_bus[1].i2c_adap,
+                              &cnxt_rde253s_tunerconfig)) {
                        result = -EINVAL;
                        goto out_free;
                }
index 58d9cc0..d64bc7c 100644 (file)
@@ -359,7 +359,7 @@ static int cx231xx_i2c_xfer(struct i2c_adapter *i2c_adap,
 
        if (num <= 0)
                return 0;
-
+       mutex_lock(&dev->i2c_lock);
        for (i = 0; i < num; i++) {
 
                addr = msgs[i].addr >> 1;
@@ -372,6 +372,7 @@ static int cx231xx_i2c_xfer(struct i2c_adapter *i2c_adap,
                        rc = cx231xx_i2c_check_for_device(i2c_adap, &msgs[i]);
                        if (rc < 0) {
                                dprintk2(2, " no device\n");
+                               mutex_lock(&dev->i2c_lock);
                                return rc;
                        }
 
@@ -384,7 +385,7 @@ static int cx231xx_i2c_xfer(struct i2c_adapter *i2c_adap,
                        }
                } else if (i + 1 < num && (msgs[i + 1].flags & I2C_M_RD) &&
                           msgs[i].addr == msgs[i + 1].addr
-                          && (msgs[i].len <= 2) && (bus->nr < 2)) {
+                          && (msgs[i].len <= 2) && (bus->nr < 3)) {
                        /* read bytes */
                        rc = cx231xx_i2c_recv_bytes_with_saddr(i2c_adap,
                                                               &msgs[i],
@@ -407,10 +408,11 @@ static int cx231xx_i2c_xfer(struct i2c_adapter *i2c_adap,
                if (i2c_debug >= 2)
                        printk("\n");
        }
-
+       mutex_unlock(&dev->i2c_lock);
        return num;
 err:
        dprintk2(2, " ERROR: %i\n", rc);
+       mutex_unlock(&dev->i2c_lock);
        return rc;
 }
 
index fd09915..a0e8bb8 100644 (file)
@@ -61,6 +61,7 @@ struct cx231xx_ir_poll_result {
 struct cx231xx_IR {
        struct cx231xx *dev;
        struct input_dev *input;
+       struct ir_input_state ir;
        char name[32];
        char phys[32];
 
@@ -68,7 +69,9 @@ struct cx231xx_IR {
        int polling;
        struct work_struct work;
        struct timer_list timer;
+       unsigned int last_toggle:1;
        unsigned int last_readcount;
+       unsigned int repeat_interval;
 
        int (*get_key) (struct cx231xx_IR *, struct cx231xx_ir_poll_result *);
 };
@@ -80,6 +83,7 @@ struct cx231xx_IR {
 static void cx231xx_ir_handle_key(struct cx231xx_IR *ir)
 {
        int result;
+       int do_sendkey = 0;
        struct cx231xx_ir_poll_result poll_result;
 
        /* read the registers containing the IR status */
@@ -93,23 +97,44 @@ static void cx231xx_ir_handle_key(struct cx231xx_IR *ir)
                poll_result.toggle_bit, poll_result.read_count,
                ir->last_readcount, poll_result.rc_data[0]);
 
-       if (poll_result.read_count > 0 &&
-           poll_result.read_count != ir->last_readcount)
-               ir_keydown(ir->input,
-                          poll_result.rc_data[0],
-                          poll_result.toggle_bit);
-
-       if (ir->dev->chip_id == CHIP_ID_EM2874)
+       if (ir->dev->chip_id == CHIP_ID_EM2874) {
                /* The em2874 clears the readcount field every time the
                   register is read.  The em2860/2880 datasheet says that it
                   is supposed to clear the readcount, but it doesn't.  So with
                   the em2874, we are looking for a non-zero read count as
                   opposed to a readcount that is incrementing */
                ir->last_readcount = 0;
-       else
-               ir->last_readcount = poll_result.read_count;
+       }
+
+       if (poll_result.read_count == 0) {
+               /* The button has not been pressed since the last read */
+       } else if (ir->last_toggle != poll_result.toggle_bit) {
+               /* A button has been pressed */
+               dprintk("button has been pressed\n");
+               ir->last_toggle = poll_result.toggle_bit;
+               ir->repeat_interval = 0;
+               do_sendkey = 1;
+       } else if (poll_result.toggle_bit == ir->last_toggle &&
+                  poll_result.read_count > 0 &&
+                  poll_result.read_count != ir->last_readcount) {
+               /* The button is still being held down */
+               dprintk("button being held down\n");
+
+               /* Debouncer for first keypress */
+               if (ir->repeat_interval++ > 9) {
+                       /* Start repeating after 1 second */
+                       do_sendkey = 1;
+               }
+       }
 
+       if (do_sendkey) {
+               dprintk("sending keypress\n");
+               ir_input_keydown(ir->input, &ir->ir, poll_result.rc_data[0]);
+               ir_input_nokey(ir->input, &ir->ir);
        }
+
+       ir->last_readcount = poll_result.read_count;
+       return;
 }
 
 static void ir_timer(unsigned long data)
@@ -175,6 +200,10 @@ int cx231xx_ir_init(struct cx231xx *dev)
        usb_make_path(dev->udev, ir->phys, sizeof(ir->phys));
        strlcat(ir->phys, "/input0", sizeof(ir->phys));
 
+       err = ir_input_init(input_dev, &ir->ir, IR_TYPE_OTHER);
+       if (err < 0)
+               goto err_out_free;
+
        input_dev->name = ir->name;
        input_dev->phys = ir->phys;
        input_dev->id.bustype = BUS_USB;
@@ -190,7 +219,7 @@ int cx231xx_ir_init(struct cx231xx *dev)
        cx231xx_ir_start(ir);
 
        /* all done */
-       err = __ir_input_register(ir->input, dev->board.ir_codes,
+       err = ir_input_register(ir->input, dev->board.ir_codes,
                                NULL, MODULE_NAME);
        if (err)
                goto err_out_stop;
index 689c5e2..d2147ca 100644 (file)
@@ -102,7 +102,7 @@ static inline int cx231xx_isoc_vbi_copy(struct cx231xx *dev, struct urb *urb)
                        return 0;
        }
 
-       buf = dev->vbi_mode.isoc_ctl.buf;
+       buf = dev->vbi_mode.bulk_ctl.buf;
 
        /* get buffer pointer and length */
        p_buffer = urb->transfer_buffer;
@@ -209,8 +209,8 @@ static void free_buffer(struct videobuf_queue *vq, struct cx231xx_buffer *buf)
           VIDEOBUF_ACTIVE, it won't be, though.
         */
        spin_lock_irqsave(&dev->vbi_mode.slock, flags);
-       if (dev->vbi_mode.isoc_ctl.buf == buf)
-               dev->vbi_mode.isoc_ctl.buf = NULL;
+       if (dev->vbi_mode.bulk_ctl.buf == buf)
+               dev->vbi_mode.bulk_ctl.buf = NULL;
        spin_unlock_irqrestore(&dev->vbi_mode.slock, flags);
 
        videobuf_vmalloc_free(&buf->vb);
@@ -246,7 +246,7 @@ vbi_buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
                        goto fail;
        }
 
-       if (!dev->vbi_mode.isoc_ctl.num_bufs)
+       if (!dev->vbi_mode.bulk_ctl.num_bufs)
                urb_init = 1;
 
        if (urb_init) {
@@ -328,7 +328,7 @@ static void cx231xx_irq_vbi_callback(struct urb *urb)
 
        /* Copy data from URB */
        spin_lock(&dev->vbi_mode.slock);
-       rc = dev->vbi_mode.isoc_ctl.isoc_copy(dev, urb);
+       rc = dev->vbi_mode.bulk_ctl.bulk_copy(dev, urb);
        spin_unlock(&dev->vbi_mode.slock);
 
        /* Reset status */
@@ -351,34 +351,34 @@ void cx231xx_uninit_vbi_isoc(struct cx231xx *dev)
 
        cx231xx_info(DRIVER_NAME "cx231xx: called cx231xx_uninit_vbi_isoc\n");
 
-       dev->vbi_mode.isoc_ctl.nfields = -1;
-       for (i = 0; i < dev->vbi_mode.isoc_ctl.num_bufs; i++) {
-               urb = dev->vbi_mode.isoc_ctl.urb[i];
+       dev->vbi_mode.bulk_ctl.nfields = -1;
+       for (i = 0; i < dev->vbi_mode.bulk_ctl.num_bufs; i++) {
+               urb = dev->vbi_mode.bulk_ctl.urb[i];
                if (urb) {
                        if (!irqs_disabled())
                                usb_kill_urb(urb);
                        else
                                usb_unlink_urb(urb);
 
-                       if (dev->vbi_mode.isoc_ctl.transfer_buffer[i]) {
+                       if (dev->vbi_mode.bulk_ctl.transfer_buffer[i]) {
 
-                               kfree(dev->vbi_mode.isoc_ctl.
+                               kfree(dev->vbi_mode.bulk_ctl.
                                      transfer_buffer[i]);
-                               dev->vbi_mode.isoc_ctl.transfer_buffer[i] =
+                               dev->vbi_mode.bulk_ctl.transfer_buffer[i] =
                                    NULL;
                        }
                        usb_free_urb(urb);
-                       dev->vbi_mode.isoc_ctl.urb[i] = NULL;
+                       dev->vbi_mode.bulk_ctl.urb[i] = NULL;
                }
-               dev->vbi_mode.isoc_ctl.transfer_buffer[i] = NULL;
+               dev->vbi_mode.bulk_ctl.transfer_buffer[i] = NULL;
        }
 
-       kfree(dev->vbi_mode.isoc_ctl.urb);
-       kfree(dev->vbi_mode.isoc_ctl.transfer_buffer);
+       kfree(dev->vbi_mode.bulk_ctl.urb);
+       kfree(dev->vbi_mode.bulk_ctl.transfer_buffer);
 
-       dev->vbi_mode.isoc_ctl.urb = NULL;
-       dev->vbi_mode.isoc_ctl.transfer_buffer = NULL;
-       dev->vbi_mode.isoc_ctl.num_bufs = 0;
+       dev->vbi_mode.bulk_ctl.urb = NULL;
+       dev->vbi_mode.bulk_ctl.transfer_buffer = NULL;
+       dev->vbi_mode.bulk_ctl.num_bufs = 0;
 
        cx231xx_capture_start(dev, 0, Vbi);
 }
@@ -389,7 +389,7 @@ EXPORT_SYMBOL_GPL(cx231xx_uninit_vbi_isoc);
  */
 int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
                          int num_bufs, int max_pkt_size,
-                         int (*isoc_copy) (struct cx231xx *dev,
+                         int (*bulk_copy) (struct cx231xx *dev,
                                            struct urb *urb))
 {
        struct cx231xx_dmaqueue *dma_q = &dev->vbi_mode.vidq;
@@ -408,8 +408,8 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
                       usb_rcvbulkpipe(dev->udev,
                                       dev->vbi_mode.end_point_addr));
 
-       dev->vbi_mode.isoc_ctl.isoc_copy = isoc_copy;
-       dev->vbi_mode.isoc_ctl.num_bufs = num_bufs;
+       dev->vbi_mode.bulk_ctl.bulk_copy = bulk_copy;
+       dev->vbi_mode.bulk_ctl.num_bufs = num_bufs;
        dma_q->pos = 0;
        dma_q->is_partial_line = 0;
        dma_q->last_sav = 0;
@@ -421,42 +421,42 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
        for (i = 0; i < 8; i++)
                dma_q->partial_buf[i] = 0;
 
-       dev->vbi_mode.isoc_ctl.urb = kzalloc(sizeof(void *) * num_bufs,
+       dev->vbi_mode.bulk_ctl.urb = kzalloc(sizeof(void *) * num_bufs,
                                             GFP_KERNEL);
-       if (!dev->vbi_mode.isoc_ctl.urb) {
+       if (!dev->vbi_mode.bulk_ctl.urb) {
                cx231xx_errdev("cannot alloc memory for usb buffers\n");
                return -ENOMEM;
        }
 
-       dev->vbi_mode.isoc_ctl.transfer_buffer =
+       dev->vbi_mode.bulk_ctl.transfer_buffer =
            kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
-       if (!dev->vbi_mode.isoc_ctl.transfer_buffer) {
+       if (!dev->vbi_mode.bulk_ctl.transfer_buffer) {
                cx231xx_errdev("cannot allocate memory for usbtransfer\n");
-               kfree(dev->vbi_mode.isoc_ctl.urb);
+               kfree(dev->vbi_mode.bulk_ctl.urb);
                return -ENOMEM;
        }
 
-       dev->vbi_mode.isoc_ctl.max_pkt_size = max_pkt_size;
-       dev->vbi_mode.isoc_ctl.buf = NULL;
+       dev->vbi_mode.bulk_ctl.max_pkt_size = max_pkt_size;
+       dev->vbi_mode.bulk_ctl.buf = NULL;
 
-       sb_size = max_packets * dev->vbi_mode.isoc_ctl.max_pkt_size;
+       sb_size = max_packets * dev->vbi_mode.bulk_ctl.max_pkt_size;
 
        /* allocate urbs and transfer buffers */
-       for (i = 0; i < dev->vbi_mode.isoc_ctl.num_bufs; i++) {
+       for (i = 0; i < dev->vbi_mode.bulk_ctl.num_bufs; i++) {
 
                urb = usb_alloc_urb(0, GFP_KERNEL);
                if (!urb) {
                        cx231xx_err(DRIVER_NAME
-                                   ": cannot alloc isoc_ctl.urb %i\n", i);
+                                   ": cannot alloc bulk_ctl.urb %i\n", i);
                        cx231xx_uninit_vbi_isoc(dev);
                        return -ENOMEM;
                }
-               dev->vbi_mode.isoc_ctl.urb[i] = urb;
+               dev->vbi_mode.bulk_ctl.urb[i] = urb;
                urb->transfer_flags = 0;
 
-               dev->vbi_mode.isoc_ctl.transfer_buffer[i] =
+               dev->vbi_mode.bulk_ctl.transfer_buffer[i] =
                    kzalloc(sb_size, GFP_KERNEL);
-               if (!dev->vbi_mode.isoc_ctl.transfer_buffer[i]) {
+               if (!dev->vbi_mode.bulk_ctl.transfer_buffer[i]) {
                        cx231xx_err(DRIVER_NAME
                                    ": unable to allocate %i bytes for transfer"
                                    " buffer %i%s\n", sb_size, i,
@@ -467,15 +467,15 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
 
                pipe = usb_rcvbulkpipe(dev->udev, dev->vbi_mode.end_point_addr);
                usb_fill_bulk_urb(urb, dev->udev, pipe,
-                                 dev->vbi_mode.isoc_ctl.transfer_buffer[i],
+                                 dev->vbi_mode.bulk_ctl.transfer_buffer[i],
                                  sb_size, cx231xx_irq_vbi_callback, dma_q);
        }
 
        init_waitqueue_head(&dma_q->wq);
 
        /* submit urbs and enables IRQ */
-       for (i = 0; i < dev->vbi_mode.isoc_ctl.num_bufs; i++) {
-               rc = usb_submit_urb(dev->vbi_mode.isoc_ctl.urb[i], GFP_ATOMIC);
+       for (i = 0; i < dev->vbi_mode.bulk_ctl.num_bufs; i++) {
+               rc = usb_submit_urb(dev->vbi_mode.bulk_ctl.urb[i], GFP_ATOMIC);
                if (rc) {
                        cx231xx_err(DRIVER_NAME
                                    ": submit of urb %i failed (error=%i)\n", i,
@@ -536,7 +536,7 @@ static inline void vbi_buffer_filled(struct cx231xx *dev,
        buf->vb.field_count++;
        do_gettimeofday(&buf->vb.ts);
 
-       dev->vbi_mode.isoc_ctl.buf = NULL;
+       dev->vbi_mode.bulk_ctl.buf = NULL;
 
        list_del(&buf->vb.queue);
        wake_up(&buf->vb.done);
@@ -553,7 +553,7 @@ u32 cx231xx_copy_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
                cx231xx_reset_vbi_buffer(dev, dma_q);
 
        /* get the buffer pointer */
-       buf = dev->vbi_mode.isoc_ctl.buf;
+       buf = dev->vbi_mode.bulk_ctl.buf;
 
        /* Remember the field number for next time */
        dma_q->current_field = field_number;
@@ -618,7 +618,7 @@ static inline void get_next_vbi_buf(struct cx231xx_dmaqueue *dma_q,
 
        if (list_empty(&dma_q->active)) {
                cx231xx_err(DRIVER_NAME ": No active queue to serve\n");
-               dev->vbi_mode.isoc_ctl.buf = NULL;
+               dev->vbi_mode.bulk_ctl.buf = NULL;
                *buf = NULL;
                return;
        }
@@ -630,7 +630,7 @@ static inline void get_next_vbi_buf(struct cx231xx_dmaqueue *dma_q,
        outp = videobuf_to_vmalloc(&(*buf)->vb);
        memset(outp, 0, (*buf)->vb.size);
 
-       dev->vbi_mode.isoc_ctl.buf = *buf;
+       dev->vbi_mode.bulk_ctl.buf = *buf;
 
        return;
 }
@@ -640,7 +640,7 @@ void cx231xx_reset_vbi_buffer(struct cx231xx *dev,
 {
        struct cx231xx_buffer *buf;
 
-       buf = dev->vbi_mode.isoc_ctl.buf;
+       buf = dev->vbi_mode.bulk_ctl.buf;
 
        if (buf == NULL) {
                /* first try to get the buffer */
@@ -664,7 +664,7 @@ int cx231xx_do_vbi_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
        void *startwrite;
        int offset, lencopy;
 
-       buf = dev->vbi_mode.isoc_ctl.buf;
+       buf = dev->vbi_mode.bulk_ctl.buf;
 
        if (buf == NULL)
                return -EINVAL;
index 89c7fe8..16c7d20 100644 (file)
@@ -41,7 +41,7 @@ extern struct videobuf_queue_ops cx231xx_vbi_qops;
 /* stream functions */
 int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
                          int num_bufs, int max_pkt_size,
-                         int (*isoc_copy) (struct cx231xx *dev,
+                         int (*bulk_copy) (struct cx231xx *dev,
                                            struct urb *urb));
 
 void cx231xx_uninit_vbi_isoc(struct cx231xx *dev);
index b638c4e..9a42ccb 100644 (file)
@@ -237,7 +237,10 @@ static inline void buffer_filled(struct cx231xx *dev,
        buf->vb.field_count++;
        do_gettimeofday(&buf->vb.ts);
 
-       dev->video_mode.isoc_ctl.buf = NULL;
+       if (dev->USE_ISO)
+               dev->video_mode.isoc_ctl.buf = NULL;
+       else
+               dev->video_mode.bulk_ctl.buf = NULL;
 
        list_del(&buf->vb.queue);
        wake_up(&buf->vb.done);
@@ -295,7 +298,10 @@ static inline void get_next_buf(struct cx231xx_dmaqueue *dma_q,
 
        if (list_empty(&dma_q->active)) {
                cx231xx_isocdbg("No active queue to serve\n");
-               dev->video_mode.isoc_ctl.buf = NULL;
+               if (dev->USE_ISO)
+                       dev->video_mode.isoc_ctl.buf = NULL;
+               else
+                       dev->video_mode.bulk_ctl.buf = NULL;
                *buf = NULL;
                return;
        }
@@ -307,7 +313,10 @@ static inline void get_next_buf(struct cx231xx_dmaqueue *dma_q,
        outp = videobuf_to_vmalloc(&(*buf)->vb);
        memset(outp, 0, (*buf)->vb.size);
 
-       dev->video_mode.isoc_ctl.buf = *buf;
+       if (dev->USE_ISO)
+               dev->video_mode.isoc_ctl.buf = *buf;
+       else
+               dev->video_mode.bulk_ctl.buf = *buf;
 
        return;
 }
@@ -418,6 +427,93 @@ static inline int cx231xx_isoc_copy(struct cx231xx *dev, struct urb *urb)
        return rc;
 }
 
+static inline int cx231xx_bulk_copy(struct cx231xx *dev, struct urb *urb)
+{
+       struct cx231xx_buffer *buf;
+       struct cx231xx_dmaqueue *dma_q = urb->context;
+       unsigned char *outp = NULL;
+       int rc = 1;
+       unsigned char *p_buffer;
+       u32 bytes_parsed = 0, buffer_size = 0;
+       u8 sav_eav = 0;
+
+       if (!dev)
+               return 0;
+
+       if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED))
+               return 0;
+
+       if (urb->status < 0) {
+               print_err_status(dev, -1, urb->status);
+               if (urb->status == -ENOENT)
+                       return 0;
+       }
+
+       buf = dev->video_mode.bulk_ctl.buf;
+       if (buf != NULL)
+               outp = videobuf_to_vmalloc(&buf->vb);
+
+       if (1) {
+
+               /*  get buffer pointer and length */
+               p_buffer = urb->transfer_buffer;
+               buffer_size = urb->actual_length;
+               bytes_parsed = 0;
+
+               if (dma_q->is_partial_line) {
+                       /* Handle the case of a partial line */
+                       sav_eav = dma_q->last_sav;
+               } else {
+                       /* Check for a SAV/EAV overlapping
+                               the buffer boundary */
+                       sav_eav =
+                           cx231xx_find_boundary_SAV_EAV(p_buffer,
+                                                         dma_q->partial_buf,
+                                                         &bytes_parsed);
+               }
+
+               sav_eav &= 0xF0;
+               /* Get the first line if we have some portion of an SAV/EAV from
+                  the last buffer or a partial line  */
+               if (sav_eav) {
+                       bytes_parsed += cx231xx_get_video_line(dev, dma_q,
+                               sav_eav,        /* SAV/EAV */
+                               p_buffer + bytes_parsed,        /* p_buffer */
+                               buffer_size - bytes_parsed);/* buf size */
+               }
+
+               /* Now parse data that is completely in this buffer */
+               /* dma_q->is_partial_line = 0;  */
+
+               while (bytes_parsed < buffer_size) {
+                       u32 bytes_used = 0;
+
+                       sav_eav = cx231xx_find_next_SAV_EAV(
+                               p_buffer + bytes_parsed,        /* p_buffer */
+                               buffer_size - bytes_parsed,     /* buf size */
+                               &bytes_used);/* bytes used to get SAV/EAV */
+
+                       bytes_parsed += bytes_used;
+
+                       sav_eav &= 0xF0;
+                       if (sav_eav && (bytes_parsed < buffer_size)) {
+                               bytes_parsed += cx231xx_get_video_line(dev,
+                                       dma_q, sav_eav, /* SAV/EAV */
+                                       p_buffer + bytes_parsed,/* p_buffer */
+                                       buffer_size - bytes_parsed);/*buf size*/
+                       }
+               }
+
+               /* Save the last four bytes of the buffer so we can check the
+                  buffer boundary condition next time */
+               memcpy(dma_q->partial_buf, p_buffer + buffer_size - 4, 4);
+               bytes_parsed = 0;
+
+       }
+       return rc;
+}
+
+
 u8 cx231xx_find_boundary_SAV_EAV(u8 *p_buffer, u8 *partial_buf,
                                 u32 *p_bytes_used)
 {
@@ -533,7 +629,10 @@ u32 cx231xx_copy_video_line(struct cx231xx *dev,
                cx231xx_reset_video_buffer(dev, dma_q);
 
        /* get the buffer pointer */
-       buf = dev->video_mode.isoc_ctl.buf;
+       if (dev->USE_ISO)
+               buf = dev->video_mode.isoc_ctl.buf;
+       else
+               buf = dev->video_mode.bulk_ctl.buf;
 
        /* Remember the field number for next time */
        dma_q->current_field = field_number;
@@ -596,7 +695,10 @@ void cx231xx_reset_video_buffer(struct cx231xx *dev,
                        dma_q->field1_done = 0;
        }
 
-       buf = dev->video_mode.isoc_ctl.buf;
+       if (dev->USE_ISO)
+               buf = dev->video_mode.isoc_ctl.buf;
+       else
+               buf = dev->video_mode.bulk_ctl.buf;
 
        if (buf == NULL) {
                u8 *outp = NULL;
@@ -626,7 +728,10 @@ int cx231xx_do_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
        void *startwrite;
        int offset, lencopy;
 
-       buf = dev->video_mode.isoc_ctl.buf;
+       if (dev->USE_ISO)
+               buf = dev->video_mode.isoc_ctl.buf;
+       else
+               buf = dev->video_mode.bulk_ctl.buf;
 
        if (buf == NULL)
                return -1;
@@ -691,7 +796,6 @@ buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
 {
        struct cx231xx_fh *fh = vq->priv_data;
        struct cx231xx *dev = fh->dev;
-       struct v4l2_frequency f;
 
        *size = (fh->dev->width * fh->dev->height * dev->format->depth + 7)>>3;
        if (0 == *count)
@@ -700,13 +804,6 @@ buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
        if (*count < CX231XX_MIN_BUF)
                *count = CX231XX_MIN_BUF;
 
-       /* Ask tuner to go to analog mode */
-       memset(&f, 0, sizeof(f));
-       f.frequency = dev->ctl_freq;
-       f.type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
-
-       call_all(dev, tuner, s_frequency, &f);
-
        return 0;
 }
 
@@ -730,8 +827,13 @@ static void free_buffer(struct videobuf_queue *vq, struct cx231xx_buffer *buf)
           VIDEOBUF_ACTIVE, it won't be, though.
         */
        spin_lock_irqsave(&dev->video_mode.slock, flags);
-       if (dev->video_mode.isoc_ctl.buf == buf)
-               dev->video_mode.isoc_ctl.buf = NULL;
+       if (dev->USE_ISO) {
+               if (dev->video_mode.isoc_ctl.buf == buf)
+                       dev->video_mode.isoc_ctl.buf = NULL;
+       } else {
+               if (dev->video_mode.bulk_ctl.buf == buf)
+                       dev->video_mode.bulk_ctl.buf = NULL;
+       }
        spin_unlock_irqrestore(&dev->video_mode.slock, flags);
 
        videobuf_vmalloc_free(&buf->vb);
@@ -764,14 +866,27 @@ buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
                        goto fail;
        }
 
-       if (!dev->video_mode.isoc_ctl.num_bufs)
-               urb_init = 1;
-
+       if (dev->USE_ISO) {
+               if (!dev->video_mode.isoc_ctl.num_bufs)
+                       urb_init = 1;
+       } else {
+               if (!dev->video_mode.bulk_ctl.num_bufs)
+                       urb_init = 1;
+       }
+       /*cx231xx_info("urb_init=%d dev->video_mode.max_pkt_size=%d\n",
+               urb_init, dev->video_mode.max_pkt_size);*/
        if (urb_init) {
-               rc = cx231xx_init_isoc(dev, CX231XX_NUM_PACKETS,
+               dev->mode_tv = 0;
+               if (dev->USE_ISO)
+                       rc = cx231xx_init_isoc(dev, CX231XX_NUM_PACKETS,
                                       CX231XX_NUM_BUFS,
                                       dev->video_mode.max_pkt_size,
                                       cx231xx_isoc_copy);
+               else
+                       rc = cx231xx_init_bulk(dev, CX231XX_NUM_PACKETS,
+                                      CX231XX_NUM_BUFS,
+                                      dev->video_mode.max_pkt_size,
+                                      cx231xx_bulk_copy);
                if (rc < 0)
                        goto fail;
        }
@@ -1039,7 +1154,7 @@ out:
        return rc;
 }
 
-static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id * id)
+static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *id)
 {
        struct cx231xx_fh *fh = priv;
        struct cx231xx *dev = fh->dev;
@@ -1138,6 +1253,19 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
        struct cx231xx *dev = fh->dev;
        int rc;
 
+       if (i == 10) {
+               dev->USE_ISO = 0;
+               cx231xx_info("trans-mode=BULK. USE_ISO = %d\n", dev->USE_ISO);
+               return 0;
+       }
+
+       if (i == 11) {
+               dev->USE_ISO = 1;
+               cx231xx_info("trans-mode=ISOC. USE_ISO = %d\n", dev->USE_ISO);
+               return 0;
+       }
+
+       dev->mode_tv = 0;
        rc = check_dev(dev);
        if (rc < 0)
                return rc;
@@ -1337,6 +1465,11 @@ static int vidioc_s_frequency(struct file *file, void *priv,
        struct cx231xx_fh *fh = priv;
        struct cx231xx *dev = fh->dev;
        int rc;
+       u32 if_frequency = 5400000;
+
+       cx231xx_info("Enter vidioc_s_frequency()f->frequency=%d;f->type=%d\n",
+                f->frequency, f->type);
+       /*cx231xx_info("f->type:  1-radio 2-analogTV 3-digitalTV\n");*/
 
        rc = check_dev(dev);
        if (rc < 0)
@@ -1356,18 +1489,35 @@ static int vidioc_s_frequency(struct file *file, void *priv,
        mutex_lock(&dev->lock);
 
        dev->ctl_freq = f->frequency;
-
-       if (dev->tuner_type == TUNER_XC5000) {
-               if (dev->cx231xx_set_analog_freq != NULL)
-                       dev->cx231xx_set_analog_freq(dev, f->frequency);
-       } else
-               call_all(dev, tuner, s_frequency, f);
+       call_all(dev, tuner, s_frequency, f);
 
        mutex_unlock(&dev->lock);
 
        /* set post channel change settings in DIF first */
        rc = cx231xx_tuner_post_channel_change(dev);
 
+       if (dev->tuner_type == TUNER_NXP_TDA18271) {
+               if (dev->norm & (V4L2_STD_MN | V4L2_STD_NTSC_443))
+                       if_frequency = 5400000;  /*5.4MHz       */
+               else if (dev->norm & V4L2_STD_B)
+                       if_frequency = 6000000;  /*6.0MHz       */
+               else if (dev->norm & (V4L2_STD_PAL_DK | V4L2_STD_SECAM_DK))
+                       if_frequency = 6900000;  /*6.9MHz       */
+               else if (dev->norm & V4L2_STD_GH)
+                       if_frequency = 7100000;  /*7.1MHz       */
+               else if (dev->norm & V4L2_STD_PAL_I)
+                       if_frequency = 7250000;  /*7.25MHz      */
+               else if (dev->norm & V4L2_STD_SECAM_L)
+                       if_frequency = 6900000;  /*6.9MHz       */
+               else if (dev->norm & V4L2_STD_SECAM_LC)
+                       if_frequency = 1250000;  /*1.25MHz      */
+
+               cx231xx_info("if_frequency is set to %d\n", if_frequency);
+               cx231xx_set_Colibri_For_LowIF(dev, if_frequency, 1, 1);
+
+               update_HH_register_after_set_DIF(dev);
+       }
+
        cx231xx_info("Set New FREQUENCY to %d\n", f->frequency);
 
        return rc;
@@ -1445,9 +1595,86 @@ static int vidioc_g_register(struct file *file, void *priv,
        case V4L2_CHIP_MATCH_I2C_DRIVER:
                call_all(dev, core, g_register, reg);
                return 0;
-       case V4L2_CHIP_MATCH_I2C_ADDR:
-               /* Not supported yet */
-               return -EINVAL;
+       case V4L2_CHIP_MATCH_I2C_ADDR:/*for register debug*/
+               switch (reg->match.addr) {
+               case 0: /* Cx231xx - internal registers */
+                       ret = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER,
+                                                 (u16)reg->reg, value, 4);
+                       reg->val = value[0] | value[1] << 8 |
+                                  value[2] << 16 | value[3] << 24;
+
+                       break;
+               case 0x600:/* AFE - read byte */
+                       ret = cx231xx_read_i2c_master(dev, AFE_DEVICE_ADDRESS,
+                                                (u16)reg->reg, 2,
+                                                &data, 1 , 0);
+                       reg->val = le32_to_cpu(data & 0xff);
+                       break;
+
+               case 0x880:/* Video Block - read byte */
+                       if (reg->reg < 0x0b) {
+                               ret = cx231xx_read_i2c_master(dev,
+                                               VID_BLK_I2C_ADDRESS,
+                                                (u16)reg->reg, 2,
+                                                &data, 1 , 0);
+                               reg->val = le32_to_cpu(data & 0xff);
+                       } else {
+                               ret = cx231xx_read_i2c_master(dev,
+                                               VID_BLK_I2C_ADDRESS,
+                                                (u16)reg->reg, 2,
+                                                &data, 4 , 0);
+                               reg->val = le32_to_cpu(data);
+                       }
+                       break;
+               case 0x980:
+                       ret = cx231xx_read_i2c_master(dev,
+                                               I2S_BLK_DEVICE_ADDRESS,
+                                               (u16)reg->reg, 1,
+                                               &data, 1 , 0);
+                       reg->val = le32_to_cpu(data & 0xff);
+                       break;
+               case 0x400:
+                       ret =
+                           cx231xx_read_i2c_master(dev, 0x40,
+                                                 (u16)reg->reg, 1,
+                                                &data, 1 , 0);
+                       reg->val = le32_to_cpu(data & 0xff);
+                       break;
+               case 0xc01:
+                       ret =
+                               cx231xx_read_i2c_master(dev, 0xc0,
+                                               (u16)reg->reg, 2,
+                                                &data, 38, 1);
+                       reg->val = le32_to_cpu(data);
+                       break;
+               case 0x022:
+                       ret =
+                               cx231xx_read_i2c_master(dev, 0x02,
+                                               (u16)reg->reg, 1,
+                                                &data, 1, 2);
+                       reg->val = le32_to_cpu(data & 0xff);
+                       break;
+               case 0x322:
+                       ret = cx231xx_read_i2c_master(dev,
+                                               0x32,
+                                                (u16)reg->reg, 1,
+                                                &data, 4 , 2);
+                               reg->val = le32_to_cpu(data);
+                       break;
+               case 0x342:
+                       ret = cx231xx_read_i2c_master(dev,
+                                               0x34,
+                                                (u16)reg->reg, 1,
+                                                &data, 4 , 2);
+                               reg->val = le32_to_cpu(data);
+                       break;
+
+               default:
+                       cx231xx_info("no match device address!!\n");
+                       break;
+                       }
+               return ret < 0 ? ret : 0;
+               /*return -EINVAL;*/
        default:
                if (!v4l2_chip_match_host(&reg->match))
                        return -EINVAL;
@@ -1531,7 +1758,91 @@ static int vidioc_s_register(struct file *file, void *priv,
                        }
                }
                return ret < 0 ? ret : 0;
+       case V4L2_CHIP_MATCH_I2C_ADDR:
+               {
+                       value = (u32) buf & 0xffffffff;
 
+                       switch (reg->match.addr) {
+                       case 0:/*cx231xx internal registers*/
+                                       data[0] = (u8) value;
+                                       data[1] = (u8) (value >> 8);
+                                       data[2] = (u8) (value >> 16);
+                                       data[3] = (u8) (value >> 24);
+                                       ret = cx231xx_write_ctrl_reg(dev,
+                                                          VRT_SET_REGISTER,
+                                                          (u16)reg->reg, data,
+                                                          4);
+                                       break;
+                       case 0x600:/* AFE - read byte */
+                                       ret = cx231xx_write_i2c_master(dev,
+                                                       AFE_DEVICE_ADDRESS,
+                                                       (u16)reg->reg, 2,
+                                                       value, 1 , 0);
+                                       break;
+
+                       case 0x880:/* Video Block - read byte */
+                                       if (reg->reg < 0x0b)
+                                               cx231xx_write_i2c_master(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       (u16)reg->reg, 2,
+                                                       value, 1, 0);
+                                       else
+                                               cx231xx_write_i2c_master(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       (u16)reg->reg, 2,
+                                                       value, 4, 0);
+                                       break;
+                       case 0x980:
+                                       ret =
+                                               cx231xx_write_i2c_master(dev,
+                                                       I2S_BLK_DEVICE_ADDRESS,
+                                                       (u16)reg->reg, 1,
+                                                       value, 1, 0);
+                                       break;
+                       case 0x400:
+                                       ret =
+                                               cx231xx_write_i2c_master(dev,
+                                                       0x40,
+                                                       (u16)reg->reg, 1,
+                                                       value, 1, 0);
+                                       break;
+                       case 0xc01:
+                                       ret =
+                                               cx231xx_write_i2c_master(dev,
+                                                        0xc0,
+                                                        (u16)reg->reg, 1,
+                                                        value, 1, 1);
+                                       break;
+
+                       case 0x022:
+                                       ret =
+                                               cx231xx_write_i2c_master(dev,
+                                                       0x02,
+                                                       (u16)reg->reg, 1,
+                                                       value, 1, 2);
+                       case 0x322:
+                                       ret =
+                                               cx231xx_write_i2c_master(dev,
+                                                       0x32,
+                                                       (u16)reg->reg, 1,
+                                                       value, 4, 2);
+                                       break;
+
+                       case 0x342:
+                                       ret =
+                                               cx231xx_write_i2c_master(dev,
+                                                       0x34,
+                                                       (u16)reg->reg, 1,
+                                                       value, 4, 2);
+                                       break;
+                       default:
+                               cx231xx_info("no match device address, "
+                                       "the value is %x\n", reg->match.addr);
+                                       break;
+
+                                       }
+
+               }
        default:
                break;
        }
@@ -1975,7 +2286,11 @@ static int cx231xx_v4l2_open(struct file *filp)
                dev->vscale = 0;
 
                /* Power up in Analog TV mode */
-               cx231xx_set_power_mode(dev, POLARIS_AVMODE_ANALOGT_TV);
+               if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER)
+                       cx231xx_set_power_mode(dev,
+                                POLARIS_AVMODE_ENXTERNAL_AV);
+               else
+                       cx231xx_set_power_mode(dev, POLARIS_AVMODE_ANALOGT_TV);
 
 #if 0
                cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
@@ -1991,7 +2306,6 @@ static int cx231xx_v4l2_open(struct file *filp)
 
                /* device needs to be initialized before isoc transfer */
                dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
-               video_mux(dev, dev->video_input);
 
        }
        if (fh->radio) {
@@ -2013,7 +2327,8 @@ static int cx231xx_v4l2_open(struct file *filp)
        if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
                /* Set the required alternate setting  VBI interface works in
                   Bulk mode only */
-               cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
+               if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER)
+                       cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
 
                videobuf_queue_vmalloc_init(&fh->vb_vidq, &cx231xx_vbi_qops,
                                            NULL, &dev->vbi_mode.slock,
@@ -2056,6 +2371,10 @@ void cx231xx_release_analog_resources(struct cx231xx *dev)
        if (dev->vdev) {
                cx231xx_info("V4L2 device %s deregistered\n",
                             video_device_node_name(dev->vdev));
+
+               if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER)
+                       cx231xx_417_unregister(dev);
+
                if (video_is_registered(dev->vdev))
                        video_unregister_device(dev->vdev);
                else
@@ -2077,39 +2396,47 @@ static int cx231xx_v4l2_close(struct file *filp)
        cx231xx_videodbg("users=%d\n", dev->users);
 
        mutex_lock(&dev->lock);
-
+       cx231xx_videodbg("users=%d\n", dev->users);
        if (res_check(fh))
                res_free(fh);
 
-       if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
-               videobuf_stop(&fh->vb_vidq);
-               videobuf_mmap_free(&fh->vb_vidq);
+       /*To workaround error number=-71 on EP0 for VideoGrabber,
+                need exclude following.*/
+       if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER)
+               if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
+                       videobuf_stop(&fh->vb_vidq);
+                       videobuf_mmap_free(&fh->vb_vidq);
+
+                       /* the device is already disconnect,
+                          free the remaining resources */
+                       if (dev->state & DEV_DISCONNECTED) {
+                               if (atomic_read(&dev->devlist_count) > 0) {
+                                       cx231xx_release_resources(dev);
+                                       mutex_unlock(&dev->lock);
+                                       kfree(dev);
+                                       dev = NULL;
+                                       return 0;
+                               }
+                               mutex_unlock(&dev->lock);
+                               return 0;
+                       }
 
-               /* the device is already disconnect,
-                  free the remaining resources */
-               if (dev->state & DEV_DISCONNECTED) {
-                       cx231xx_release_resources(dev);
+                       /* do this before setting alternate! */
+                       cx231xx_uninit_vbi_isoc(dev);
+
+                       /* set alternate 0 */
+                       if (!dev->vbi_or_sliced_cc_mode)
+                               cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
+                       else
+                               cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
+
+                       kfree(fh);
+                       dev->users--;
+                       wake_up_interruptible_nr(&dev->open, 1);
                        mutex_unlock(&dev->lock);
-                       kfree(dev);
                        return 0;
                }
 
-               /* do this before setting alternate! */
-               cx231xx_uninit_vbi_isoc(dev);
-
-               /* set alternate 0 */
-               if (!dev->vbi_or_sliced_cc_mode)
-                       cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
-               else
-                       cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
-
-               kfree(fh);
-               dev->users--;
-               wake_up_interruptible_nr(&dev->open, 1);
-               mutex_unlock(&dev->lock);
-               return 0;
-       }
-
        if (dev->users == 1) {
                videobuf_stop(&fh->vb_vidq);
                videobuf_mmap_free(&fh->vb_vidq);
@@ -2120,6 +2447,7 @@ static int cx231xx_v4l2_close(struct file *filp)
                        cx231xx_release_resources(dev);
                        mutex_unlock(&dev->lock);
                        kfree(dev);
+                       dev = NULL;
                        return 0;
                }
 
@@ -2127,7 +2455,10 @@ static int cx231xx_v4l2_close(struct file *filp)
                call_all(dev, core, s_power, 0);
 
                /* do this before setting alternate! */
-               cx231xx_uninit_isoc(dev);
+               if (dev->USE_ISO)
+                       cx231xx_uninit_isoc(dev);
+               else
+                       cx231xx_uninit_bulk(dev);
                cx231xx_set_mode(dev, CX231XX_SUSPEND);
 
                /* set alternate 0 */
@@ -2175,7 +2506,7 @@ cx231xx_v4l2_read(struct file *filp, char __user *buf, size_t count,
  * cx231xx_v4l2_poll()
  * will allocate buffers when called for the first time
  */
-static unsigned int cx231xx_v4l2_poll(struct file *filp, poll_table * wait)
+static unsigned int cx231xx_v4l2_poll(struct file *filp, poll_table *wait)
 {
        struct cx231xx_fh *fh = filp->private_data;
        struct cx231xx *dev = fh->dev;
index 38d4171..d9a90c5 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/i2c-algo-bit.h>
 #include <linux/mutex.h>
 
+#include <media/cx2341x.h>
 
 #include <media/videobuf-vmalloc.h>
 #include <media/v4l2-device.h>
 #define     AFE_DEVICE_ADDRESS         0x60
 #define     I2S_BLK_DEVICE_ADDRESS     0x98
 #define     VID_BLK_I2C_ADDRESS                0x88
+#define     VERVE_I2C_ADDRESS           0x40
 #define     DIF_USE_BASEBAND            0xFFFFFFFF
 
 /* Boards supported by driver */
 #define CX231XX_BOARD_UNKNOWN              0
-#define CX231XX_BOARD_CNXT_RDE_250             1
-#define CX231XX_BOARD_CNXT_RDU_250             2
+#define CX231XX_BOARD_CNXT_CARRAERA            1
+#define CX231XX_BOARD_CNXT_SHELBY      2
+#define CX231XX_BOARD_CNXT_RDE_253S            3
+#define CX231XX_BOARD_CNXT_RDU_253S            4
+#define CX231XX_BOARD_CNXT_VIDEO_GRABBER       5
+#define CX231XX_BOARD_CNXT_RDE_250     6
+#define CX231XX_BOARD_CNXT_RDU_250             7
 
 /* Limits minimum and default number of buffers */
 #define CX231XX_MIN_BUF                 4
 #define CX231XX_URB_TIMEOUT            \
                msecs_to_jiffies(CX231XX_NUM_BUFS * CX231XX_NUM_PACKETS)
 
+#define CX231xx_NORMS (\
+       V4L2_STD_NTSC_M |  V4L2_STD_NTSC_M_JP |  V4L2_STD_NTSC_443 | \
+       V4L2_STD_PAL_BG |  V4L2_STD_PAL_DK    |  V4L2_STD_PAL_I    | \
+       V4L2_STD_PAL_M  |  V4L2_STD_PAL_N     |  V4L2_STD_PAL_Nc   | \
+       V4L2_STD_PAL_60 |  V4L2_STD_SECAM_L   |  V4L2_STD_SECAM_DK)
+#define CX231xx_VERSION_CODE KERNEL_VERSION(0, 0, 2)
+
+#define SLEEP_S5H1432    30
+#define CX23417_OSC_EN   8
+#define CX23417_RESET    9
+
+struct cx23417_fmt {
+       char  *name;
+       u32   fourcc;          /* v4l2 format id */
+       int   depth;
+       int   flags;
+       u32   cxformat;
+};
 enum cx231xx_mode {
        CX231XX_SUSPEND,
        CX231XX_ANALOG_MODE,
@@ -114,7 +139,7 @@ enum cx231xx_stream_state {
 
 struct cx231xx;
 
-struct cx231xx_usb_isoc_ctl {
+struct cx231xx_isoc_ctl {
        /* max packet size of isoc transaction */
        int max_pkt_size;
 
@@ -148,6 +173,40 @@ struct cx231xx_usb_isoc_ctl {
        int (*isoc_copy) (struct cx231xx *dev, struct urb *urb);
 };
 
+struct cx231xx_bulk_ctl {
+       /* max packet size of bulk transaction */
+       int max_pkt_size;
+
+       /* number of allocated urbs */
+       int num_bufs;
+
+       /* urb for bulk transfers */
+       struct urb **urb;
+
+       /* transfer buffers for bulk transfer */
+       char **transfer_buffer;
+
+       /* Last buffer command and region */
+       u8 cmd;
+       int pos, size, pktsize;
+
+       /* Last field: ODD or EVEN? */
+       int field;
+
+       /* Stores incomplete commands */
+       u32 tmp_buf;
+       int tmp_buf_len;
+
+       /* Stores already requested buffers */
+       struct cx231xx_buffer *buf;
+
+       /* Stores the number of received fields */
+       int nfields;
+
+       /* bulk urb callback */
+       int (*bulk_copy) (struct cx231xx *dev, struct urb *urb);
+};
+
 struct cx231xx_fmt {
        char *name;
        u32 fourcc;             /* v4l2 format id */
@@ -165,6 +224,11 @@ struct cx231xx_buffer {
        int receiving;
 };
 
+enum ps_package_head {
+       CX231XX_NEED_ADD_PS_PACKAGE_HEAD = 0,
+       CX231XX_NONEED_PS_PACKAGE_HEAD
+};
+
 struct cx231xx_dmaqueue {
        struct list_head active;
        struct list_head queued;
@@ -181,6 +245,14 @@ struct cx231xx_dmaqueue {
        u32 lines_completed;
        u8 field1_done;
        u32 lines_per_field;
+
+       /*Mpeg2 control buffer*/
+       u8 *p_left_data;
+       u32 left_data_count;
+       u8 mpeg_buffer_done;
+       u32 mpeg_buffer_completed;
+       enum ps_package_head add_ps_package_head;
+       char ps_head[10];
 };
 
 /* inputs */
@@ -309,7 +381,8 @@ enum AUDIO_INPUT {
 };
 
 #define CX231XX_AUDIO_BUFS              5
-#define CX231XX_NUM_AUDIO_PACKETS       64
+#define CX231XX_NUM_AUDIO_PACKETS       16
+#define CX231XX_ISO_NUM_AUDIO_PACKETS  64
 #define CX231XX_CAPTURE_STREAM_EN       1
 #define CX231XX_STOP_AUDIO              0
 #define CX231XX_START_AUDIO             1
@@ -331,6 +404,7 @@ struct cx231xx_audio {
 
        int users, shutdown;
        enum cx231xx_stream_state capture_stream;
+       /* locks */
        spinlock_t slock;
 
        int alt;                /* alternate */
@@ -350,6 +424,28 @@ struct cx231xx_fh {
        struct videobuf_queue vb_vidq;
 
        enum v4l2_buf_type type;
+
+
+
+/*following is copyed from cx23885.h*/
+       u32                        resources;
+
+       /* video overlay */
+       struct v4l2_window         win;
+       struct v4l2_clip           *clips;
+       unsigned int               nclips;
+
+       /* video capture */
+       struct cx23417_fmt         *fmt;
+       unsigned int               width, height;
+
+       /* vbi capture */
+       struct videobuf_queue      vidq;
+       struct videobuf_queue      vbiq;
+
+       /* MPEG Encoder specifics ONLY */
+
+       atomic_t                   v4l_reading;
 };
 
 /*****************************************************************/
@@ -403,6 +499,13 @@ struct VENDOR_REQUEST_IN {
        u8 *pBuff;
 };
 
+struct cx231xx_tvnorm {
+       char            *name;
+       v4l2_std_id     id;
+       u32             cxiformat;
+       u32             cxoformat;
+};
+
 struct cx231xx_ctrl {
        struct v4l2_queryctrl v;
        u32 off;
@@ -424,7 +527,9 @@ enum TRANSFER_TYPE {
 struct cx231xx_video_mode {
        /* Isoc control struct */
        struct cx231xx_dmaqueue vidq;
-       struct cx231xx_usb_isoc_ctl isoc_ctl;
+       struct cx231xx_isoc_ctl isoc_ctl;
+       struct cx231xx_bulk_ctl bulk_ctl;
+       /* locks */
        spinlock_t slock;
 
        /* usb transfer */
@@ -434,6 +539,64 @@ struct cx231xx_video_mode {
        unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */
        u16 end_point_addr;
 };
+/*
+struct cx23885_dmaqueue {
+       struct list_head       active;
+       struct list_head       queued;
+       struct timer_list      timeout;
+       struct btcx_riscmem    stopper;
+       u32                    count;
+};
+*/
+struct cx231xx_tsport {
+       struct cx231xx *dev;
+
+       int                        nr;
+       int                        sram_chno;
+
+       struct videobuf_dvb_frontends frontends;
+
+       /* dma queues */
+
+       u32                        ts_packet_size;
+       u32                        ts_packet_count;
+
+       int                        width;
+       int                        height;
+
+       /* locks */
+       spinlock_t                 slock;
+
+       /* registers */
+       u32                        reg_gpcnt;
+       u32                        reg_gpcnt_ctl;
+       u32                        reg_dma_ctl;
+       u32                        reg_lngth;
+       u32                        reg_hw_sop_ctrl;
+       u32                        reg_gen_ctrl;
+       u32                        reg_bd_pkt_status;
+       u32                        reg_sop_status;
+       u32                        reg_fifo_ovfl_stat;
+       u32                        reg_vld_misc;
+       u32                        reg_ts_clk_en;
+       u32                        reg_ts_int_msk;
+       u32                        reg_ts_int_stat;
+       u32                        reg_src_sel;
+
+       /* Default register vals */
+       int                        pci_irqmask;
+       u32                        dma_ctl_val;
+       u32                        ts_int_msk_val;
+       u32                        gen_ctrl_val;
+       u32                        ts_clk_en_val;
+       u32                        src_sel_val;
+       u32                        vld_misc_val;
+       u32                        hw_sop_ctrl_val;
+
+       /* Allow a single tsport to have multiple frontends */
+       u32                        num_frontends;
+       void                       *port_priv;
+};
 
 /* main device struct */
 struct cx231xx {
@@ -465,7 +628,9 @@ struct cx231xx {
        /* I2C adapters: Master 1 & 2 (External) & Master 3 (Internal only) */
        struct cx231xx_i2c i2c_bus[3];
        unsigned int xc_fw_load_done:1;
+       /* locks */
        struct mutex gpio_i2c_lock;
+       struct mutex i2c_lock;
 
        /* video for linux */
        int users;              /* user count for exclusive use */
@@ -505,6 +670,8 @@ struct cx231xx {
        struct cx231xx_video_mode sliced_cc_mode;
        struct cx231xx_video_mode ts1_mode;
 
+       atomic_t devlist_count;
+
        struct usb_device *udev;        /* the usb device */
        char urb_buf[URB_MAX_CTRL_SIZE];        /* urb control msg buffer */
 
@@ -550,8 +717,24 @@ struct cx231xx {
        u8 vbi_or_sliced_cc_mode;       /* 0 - vbi ; 1 - sliced cc mode */
        enum cx231xx_std_mode std_mode; /* 0 - Air; 1 - cable */
 
+       /*mode: digital=1 or analog=0*/
+       u8 mode_tv;
+
+       u8 USE_ISO;
+       struct cx231xx_tvnorm      encodernorm;
+       struct cx231xx_tsport      ts1, ts2;
+       struct cx2341x_mpeg_params mpeg_params;
+       struct video_device        *v4l_device;
+       atomic_t                   v4l_reader_count;
+       u32                        freq;
+       unsigned int               input;
+       u32                        cx23417_mailbox;
+       u32                        __iomem *lmmio;
+       u8                         __iomem *bmmio;
 };
 
+extern struct list_head cx231xx_devlist;
+
 #define cx25840_call(cx231xx, o, f, args...) \
        v4l2_subdev_call(cx231xx->sd_cx25840, o, f, ##args)
 #define tuner_call(cx231xx, o, f, args...) \
@@ -577,6 +760,10 @@ int cx231xx_i2c_register(struct cx231xx_i2c *bus);
 int cx231xx_i2c_unregister(struct cx231xx_i2c *bus);
 
 /* Internal block control functions */
+int cx231xx_read_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
+                u8 saddr_len, u32 *data, u8 data_len, int master);
+int cx231xx_write_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
+                u8 saddr_len, u32 data, u8 data_len, int master);
 int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr,
                          u16 saddr, u8 saddr_len, u32 *data, u8 data_len);
 int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr,
@@ -588,6 +775,9 @@ int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
                                        u16 saddr, u32 mask, u32 value);
 u32 cx231xx_set_field(u32 field_mask, u32 data);
 
+/*verve r/w*/
+void initGPIO(struct cx231xx *dev);
+void uninitGPIO(struct cx231xx *dev);
 /* afe related functions */
 int cx231xx_afe_init_super_block(struct cx231xx *dev, u32 ref_count);
 int cx231xx_afe_init_channels(struct cx231xx *dev);
@@ -607,6 +797,19 @@ int cx231xx_i2s_blk_set_audio_input(struct cx231xx *dev, u8 audio_input);
 /* DIF related functions */
 int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode,
                                          u32 function_mode, u32 standard);
+void cx231xx_set_Colibri_For_LowIF(struct cx231xx *dev, u32 if_freq,
+                                        u8 spectral_invert, u32 mode);
+u32 cx231xx_Get_Colibri_CarrierOffset(u32 mode, u32 standerd);
+void cx231xx_set_DIF_bandpass(struct cx231xx *dev, u32 if_freq,
+                                        u8 spectral_invert, u32 mode);
+void cx231xx_Setup_AFE_for_LowIF(struct cx231xx *dev);
+void reset_s5h1432_demod(struct cx231xx *dev);
+void cx231xx_dump_HH_reg(struct cx231xx *dev);
+void update_HH_register_after_set_DIF(struct cx231xx *dev);
+void cx231xx_dump_SC_reg(struct cx231xx *dev);
+
+
+
 int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard);
 int cx231xx_tuner_pre_channel_change(struct cx231xx *dev);
 int cx231xx_tuner_post_channel_change(struct cx231xx *dev);
@@ -675,12 +878,26 @@ int cx231xx_capture_start(struct cx231xx *dev, int start, u8 media_type);
 int cx231xx_resolution_set(struct cx231xx *dev);
 int cx231xx_set_video_alternate(struct cx231xx *dev);
 int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt);
+int is_fw_load(struct cx231xx *dev);
+int cx231xx_check_fw(struct cx231xx *dev);
 int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
                      int num_bufs, int max_pkt_size,
                      int (*isoc_copy) (struct cx231xx *dev,
                                        struct urb *urb));
+int cx231xx_init_bulk(struct cx231xx *dev, int max_packets,
+                     int num_bufs, int max_pkt_size,
+                     int (*bulk_copy) (struct cx231xx *dev,
+                                       struct urb *urb));
+void cx231xx_stop_TS1(struct cx231xx *dev);
+void cx231xx_start_TS1(struct cx231xx *dev);
 void cx231xx_uninit_isoc(struct cx231xx *dev);
+void cx231xx_uninit_bulk(struct cx231xx *dev);
 int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode);
+int cx231xx_unmute_audio(struct cx231xx *dev);
+int cx231xx_ep5_bulkout(struct cx231xx *dev, u8 *firmware, u16 size);
+void cx231xx_disable656(struct cx231xx *dev);
+void cx231xx_enable656(struct cx231xx *dev);
+int cx231xx_demod_reset(struct cx231xx *dev);
 int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio);
 
 /* Device list functions */
@@ -740,6 +957,10 @@ int cx231xx_tuner_callback(void *ptr, int component, int command, int arg);
 int cx231xx_ir_init(struct cx231xx *dev);
 int cx231xx_ir_fini(struct cx231xx *dev);
 
+/* cx23885-417.c                                               */
+extern int cx231xx_417_register(struct cx231xx *dev);
+extern void cx231xx_417_unregister(struct cx231xx *dev);
+
 /* printk macros */
 
 #define cx231xx_err(fmt, arg...) do {\