]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/media/video/cpia2/cpia2_usb.c
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
[linux-2.6-omap-h63xx.git] / drivers / media / video / cpia2 / cpia2_usb.c
index f4da029414936bf43551077e7911b78bc5ed8cb8..a8a199047cbde4c448dbfb736beedbb78d3c4e08 100644 (file)
@@ -49,7 +49,7 @@ static int frame_sizes[] = {
 #define FRAME_SIZE_PER_DESC   frame_sizes[cam->cur_alt]
 
 static void process_frame(struct camera_data *cam);
-static void cpia2_usb_complete(struct urb *urb, struct pt_regs *);
+static void cpia2_usb_complete(struct urb *urb);
 static int cpia2_usb_probe(struct usb_interface *intf,
                           const struct usb_device_id *id);
 static void cpia2_usb_disconnect(struct usb_interface *intf);
@@ -84,7 +84,7 @@ static struct usb_driver cpia2_driver = {
  *****************************************************************************/
 static void process_frame(struct camera_data *cam)
 {
-       static int frame_count = 0;
+       static int frame_count;
 
        unsigned char *inbuff = cam->workbuff->data;
 
@@ -199,7 +199,7 @@ static void add_COM(struct camera_data *cam)
  *
  *  callback when incoming packet is received
  *****************************************************************************/
-static void cpia2_usb_complete(struct urb *urb, struct pt_regs *regs)
+static void cpia2_usb_complete(struct urb *urb)
 {
        int i;
        unsigned char *cdata;
@@ -632,7 +632,7 @@ int cpia2_usb_transfer_cmd(struct camera_data *cam,
 static int submit_urbs(struct camera_data *cam)
 {
        struct urb *urb;
-       int fx, err, i;
+       int fx, err, i, j;
 
        for(i=0; i<NUM_SBUF; ++i) {
                if (cam->sbuf[i].data)
@@ -640,6 +640,10 @@ static int submit_urbs(struct camera_data *cam)
                cam->sbuf[i].data =
                    kmalloc(FRAMES_PER_DESC * FRAME_SIZE_PER_DESC, GFP_KERNEL);
                if (!cam->sbuf[i].data) {
+                       while (--i >= 0) {
+                               kfree(cam->sbuf[i].data);
+                               cam->sbuf[i].data = NULL;
+                       }
                        return -ENOMEM;
                }
        }
@@ -653,6 +657,9 @@ static int submit_urbs(struct camera_data *cam)
                }
                urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL);
                if (!urb) {
+                       ERR("%s: usb_alloc_urb error!\n", __func__);
+                       for (j = 0; j < i; j++)
+                               usb_free_urb(cam->sbuf[j].urb);
                        return -ENOMEM;
                }