The patch number 10328 was added via Mauro Carvalho Chehab <mche...@redhat.com>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        Linux Media Mailing List <linux-me...@vger.kernel.org>

------

From: Mauro Carvalho Chehab  <mche...@redhat.com>
merge: http://linuxtv.org/hg/~dougsland/em28xx/


Priority: normal

Signed-off-by: Mauro Carvalho Chehab <mche...@redhat.com>


---

 linux/Documentation/video4linux/CARDLIST.em28xx |    1 
 linux/drivers/media/video/em28xx/em28xx-audio.c |   33 +++++++++++-----
 linux/drivers/media/video/em28xx/em28xx-cards.c |   26 +++++++++++-
 linux/drivers/media/video/em28xx/em28xx-core.c  |    7 ++-
 linux/drivers/media/video/em28xx/em28xx.h       |    1 
 5 files changed, 54 insertions(+), 14 deletions(-)

diff -r bb3adf352e10 -r 0fa5b943cee9 
linux/Documentation/video4linux/CARDLIST.em28xx
--- a/linux/Documentation/video4linux/CARDLIST.em28xx   Tue Jan 27 22:38:07 
2009 -0200
+++ b/linux/Documentation/video4linux/CARDLIST.em28xx   Tue Jan 27 22:41:52 
2009 -0200
@@ -58,3 +58,4 @@
  58 -> Compro VideoMate ForYou/Stereo           (em2820/em2840) [185b:2041]
  60 -> Hauppauge WinTV HVR 850                  (em2883)        [2040:651f]
  61 -> Pixelview PlayTV Box 4 USB 2.0           (em2820/em2840)
+ 62 -> Gadmei TVR200                            (em2820/em2840)
diff -r bb3adf352e10 -r 0fa5b943cee9 
linux/drivers/media/video/em28xx/em28xx-audio.c
--- a/linux/drivers/media/video/em28xx/em28xx-audio.c   Tue Jan 27 22:38:07 
2009 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-audio.c   Tue Jan 27 22:41:52 
2009 -0200
@@ -62,15 +62,19 @@ static int em28xx_isoc_audio_deinit(stru
        int i;
 
        dprintk("Stopping isoc\n");
-       for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
-               usb_kill_urb(dev->adev.urb[i]);
+       for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
+               if (!irqs_disabled())
+                       usb_kill_urb(dev->adev.urb[i]);
+               else
+                       usb_unlink_urb(dev->adev.urb[i]);
                usb_free_urb(dev->adev.urb[i]);
                dev->adev.urb[i] = NULL;
 
-              kfree(dev->adev.transfer_buffer[i]);
-              dev->adev.transfer_buffer[i] = NULL;
-       }
-
+               kfree(dev->adev.transfer_buffer[i]);
+               dev->adev.transfer_buffer[i] = NULL;
+       }
+
+       dev->isoc_ctl.num_bufs = 0;
        return 0;
 }
 
@@ -175,6 +179,8 @@ static int em28xx_init_audio_isoc(struct
 
        dprintk("Starting isoc transfers\n");
 
+       dev->isoc_ctl.num_bufs = 0;
+
        for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
                struct urb *urb;
                int j, k;
@@ -216,10 +222,19 @@ static int em28xx_init_audio_isoc(struct
        for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
                errCode = usb_submit_urb(dev->adev.urb[i], GFP_ATOMIC);
                if (errCode) {
-                       em28xx_isoc_audio_deinit(dev);
+                       if (dev->isoc_ctl.num_bufs == 0) {
+                               usb_free_urb(dev->adev.urb[i]);
+                               dev->adev.urb[i] = NULL;
+                               kfree(dev->adev.transfer_buffer[i]);
+                               dev->adev.transfer_buffer[i] = NULL;
+                       } else
+                               em28xx_isoc_audio_deinit(dev);
 
                        return errCode;
                }
+               mutex_lock(&dev->lock);
+               dev->isoc_ctl.num_bufs++;
+               mutex_unlock(&dev->lock);
        }
 
        return 0;
@@ -467,9 +482,9 @@ static snd_pcm_uframes_t snd_em28xx_capt
        snd_pcm_uframes_t hwptr_done;
 
        dev = snd_pcm_substream_chip(substream);
-       spin_lock_irqsave(&dev->adev.slock, flags);
+       spin_lock_irqsave(&dev->adev.slock, flags);
        hwptr_done = dev->adev.hwptr_done_capture;
-       spin_unlock_irqrestore(&dev->adev.slock, flags);
+       spin_unlock_irqrestore(&dev->adev.slock, flags);
 
        return hwptr_done;
 }
