From 1c6410f317c3e78409f0179283089034c77a6ad5 Mon Sep 17 00:00:00 2001 From: Florian Mickler Date: Mon, 21 Mar 2011 07:19:08 -0300 Subject: [PATCH] [media] vp702x: preallocate memory on device probe This sets up a buffer and a mutex protecting that buffer in the struct vp702x_device_state. The definition of struct vp702x_device_state is moved into the header in order to use the buffer also in the frontend. Signed-off-by: Florian Mickler Cc: Patrick Boettcher Signed-off-by: Mauro Carvalho Chehab --- drivers/media/dvb/dvb-usb/vp702x.c | 41 +++++++++++++++++++++++++++++++------- drivers/media/dvb/dvb-usb/vp702x.h | 8 ++++++++ 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/drivers/media/dvb/dvb-usb/vp702x.c b/drivers/media/dvb/dvb-usb/vp702x.c index 25536f98c4d1..569c93fbb86c 100644 --- a/drivers/media/dvb/dvb-usb/vp702x.c +++ b/drivers/media/dvb/dvb-usb/vp702x.c @@ -15,6 +15,7 @@ * see Documentation/dvb/README.dvb-usb for more information */ #include "vp702x.h" +#include /* debug */ int dvb_usb_vp702x_debug; @@ -29,10 +30,6 @@ struct vp702x_adapter_state { u8 pid_filter_state; }; -struct vp702x_device_state { - u8 power_state; -}; - /* check for mutex FIXME */ int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen) { @@ -241,8 +238,38 @@ static struct dvb_usb_device_properties vp702x_properties; static int vp702x_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) { - return dvb_usb_device_init(intf, &vp702x_properties, - THIS_MODULE, NULL, adapter_nr); + struct dvb_usb_device *d; + struct vp702x_device_state *st; + int ret; + + ret = dvb_usb_device_init(intf, &vp702x_properties, + THIS_MODULE, &d, adapter_nr); + if (ret) + goto out; + + st = d->priv; + st->buf_len = 16; + st->buf = kmalloc(st->buf_len, GFP_KERNEL); + if (!st->buf) { + ret = -ENOMEM; + dvb_usb_device_exit(intf); + goto out; + } + mutex_init(&st->buf_mutex); + +out: + return ret; + +} + +static void vp702x_usb_disconnect(struct usb_interface *intf) +{ + struct dvb_usb_device *d = usb_get_intfdata(intf); + struct vp702x_device_state *st = d->priv; + mutex_lock(&st->buf_mutex); + kfree(st->buf); + mutex_unlock(&st->buf_mutex); + dvb_usb_device_exit(intf); } static struct usb_device_id vp702x_usb_table [] = { @@ -309,7 +336,7 @@ static struct dvb_usb_device_properties vp702x_properties = { static struct usb_driver vp702x_usb_driver = { .name = "dvb_usb_vp702x", .probe = vp702x_usb_probe, - .disconnect = dvb_usb_device_exit, + .disconnect = vp702x_usb_disconnect, .id_table = vp702x_usb_table, }; diff --git a/drivers/media/dvb/dvb-usb/vp702x.h b/drivers/media/dvb/dvb-usb/vp702x.h index c2f97f96c21f..86960c657522 100644 --- a/drivers/media/dvb/dvb-usb/vp702x.h +++ b/drivers/media/dvb/dvb-usb/vp702x.h @@ -98,6 +98,14 @@ extern int dvb_usb_vp702x_debug; #define RESET_TUNER 0xBE /* IN i: 0, v: 0, no extra buffer */ +struct vp702x_device_state { + u8 power_state; + struct mutex buf_mutex; + int buf_len; + u8 *buf; +}; + + extern struct dvb_frontend * vp702x_fe_attach(struct dvb_usb_device *d); extern int vp702x_usb_inout_op(struct dvb_usb_device *d, u8 *o, int olen, u8 *i, int ilen, int msec); -- 2.11.0