diff options
author | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2013-12-28 09:47:16 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-01-10 03:00:25 -0500 |
commit | 46c704d77f785974ce095b6cf0c71b92d1b06706 (patch) | |
tree | f9223fc9a4ec37674dbb77e3d8175f0b5617a2cb /drivers/media | |
parent | dad4c41827c71a84c8455e19431278e8c1edf118 (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.c | 31 |
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; |