aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/usb/au0828
diff options
context:
space:
mode:
authorTim Mester <ttmesterr@gmail.com>2014-01-06 23:29:25 -0500
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-01-13 08:11:11 -0500
commitf251b3e78cc57411627d825eae3c911da77b4035 (patch)
treef133f7540fa82534dad782272c2fd2e6afb54d64 /drivers/media/usb/au0828
parent4609981f84a23e8d481502f4728e0fed910abe03 (diff)
[media] au0828: Add option to preallocate digital transfer buffers
Added command line parameter preallocate_big_buffers so that the digital transfer buffers can be allocated when the driver is registered. They do not have to be allocated every time a feed is started. Signed-off-by: Tim Mester <tmester@ieee.org> Acked-by: Devin Heitmueller <dheitmueller@kernellabs.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/usb/au0828')
-rw-r--r--drivers/media/usb/au0828/au0828-core.c13
-rw-r--r--drivers/media/usb/au0828/au0828-dvb.c47
-rw-r--r--drivers/media/usb/au0828/au0828.h4
3 files changed, 57 insertions, 7 deletions
diff --git a/drivers/media/usb/au0828/au0828-core.c b/drivers/media/usb/au0828/au0828-core.c
index bd9d19a73efd..ab45a6f9dcc9 100644
--- a/drivers/media/usb/au0828/au0828-core.c
+++ b/drivers/media/usb/au0828/au0828-core.c
@@ -173,9 +173,8 @@ static int au0828_usb_probe(struct usb_interface *interface,
173 const struct usb_device_id *id) 173 const struct usb_device_id *id)
174{ 174{
175 int ifnum; 175 int ifnum;
176#ifdef CONFIG_VIDEO_AU0828_V4L2 176 int retval = 0;
177 int retval; 177
178#endif
179 struct au0828_dev *dev; 178 struct au0828_dev *dev;
180 struct usb_device *usbdev = interface_to_usbdev(interface); 179 struct usb_device *usbdev = interface_to_usbdev(interface);
181 180
@@ -257,7 +256,11 @@ static int au0828_usb_probe(struct usb_interface *interface,
257#endif 256#endif
258 257
259 /* Digital TV */ 258 /* Digital TV */
260 au0828_dvb_register(dev); 259 retval = au0828_dvb_register(dev);
260 if (retval)
261 pr_err("%s() au0282_dev_register failed\n",
262 __func__);
263
261 264
262 /* Store the pointer to the au0828_dev so it can be accessed in 265 /* Store the pointer to the au0828_dev so it can be accessed in
263 au0828_usb_disconnect */ 266 au0828_usb_disconnect */
@@ -268,7 +271,7 @@ static int au0828_usb_probe(struct usb_interface *interface,
268 271
269 mutex_unlock(&dev->lock); 272 mutex_unlock(&dev->lock);
270 273
271 return 0; 274 return retval;
272} 275}
273 276
274static struct usb_driver au0828_usb_driver = { 277static struct usb_driver au0828_usb_driver = {
diff --git a/drivers/media/usb/au0828/au0828-dvb.c b/drivers/media/usb/au0828/au0828-dvb.c
index 3c718dbeae71..19fe049aeb5e 100644
--- a/drivers/media/usb/au0828/au0828-dvb.c
+++ b/drivers/media/usb/au0828/au0828-dvb.c
@@ -33,6 +33,10 @@
33#include "mxl5007t.h" 33#include "mxl5007t.h"
34#include "tda18271.h" 34#include "tda18271.h"
35 35
36int preallocate_big_buffers;
37module_param_named(preallocate_big_buffers, preallocate_big_buffers, int, 0644);
38MODULE_PARM_DESC(preallocate_big_buffers, "Preallocate the larger transfer buffers at module load time");
39
36DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 40DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
37 41
38#define _AU0828_BULKPIPE 0x83 42#define _AU0828_BULKPIPE 0x83
@@ -155,7 +159,9 @@ static int stop_urb_transfer(struct au0828_dev *dev)
155 for (i = 0; i < URB_COUNT; i++) { 159 for (i = 0; i < URB_COUNT; i++) {
156 if (dev->urbs[i]) { 160 if (dev->urbs[i]) {
157 usb_kill_urb(dev->urbs[i]); 161 usb_kill_urb(dev->urbs[i]);
158 kfree(dev->urbs[i]->transfer_buffer); 162 if (!preallocate_big_buffers)
163 kfree(dev->urbs[i]->transfer_buffer);
164
159 usb_free_urb(dev->urbs[i]); 165 usb_free_urb(dev->urbs[i]);
160 } 166 }
161 } 167 }
@@ -183,7 +189,12 @@ static int start_urb_transfer(struct au0828_dev *dev)
183 189
184 purb = dev->urbs[i]; 190 purb = dev->urbs[i];
185 191
186 purb->transfer_buffer = kzalloc(URB_BUFSIZE, GFP_KERNEL); 192 if (preallocate_big_buffers)
193 purb->transfer_buffer = dev->dig_transfer_buffer[i];
194 else
195 purb->transfer_buffer = kzalloc(URB_BUFSIZE,
196 GFP_KERNEL);
197
187 if (!purb->transfer_buffer) { 198 if (!purb->transfer_buffer) {
188 usb_free_urb(purb); 199 usb_free_urb(purb);
189 dev->urbs[i] = NULL; 200 dev->urbs[i] = NULL;
@@ -334,6 +345,23 @@ static int dvb_register(struct au0828_dev *dev)
334 345
335 dprintk(1, "%s()\n", __func__); 346 dprintk(1, "%s()\n", __func__);
336 347
348 if (preallocate_big_buffers) {
349 int i;
350 for (i = 0; i < URB_COUNT; i++) {
351 dev->dig_transfer_buffer[i] = kzalloc(URB_BUFSIZE,
352 GFP_KERNEL);
353
354 if (!dev->dig_transfer_buffer[i]) {
355 result = -ENOMEM;
356
357 printk(KERN_ERR
358 "%s: failed buffer allocation (errno = %d)\n",
359 DRIVER_NAME, result);
360 goto fail_adapter;
361 }
362 }
363 }
364
337 INIT_WORK(&dev->restart_streaming, au0828_restart_dvb_streaming); 365 INIT_WORK(&dev->restart_streaming, au0828_restart_dvb_streaming);
338 366
339 /* register adapter */ 367 /* register adapter */
@@ -424,6 +452,13 @@ fail_frontend:
424 dvb_frontend_detach(dvb->frontend); 452 dvb_frontend_detach(dvb->frontend);
425 dvb_unregister_adapter(&dvb->adapter); 453 dvb_unregister_adapter(&dvb->adapter);
426fail_adapter: 454fail_adapter:
455
456 if (preallocate_big_buffers) {
457 int i;
458 for (i = 0; i < URB_COUNT; i++)
459 kfree(dev->dig_transfer_buffer[i]);
460 }
461
427 return result; 462 return result;
428} 463}
429 464
@@ -444,6 +479,14 @@ void au0828_dvb_unregister(struct au0828_dev *dev)
444 dvb_unregister_frontend(dvb->frontend); 479 dvb_unregister_frontend(dvb->frontend);
445 dvb_frontend_detach(dvb->frontend); 480 dvb_frontend_detach(dvb->frontend);
446 dvb_unregister_adapter(&dvb->adapter); 481 dvb_unregister_adapter(&dvb->adapter);
482
483 if (preallocate_big_buffers) {
484 int i;
485 for (i = 0; i < URB_COUNT; i++)
486 kfree(dev->dig_transfer_buffer[i]);
487 }
488
489
447} 490}
448 491
449/* All the DVB attach calls go here, this function get's modified 492/* All the DVB attach calls go here, this function get's modified
diff --git a/drivers/media/usb/au0828/au0828.h b/drivers/media/usb/au0828/au0828.h
index a00b400f8703..5439772c1551 100644
--- a/drivers/media/usb/au0828/au0828.h
+++ b/drivers/media/usb/au0828/au0828.h
@@ -262,6 +262,10 @@ struct au0828_dev {
262 /* USB / URB Related */ 262 /* USB / URB Related */
263 int urb_streaming; 263 int urb_streaming;
264 struct urb *urbs[URB_COUNT]; 264 struct urb *urbs[URB_COUNT];
265
266 /* Preallocated transfer digital transfer buffers */
267
268 char *dig_transfer_buffer[URB_COUNT];
265}; 269};
266 270
267/* ----------------------------------------------------------- */ 271/* ----------------------------------------------------------- */