drivers/media/usb/dvb-usb/vp702x.c

Source file repositories/reference/linux-study-clean/drivers/media/usb/dvb-usb/vp702x.c

File Facts

System
Linux kernel
Corpus path
drivers/media/usb/dvb-usb/vp702x.c
Extension
.c
Size
10385 bytes
Lines
456
Domain
Driver Families
Bucket
drivers/media
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct vp702x_adapter_state {
	int pid_filter_count;
	int pid_filter_can_bypass;
	u8  pid_filter_state;
};

static int vp702x_usb_in_op_unlocked(struct dvb_usb_device *d, u8 req,
				     u16 value, u16 index, u8 *b, int blen)
{
	int ret;

	ret = usb_control_msg(d->udev,
		usb_rcvctrlpipe(d->udev, 0),
		req,
		USB_TYPE_VENDOR | USB_DIR_IN,
		value, index, b, blen,
		2000);

	if (ret < 0) {
		warn("usb in operation failed. (%d)", ret);
		ret = -EIO;
	} else
		ret = 0;


	deb_xfer("in: req. %02x, val: %04x, ind: %04x, buffer: ",req,value,index);
	debug_dump(b,blen,deb_xfer);

	return ret;
}

int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value,
		     u16 index, u8 *b, int blen)
{
	int ret;

	mutex_lock(&d->usb_mutex);
	ret = vp702x_usb_in_op_unlocked(d, req, value, index, b, blen);
	mutex_unlock(&d->usb_mutex);

	return ret;
}

static int vp702x_usb_out_op_unlocked(struct dvb_usb_device *d, u8 req,
				      u16 value, u16 index, u8 *b, int blen)
{
	int ret;
	deb_xfer("out: req. %02x, val: %04x, ind: %04x, buffer: ",req,value,index);
	debug_dump(b,blen,deb_xfer);

	if ((ret = usb_control_msg(d->udev,
			usb_sndctrlpipe(d->udev,0),
			req,
			USB_TYPE_VENDOR | USB_DIR_OUT,
			value,index,b,blen,
			2000)) != blen) {
		warn("usb out operation failed. (%d)",ret);
		return -EIO;
	} else
		return 0;
}

static int vp702x_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
			     u16 index, u8 *b, int blen)
{
	int ret;

	mutex_lock(&d->usb_mutex);
	ret = vp702x_usb_out_op_unlocked(d, req, value, index, b, blen);
	mutex_unlock(&d->usb_mutex);

	return ret;
}

int vp702x_usb_inout_op(struct dvb_usb_device *d, u8 *o, int olen, u8 *i, int ilen, int msec)
{
	int ret;

	if ((ret = mutex_lock_interruptible(&d->usb_mutex)))
		return ret;

	ret = vp702x_usb_out_op_unlocked(d, REQUEST_OUT, 0, 0, o, olen);
	msleep(msec);
	ret = vp702x_usb_in_op_unlocked(d, REQUEST_IN, 0, 0, i, ilen);

	mutex_unlock(&d->usb_mutex);
	return ret;
}

static int vp702x_usb_inout_cmd(struct dvb_usb_device *d, u8 cmd, u8 *o,

Annotation

Implementation Notes