aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <m.chehab@samsung.com>2013-12-28 09:47:16 -0500
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-01-10 03:00:25 -0500
commit46c704d77f785974ce095b6cf0c71b92d1b06706 (patch)
treef9223fc9a4ec37674dbb77e3d8175f0b5617a2cb /drivers/media
parentdad4c41827c71a84c8455e19431278e8c1edf118 (diff)
[media] em28xx: use usb_alloc_coherent() for audio
Instead of allocating transfer buffers with kmalloc() use usb_alloc_coherent(). This patch should make it work also with ARM CPUs. Reviewed-by: Frank Schäfer <fschaefer.oss@googlemail.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/usb/em28xx/em28xx-audio.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/drivers/media/usb/em28xx/em28xx-audio.c b/drivers/media/usb/em28xx/em28xx-audio.c
index a6eef06ffdcd..e5120430ec80 100644
--- a/drivers/media/usb/em28xx/em28xx-audio.c
+++ b/drivers/media/usb/em28xx/em28xx-audio.c
@@ -64,16 +64,22 @@ static int em28xx_deinit_isoc_audio(struct em28xx *dev)
64 64
65 dprintk("Stopping isoc\n"); 65 dprintk("Stopping isoc\n");
66 for (i = 0; i < EM28XX_AUDIO_BUFS; i++) { 66 for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
67 struct urb *urb = dev->adev.urb[i];
68
67 if (!irqs_disabled()) 69 if (!irqs_disabled())
68 usb_kill_urb(dev->adev.urb[i]); 70 usb_kill_urb(urb);
69 else 71 else
70 usb_unlink_urb(dev->adev.urb[i]); 72 usb_unlink_urb(urb);
71 73
72 usb_free_urb(dev->adev.urb[i]); 74 usb_free_coherent(dev->udev,
73 dev->adev.urb[i] = NULL; 75 urb->transfer_buffer_length,
76 dev->adev.transfer_buffer[i],
77 urb->transfer_dma);
74 78
75 kfree(dev->adev.transfer_buffer[i]);
76 dev->adev.transfer_buffer[i] = NULL; 79 dev->adev.transfer_buffer[i] = NULL;
80
81 usb_free_urb(urb);
82 dev->adev.urb[i] = NULL;
77 } 83 }
78 84
79 return 0; 85 return 0;
@@ -176,12 +182,8 @@ static int em28xx_init_audio_isoc(struct em28xx *dev)
176 for (i = 0; i < EM28XX_AUDIO_BUFS; i++) { 182 for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
177 struct urb *urb; 183 struct urb *urb;
178 int j, k; 184 int j, k;
185 void *buf;
179 186
180 dev->adev.transfer_buffer[i] = kmalloc(sb_size, GFP_ATOMIC);
181 if (!dev->adev.transfer_buffer[i])
182 return -ENOMEM;
183
184 memset(dev->adev.transfer_buffer[i], 0x80, sb_size);
185 urb = usb_alloc_urb(EM28XX_NUM_AUDIO_PACKETS, GFP_ATOMIC); 187 urb = usb_alloc_urb(EM28XX_NUM_AUDIO_PACKETS, GFP_ATOMIC);
186 if (!urb) { 188 if (!urb) {
187 em28xx_errdev("usb_alloc_urb failed!\n"); 189 em28xx_errdev("usb_alloc_urb failed!\n");
@@ -192,10 +194,17 @@ static int em28xx_init_audio_isoc(struct em28xx *dev)
192 return -ENOMEM; 194 return -ENOMEM;
193 } 195 }
194 196
197 buf = usb_alloc_coherent(dev->udev, sb_size, GFP_ATOMIC,
198 &urb->transfer_dma);
199 if (!buf)
200 return -ENOMEM;
201 dev->adev.transfer_buffer[i] = buf;
202 memset(buf, 0x80, sb_size);
203
195 urb->dev = dev->udev; 204 urb->dev = dev->udev;
196 urb->context = dev; 205 urb->context = dev;
197 urb->pipe = usb_rcvisocpipe(dev->udev, EM28XX_EP_AUDIO); 206 urb->pipe = usb_rcvisocpipe(dev->udev, EM28XX_EP_AUDIO);
198 urb->transfer_flags = URB_ISO_ASAP; 207 urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
199 urb->transfer_buffer = dev->adev.transfer_buffer[i]; 208 urb->transfer_buffer = dev->adev.transfer_buffer[i];
200 urb->interval = 1; 209 urb->interval = 1;
201 urb->complete = em28xx_audio_isocirq; 210 urb->complete = em28xx_audio_isocirq;