The patch number 8934 was added via Mauro Carvalho Chehab <[EMAIL PROTECTED]>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        [EMAIL PROTECTED]

------

From: Mauro Carvalho Chehab  <[EMAIL PROTECTED]>
merge: http://linuxtv.org/hg/~jfrancois/gspca/




Signed-off-by: Mauro Carvalho Chehab <[EMAIL PROTECTED]>


---

 linux/Documentation/video4linux/gspca.txt |    2 
 linux/drivers/media/video/gspca/gspca.c   |   25 +++++-----
 linux/drivers/media/video/gspca/pac207.c  |    1 
 linux/drivers/media/video/gspca/sonixj.c  |   51 +++++++++++++++++++++-
 linux/drivers/media/video/gspca/zc3xx.c   |    4 -
 5 files changed, 67 insertions(+), 16 deletions(-)

diff -r ed5ea7c1bc82 -r e3f4b17fead0 linux/Documentation/video4linux/gspca.txt
--- a/linux/Documentation/video4linux/gspca.txt Mon Sep 08 07:54:27 2008 -0300
+++ b/linux/Documentation/video4linux/gspca.txt Wed Sep 10 23:34:19 2008 -0300
@@ -42,6 +42,7 @@ zc3xx         0458:700c       Genius VideoCam V3
 zc3xx          0458:700c       Genius VideoCam V3
 zc3xx          0458:700f       Genius VideoCam Web V2
 sonixj         0458:7025       Genius Eye 311Q
+sonixj         0458:702e       Genius Slim 310 NB
 sonixj         045e:00f5       MicroSoft VX3000
 sonixj         045e:00f7       MicroSoft VX1000
 ov519          045e:028c       Micro$oft xbox cam
@@ -181,6 +182,7 @@ pac207              093a:2470       Genius GF112
 pac207         093a:2470       Genius GF112
 pac207         093a:2471       Genius VideoCam ge111
 pac207         093a:2472       Genius VideoCam ge110
+pac207         093a:2476       Genius e-Messenger 112
 pac7311                093a:2600       PAC7311 Typhoon
 pac7311                093a:2601       Philips SPC 610 NC
 pac7311                093a:2603       PAC7312
