drivers/media/usb/dvb-usb-v2/rtl28xxu.c

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

File Facts

System
Linux kernel
Corpus path
drivers/media/usb/dvb-usb-v2/rtl28xxu.c
Extension
.c
Size
52730 bytes
Lines
2014
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

if (msg[0].len > 24 || msg[1].len > 24) {
			/* TODO: check msg[0].len max */
			ret = -EOPNOTSUPP;
			goto err_mutex_unlock;
		} else if (msg[0].addr == 0x10) {
			if (msg[0].len < 1 || msg[1].len < 1) {
				ret = -EOPNOTSUPP;
				goto err_mutex_unlock;
			}
			/* method 1 - integrated demod */
			if (msg[0].buf[0] == 0x00) {
				/* return demod page from driver cache */
				msg[1].buf[0] = dev->page;
				ret = 0;
			} else {
				req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
				req.index = CMD_DEMOD_RD | dev->page;
				req.size = msg[1].len;
				req.data = &msg[1].buf[0];
				ret = rtl28xxu_ctrl_msg(d, &req);
			}
		} else if (msg[0].len < 2) {
			if (msg[0].len < 1) {
				ret = -EOPNOTSUPP;
				goto err_mutex_unlock;
			}
			/* method 2 - old I2C */
			req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
			req.index = CMD_I2C_RD;
			req.size = msg[1].len;
			req.data = &msg[1].buf[0];
			ret = rtl28xxu_ctrl_msg(d, &req);
		} else {
			/* method 3 - new I2C */
			req.value = (msg[0].addr << 1);
			req.index = CMD_I2C_DA_WR;
			req.size = msg[0].len;
			req.data = msg[0].buf;
			ret = rtl28xxu_ctrl_msg(d, &req);
			if (ret)
				goto err_mutex_unlock;

			req.value = (msg[0].addr << 1);
			req.index = CMD_I2C_DA_RD;
			req.size = msg[1].len;
			req.data = msg[1].buf;
			ret = rtl28xxu_ctrl_msg(d, &req);
		}
	} else if (num == 1 && !(msg[0].flags & I2C_M_RD)) {
		if (msg[0].len > 22) {
			/* TODO: check msg[0].len max */
			ret = -EOPNOTSUPP;
			goto err_mutex_unlock;
		} else if (msg[0].addr == 0x10) {
			if (msg[0].len < 1) {
				ret = -EOPNOTSUPP;
				goto err_mutex_unlock;
			}
			/* method 1 - integrated demod */
			if (msg[0].buf[0] == 0x00) {
				if (msg[0].len < 2) {
					ret = -EOPNOTSUPP;
					goto err_mutex_unlock;
				}
				/* save demod page for later demod access */
				dev->page = msg[0].buf[1];
				ret = 0;
			} else {
				req.value = (msg[0].buf[0] << 8) |
					(msg[0].addr << 1);
				req.index = CMD_DEMOD_WR | dev->page;
				req.size = msg[0].len-1;
				req.data = &msg[0].buf[1];
				ret = rtl28xxu_ctrl_msg(d, &req);
			}
		} else if ((msg[0].len < 23) && (!dev->new_i2c_write)) {
			if (msg[0].len < 1) {
				ret = -EOPNOTSUPP;
				goto err_mutex_unlock;
			}
			/* method 2 - old I2C */
			req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
			req.index = CMD_I2C_WR;
			req.size = msg[0].len-1;
			req.data = &msg[0].buf[1];
			ret = rtl28xxu_ctrl_msg(d, &req);
		} else {
			/* method 3 - new I2C */
			req.value = (msg[0].addr << 1);
			req.index = CMD_I2C_DA_WR;

Annotation

Implementation Notes