diff options
author | Florian Mickler <florian@mickler.org> | 2011-03-21 07:19:08 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-05-20 09:28:05 -0300 |
commit | 1c6410f317c3e78409f0179283089034c77a6ad5 (patch) | |
tree | 281a8ff04d5e6af29030572f78cb14a4447441b6 /drivers/media/dvb/dvb-usb/vp702x.c | |
parent | 36f773e8e3f207136a6b903b71754593e0e1819c (diff) | |
download | blackbird-op-linux-1c6410f317c3e78409f0179283089034c77a6ad5.tar.gz blackbird-op-linux-1c6410f317c3e78409f0179283089034c77a6ad5.zip |
[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 <florian@mickler.org>
Cc: Patrick Boettcher <pb@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb/dvb-usb/vp702x.c')
-rw-r--r-- | drivers/media/dvb/dvb-usb/vp702x.c | 41 |
1 files changed, 34 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 <linux/mutex.h> /* 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, }; |