V4L/DVB (11303): tda7432: remove legacy code for old-style i2c API
[safe/jmp/linux-2.6] / drivers / media / video / gspca / sonixj.c
index d9a7d11..c72e19d 100644 (file)
@@ -22,7 +22,6 @@
 #define MODULE_NAME "sonixj"
 
 #include "gspca.h"
-#define QUANT_VAL 4            /* quantization table */
 #include "jpeg.h"
 
 #define V4L2_CID_INFRARED (V4L2_CID_PRIVATE_BASE + 0)
@@ -45,8 +44,15 @@ struct sd {
        u8 blue;
        u8 red;
        u8 gamma;
-       u8 vflip;                       /* ov7630 only */
+       u8 vflip;                       /* ov7630/ov7648 only */
        u8 infrared;                    /* mt9v111 only */
+       u8 quality;                     /* image quality */
+#define QUALITY_MIN 60
+#define QUALITY_MAX 95
+#define QUALITY_DEF 80
+       u8 jpegqual;                    /* webcam quality */
+
+       u8 reg18;
 
        s8 ag_cnt;
 #define AG_CNT_START 13
@@ -68,6 +74,8 @@ struct sd {
 #define SENSOR_OV7660 7
 #define SENSOR_SP80708 8
        u8 i2c_base;
+
+       u8 *jpeg_hdr;
 };
 
 /* V4L2 controls supported by the driver */
@@ -192,7 +200,7 @@ static struct ctrl sd_ctrls[] = {
            .set = sd_setautogain,
            .get = sd_getautogain,
        },
-/* ov7630 only */
+/* ov7630/ov7648 only */
 #define VFLIP_IDX 6
        {
            {
@@ -202,7 +210,7 @@ static struct ctrl sd_ctrls[] = {
                .minimum = 0,
                .maximum = 1,
                .step    = 1,
-#define VFLIP_DEF 1
+#define VFLIP_DEF 0                    /* vflip def = 1 for ov7630 */
                .default_value = VFLIP_DEF,
            },
            .set = sd_setvflip,
@@ -234,13 +242,13 @@ static __u32 ctrl_dis[] = {
                                                /* SENSOR_MI0360 1 */
        (1 << INFRARED_IDX) | (1 << VFLIP_IDX),
                                                /* SENSOR_MO4000 2 */
-       (1 << AUTOGAIN_IDX),
+       (1 << VFLIP_IDX),
                                                /* SENSOR_MT9V111 3 */
        (1 << INFRARED_IDX) | (1 << VFLIP_IDX),
                                                /* SENSOR_OM6802 4 */
        (1 << AUTOGAIN_IDX) | (1 << INFRARED_IDX),
                                                /* SENSOR_OV7630 5 */
-       (1 << AUTOGAIN_IDX) | (1 << INFRARED_IDX) | (1 << VFLIP_IDX),
+       (1 << INFRARED_IDX),
                                                /* SENSOR_OV7648 6 */
        (1 << AUTOGAIN_IDX) | (1 << INFRARED_IDX) | (1 << VFLIP_IDX),
                                                /* SENSOR_OV7660 7 */
@@ -379,11 +387,21 @@ static const u8 *sn_tb[] = {
        sn_sp80708
 };
 
+/* default gamma table */
 static const u8 gamma_def[17] = {
        0x00, 0x2d, 0x46, 0x5a, 0x6c, 0x7c, 0x8b, 0x99,
        0xa6, 0xb2, 0xbf, 0xca, 0xd5, 0xe0, 0xeb, 0xf5, 0xff
 };
-
+/* gamma for sensors HV7131R and MT9V111 */
+static const u8 gamma_spec_1[17] = {
+       0x08, 0x3a, 0x52, 0x65, 0x75, 0x83, 0x91, 0x9d,
+       0xa9, 0xb4, 0xbe, 0xc8, 0xd2, 0xdb, 0xe4, 0xed, 0xf5
+};
+/* gamma for sensor SP80708 */
+static const u8 gamma_spec_2[17] = {
+       0x0a, 0x2d, 0x4e, 0x68, 0x7d, 0x8f, 0x9f, 0xab,
+       0xb7, 0xc2, 0xcc, 0xd3, 0xd8, 0xde, 0xe2, 0xe5, 0xe6
+};
 
 /* color matrix and offsets */
 static const u8 reg84[] = {
@@ -507,8 +525,18 @@ static const u8 mt9v111_sensor_init[][8] = {
        {0xb1, 0x5c, 0x01, 0x00, 0x01, 0x00, 0x00, 0x10}, /* IFP select */
        {0xb1, 0x5c, 0x08, 0x04, 0x80, 0x00, 0x00, 0x10}, /* output fmt ctrl */
        {0xb1, 0x5c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10}, /* op mode ctrl */
+       {0xb1, 0x5c, 0x02, 0x00, 0x16, 0x00, 0x00, 0x10},
+       {0xb1, 0x5c, 0x03, 0x01, 0xe1, 0x00, 0x00, 0x10},
+       {0xb1, 0x5c, 0x04, 0x02, 0x81, 0x00, 0x00, 0x10},
+       {0xb1, 0x5c, 0x05, 0x00, 0x04, 0x00, 0x00, 0x10},
        {0xb1, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0x10}, /* sensor select */
+       {0xb1, 0x5c, 0x02, 0x00, 0x16, 0x00, 0x00, 0x10},
+       {0xb1, 0x5c, 0x03, 0x01, 0xe6, 0x00, 0x00, 0x10},
+       {0xb1, 0x5c, 0x04, 0x02, 0x86, 0x00, 0x00, 0x10},
+       {0xb1, 0x5c, 0x05, 0x00, 0x04, 0x00, 0x00, 0x10},
+       {0xb1, 0x5c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10},
        {0xb1, 0x5c, 0x08, 0x00, 0x08, 0x00, 0x00, 0x10}, /* row start */
+       {0xb1, 0x5c, 0x0e, 0x00, 0x08, 0x00, 0x00, 0x10},
        {0xb1, 0x5c, 0x02, 0x00, 0x16, 0x00, 0x00, 0x10}, /* col start */
        {0xb1, 0x5c, 0x03, 0x01, 0xe7, 0x00, 0x00, 0x10}, /* window height */
        {0xb1, 0x5c, 0x04, 0x02, 0x87, 0x00, 0x00, 0x10}, /* window width */
@@ -522,7 +550,7 @@ static const u8 mt9v111_sensor_init[][8] = {
        /*******/
        {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
        {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
-       {0xb1, 0x5c, 0x09, 0x00, 0x64, 0x00, 0x00, 0x10}, /* shutter width */
+       {0xb1, 0x5c, 0x09, 0x01, 0x2c, 0x00, 0x00, 0x10},
        {0xd1, 0x5c, 0x2b, 0x00, 0x33, 0x00, 0xa0, 0x10}, /* green1 gain */
        {0xd1, 0x5c, 0x2d, 0x00, 0xa0, 0x00, 0x33, 0x10}, /* red gain */
        /*******/
@@ -649,7 +677,8 @@ static const u8 ov7648_sensor_init[][8] = {
        {0xb1, 0x21, 0x2d, 0x85, 0x00, 0x00, 0x00, 0x10},
 /*...*/
 /*     {0xa1, 0x21, 0x12, 0x08, 0x00, 0x00, 0x00, 0x10}, jfm done */
-/*     {0xa1, 0x21, 0x75, 0x06, 0x00, 0x00, 0x00, 0x10}, jfm done */
+/*     {0xa1, 0x21, 0x75, 0x06, 0x00, 0x00, 0x00, 0x10},   * COMN
+                                                        * set by setvflip */
        {0xa1, 0x21, 0x19, 0x02, 0x00, 0x00, 0x00, 0x10},
        {0xa1, 0x21, 0x10, 0x32, 0x00, 0x00, 0x00, 0x10},
 /*     {0xa1, 0x21, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10}, jfm done */
@@ -838,25 +867,6 @@ static const u8 sp80708_sensor_init[][8] = {
        {}
 };
 
-static const u8 qtable4[] = {
-       0x06, 0x04, 0x04, 0x06, 0x04, 0x04, 0x06, 0x06,
-       0x06, 0x06, 0x08, 0x06, 0x06, 0x08, 0x0a, 0x11,
-       0x0a, 0x0a, 0x08, 0x08, 0x0a, 0x15, 0x0f, 0x0f,
-       0x0c, 0x11, 0x19, 0x15, 0x19, 0x19, 0x17, 0x15,
-       0x17, 0x17, 0x1b, 0x1d, 0x25, 0x21, 0x1b, 0x1d,
-       0x23, 0x1d, 0x17, 0x17, 0x21, 0x2e, 0x21, 0x23,
-       0x27, 0x29, 0x2c, 0x2c, 0x2c, 0x19, 0x1f, 0x30,
-       0x32, 0x2e, 0x29, 0x32, 0x25, 0x29, 0x2c, 0x29,
-       0x06, 0x08, 0x08, 0x0a, 0x08, 0x0a, 0x13, 0x0a,
-       0x0a, 0x13, 0x29, 0x1b, 0x17, 0x1b, 0x29, 0x29,
-       0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
-       0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
-       0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
-       0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
-       0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
-       0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29
-};
-
 /* read <len> bytes to gspca_dev->usb_buf */
 static void reg_r(struct gspca_dev *gspca_dev,
                  u16 value, int len)
@@ -999,18 +1009,19 @@ static int hv7131r_probe(struct gspca_dev *gspca_dev)
        return -ENODEV;
 }
 
-static int mi0360_probe(struct gspca_dev *gspca_dev)
+static void mi0360_probe(struct gspca_dev *gspca_dev)
 {
+       struct sd *sd = (struct sd *) gspca_dev;
        int i, j;
-       u16 val;
+       u16 val = 0;
        static const u8 probe_tb[][4][8] = {
-           {
+           {                                   /* mi0360 */
                {0xb0, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10},
                {0x90, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
                {0xa2, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
                {0xb0, 0x5d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10}
            },
-           {
+           {                                   /* mt9v111 */
                {0xb0, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0x10},
                {0x90, 0x5c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x10},
                {0xa2, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
@@ -1036,13 +1047,16 @@ static int mi0360_probe(struct gspca_dev *gspca_dev)
        switch (val) {
        case 0x823a:
                PDEBUG(D_PROBE, "Sensor mt9v111");
-               return SENSOR_MT9V111;
+               sd->sensor = SENSOR_MT9V111;
+               sd->i2c_base = 0x5c;
+               break;
        case 0x8243:
                PDEBUG(D_PROBE, "Sensor mi0360");
-               return SENSOR_MI0360;
+               break;
+       default:
+               PDEBUG(D_PROBE, "Unknown sensor %04x - forced to mi0360", val);
+               break;
        }
-       PDEBUG(D_PROBE, "Unknown sensor %04x - forced to mi0360", val);
-       return SENSOR_MI0360;
 }
 
 static int configure_gpio(struct gspca_dev *gspca_dev,
@@ -1279,8 +1293,13 @@ static int sd_config(struct gspca_dev *gspca_dev,
        sd->gamma = GAMMA_DEF;
        sd->autogain = AUTOGAIN_DEF;
        sd->ag_cnt = -1;
-       sd->vflip = VFLIP_DEF;
+       if (sd->sensor != SENSOR_OV7630)
+               sd->vflip = 0;
+       else
+               sd->vflip = 1;
        sd->infrared = INFRARED_DEF;
+       sd->quality = QUALITY_DEF;
+       sd->jpegqual = 80;
 
        gspca_dev->ctrl_dis = ctrl_dis[sd->sensor];
        return 0;
@@ -1309,21 +1328,15 @@ static int sd_init(struct gspca_dev *gspca_dev)
        case BRIDGE_SN9C105:
                if (regF1 != 0x11)
                        return -ENODEV;
-               if (sd->sensor == SENSOR_MI0360) {
-                       sd->sensor = mi0360_probe(gspca_dev);
-                       if (sd->sensor == SENSOR_MT9V111)
-                               sd->i2c_base = 0x5c;
-               }
+               if (sd->sensor == SENSOR_MI0360)
+                       mi0360_probe(gspca_dev);
                reg_w(gspca_dev, 0x01, regGpio, 2);
                break;
        case BRIDGE_SN9C120:
                if (regF1 != 0x12)
                        return -ENODEV;
-               if (sd->sensor == SENSOR_MI0360) {
-                       sd->sensor = mi0360_probe(gspca_dev);
-                       if (sd->sensor == SENSOR_MT9V111)
-                               sd->i2c_base = 0x5c;
-               }
+               if (sd->sensor == SENSOR_MI0360)
+                       mi0360_probe(gspca_dev);
                regGpio[1] = 0x70;
                reg_w(gspca_dev, 0x01, regGpio, 2);
                break;
@@ -1514,14 +1527,27 @@ static void setgamma(struct gspca_dev *gspca_dev)
        struct sd *sd = (struct sd *) gspca_dev;
        int i;
        u8 gamma[17];
+       const u8 *gamma_base;
        static const u8 delta[17] = {
                0x00, 0x14, 0x1c, 0x1c, 0x1c, 0x1c, 0x1b, 0x1a,
                0x18, 0x13, 0x10, 0x0e, 0x08, 0x07, 0x04, 0x02, 0x00
        };
 
+       switch (sd->sensor) {
+       case SENSOR_HV7131R:
+       case SENSOR_MT9V111:
+               gamma_base = gamma_spec_1;
+               break;
+       case SENSOR_SP80708:
+               gamma_base = gamma_spec_2;
+               break;
+       default:
+               gamma_base = gamma_def;
+               break;
+       }
 
        for (i = 0; i < sizeof gamma; i++)
-               gamma[i] = gamma_def[i]
+               gamma[i] = gamma_base[i]
                        + delta[i] * (sd->gamma - GAMMA_DEF) / 32;
        reg_w(gspca_dev, 0x20, gamma, sizeof gamma);
 }
@@ -1532,16 +1558,39 @@ static void setautogain(struct gspca_dev *gspca_dev)
 
        if (gspca_dev->ctrl_dis & (1 << AUTOGAIN_IDX))
                return;
+       switch (sd->sensor) {
+       case SENSOR_OV7630:
+       case SENSOR_OV7648: {
+               u8 comb;
+
+               if (sd->sensor == SENSOR_OV7630)
+                       comb = 0xc0;
+               else
+                       comb = 0xa0;
+               if (sd->autogain)
+                       comb |= 0x02;
+               i2c_w1(&sd->gspca_dev, 0x13, comb);
+               return;
+           }
+       }
        if (sd->autogain)
                sd->ag_cnt = AG_CNT_START;
        else
                sd->ag_cnt = -1;
 }
 
+/* ov7630/ov7648 only */
 static void setvflip(struct sd *sd)
 {
-       i2c_w1(&sd->gspca_dev, 0x75,                    /* COMN */
-               sd->vflip ? 0x82 : 0x02);
+       u8 comn;
+
+       if (sd->sensor == SENSOR_OV7630)
+               comn = 0x02;
+       else
+               comn = 0x06;
+       if (sd->vflip)
+               comn |= 0x80;
+       i2c_w1(&sd->gspca_dev, 0x75, comn);
 }
 
 static void setinfrared(struct sd *sd)
@@ -1552,12 +1601,49 @@ static void setinfrared(struct sd *sd)
                sd->infrared ? 0x66 : 0x64);
 }
 
+static void setjpegqual(struct gspca_dev *gspca_dev)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+       int i, sc;
+
+       if (sd->jpegqual < 50)
+               sc = 5000 / sd->jpegqual;
+       else
+               sc = 200 - sd->jpegqual * 2;
+#if USB_BUF_SZ < 64
+#error "No room enough in usb_buf for quantization table"
+#endif
+       for (i = 0; i < 64; i++)
+               gspca_dev->usb_buf[i] =
+                       (jpeg_head[JPEG_QT0_OFFSET + i] * sc + 50) / 100;
+       usb_control_msg(gspca_dev->dev,
+                       usb_sndctrlpipe(gspca_dev->dev, 0),
+                       0x08,
+                       USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
+                       0x0100, 0,
+                       gspca_dev->usb_buf, 64,
+                       500);
+       for (i = 0; i < 64; i++)
+               gspca_dev->usb_buf[i] =
+                       (jpeg_head[JPEG_QT1_OFFSET + i] * sc + 50) / 100;
+       usb_control_msg(gspca_dev->dev,
+                       usb_sndctrlpipe(gspca_dev->dev, 0),
+                       0x08,
+                       USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
+                       0x0140, 0,
+                       gspca_dev->usb_buf, 64,
+                       500);
+
+       sd->reg18 ^= 0x40;
+       reg_w1(gspca_dev, 0x18, sd->reg18);
+}
+
 /* -- start the camera -- */
 static int sd_start(struct gspca_dev *gspca_dev)
 {
        struct sd *sd = (struct sd *) gspca_dev;
        int i;
-       u8 reg1, reg17, reg18;
+       u8 reg1, reg17;
        const u8 *sn9c1xx;
        int mode;
        static const u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f };
@@ -1566,6 +1652,12 @@ static int sd_start(struct gspca_dev *gspca_dev)
        static const u8 CE_ov76xx[] =
                                { 0x32, 0xdd, 0x32, 0xdd };
 
+       /* create the JPEG header */
+       sd->jpeg_hdr = kmalloc(JPEG_HDR_SZ, GFP_KERNEL);
+       jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
+                       0x21);          /* JPEG 422 */
+       jpeg_set_qual(sd->jpeg_hdr, sd->quality);
+
        sn9c1xx = sn_tb[(int) sd->sensor];
        configure_gpio(gspca_dev, sn9c1xx);
 
@@ -1608,6 +1700,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
        reg_w1(gspca_dev, 0x07, sn9c1xx[7]);    /* green */
        reg_w1(gspca_dev, 0x06, sn9c1xx[6]);    /* blue */
        reg_w1(gspca_dev, 0x14, sn9c1xx[0x14]);
+
        setgamma(gspca_dev);
 
        for (i = 0; i < 8; i++)
@@ -1666,7 +1759,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
                        reg1 = 0x04;    /* 320 clk 48Mhz */
                } else {
 /*                     reg1 = 0x06;     * 640 clk 24Mz (done) */
-                       reg17 = 0xe2;
+                       reg17 = 0xc2;
                }
                break;
        case SENSOR_OM6802:
@@ -1702,7 +1795,6 @@ static int sd_start(struct gspca_dev *gspca_dev)
                sp80708_InitSensor(gspca_dev);
                if (mode) {
 /*??                   reg1 = 0x04;     * 320 clk 48Mhz */
-                       ;
                } else {
                        reg1 = 0x46;     /* 640 clk 48Mz */
                        reg17 = 0xa2;
@@ -1724,13 +1816,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
        }
 
        /* here change size mode 0 -> VGA; 1 -> CIF */
-       reg18 = sn9c1xx[0x18] | (mode << 4);
-       reg_w1(gspca_dev, 0x18, reg18 | 0x40);
-
-       reg_w(gspca_dev, 0x0100, qtable4, 0x40);
-       reg_w(gspca_dev, 0x0140, qtable4 + 0x40, 0x40);
-
-       reg_w1(gspca_dev, 0x18, reg18);
+       sd->reg18 = sn9c1xx[0x18] | (mode << 4) | 0x40;
+       reg_w1(gspca_dev, 0x18, sd->reg18);
+       setjpegqual(gspca_dev);
 
        reg_w1(gspca_dev, 0x17, reg17);
        reg_w1(gspca_dev, 0x01, reg1);
@@ -1787,6 +1875,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
        reg_w1(gspca_dev, 0xf1, 0x00);
 }
 
+static void sd_stop0(struct gspca_dev *gspca_dev)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       kfree(sd->jpeg_hdr);
+}
+
 static void do_autogain(struct gspca_dev *gspca_dev)
 {
        struct sd *sd = (struct sd *) gspca_dev;
@@ -1870,7 +1965,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
        if (gspca_dev->last_packet_type == LAST_PACKET) {
 
                /* put the JPEG 422 header */
-               jpeg_put_header(gspca_dev, frame, 0x21);
+               gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
+                       sd->jpeg_hdr, JPEG_HDR_SZ);
        }
        gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len);
 }
@@ -2037,6 +2133,34 @@ static int sd_getinfrared(struct gspca_dev *gspca_dev, __s32 *val)
        return 0;
 }
 
+static int sd_set_jcomp(struct gspca_dev *gspca_dev,
+                       struct v4l2_jpegcompression *jcomp)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       if (jcomp->quality < QUALITY_MIN)
+               sd->quality = QUALITY_MIN;
+       else if (jcomp->quality > QUALITY_MAX)
+               sd->quality = QUALITY_MAX;
+       else
+               sd->quality = jcomp->quality;
+       if (gspca_dev->streaming)
+               jpeg_set_qual(sd->jpeg_hdr, sd->quality);
+       return 0;
+}
+
+static int sd_get_jcomp(struct gspca_dev *gspca_dev,
+                       struct v4l2_jpegcompression *jcomp)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       memset(jcomp, 0, sizeof *jcomp);
+       jcomp->quality = sd->quality;
+       jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT
+                       | V4L2_JPEG_MARKER_DQT;
+       return 0;
+}
+
 /* sub-driver description */
 static const struct sd_desc sd_desc = {
        .name = MODULE_NAME,
@@ -2046,8 +2170,11 @@ static const struct sd_desc sd_desc = {
        .init = sd_init,
        .start = sd_start,
        .stopN = sd_stopN,
+       .stop0 = sd_stop0,
        .pkt_scan = sd_pkt_scan,
        .dq_callback = do_autogain,
+       .get_jcomp = sd_get_jcomp,
+       .set_jcomp = sd_set_jcomp,
 };
 
 /* -- module initialisation -- */
@@ -2062,9 +2189,7 @@ static const __devinitdata struct usb_device_id device_table[] = {
 #endif
        {USB_DEVICE(0x045e, 0x00f5), BSI(SN9C105, OV7660, 0x21)},
        {USB_DEVICE(0x045e, 0x00f7), BSI(SN9C105, OV7660, 0x21)},
-#if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
        {USB_DEVICE(0x0471, 0x0327), BSI(SN9C105, MI0360, 0x5d)},
-#endif
        {USB_DEVICE(0x0471, 0x0328), BSI(SN9C105, MI0360, 0x5d)},
        {USB_DEVICE(0x0471, 0x0330), BSI(SN9C105, MI0360, 0x5d)},
        {USB_DEVICE(0x06f8, 0x3004), BSI(SN9C105, OV7660, 0x21)},
@@ -2102,9 +2227,9 @@ static const __devinitdata struct usb_device_id device_table[] = {
        {USB_DEVICE(0x0c45, 0x613a), BSI(SN9C120, OV7648, 0x21)},
 #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
        {USB_DEVICE(0x0c45, 0x613b), BSI(SN9C120, OV7660, 0x21)},
+#endif
        {USB_DEVICE(0x0c45, 0x613c), BSI(SN9C120, HV7131R, 0x11)},
 /*     {USB_DEVICE(0x0c45, 0x613e), BSI(SN9C120, OV7630, 0x??)}, */
-#endif
        {USB_DEVICE(0x0c45, 0x6143), BSI(SN9C120, SP80708, 0x18)},
        {}
 };