The patch number 10163 was added via Mauro Carvalho Chehab <[email protected]>
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:
        [email protected]

------

From: Mauro Carvalho Chehab  <[email protected]>
em28xx: allocate adev together with struct em28xx dev


Some devices require different setups on struct_audio. Due to that, we
may need to change some fields at dev.adev during device probe. So, this
patch moves the dynamic memory allocation of adev at em28xx-alsa to the
dynamic allocation of struct em28xx dev that happens during device
probe.

Priority: normal

Signed-off-by: Mauro Carvalho Chehab <[email protected]>


---

 linux/drivers/media/video/em28xx/em28xx-audio.c |   97 +++++++---------
 linux/drivers/media/video/em28xx/em28xx.h       |    2 
 2 files changed, 45 insertions(+), 54 deletions(-)

diff -r 87d1334f096b -r 9d9288bed20b 
linux/drivers/media/video/em28xx/em28xx-audio.c
--- a/linux/drivers/media/video/em28xx/em28xx-audio.c   Wed Dec 31 10:34:18 
2008 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx-audio.c   Wed Dec 31 10:37:33 
2008 -0200
@@ -63,9 +63,9 @@ static int em28xx_isoc_audio_deinit(stru
 
        dprintk("Stopping isoc\n");
        for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
-               usb_unlink_urb(dev->adev->urb[i]);
-               usb_free_urb(dev->adev->urb[i]);
-               dev->adev->urb[i] = NULL;
+               usb_unlink_urb(dev->adev.urb[i]);
+               usb_free_urb(dev->adev.urb[i]);
+               dev->adev.urb[i] = NULL;
        }
 
        return 0;