diff -r ed5ea7c1bc82 -r e3f4b17fead0 linux/drivers/media/video/gspca/gspca.c
--- a/linux/drivers/media/video/gspca/gspca.c   Mon Sep 08 07:54:27 2008 -0300
+++ b/linux/drivers/media/video/gspca/gspca.c   Wed Sep 10 23:34:19 2008 -0300
@@ -47,7 +47,7 @@ MODULE_DESCRIPTION("GSPCA USB Camera Dri
 MODULE_DESCRIPTION("GSPCA USB Camera Driver");
 MODULE_LICENSE("GPL");
 
-#define DRIVER_VERSION_NUMBER  KERNEL_VERSION(2, 2, 0)
+#define DRIVER_VERSION_NUMBER  KERNEL_VERSION(2, 3, 0)
 
 static int video_nr = -1;
 
@@ -195,7 +195,7 @@ static void bulk_irq(struct urb *urb
 {
        struct gspca_dev *gspca_dev = (struct gspca_dev *) urb->context;
        struct gspca_frame *frame;
-       int j, ret;
+       int j;
 
        PDEBUG(D_PACK, "bulk irq");
        if (!gspca_dev->streaming)
@@ -222,11 +222,6 @@ static void bulk_irq(struct urb *urb
                                        urb->transfer_buffer,
                                        urb->actual_length);
        }
-       /* resubmit the URB */
-       urb->status = 0;
-       ret = usb_submit_urb(urb, GFP_ATOMIC);
-       if (ret < 0)
-               PDEBUG(D_ERR|D_PACK, "usb_submit_urb() ret %d", ret);
 }
 
 /*
@@ -512,20 +507,20 @@ static int create_urbs(struct gspca_dev 
                PDEBUG(D_STREAM,
                        "isoc %d pkts size %d = bsize:%d",
                        npkt, psize, bsize);
+               nurbs = DEF_NURBS;
        } else {
                npkt = 0;
                bsize = psize;
                PDEBUG(D_STREAM, "bulk bsize:%d", bsize);
-       }
-
-       nurbs = DEF_NURBS;
+               nurbs = 1;
+       }
+
        gspca_dev->nurbs = nurbs;
        for (n = 0; n < nurbs; n++) {
                urb = usb_alloc_urb(npkt, GFP_KERNEL);
                if (!urb) {
                        err("usb_alloc_urb failed");
-                       for (i = 0; i < n; i++)
-                               usb_free_urb(gspca_dev->urb[i]);
+                       destroy_urbs(gspca_dev);
                        return -ENOMEM;
                }
                urb->transfer_buffer = usb_buffer_alloc(gspca_dev->dev,
@@ -535,8 +530,8 @@ static int create_urbs(struct gspca_dev 
 
                if (urb->transfer_buffer == NULL) {
                        usb_free_urb(urb);
+                       err("usb_buffer_urb failed");
                        destroy_urbs(gspca_dev);
-                       err("usb_buffer_urb failed");
                        return -ENOMEM;
                }
                gspca_dev->urb[n] = urb;
@@ -593,6 +588,10 @@ static int gspca_init_transfer(struct gs
                gspca_dev->sd_desc->start(gspca_dev);
                gspca_dev->streaming = 1;
                atomic_set(&gspca_dev->nevent, 0);
+
+               /* start the bulk transfer is done by the subdriver */
+               if (gspca_dev->bulk)
+                       break;
 
                /* submit the URBs */
                for (n = 0; n < gspca_dev->nurbs; n++) {
diff -r ed5ea7c1bc82 -r e3f4b17fead0 linux/drivers/media/video/gspca/pac207.c
--- a/linux/drivers/media/video/gspca/pac207.c  Mon Sep 08 07:54:27 2008 -0300
+++ b/linux/drivers/media/video/gspca/pac207.c  Wed Sep 10 23:34:19 2008 -0300
@@ -534,6 +534,7 @@ static const __devinitdata struct usb_de
        {USB_DEVICE(0x093a, 0x2470)},
        {USB_DEVICE(0x093a, 0x2471)},
        {USB_DEVICE(0x093a, 0x2472)},
+       {USB_DEVICE(0x093a, 0x2476)},
        {USB_DEVICE(0x2001, 0xf115)},
        {}
 };
diff -r ed5ea7c1bc82 -r e3f4b17fead0 linux/drivers/media/video/gspca/sonixj.c
--- a/linux/drivers/media/video/gspca/sonixj.c  Mon Sep 08 07:54:27 2008 -0300
+++ b/linux/drivers/media/video/gspca/sonixj.c  Wed Sep 10 23:34:19 2008 -0300
@@ -39,6 +39,7 @@ struct sd {
        unsigned char contrast;
        unsigned char colors;
        unsigned char autogain;
+       __u8 vflip;                     /* ov7630 only */
 
        signed char ag_cnt;
 #define AG_CNT_START 13
@@ -70,6 +71,8 @@ static int sd_getcolors(struct gspca_dev
 static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val);
 static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val);
 static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val);
