[media] easycap: use usb_kill_urb wrapper functions
authorTomas Winkler <tomas.winkler@intel.com>
Wed, 9 Nov 2011 11:26:37 +0000 (08:26 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 24 Nov 2011 21:16:22 +0000 (19:16 -0200)
1. kill_video_usb can be used in all places where video urbs are killed
and reduce code repetition

2. remove unnecessary check for easycap == NULL in the function
as it is always checked by the calling function

3. rename the function to easycap_video_kill_urb to reduce
possibility of name conflict

4. implement also easycap_audio_kill_urb

5. simplify freeing urbs

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/staging/media/easycap/easycap.h
drivers/staging/media/easycap/easycap_ioctl.c
drivers/staging/media/easycap/easycap_main.c
drivers/staging/media/easycap/easycap_sound.c

index 899e5720546bb9184bd66387d049c6daaf6e457e..1d98d3167d7465c0e591370f0fe39958f095312e 100644 (file)
@@ -472,7 +472,7 @@ struct easycap {
 long easycap_unlocked_ioctl(struct file *, unsigned int, unsigned long);
 int easycap_dqbuf(struct easycap *, int);
 int submit_video_urbs(struct easycap *);
-int kill_video_urbs(struct easycap *);
+int easycap_video_kill_urbs(struct easycap *);
 void easycap_testcard(struct easycap *, int);
 int fillin_formats(void);
 int newinput(struct easycap *, int);
@@ -489,6 +489,7 @@ int adjust_hue(struct easycap *, int);
  */
 /*---------------------------------------------------------------------------*/
 int easycap_alsa_probe(struct easycap *);
+int easycap_audio_kill_urbs(struct easycap *);
 void easycap_alsa_complete(struct urb *);
 int audio_setup(struct easycap *);
 /*---------------------------------------------------------------------------*/
index ccab5cace2407d41874a2c7e51113a95fc1e8047..90d4384f2d156ff5c469c5e4be34996ba5edab6c 100644 (file)
@@ -124,7 +124,7 @@ int adjust_standard(struct easycap *peasycap, v4l2_std_id std_id)
        }
        if (peasycap->video_isoc_streaming) {
                resubmit = true;
-               kill_video_urbs(peasycap);
+               easycap_video_kill_urbs(peasycap);
        } else
                resubmit = false;
 /*--------------------------------------------------------------------------*/
@@ -557,7 +557,7 @@ int adjust_format(struct easycap *peasycap,
                peasycap->bytesperpixel * peasycap->width * peasycap->height;
        if (peasycap->video_isoc_streaming) {
                resubmit = true;
-               kill_video_urbs(peasycap);
+               easycap_video_kill_urbs(peasycap);
        } else
                resubmit = false;
 /*---------------------------------------------------------------------------*/
index 8da1682aa64e94de9972170618555374ab74ec74..c147c61caf90ab9bbefd9655711fc565346b6309 100644 (file)
@@ -401,7 +401,7 @@ newinput(struct easycap *peasycap, int input)
        peasycap->audio_idle = 1;
        if (peasycap->video_isoc_streaming) {
                resubmit = true;
-               kill_video_urbs(peasycap);
+               easycap_video_kill_urbs(peasycap);
        } else {
                resubmit = false;
        }
@@ -620,43 +620,53 @@ int submit_video_urbs(struct easycap *peasycap)
                        peasycap->video_eof = 1;
                }
 
-               if (isbad) {
-                       JOM(4, "attempting cleanup instead of submitting\n");
-                       list_for_each(plist_head, (peasycap->purb_video_head)) {
-                               pdata_urb = list_entry(plist_head,
-                                               struct data_urb, list_head);
-                               if (pdata_urb) {
-                                       purb = pdata_urb->purb;
-                                       if (purb)
-                                               usb_kill_urb(purb);
-                               }
-                       }
-                       peasycap->video_isoc_streaming = 0;
-               } else {
+               if (isbad)
+                       easycap_video_kill_urbs(peasycap);
+               else
                        peasycap->video_isoc_streaming = 1;
-                       JOM(4, "submitted %i video urbs\n", m);
-               }
        } else {
                JOM(4, "already streaming video urbs\n");
        }
        return 0;
 }
 /*****************************************************************************/
