drivers/usb/isp1760/isp1760-udc.c

Source file repositories/reference/linux-study-clean/drivers/usb/isp1760/isp1760-udc.c

File Facts

System
Linux kernel
Corpus path
drivers/usb/isp1760/isp1760-udc.c
Extension
.c
Size
39217 bytes
Lines
1601
Domain
Driver Families
Bucket
drivers/usb
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 isp1760_request {
	struct usb_request req;
	struct list_head queue;
	struct isp1760_ep *ep;
	unsigned int packet_size;
};

static inline struct isp1760_udc *gadget_to_udc(struct usb_gadget *gadget)
{
	return container_of(gadget, struct isp1760_udc, gadget);
}

static inline struct isp1760_ep *ep_to_udc_ep(struct usb_ep *ep)
{
	return container_of(ep, struct isp1760_ep, ep);
}

static inline struct isp1760_request *req_to_udc_req(struct usb_request *req)
{
	return container_of(req, struct isp1760_request, req);
}

static u32 isp1760_udc_read(struct isp1760_udc *udc, u16 field)
{
	return isp1760_field_read(udc->fields, field);
}

static void isp1760_udc_write(struct isp1760_udc *udc, u16 field, u32 val)
{
	isp1760_field_write(udc->fields, field, val);
}

static u32 isp1760_udc_read_raw(struct isp1760_udc *udc, u16 reg)
{
	__le32 val;

	regmap_raw_read(udc->regs, reg, &val, 4);

	return le32_to_cpu(val);
}

static u16 isp1760_udc_read_raw16(struct isp1760_udc *udc, u16 reg)
{
	__le16 val;

	regmap_raw_read(udc->regs, reg, &val, 2);

	return le16_to_cpu(val);
}

static void isp1760_udc_write_raw(struct isp1760_udc *udc, u16 reg, u32 val)
{
	__le32 val_le = cpu_to_le32(val);

	regmap_raw_write(udc->regs, reg, &val_le, 4);
}

static void isp1760_udc_write_raw16(struct isp1760_udc *udc, u16 reg, u16 val)
{
	__le16 val_le = cpu_to_le16(val);

	regmap_raw_write(udc->regs, reg, &val_le, 2);
}

static void isp1760_udc_set(struct isp1760_udc *udc, u32 field)
{
	isp1760_udc_write(udc, field, 0xFFFFFFFF);
}

static void isp1760_udc_clear(struct isp1760_udc *udc, u32 field)
{
	isp1760_udc_write(udc, field, 0);
}

static bool isp1760_udc_is_set(struct isp1760_udc *udc, u32 field)
{
	return !!isp1760_udc_read(udc, field);
}
/* -----------------------------------------------------------------------------
 * Endpoint Management
 */

static struct isp1760_ep *isp1760_udc_find_ep(struct isp1760_udc *udc,
					      u16 index)
{
	unsigned int i;

	if (index == 0)
		return &udc->ep[0];

Annotation

Implementation Notes