mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-07 02:54:09 +08:00
[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>
This commit is contained in:
parent
36f773e8e3
commit
1c6410f317
@ -15,6 +15,7 @@
|
|||||||
* see Documentation/dvb/README.dvb-usb for more information
|
* see Documentation/dvb/README.dvb-usb for more information
|
||||||
*/
|
*/
|
||||||
#include "vp702x.h"
|
#include "vp702x.h"
|
||||||
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
/* debug */
|
/* debug */
|
||||||
int dvb_usb_vp702x_debug;
|
int dvb_usb_vp702x_debug;
|
||||||
@ -29,10 +30,6 @@ struct vp702x_adapter_state {
|
|||||||
u8 pid_filter_state;
|
u8 pid_filter_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vp702x_device_state {
|
|
||||||
u8 power_state;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* check for mutex FIXME */
|
/* check for mutex FIXME */
|
||||||
int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen)
|
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,
|
static int vp702x_usb_probe(struct usb_interface *intf,
|
||||||
const struct usb_device_id *id)
|
const struct usb_device_id *id)
|
||||||
{
|
{
|
||||||
return dvb_usb_device_init(intf, &vp702x_properties,
|
struct dvb_usb_device *d;
|
||||||
THIS_MODULE, NULL, adapter_nr);
|
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 [] = {
|
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 = {
|
static struct usb_driver vp702x_usb_driver = {
|
||||||
.name = "dvb_usb_vp702x",
|
.name = "dvb_usb_vp702x",
|
||||||
.probe = vp702x_usb_probe,
|
.probe = vp702x_usb_probe,
|
||||||
.disconnect = dvb_usb_device_exit,
|
.disconnect = vp702x_usb_disconnect,
|
||||||
.id_table = vp702x_usb_table,
|
.id_table = vp702x_usb_table,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -98,6 +98,14 @@ extern int dvb_usb_vp702x_debug;
|
|||||||
#define RESET_TUNER 0xBE
|
#define RESET_TUNER 0xBE
|
||||||
/* IN i: 0, v: 0, no extra buffer */
|
/* 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 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);
|
extern int vp702x_usb_inout_op(struct dvb_usb_device *d, u8 *o, int olen, u8 *i, int ilen, int msec);
|
||||||
|
Loading…
Reference in New Issue
Block a user