diff -r bb3adf352e10 -r 0fa5b943cee9 
linux/drivers/media/video/em28xx/em28xx-cards.c
--- a/linux/drivers/media/video/em28xx/em28xx-cards.c   Tue Jan 27 22:38:07 
2009 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-cards.c   Tue Jan 27 22:41:52 
2009 -0200
@@ -187,6 +187,25 @@ struct em28xx_board em28xx_boards[] = {
                .tda9887_conf = TDA9887_PRESENT,
                .decoder      = EM28XX_SAA711X,
                .input        = { {
+                       .type     = EM28XX_VMUX_COMPOSITE1,
+                       .vmux     = SAA7115_COMPOSITE0,
+                       .amux     = EM28XX_AMUX_LINE_IN,
+               }, {
+                       .type     = EM28XX_VMUX_SVIDEO,
+                       .vmux     = SAA7115_SVIDEO3,
+                       .amux     = EM28XX_AMUX_LINE_IN,
+               } },
+       },
+       [EM2820_BOARD_GADMEI_TVR200] = {
+               .name         = "Gadmei TVR200",
+               .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
+               .tda9887_conf = TDA9887_PRESENT,
+               .decoder      = EM28XX_SAA711X,
+               .input        = { {
+                       .type     = EM28XX_VMUX_TELEVISION,
+                       .vmux     = SAA7115_COMPOSITE2,
+                       .amux     = EM28XX_AMUX_LINE_IN,
+               }, {
                        .type     = EM28XX_VMUX_COMPOSITE1,
                        .vmux     = SAA7115_COMPOSITE0,
                        .amux     = EM28XX_AMUX_LINE_IN,
@@ -1418,6 +1437,7 @@ static struct em28xx_hash_table em28xx_i
        {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
        {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
        {0x1ba50080, EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA, TUNER_ABSENT},
+       {0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
 };
 
 int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
@@ -1679,7 +1699,7 @@ static int em28xx_hint_board(struct em28
                        em28xx_errdev("If the board were missdetected, "
                                      "please email this log to:\n");
                        em28xx_errdev("\tV4L Mailing List "
-                                     " <video4linux-l...@redhat.com>\n");
+                                     " <linux-me...@vger.kernel.org>\n");
                        em28xx_errdev("Board detected as %s\n",
                                      em28xx_boards[dev->model].name);
 
@@ -1711,7 +1731,7 @@ static int em28xx_hint_board(struct em28
                        em28xx_errdev("If the board were missdetected, "
                                      "please email this log to:\n");
                        em28xx_errdev("\tV4L Mailing List "
-                                     " <video4linux-l...@redhat.com>\n");
+                                     " <linux-me...@vger.kernel.org>\n");
                        em28xx_errdev("Board detected as %s\n",
                                      em28xx_boards[dev->model].name);
 
@@ -1724,7 +1744,7 @@ static int em28xx_hint_board(struct em28
        em28xx_errdev("You may try to use card=<n> insmod option to "
                      "workaround that.\n");
        em28xx_errdev("Please send an email with this log to:\n");
-       em28xx_errdev("\tV4L Mailing List <video4linux-l...@redhat.com>\n");
+       em28xx_errdev("\tV4L Mailing List <linux-me...@vger.kernel.org>\n");
        em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash);
        em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash);
 
diff -r bb3adf352e10 -r 0fa5b943cee9 
linux/drivers/media/video/em28xx/em28xx-core.c
--- a/linux/drivers/media/video/em28xx/em28xx-core.c    Tue Jan 27 22:38:07 
2009 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-core.c    Tue Jan 27 22:41:52 
2009 -0200
@@ -869,8 +869,11 @@ void em28xx_uninit_isoc(struct em28xx *d
        for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
                urb = dev->isoc_ctl.urb[i];
                if (urb) {
-                       usb_kill_urb(urb);
-                       usb_unlink_urb(urb);
+                       if (!irqs_disabled())
+                               usb_kill_urb(urb);
+                       else
+                               usb_unlink_urb(urb);
+
                        if (dev->isoc_ctl.transfer_buffer[i]) {
                                usb_buffer_free(dev->udev,
                                        urb->transfer_buffer_length,
diff -r bb3adf352e10 -r 0fa5b943cee9 linux/drivers/media/video/em28xx/em28xx.h
--- a/linux/drivers/media/video/em28xx/em28xx.h Tue Jan 27 22:38:07 2009 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx.h Tue Jan 27 22:41:52 2009 -0200
@@ -99,6 +99,7 @@
 #define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU     58
 #define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850     60
 #define EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2    61
+#define EM2820_BOARD_GADMEI_TVR200               62
 
 /* Limits minimum and default number of buffers */
 #define EM28XX_MIN_BUF 4


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/0fa5b943cee9045071a84b8491c51a6c5b4f2706

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to