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

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

File Facts

System
Linux kernel
Corpus path
drivers/media/usb/dvb-usb/m920x.c
Extension
.c
Size
30821 bytes
Lines
1282
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 (ret != 0) {
			deb("Initialising remote control failed\n");
			return ret;
		}

		deb("Initialising remote control success\n");
	}

	for (i = 0; i < d->props.num_adapters; i++)
		flags |= d->adapter[i].props.fe[0].caps;

	/* Some devices(Dposh) might crash if we attempt touch at all. */
	if (flags & DVB_USB_ADAP_HAS_PID_FILTER) {
		for (i = 0; i < d->props.num_adapters; i++) {
			epi = d->adapter[i].props.fe[0].stream.endpoint - 0x81;

			if (epi < 0 || epi >= M9206_MAX_ADAPTERS) {
				printk(KERN_INFO "m920x: Unexpected adapter endpoint!\n");
				return -EINVAL;
			}

			adap_enabled[epi] = 1;
		}

		for (i = 0; i < M9206_MAX_ADAPTERS; i++) {
			if (adap_enabled[i])
				continue;

			if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x0)) != 0)
				return ret;

			if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x02f5)) != 0)
				return ret;
		}
	}

	return 0;
}

static int m920x_init_ep(struct usb_interface *intf)
{
	struct usb_device *udev = interface_to_usbdev(intf);
	struct usb_host_interface *alt;

	if ((alt = usb_altnum_to_altsetting(intf, 1)) == NULL) {
		deb("No alt found!\n");
		return -ENODEV;
	}

	return usb_set_interface(udev, alt->desc.bInterfaceNumber,
				 alt->desc.bAlternateSetting);
}

static inline void m920x_parse_rc_state(struct dvb_usb_device *d, u8 rc_state,
					int *state)
{
	struct m920x_state *m = d->priv;

	switch (rc_state) {
	case 0x80:
		*state = REMOTE_NO_KEY_PRESSED;
		break;

	case 0x88: /* framing error or "invalid code" */
	case 0x99:
	case 0xc0:
	case 0xd8:
		*state = REMOTE_NO_KEY_PRESSED;
		m->rep_count = 0;
		break;

	case 0x93:
	case 0x92:
	case 0x83: /* pinnacle PCTV310e */
	case 0x82:
		m->rep_count = 0;
		*state = REMOTE_KEY_PRESSED;
		break;

	case 0x91:
	case 0x81: /* pinnacle PCTV310e */
		/* prevent immediate auto-repeat */
		if (++m->rep_count > 2)
			*state = REMOTE_KEY_REPEAT;
		else
			*state = REMOTE_NO_KEY_PRESSED;
		break;

	default:
		deb("Unexpected rc state %02x\n", rc_state);

Annotation

Implementation Notes