On SXGA mode, alternate setting 8 should be used. However, the gspca
core currently prevents its usage, in order to reserve some bandwidth
for audio. Not sure why, since, at least on this USB 2.0 device, we're
using 480/800 frames only for ISOC transfers (about 60%). So, there's
enough bandwith for audio.

Tested with a GigaWare model 25-234 (using OV9550 sensor), USB ID
0c45:628f.

Cc: sta...@kernel.org
Signed-off-by: Mauro Carvalho Chehab <mche...@redhat.com>

diff --git a/drivers/media/video/gspca/gspca.c 
b/drivers/media/video/gspca/gspca.c
index 0a7af73..b74bfa1 100644
--- a/drivers/media/video/gspca/gspca.c
+++ b/drivers/media/video/gspca/gspca.c
@@ -652,7 +652,7 @@ static struct usb_host_endpoint *get_ep(struct gspca_dev 
*gspca_dev)
                                   : USB_ENDPOINT_XFER_ISOC;
        i = gspca_dev->alt;                     /* previous alt setting */
        if (gspca_dev->cam.reverse_alts) {
-               if (gspca_dev->audio && i < gspca_dev->nbalt - 2)
+               if (!gspca_dev->no_audio_hack && gspca_dev->audio && i < 
gspca_dev->nbalt - 2)
                        i++;
                while (++i < gspca_dev->nbalt) {
                        ep = alt_xfer(&intf->altsetting[i], xfer);
@@ -660,7 +660,7 @@ static struct usb_host_endpoint *get_ep(struct gspca_dev 
*gspca_dev)
                                break;
                }
        } else {
-               if (gspca_dev->audio && i > 1)
+               if (!gspca_dev->no_audio_hack && gspca_dev->audio && i > 1)
                        i--;
                while (--i >= 0) {
                        ep = alt_xfer(&intf->altsetting[i], xfer);
diff --git a/drivers/media/video/gspca/gspca.h 
b/drivers/media/video/gspca/gspca.h
index d4d210b..8f0fcf2 100644
--- a/drivers/media/video/gspca/gspca.h
+++ b/drivers/media/video/gspca/gspca.h
@@ -220,6 +220,7 @@ struct gspca_dev {
        __u8 alt;                       /* USB alternate setting */
        __u8 nbalt;                     /* number of USB alternate settings */
        u8 audio;                       /* presence of audio device */
+       u8 no_audio_hack;               /* Disable audio alternate hack */
 };
 
 int gspca_dev_probe(struct usb_interface *intf,
diff --git a/drivers/media/video/gspca/sn9c20x.c 
b/drivers/media/video/gspca/sn9c20x.c
index e812598..55c7f17 100644
--- a/drivers/media/video/gspca/sn9c20x.c
+++ b/drivers/media/video/gspca/sn9c20x.c
@@ -2031,6 +2031,7 @@ static int sd_init(struct gspca_dev *gspca_dev)
        u8 i2c_init[9] =
                {0x80, sd->i2c_addr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03};
 
+       gspca_dev->no_audio_hack = 1;
        for (i = 0; i < ARRAY_SIZE(bridge_init); i++) {
                value = bridge_init[i][1];
                if (reg_w(gspca_dev, bridge_init[i][0], &value, 1) < 0) {
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to