@@ -94,8 +94,8 @@ static void em28xx_audio_isocirq(struct 
        struct snd_pcm_substream *substream;
        struct snd_pcm_runtime   *runtime;
 #endif
-       if (dev->adev->capture_pcm_substream) {
-               substream = dev->adev->capture_pcm_substream;
+       if (dev->adev.capture_pcm_substream) {
+               substream = dev->adev.capture_pcm_substream;
                runtime = substream->runtime;
                stride = runtime->frame_bits >> 3;
 
@@ -109,9 +109,9 @@ static void em28xx_audio_isocirq(struct 
                                continue;
 
 #ifdef NO_PCM_LOCK
-                       spin_lock_irqsave(&dev->adev->slock, flags);
-#endif
-                       oldptr = dev->adev->hwptr_done_capture;
+                       spin_lock_irqsave(&dev->adev.slock, flags);
+#endif
+                       oldptr = dev->adev.hwptr_done_capture;
                        if (oldptr + length >= runtime->buffer_size) {
                                unsigned int cnt =
                                    runtime->buffer_size - oldptr;
@@ -128,22 +128,22 @@ static void em28xx_audio_isocirq(struct 
                        snd_pcm_stream_lock(substream);
 #endif
 
-                       dev->adev->hwptr_done_capture += length;
-                       if (dev->adev->hwptr_done_capture >=
+                       dev->adev.hwptr_done_capture += length;
+                       if (dev->adev.hwptr_done_capture >=
                            runtime->buffer_size)
-                               dev->adev->hwptr_done_capture -=
+                               dev->adev.hwptr_done_capture -=
                                    runtime->buffer_size;
 
-                       dev->adev->capture_transfer_done += length;
-                       if (dev->adev->capture_transfer_done >=
+                       dev->adev.capture_transfer_done += length;
+                       if (dev->adev.capture_transfer_done >=
                            runtime->period_size) {
-                               dev->adev->capture_transfer_done -=
+                               dev->adev.capture_transfer_done -=
                                    runtime->period_size;
                                period_elapsed = 1;
                        }
 
 #ifdef NO_PCM_LOCK
-                       spin_unlock_irqrestore(&dev->adev->slock, flags);
+                       spin_unlock_irqrestore(&dev->adev.slock, flags);
 #else
                        snd_pcm_stream_unlock(substream);
 #endif
@@ -153,7 +153,7 @@ static void em28xx_audio_isocirq(struct 
        }
        urb->status = 0;
 
-       if (dev->adev->shutdown)
+       if (dev->adev.shutdown)
                return;
 
        status = usb_submit_urb(urb, GFP_ATOMIC);
@@ -176,17 +176,17 @@ static int em28xx_init_audio_isoc(struct
                struct urb *urb;
                int j, k;
 
-               dev->adev->transfer_buffer[i] = kmalloc(sb_size, GFP_ATOMIC);
-               if (!dev->adev->transfer_buffer[i])
+               dev->adev.transfer_buffer[i] = kmalloc(sb_size, GFP_ATOMIC);
+               if (!dev->adev.transfer_buffer[i])
                        return -ENOMEM;
 
-               memset(dev->adev->transfer_buffer[i], 0x80, sb_size);
+               memset(dev->adev.transfer_buffer[i], 0x80, sb_size);
                urb = usb_alloc_urb(EM28XX_NUM_AUDIO_PACKETS, GFP_ATOMIC);
                if (!urb) {
                        em28xx_errdev("usb_alloc_urb failed!\n");
                        for (j = 0; j < i; j++) {
-                               usb_free_urb(dev->adev->urb[j]);
-                               kfree(dev->adev->transfer_buffer[j]);
+                               usb_free_urb(dev->adev.urb[j]);
+                               kfree(dev->adev.transfer_buffer[j]);
                        }
                        return -ENOMEM;
                }
@@ -195,7 +195,7 @@ static int em28xx_init_audio_isoc(struct
                urb->context = dev;
                urb->pipe = usb_rcvisocpipe(dev->udev, 0x83);
                urb->transfer_flags = URB_ISO_ASAP;
-               urb->transfer_buffer = dev->adev->transfer_buffer[i];
+               urb->transfer_buffer = dev->adev.transfer_buffer[i];
                urb->interval = 1;
                urb->complete = em28xx_audio_isocirq;
                urb->number_of_packets = EM28XX_NUM_AUDIO_PACKETS;
@@ -207,11 +207,11 @@ static int em28xx_init_audio_isoc(struct
                        urb->iso_frame_desc[j].length =
                            EM28XX_AUDIO_MAX_PACKET_SIZE;
                }
-               dev->adev->urb[i] = urb;
+               dev->adev.urb[i] = urb;
        }
 
        for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
-               errCode = usb_submit_urb(dev->adev->urb[i], GFP_ATOMIC);
+               errCode = usb_submit_urb(dev->adev.urb[i], GFP_ATOMIC);
                if (errCode) {
                        em28xx_isoc_audio_deinit(dev);
 
@@ -224,16 +224,16 @@ static int em28xx_init_audio_isoc(struct
 
 static int em28xx_cmd(struct em28xx *dev, int cmd, int arg)
 {
-       dprintk("%s transfer\n", (dev->adev->capture_stream == STREAM_ON)?
+       dprintk("%s transfer\n", (dev->adev.capture_stream == STREAM_ON) ?
                                 "stop" : "start");
 
        switch (cmd) {
        case EM28XX_CAPTURE_STREAM_EN:
-               if (dev->adev->capture_stream == STREAM_OFF && arg == 1) {
-                       dev->adev->capture_stream = STREAM_ON;
+               if (dev->adev.capture_stream == STREAM_OFF && arg == 1) {
+                       dev->adev.capture_stream = STREAM_ON;
                        em28xx_init_audio_isoc(dev);
-               } else if (dev->adev->capture_stream == STREAM_ON && arg == 0) {
-                       dev->adev->capture_stream = STREAM_OFF;
+               } else if (dev->adev.capture_stream == STREAM_ON && arg == 0) {
+                       dev->adev.capture_stream = STREAM_OFF;
                        em28xx_isoc_audio_deinit(dev);
                } else {
                        printk(KERN_ERR "An underrun very likely occurred. "
@@ -332,17 +332,17 @@ static int snd_em28xx_capture_open(struc
                goto err;
 
        runtime->hw = snd_em28xx_hw_capture;
-       if (dev->alt == 0 && dev->adev->users == 0) {
+       if (dev->alt == 0 && dev->adev.users == 0) {
                int errCode;
                dev->alt = 7;
                errCode = usb_set_interface(dev->udev, 0, 7);
                dprintk("changing alternate number to 7\n");
        }
 
-       dev->adev->users++;
+       dev->adev.users++;
 
        snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
-       dev->adev->capture_pcm_substream = substream;
+       dev->adev.capture_pcm_substream = substream;
        runtime->private_data = dev;
 
        return 0;
@@ -358,7 +358,7 @@ static int snd_em28xx_pcm_close(struct s
 #endif
 {
        struct em28xx *dev = snd_pcm_substream_chip(substream);
-       dev->adev->users--;
+       dev->adev.users--;
 
        dprintk("closing device\n");
 
@@ -367,10 +367,10 @@ static int snd_em28xx_pcm_close(struct s
        em28xx_audio_analog_set(dev);
        mutex_unlock(&dev->lock);
 
-       if (dev->adev->users == 0 && dev->adev->shutdown == 1) {
-               dprintk("audio users: %d\n", dev->adev->users);
+       if (dev->adev.users == 0 && dev->adev.shutdown == 1) {
+               dprintk("audio users: %d\n", dev->adev.users);
                dprintk("disabling audio stream!\n");
-               dev->adev->shutdown = 0;
+               dev->adev.shutdown = 0;
                dprintk("released lock\n");
                em28xx_cmd(dev, EM28XX_CAPTURE_STREAM_EN, 0);
        }
@@ -412,7 +412,7 @@ static int snd_em28xx_hw_capture_free(st
 
        dprintk("Stop capture, if needed\n");
 
-       if (dev->adev->capture_stream == STREAM_ON)
+       if (dev->adev.capture_stream == STREAM_ON)
                em28xx_cmd(dev, EM28XX_CAPTURE_STREAM_EN, 0);
 
        return 0;
@@ -443,7 +443,7 @@ static int snd_em28xx_capture_trigger(st
                em28xx_cmd(dev, EM28XX_CAPTURE_STREAM_EN, 1);
                return 0;
        case SNDRV_PCM_TRIGGER_STOP:
-               dev->adev->shutdown = 1;
+               dev->adev.shutdown = 1;
                return 0;
        default:
                return -EINVAL;
@@ -462,7 +462,7 @@ static snd_pcm_uframes_t snd_em28xx_capt
 
        snd_pcm_uframes_t hwptr_done;
        dev = snd_pcm_substream_chip(substream);
-       hwptr_done = dev->adev->hwptr_done_capture;
+       hwptr_done = dev->adev.hwptr_done_capture;
 
        return hwptr_done;
 }
@@ -498,7 +498,7 @@ static struct snd_pcm_ops snd_em28xx_pcm
 
 static int em28xx_audio_init(struct em28xx *dev)
 {
-       struct em28xx_audio *adev;
+       struct em28xx_audio *adev = &dev->adev;
 #if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 16)
        snd_pcm_t           *pcm;
        snd_card_t          *card;
@@ -521,16 +521,9 @@ static int em28xx_audio_init(struct em28
        printk(KERN_INFO "em28xx-audio.c: Copyright (C) 2006 Markus "
                         "Rechberger\n");
 
-       adev = kzalloc(sizeof(*adev), GFP_KERNEL);
-       if (!adev) {
-               printk(KERN_ERR "em28xx-audio.c: out of memory\n");
-               return -1;
-       }
        card = snd_card_new(index[devnr], "Em28xx Audio", THIS_MODULE, 0);
-       if (card == NULL) {
-               kfree(adev);
+       if (card == NULL)
                return -ENOMEM;
-       }
 
        spin_lock_init(&adev->slock);
        err = snd_pcm_new(card, "Em28xx Audio", 0, 0, 1, &pcm);
@@ -554,7 +547,6 @@ static int em28xx_audio_init(struct em28
        }
        adev->sndcard = card;
        adev->udev = dev->udev;
-       dev->adev = adev;
 
        return 0;
 }
@@ -571,10 +563,9 @@ static int em28xx_audio_fini(struct em28
                return 0;
        }
 
-       if (dev->adev) {
-               snd_card_free(dev->adev->sndcard);
-               kfree(dev->adev);
-               dev->adev = NULL;
+       if (dev->adev.sndcard) {
+               snd_card_free(dev->adev.sndcard);
+               dev->adev.sndcard = NULL;
        }
 
        return 0;
diff -r 87d1334f096b -r 9d9288bed20b linux/drivers/media/video/em28xx/em28xx.h
--- a/linux/drivers/media/video/em28xx/em28xx.h Wed Dec 31 10:34:18 2008 -0200
+++ b/linux/drivers/media/video/em28xx/em28xx.h Wed Dec 31 10:37:33 2008 -0200
@@ -482,7 +482,7 @@ struct em28xx {
        unsigned long i2c_hash; /* i2c devicelist hash -
                                   for boards with generic ID */
 
-       struct em28xx_audio *adev;
+       struct em28xx_audio adev;
 
        /* states */
        enum em28xx_dev_state state;


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/9d9288bed20b5ab422d8214ad937f0e07a6029dc

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to