-int kill_video_urbs(struct easycap *peasycap)
+int easycap_audio_kill_urbs(struct easycap *peasycap)
 {
        int m;
        struct list_head *plist_head;
        struct data_urb *pdata_urb;
 
-       if (!peasycap) {
-               SAY("ERROR: peasycap is NULL\n");
+       if (!peasycap->audio_isoc_streaming)
+               return 0;
+
+       if (!peasycap->purb_audio_head) {
+               SAM("ERROR: peasycap->purb_audio_head is NULL\n");
                return -EFAULT;
        }
-       if (!peasycap->video_isoc_streaming) {
-               JOM(8, "%i=video_isoc_streaming, no video urbs killed\n",
-                       peasycap->video_isoc_streaming);
-               return 0;
+
+       peasycap->audio_isoc_streaming = 0;
+       m = 0;
+       list_for_each(plist_head, peasycap->purb_audio_head) {
+               pdata_urb = list_entry(plist_head, struct data_urb, list_head);
+               if (pdata_urb && pdata_urb->purb) {
+                       usb_kill_urb(pdata_urb->purb);
+                       m++;
+               }
        }
+
+       JOM(4, "%i audio urbs killed\n", m);
+
+       return 0;
+}
+int easycap_video_kill_urbs(struct easycap *peasycap)
+{
+       int m;
+       struct list_head *plist_head;
+       struct data_urb *pdata_urb;
+
+       if (!peasycap->video_isoc_streaming)
+               return 0;
+
        if (!peasycap->purb_video_head) {
                SAM("ERROR: peasycap->purb_video_head is NULL\n");
                return -EFAULT;
@@ -694,8 +704,8 @@ static int videodev_release(struct video_device *pvideo_device)
                SAY("ending unsuccessfully\n");
                return -EFAULT;
        }
-       if (0 != kill_video_urbs(peasycap)) {
-               SAM("ERROR: kill_video_urbs() failed\n");
+       if (easycap_video_kill_urbs(peasycap)) {
+               SAM("ERROR: easycap_video_kill_urbs() failed\n");
                return -EFAULT;
        }
        JOM(4, "ending successfully\n");
@@ -738,20 +748,15 @@ static void easycap_delete(struct kref *pkref)
  */
 /*---------------------------------------------------------------------------*/
        if (peasycap->purb_video_head) {
-               JOM(4, "freeing video urbs\n");
                m = 0;
-               list_for_each(plist_head, (peasycap->purb_video_head)) {
+               list_for_each(plist_head, peasycap->purb_video_head) {
                        pdata_urb = list_entry(plist_head,
                                                struct data_urb, list_head);
-                       if (!pdata_urb) {
-                               JOM(4, "ERROR: pdata_urb is NULL\n");
-                       } else {
-                               if (pdata_urb->purb) {
-                                       usb_free_urb(pdata_urb->purb);
-                                       pdata_urb->purb = NULL;
-                                       peasycap->allocation_video_urb -= 1;
-                                       m++;
-                               }
+                       if (pdata_urb && pdata_urb->purb) {
+                               usb_free_urb(pdata_urb->purb);
+                               pdata_urb->purb = NULL;
+                               peasycap->allocation_video_urb--;
+                               m++;
                        }
                }
 
@@ -767,7 +772,6 @@ static void easycap_delete(struct kref *pkref)
                                peasycap->allocation_video_struct -=
                                                sizeof(struct data_urb);
                                kfree(pdata_urb);
-                               pdata_urb = NULL;
                                m++;
                        }
                }
@@ -832,15 +836,11 @@ static void easycap_delete(struct kref *pkref)
                list_for_each(plist_head, (peasycap->purb_audio_head)) {
                        pdata_urb = list_entry(plist_head,
                                        struct data_urb, list_head);
-                       if (!pdata_urb)
-                               JOM(4, "ERROR: pdata_urb is NULL\n");
-                       else {
-                               if (pdata_urb->purb) {
-                                       usb_free_urb(pdata_urb->purb);
-                                       pdata_urb->purb = NULL;
-                                       peasycap->allocation_audio_urb -= 1;
-                                       m++;
-                               }
+                       if (pdata_urb && pdata_urb->purb) {
+                               usb_free_urb(pdata_urb->purb);
+                               pdata_urb->purb = NULL;
+                               peasycap->allocation_audio_urb--;
+                               m++;
                        }
                }
                JOM(4, "%i audio urbs freed\n", m);
@@ -855,7 +855,6 @@ static void easycap_delete(struct kref *pkref)
                                peasycap->allocation_audio_struct -=
                                                        sizeof(struct data_urb);
                                kfree(pdata_urb);
-                               pdata_urb = NULL;
                                m++;
                        }
                }
@@ -1084,7 +1083,7 @@ int easycap_dqbuf(struct easycap *peasycap, int mode)
                                        JOM(8, " ... failed  returning -EIO\n");
                                        peasycap->video_eof = 1;
                                        peasycap->audio_eof = 1;
-                                       kill_video_urbs(peasycap);
+                                       easycap_video_kill_urbs(peasycap);
                                        return -EIO;
                                }
                                peasycap->status = 0;
@@ -1094,7 +1093,7 @@ int easycap_dqbuf(struct easycap *peasycap, int mode)
                        #endif /*PERSEVERE*/
                        peasycap->video_eof = 1;
                        peasycap->audio_eof = 1;
-                       kill_video_urbs(peasycap);
+                       easycap_video_kill_urbs(peasycap);
                        JOM(8, "returning -EIO\n");
                        return -EIO;
                }
@@ -1147,7 +1146,7 @@ int easycap_dqbuf(struct easycap *peasycap, int mode)
                                        JOM(8, " ... failed returning -EIO\n");
                                        peasycap->video_eof = 1;
                                        peasycap->audio_eof = 1;
-                                       kill_video_urbs(peasycap);
+                                       easycap_video_kill_urbs(peasycap);
                                        return -EIO;
                                }
                                peasycap->status = 0;
@@ -1157,7 +1156,7 @@ int easycap_dqbuf(struct easycap *peasycap, int mode)
 #endif /*PERSEVERE*/
                        peasycap->video_eof = 1;
                        peasycap->audio_eof = 1;
-                       kill_video_urbs(peasycap);
+                       easycap_video_kill_urbs(peasycap);
                        JOM(8, "returning -EIO\n");
                        return -EIO;
                }
