[PATCH] V4L: 920: fixed autodetection of max size by if alternate setting
authorMauro Carvalho Chehab <mchehab@brturbo.com.br>
Wed, 9 Nov 2005 05:38:52 +0000 (21:38 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Wed, 9 Nov 2005 15:56:31 +0000 (07:56 -0800)
- Fixed autodetection of max size by if alternate setting
- Fixed some debug messages

Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/media/video/em28xx/em28xx-core.c
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/em28xx/em28xx.h

index 5cc850666fd7236bec0b68fc518b92e718abecc7..d54bc0127484547f4908bd3695da352e35b5b947 100644 (file)
@@ -797,20 +797,19 @@ int em28xx_set_alternate(struct em28xx *dev)
        dev->alt = alt;
        if (dev->alt == 0) {
                int i;
-               for(i=0;i< EM28XX_MAX_ALT; i++)
+               for(i=0;i< dev->num_alt; i++)
                        if(dev->alt_max_pkt_size[i]>dev->alt_max_pkt_size[dev->alt])
                                dev->alt=i;
        }
 
        if (dev->alt != prev_alt) {
                dev->max_pkt_size = dev->alt_max_pkt_size[dev->alt];
-               em28xx_coredbg("setting alternate %d with wMaxPacketSize=%u", dev->alt,
+               em28xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n", dev->alt,
                       dev->max_pkt_size);
                errCode = usb_set_interface(dev->udev, 0, dev->alt);
                if (errCode < 0) {
-                       em28xx_errdev
-                                       ("cannot change alternate number to %d (error=%i)\n",
-                                        dev->alt, errCode);
+                       em28xx_errdev ("cannot change alternate number to %d (error=%i)\n",
+                                                       dev->alt, errCode);
                        return errCode;
                }
        }
index 0bbfce03172d44c833f5ddfb7a7177f7fe7b768e..57c1826b928ef2b35c6379f149cba7c194c4e4ff 100644 (file)
@@ -53,8 +53,7 @@ MODULE_LICENSE("GPL");
 
 static LIST_HEAD(em28xx_devlist);
 
-static unsigned int card[]  = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
-
+static unsigned int card[]     = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
 module_param_array(card,  int, NULL, 0444);
 MODULE_PARM_DESC(card,"card type");
 
@@ -1591,7 +1590,6 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
        int retval = -ENOMEM;
        int errCode, i;
        unsigned int maxh, maxw;
-       struct usb_interface *uif;
 
        dev->udev = udev;
        dev->model = model;
@@ -1651,17 +1649,6 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
        dev->vpic.depth = 16;
        dev->vpic.palette = VIDEO_PALETTE_YUV422;
 
-       /* compute alternate max packet sizes */
-       uif = dev->udev->actconfig->interface[0];
-       dev->alt_max_pkt_size[0] = 0;
-       for (i = 1; i <= EM28XX_MAX_ALT && i < uif->num_altsetting ; i++) {
-               u16 tmp =
-                   le16_to_cpu(uif->altsetting[i].endpoint[1].desc.
-                               wMaxPacketSize);
-               dev->alt_max_pkt_size[i] =
-                   (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
-       }
-
 #ifdef CONFIG_MODULES
        /* request some modules */
        if (dev->decoder == EM28XX_SAA7113 || dev->decoder == EM28XX_SAA7114)
@@ -1756,6 +1743,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
 {
        const struct usb_endpoint_descriptor *endpoint;
        struct usb_device *udev;
+       struct usb_interface *uif;
        struct em28xx *dev = NULL;
        int retval = -ENODEV;
        int model,i,nr,ifnum;
@@ -1795,7 +1783,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
        nr=interface->minor;
 
        if (nr>EM28XX_MAXBOARDS) {
-               printk ("em28xx: Supports only %i em28xx boards.\n",EM28XX_MAXBOARDS);
+               printk (DRIVER_NAME ": Supports only %i em28xx boards.\n",EM28XX_MAXBOARDS);
                return -ENOMEM;
        }
 
@@ -1807,6 +1795,28 @@ static int em28xx_usb_probe(struct usb_interface *interface,
        }
        memset(dev, 0, sizeof(*dev));
 
+       /* compute alternate max packet sizes */
+       uif = udev->actconfig->interface[0];
+
+       dev->num_alt=uif->num_altsetting;
+       printk(DRIVER_NAME ": Alternate settings: %i\n",dev->num_alt);
+//     dev->alt_max_pkt_size = kmalloc(sizeof(*dev->alt_max_pkt_size)*
+       dev->alt_max_pkt_size = kmalloc(32*
+                                               dev->num_alt,GFP_KERNEL);
+       if (dev->alt_max_pkt_size == NULL) {
+               em28xx_err(DRIVER_NAME ": out of memory!\n");
+               return -ENOMEM;
+       }
+
+       for (i = 0; i < dev->num_alt ; i++) {
+               u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[1].desc.
+                                                       wMaxPacketSize);
+               dev->alt_max_pkt_size[i] =
+                   (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
+               printk(DRIVER_NAME ": Alternate setting %i, max size= %i\n",i,
+                                                       dev->alt_max_pkt_size[i]);
+       }
+
        snprintf(dev->name, 29, "em28xx #%d", nr);
 
        if ((card[nr]>=0)&&(card[nr]<em28xx_bcount))
@@ -1876,11 +1886,12 @@ static void em28xx_usb_disconnect(struct usb_interface *interface)
 
        up(&dev->lock);
 
-       if (!dev->users)
+       if (!dev->users) {
+               kfree(dev->alt_max_pkt_size);
                kfree(dev);
+       }
 
        up_write(&em28xx_disconnect);
-
 }
 
 static struct usb_driver em28xx_usb_driver = {
index d51f8c63bcf944551561dbb81034616da875c83a..5c7a41ce69f37c69daaa441134a4c0fab301f304 100644 (file)
@@ -63,7 +63,6 @@
 
 /* default alternate; 0 means choose the best */
 #define EM28XX_PINOUT 0
-#define EM28XX_MAX_ALT 7
 
 #define EM28XX_INTERLACED_DEFAULT 1
 
@@ -267,7 +266,8 @@ struct em28xx {
        struct usb_device *udev;        /* the usb device */
        int alt;                /* alternate */
        int max_pkt_size;       /* max packet size of isoc transaction */
-       unsigned int alt_max_pkt_size[EM28XX_MAX_ALT + 1];      /* array of wMaxPacketSize */
+       int num_alt;            /* Number of alternative settings */
+       unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */
        struct urb *urb[EM28XX_NUM_BUFS];       /* urb for isoc transfers */
        char *transfer_buffer[EM28XX_NUM_BUFS]; /* transfer buffers for isoc transfer */
        /* helper funcs that call usb_control_msg */