]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/media/video/gspca/stv06xx/stv06xx_pb0100.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / media / video / gspca / stv06xx / stv06xx_pb0100.c
index 285221e6b3908995e157fe3839b2d0f8f1621077..ac47b4c9438874af6c7038d0d8516f17347b1b58 100644 (file)
@@ -208,11 +208,24 @@ static int pb0100_probe(struct sd *sd)
 
 static int pb0100_start(struct sd *sd)
 {
-       int err;
+       int err, packet_size, max_packet_size;
+       struct usb_host_interface *alt;
+       struct usb_interface *intf;
        struct cam *cam = &sd->gspca_dev.cam;
        s32 *sensor_settings = sd->sensor_priv;
        u32 mode = cam->cam_mode[sd->gspca_dev.curr_mode].priv;
 
+       intf = usb_ifnum_to_if(sd->gspca_dev.dev, sd->gspca_dev.iface);
+       alt = usb_altnum_to_altsetting(intf, sd->gspca_dev.alt);
+       packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
+
+       /* If we don't have enough bandwidth use a lower framerate */
+       max_packet_size = sd->sensor->max_packet_size[sd->gspca_dev.curr_mode];
+       if (packet_size < max_packet_size)
+               stv06xx_write_sensor(sd, PB_ROWSPEED, BIT(4)|BIT(3)|BIT(1));
+       else
+               stv06xx_write_sensor(sd, PB_ROWSPEED, BIT(5)|BIT(3)|BIT(1));
+
        /* Setup sensor window */
        if (mode & PB0100_CROP_TO_VGA) {
                stv06xx_write_sensor(sd, PB_RSTART, 30);
@@ -328,9 +341,6 @@ static int pb0100_init(struct sd *sd)
        stv06xx_write_bridge(sd, STV_REG03, 0x45);
        stv06xx_write_bridge(sd, STV_REG04, 0x07);
 
-       /* ISO-Size (0x27b: 635... why? - HDCS uses 847) */
-       stv06xx_write_bridge(sd, STV_ISO_SIZE_L, 847);
-
        /* Scan/timing for the sensor */
        stv06xx_write_sensor(sd, PB_ROWSPEED, BIT(4)|BIT(3)|BIT(1));
        stv06xx_write_sensor(sd, PB_CFILLIN, 14);