@@ -3969,12 +3968,9 @@ static void easycap_usb_disconnect(struct usb_interface *pusb_interface)
 {
        struct usb_host_interface *pusb_host_interface;
        struct usb_interface_descriptor *pusb_interface_descriptor;
-       u8 bInterfaceNumber;
        struct easycap *peasycap;
-
-       struct list_head *plist_head;
-       struct data_urb *pdata_urb;
-       int minor, m, kd;
+       int minor, kd;
+       u8 bInterfaceNumber;
 
        JOT(4, "\n");
 
@@ -4009,45 +4005,14 @@ static void easycap_usb_disconnect(struct usb_interface *pusb_interface)
        peasycap->audio_eof = 1;
        wake_up_interruptible(&(peasycap->wq_video));
        wake_up_interruptible(&(peasycap->wq_audio));
-/*---------------------------------------------------------------------------*/
+
        switch (bInterfaceNumber) {
-       case 0: {
-               if (peasycap->purb_video_head) {
-                       JOM(4, "killing video urbs\n");
-                       m = 0;
-                       list_for_each(plist_head, peasycap->purb_video_head) {
-                               pdata_urb = list_entry(plist_head,
-                                               struct data_urb, list_head);
-                               if (pdata_urb) {
-                                       if (pdata_urb->purb) {
-                                               usb_kill_urb(pdata_urb->purb);
-                                               m++;
-                                       }
-                               }
-                       }
-                       JOM(4, "%i video urbs killed\n", m);
-               }
+       case 0:
+               easycap_video_kill_urbs(peasycap);
                break;
-       }
-/*---------------------------------------------------------------------------*/
-       case 2: {
-               if (peasycap->purb_audio_head) {
-                       JOM(4, "killing audio urbs\n");
-                       m = 0;
-                       list_for_each(plist_head, peasycap->purb_audio_head) {
-                               pdata_urb = list_entry(plist_head,
-                                               struct data_urb, list_head);
-                               if (pdata_urb) {
-                                       if (pdata_urb->purb) {
-                                               usb_kill_urb(pdata_urb->purb);
-                                               m++;
-                                       }
-                               }
-                       }
-                       JOM(4, "%i audio urbs killed\n", m);
-               }
+       case 2:
+               easycap_audio_kill_urbs(peasycap);
                break;
-       }
        default:
                break;
        }
index 70813a5ef5fe6ca17e4ce53e866dfee030f61103..f7f9a769d5b7a70220e232aea3986882cb77e77e 100644 (file)
@@ -138,18 +138,11 @@ static int submit_audio_urbs(struct easycap *peasycap)
                SAM(".....  possibly inadequate USB bandwidth\n");
                peasycap->audio_eof = 1;
        }
-       if (isbad) {
-               JOM(4, "attempting cleanup instead of submitting\n");
-               list_for_each(plist_head, (peasycap->purb_audio_head)) {
-                       pdata_urb = list_entry(plist_head, struct data_urb, list_head);
-                       if (pdata_urb && pdata_urb->purb)
-                               usb_kill_urb(pdata_urb->purb);
-               }
-               peasycap->audio_isoc_streaming = 0;
-       } else {
+
+       if (isbad)
+               easycap_audio_kill_urbs(peasycap);
+       else
                peasycap->audio_isoc_streaming = m;
-               JOM(4, "submitted %i audio urbs\n", m);
-       }
 
        return 0;
 }