+static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val);
+static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val);
 
 static struct ctrl sd_ctrls[] = {
        {
@@ -131,6 +134,22 @@ static struct ctrl sd_ctrls[] = {
            .set = sd_setautogain,
            .get = sd_getautogain,
        },
+/* ov7630 only */
+#define VFLIP_IDX 4
+       {
+           {
+               .id      = V4L2_CID_VFLIP,
+               .type    = V4L2_CTRL_TYPE_BOOLEAN,
+               .name    = "Vflip",
+               .minimum = 0,
+               .maximum = 1,
+               .step    = 1,
+#define VFLIP_DEF 0
+               .default_value = VFLIP_DEF,
+           },
+           .set = sd_setvflip,
+           .get = sd_getvflip,
+       },
 };
 
 static struct v4l2_pix_format vga_mode[] = {
@@ -450,7 +469,8 @@ static const __u8 ov7630_sensor_init[][8
        {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
        {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
 /*fixme: + 0x12, 0x04*/
-       {0xa1, 0x21, 0x75, 0x82, 0x00, 0x00, 0x00, 0x10},
+/*     {0xa1, 0x21, 0x75, 0x82, 0x00, 0x00, 0x00, 0x10},  * COMN
+                                                        * set by setvflip */
        {0xa1, 0x21, 0x10, 0x32, 0x00, 0x00, 0x00, 0x10},
        {0xa1, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
        {0xb1, 0x21, 0x01, 0x80, 0x80, 0x00, 0x00, 0x10},
@@ -972,6 +992,8 @@ static int sd_config(struct gspca_dev *g
                gspca_dev->ctrl_dis = (1 << AUTOGAIN_IDX);
                break;
        }
+       if (sd->sensor != SENSOR_OV7630)
+               gspca_dev->ctrl_dis |= (1 << VFLIP_IDX);
 
        return 0;
 }
@@ -1198,6 +1220,14 @@ static void setautogain(struct gspca_dev
                sd->ag_cnt = AG_CNT_START;
        else
                sd->ag_cnt = -1;
+}
+
+static void setvflip(struct sd *sd)
+{
+       if (sd->sensor != SENSOR_OV7630)
+               return;
+       i2c_w1(&sd->gspca_dev, 0x75,                    /* COMN */
+               sd->vflip ? 0x82 : 0x02);
 }
 
 /* -- start the camera -- */
@@ -1298,6 +1328,7 @@ static void sd_start(struct gspca_dev *g
                break;
        case SENSOR_OV7630:
                ov7630_InitSensor(gspca_dev);
+               setvflip(sd);
                reg17 = 0xe2;
                reg1 = 0x44;
                break;
@@ -1586,6 +1617,23 @@ static int sd_getautogain(struct gspca_d
        return 0;
 }
 
+static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       sd->vflip = val;
+       setvflip(sd);
+       return 0;
+}
+
+static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       *val = sd->vflip;
+       return 0;
+}
+
 /* sub-driver description */
 static const struct sd_desc sd_desc = {
        .name = MODULE_NAME,
@@ -1607,6 +1655,7 @@ static const __devinitdata struct usb_de
 static const __devinitdata struct usb_device_id device_table[] = {
 #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
        {USB_DEVICE(0x0458, 0x7025), BSI(SN9C120, MI0360, 0x5d)},
+       {USB_DEVICE(0x0458, 0x702e), BSI(SN9C120, OV7660, 0x21)},
        {USB_DEVICE(0x045e, 0x00f5), BSI(SN9C105, OV7660, 0x21)},
        {USB_DEVICE(0x045e, 0x00f7), BSI(SN9C105, OV7660, 0x21)},
        {USB_DEVICE(0x0471, 0x0327), BSI(SN9C105, MI0360, 0x5d)},
diff -r ed5ea7c1bc82 -r e3f4b17fead0 linux/drivers/media/video/gspca/zc3xx.c
--- a/linux/drivers/media/video/gspca/zc3xx.c   Mon Sep 08 07:54:27 2008 -0300
+++ b/linux/drivers/media/video/gspca/zc3xx.c   Wed Sep 10 23:34:19 2008 -0300
@@ -6581,8 +6581,8 @@ static int setlightfreq(struct gspca_dev
                 cs2102_60HZ, cs2102_60HZScale},
 /* SENSOR_CS2102K 1 */
                {cs2102_NoFliker, cs2102_NoFlikerScale,
-                cs2102_50HZ, cs2102_50HZScale,
-                cs2102_60HZ, cs2102_60HZScale},
+                NULL, NULL, /* currently disabled */
+                NULL, NULL},
 /* SENSOR_GC0305 2 */
                {gc0305_NoFliker, gc0305_NoFliker,
                 gc0305_50HZ, gc0305_50HZ,


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/e3f4b17fead05999d37502ea96c16614a2a2a930

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to