xref: /plan9/sys/src/9/omap/usbehci.h (revision 5bdeb9a20ca533546de47a1bc407975caf1023f5)
184860c5dSDavid du Colombier /* override default macros from ../port/usb.h */
284860c5dSDavid du Colombier #undef	dprint
384860c5dSDavid du Colombier #undef	ddprint
484860c5dSDavid du Colombier #undef	deprint
584860c5dSDavid du Colombier #undef	ddeprint
684860c5dSDavid du Colombier #define dprint		if(ehcidebug)print
784860c5dSDavid du Colombier #define ddprint		if(ehcidebug>1)print
884860c5dSDavid du Colombier #define deprint		if(ehcidebug || ep->debug)print
984860c5dSDavid du Colombier #define ddeprint	if(ehcidebug>1 || ep->debug>1)print
1084860c5dSDavid du Colombier 
1184860c5dSDavid du Colombier typedef struct Ctlr Ctlr;
127bb09086SDavid du Colombier typedef struct Eopio Eopio;
1384860c5dSDavid du Colombier typedef struct Isoio Isoio;
1484860c5dSDavid du Colombier typedef struct Poll Poll;
1584860c5dSDavid du Colombier typedef struct Qh Qh;
1684860c5dSDavid du Colombier typedef struct Qtree Qtree;
1784860c5dSDavid du Colombier 
1884860c5dSDavid du Colombier #pragma incomplete Ctlr;
1984860c5dSDavid du Colombier #pragma incomplete Eopio;
2084860c5dSDavid du Colombier #pragma incomplete Isoio;
2184860c5dSDavid du Colombier #pragma incomplete Poll;
2284860c5dSDavid du Colombier #pragma incomplete Qh;
2384860c5dSDavid du Colombier #pragma incomplete Qtree;
2484860c5dSDavid du Colombier 
2584860c5dSDavid du Colombier struct Poll
2684860c5dSDavid du Colombier {
2784860c5dSDavid du Colombier 	Lock;
2884860c5dSDavid du Colombier 	Rendez;
2984860c5dSDavid du Colombier 	int	must;
3084860c5dSDavid du Colombier 	int	does;
3184860c5dSDavid du Colombier };
3284860c5dSDavid du Colombier 
3384860c5dSDavid du Colombier struct Ctlr
3484860c5dSDavid du Colombier {
3584860c5dSDavid du Colombier 	Rendez;			/* for waiting to async advance doorbell */
3684860c5dSDavid du Colombier 	Lock;			/* for ilock. qh lists and basic ctlr I/O */
3784860c5dSDavid du Colombier 	QLock	portlck;	/* for port resets/enable... (and doorbell) */
3884860c5dSDavid du Colombier 	int	active;		/* in use or not */
3984860c5dSDavid du Colombier 	Ecapio*	capio;		/* Capability i/o regs */
4084860c5dSDavid du Colombier 	Eopio*	opio;		/* Operational i/o regs */
4184860c5dSDavid du Colombier 
4284860c5dSDavid du Colombier 	int	nframes;	/* 1024, 512, or 256 frames in the list */
4384860c5dSDavid du Colombier 	ulong*	frames;		/* periodic frame list (hw) */
4484860c5dSDavid du Colombier 	Qh*	qhs;		/* async Qh circular list for bulk/ctl */
4584860c5dSDavid du Colombier 	Qtree*	tree;		/* tree of Qhs for the periodic list */
4684860c5dSDavid du Colombier 	int	ntree;		/* number of dummy qhs in tree */
4784860c5dSDavid du Colombier 	Qh*	intrqhs;	/* list of (not dummy) qhs in tree  */
4884860c5dSDavid du Colombier 	Isoio*	iso;		/* list of active Iso I/O */
4984860c5dSDavid du Colombier 	ulong	load;
5084860c5dSDavid du Colombier 	ulong	isoload;
5184860c5dSDavid du Colombier 	int	nintr;		/* number of interrupts attended */
5284860c5dSDavid du Colombier 	int	ntdintr;	/* number of intrs. with something to do */
5384860c5dSDavid du Colombier 	int	nqhintr;	/* number of async td intrs. */
5484860c5dSDavid du Colombier 	int	nisointr;	/* number of periodic td intrs. */
5584860c5dSDavid du Colombier 	int	nreqs;
5684860c5dSDavid du Colombier 	Poll	poll;
5784860c5dSDavid du Colombier };
5884860c5dSDavid du Colombier 
5984860c5dSDavid du Colombier /*
607bb09086SDavid du Colombier  * Operational registers (hw)
617bb09086SDavid du Colombier  */
627bb09086SDavid du Colombier struct Eopio
637bb09086SDavid du Colombier {
647bb09086SDavid du Colombier 	ulong	cmd;		/* 00 command */
657bb09086SDavid du Colombier 	ulong	sts;		/* 04 status */
667bb09086SDavid du Colombier 	ulong	intr;		/* 08 interrupt enable */
677bb09086SDavid du Colombier 	ulong	frno;		/* 0c frame index */
687bb09086SDavid du Colombier 	ulong	seg;		/* 10 bits 63:32 of EHCI datastructs (unused) */
697bb09086SDavid du Colombier 	ulong	frbase;		/* 14 frame list base addr, 4096-byte boundary */
707bb09086SDavid du Colombier 	ulong	link;		/* 18 link for async list */
717bb09086SDavid du Colombier 	uchar	d2c[0x40-0x1c];	/* 1c dummy */
727bb09086SDavid du Colombier 	ulong	config;		/* 40 1: all ports default-routed to this HC */
737bb09086SDavid du Colombier 	ulong	portsc[3];	/* 44 Port status and control, one per port */
747bb09086SDavid du Colombier 
757bb09086SDavid du Colombier 	/* defined for omap35 ehci at least */
767bb09086SDavid du Colombier 	uchar	_pad0[0x80 - 0x50];
777bb09086SDavid du Colombier 	ulong	insn[6];	/* implementation-specific */
787bb09086SDavid du Colombier };
797bb09086SDavid du Colombier 
807bb09086SDavid du Colombier typedef struct Uhh Uhh;
817bb09086SDavid du Colombier struct Uhh {
827bb09086SDavid du Colombier 	ulong	revision;	/* ro */
837bb09086SDavid du Colombier 	uchar	_pad0[0x10-0x4];
847bb09086SDavid du Colombier 	ulong	sysconfig;
857bb09086SDavid du Colombier 	ulong	sysstatus;	/* ro */
867bb09086SDavid du Colombier 
877bb09086SDavid du Colombier 	uchar	_pad1[0x40-0x18];
887bb09086SDavid du Colombier 	ulong	hostconfig;
897bb09086SDavid du Colombier 	ulong	debug_csr;
907bb09086SDavid du Colombier };
917bb09086SDavid du Colombier 
92*5bdeb9a2SDavid du Colombier enum {
93*5bdeb9a2SDavid du Colombier 	/* hostconfig bits */
94*5bdeb9a2SDavid du Colombier 	P1ulpi_bypass = 1<<0,	/* utmi if set; else ulpi */
95*5bdeb9a2SDavid du Colombier };
96*5bdeb9a2SDavid du Colombier 
977bb09086SDavid du Colombier extern Ecapio *ehcidebugcapio;
987bb09086SDavid du Colombier extern int ehcidebugport;
9984860c5dSDavid du Colombier 
10084860c5dSDavid du Colombier extern int ehcidebug;
10184860c5dSDavid du Colombier 
10284860c5dSDavid du Colombier void	ehcilinkage(Hci *hp);
10384860c5dSDavid du Colombier void	ehcimeminit(Ctlr *ctlr);
10484860c5dSDavid du Colombier void	ehcirun(Ctlr *ctlr, int on);
105