xref: /openbmc/u-boot/drivers/usb/musb/musb_core.h (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0 */
22731b9a8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************
32731b9a8SJean-Christophe PLAGNIOL-VILLARD  * Copyright 2008 Mentor Graphics Corporation
42731b9a8SJean-Christophe PLAGNIOL-VILLARD  * Copyright (C) 2008 by Texas Instruments
52731b9a8SJean-Christophe PLAGNIOL-VILLARD  *
62731b9a8SJean-Christophe PLAGNIOL-VILLARD  * This file is part of the Inventra Controller Driver for Linux.
72731b9a8SJean-Christophe PLAGNIOL-VILLARD  ******************************************************************/
82731b9a8SJean-Christophe PLAGNIOL-VILLARD 
92731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef __MUSB_HDRC_DEFS_H__
102731b9a8SJean-Christophe PLAGNIOL-VILLARD #define __MUSB_HDRC_DEFS_H__
112731b9a8SJean-Christophe PLAGNIOL-VILLARD 
122731b9a8SJean-Christophe PLAGNIOL-VILLARD #include <usb_defs.h>
132731b9a8SJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h>
142731b9a8SJean-Christophe PLAGNIOL-VILLARD 
152731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_EP0_FIFOSIZE	64	/* This is non-configurable */
162731b9a8SJean-Christophe PLAGNIOL-VILLARD 
17f298e4b6STom Rix /* EP0 */
18f298e4b6STom Rix struct musb_ep0_regs {
19f298e4b6STom Rix 	u16	reserved4;
20f298e4b6STom Rix 	u16	csr0;
21f298e4b6STom Rix 	u16	reserved5;
22f298e4b6STom Rix 	u16	reserved6;
23f298e4b6STom Rix 	u16	count0;
24f298e4b6STom Rix 	u8	host_type0;
25f298e4b6STom Rix 	u8	host_naklimit0;
26f298e4b6STom Rix 	u8	reserved7;
27f298e4b6STom Rix 	u8	reserved8;
28f298e4b6STom Rix 	u8	reserved9;
29f298e4b6STom Rix 	u8	configdata;
30f298e4b6STom Rix };
31f298e4b6STom Rix 
32f298e4b6STom Rix /* EP 1-15 */
33f298e4b6STom Rix struct musb_epN_regs {
34f298e4b6STom Rix 	u16	txmaxp;
35f298e4b6STom Rix 	u16	txcsr;
36f298e4b6STom Rix 	u16	rxmaxp;
37f298e4b6STom Rix 	u16	rxcsr;
38f298e4b6STom Rix 	u16	rxcount;
39f298e4b6STom Rix 	u8	txtype;
40f298e4b6STom Rix 	u8	txinterval;
41f298e4b6STom Rix 	u8	rxtype;
42f298e4b6STom Rix 	u8	rxinterval;
43f298e4b6STom Rix 	u8	reserved0;
44f298e4b6STom Rix 	u8	fifosize;
45f298e4b6STom Rix };
46f298e4b6STom Rix 
472731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Mentor USB core register overlay structure */
48e608f221SBryan Wu #ifndef musb_regs
492731b9a8SJean-Christophe PLAGNIOL-VILLARD struct musb_regs {
502731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* common registers */
512731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	faddr;
522731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	power;
532731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	intrtx;
542731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	intrrx;
552731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	intrtxe;
562731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	intrrxe;
572731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	intrusb;
582731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	intrusbe;
592731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	frame;
602731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	index;
612731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	testmode;
622731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* indexed registers */
632731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	txmaxp;
642731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	txcsr;
652731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	rxmaxp;
662731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	rxcsr;
672731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	rxcount;
682731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	txtype;
692731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	txinterval;
702731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	rxtype;
712731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	rxinterval;
722731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	reserved0;
732731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	fifosize;
742731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* fifo */
752731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u32	fifox[16];
762731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* OTG, dynamic FIFO, version & vendor registers */
772731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	devctl;
782731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	reserved1;
792731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	txfifosz;
802731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	rxfifosz;
812731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	txfifoadd;
822731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	rxfifoadd;
832731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u32	vcontrol;
842731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	hwvers;
859bb47abfSAjay Kumar Gupta 	u16	reserved2a[1];
869bb47abfSAjay Kumar Gupta 	u8	ulpi_busctl;
879bb47abfSAjay Kumar Gupta 	u8	reserved2b[1];
889bb47abfSAjay Kumar Gupta 	u16	reserved2[3];
892731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	epinfo;
902731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	raminfo;
912731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	linkinfo;
922731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	vplen;
932731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	hseof1;
942731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	fseof1;
952731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	lseof1;
962731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	reserved3;
972731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* target address registers */
982731b9a8SJean-Christophe PLAGNIOL-VILLARD 	struct musb_tar_regs {
992731b9a8SJean-Christophe PLAGNIOL-VILLARD 		u8	txfuncaddr;
1002731b9a8SJean-Christophe PLAGNIOL-VILLARD 		u8	reserved0;
1012731b9a8SJean-Christophe PLAGNIOL-VILLARD 		u8	txhubaddr;
1022731b9a8SJean-Christophe PLAGNIOL-VILLARD 		u8	txhubport;
1032731b9a8SJean-Christophe PLAGNIOL-VILLARD 		u8	rxfuncaddr;
1042731b9a8SJean-Christophe PLAGNIOL-VILLARD 		u8	reserved1;
1052731b9a8SJean-Christophe PLAGNIOL-VILLARD 		u8	rxhubaddr;
1062731b9a8SJean-Christophe PLAGNIOL-VILLARD 		u8	rxhubport;
1072731b9a8SJean-Christophe PLAGNIOL-VILLARD 	} tar[16];
108f298e4b6STom Rix 	/*
109f298e4b6STom Rix 	 * endpoint registers
110f298e4b6STom Rix 	 * ep0 elements are valid when array index is 0
111f298e4b6STom Rix 	 * otherwise epN is valid
112f298e4b6STom Rix 	 */
113f298e4b6STom Rix 	union musb_ep_regs {
114f298e4b6STom Rix 		struct musb_ep0_regs ep0;
115f298e4b6STom Rix 		struct musb_epN_regs epN;
116f298e4b6STom Rix 	} ep[16];
117f298e4b6STom Rix 
118c60795f4SIlya Yanok } __attribute__((packed));
119e608f221SBryan Wu #endif
1202731b9a8SJean-Christophe PLAGNIOL-VILLARD 
1212731b9a8SJean-Christophe PLAGNIOL-VILLARD /*
1222731b9a8SJean-Christophe PLAGNIOL-VILLARD  * MUSB Register bits
1232731b9a8SJean-Christophe PLAGNIOL-VILLARD  */
1242731b9a8SJean-Christophe PLAGNIOL-VILLARD 
1252731b9a8SJean-Christophe PLAGNIOL-VILLARD /* POWER */
1262731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_POWER_ISOUPDATE	0x80
1272731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_POWER_SOFTCONN	0x40
1282731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_POWER_HSENAB	0x20
1292731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_POWER_HSMODE	0x10
1302731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_POWER_RESET	0x08
1312731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_POWER_RESUME	0x04
1322731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_POWER_SUSPENDM	0x02
1332731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_POWER_ENSUSPEND	0x01
1342731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_POWER_HSMODE_SHIFT	4
1352731b9a8SJean-Christophe PLAGNIOL-VILLARD 
1362731b9a8SJean-Christophe PLAGNIOL-VILLARD /* INTRUSB */
1372731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_INTR_SUSPEND	0x01
1382731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_INTR_RESUME	0x02
1392731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_INTR_RESET		0x04
1402731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_INTR_BABBLE	0x04
1412731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_INTR_SOF		0x08
1422731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_INTR_CONNECT	0x10
1432731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_INTR_DISCONNECT	0x20
1442731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_INTR_SESSREQ	0x40
1452731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_INTR_VBUSERROR	0x80	/* For SESSION end */
1462731b9a8SJean-Christophe PLAGNIOL-VILLARD 
1472731b9a8SJean-Christophe PLAGNIOL-VILLARD /* DEVCTL */
1482731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_DEVCTL_BDEVICE	0x80
1492731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_DEVCTL_FSDEV	0x40
1502731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_DEVCTL_LSDEV	0x20
1512731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_DEVCTL_VBUS	0x18
1522731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_DEVCTL_VBUS_SHIFT	3
1532731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_DEVCTL_HM		0x04
1542731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_DEVCTL_HR		0x02
1552731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_DEVCTL_SESSION	0x01
1562731b9a8SJean-Christophe PLAGNIOL-VILLARD 
1579bb47abfSAjay Kumar Gupta /* ULPI VBUSCONTROL */
1589bb47abfSAjay Kumar Gupta #define ULPI_USE_EXTVBUS	0x01
1599bb47abfSAjay Kumar Gupta #define ULPI_USE_EXTVBUSIND	0x02
1609bb47abfSAjay Kumar Gupta 
1612731b9a8SJean-Christophe PLAGNIOL-VILLARD /* TESTMODE */
1622731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TEST_FORCE_HOST	0x80
1632731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TEST_FIFO_ACCESS	0x40
1642731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TEST_FORCE_FS	0x20
1652731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TEST_FORCE_HS	0x10
1662731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TEST_PACKET	0x08
1672731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TEST_K		0x04
1682731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TEST_J		0x02
1692731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TEST_SE0_NAK	0x01
1702731b9a8SJean-Christophe PLAGNIOL-VILLARD 
1712731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Allocate for double-packet buffering (effectively doubles assigned _SIZE) */
1722731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_FIFOSZ_DPB		0x10
1732731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Allocation size (8, 16, 32, ... 4096) */
1742731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_FIFOSZ_SIZE	0x0f
1752731b9a8SJean-Christophe PLAGNIOL-VILLARD 
1762731b9a8SJean-Christophe PLAGNIOL-VILLARD /* CSR0 */
1772731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_FLUSHFIFO	0x0100
1782731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_TXPKTRDY	0x0002
1792731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_RXPKTRDY	0x0001
1802731b9a8SJean-Christophe PLAGNIOL-VILLARD 
1812731b9a8SJean-Christophe PLAGNIOL-VILLARD /* CSR0 in Peripheral mode */
1822731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_P_SVDSETUPEND	0x0080
1832731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_P_SVDRXPKTRDY	0x0040
1842731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_P_SENDSTALL	0x0020
1852731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_P_SETUPEND	0x0010
1862731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_P_DATAEND	0x0008
1872731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_P_SENTSTALL	0x0004
1882731b9a8SJean-Christophe PLAGNIOL-VILLARD 
1892731b9a8SJean-Christophe PLAGNIOL-VILLARD /* CSR0 in Host mode */
1902731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_H_DIS_PING		0x0800
1912731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_H_WR_DATATOGGLE	0x0400	/* Set to allow setting: */
1922731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_H_DATATOGGLE		0x0200	/* Data toggle control */
1932731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_H_NAKTIMEOUT		0x0080
1942731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_H_STATUSPKT		0x0040
1952731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_H_REQPKT		0x0020
1962731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_H_ERROR		0x0010
1972731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_H_SETUPPKT		0x0008
1982731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_H_RXSTALL		0x0004
1992731b9a8SJean-Christophe PLAGNIOL-VILLARD 
2002731b9a8SJean-Christophe PLAGNIOL-VILLARD /* CSR0 bits to avoid zeroing (write zero clears, write 1 ignored) */
2012731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_P_WZC_BITS	\
2022731b9a8SJean-Christophe PLAGNIOL-VILLARD 	(MUSB_CSR0_P_SENTSTALL)
2032731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CSR0_H_WZC_BITS	\
2042731b9a8SJean-Christophe PLAGNIOL-VILLARD 	(MUSB_CSR0_H_NAKTIMEOUT | MUSB_CSR0_H_RXSTALL \
2052731b9a8SJean-Christophe PLAGNIOL-VILLARD 	| MUSB_CSR0_RXPKTRDY)
2062731b9a8SJean-Christophe PLAGNIOL-VILLARD 
2072731b9a8SJean-Christophe PLAGNIOL-VILLARD /* TxType/RxType */
2082731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TYPE_SPEED		0xc0
2092731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TYPE_SPEED_SHIFT	6
2102731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TYPE_SPEED_HIGH 	1
2112731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TYPE_SPEED_FULL 	2
2122731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TYPE_SPEED_LOW	3
2132731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TYPE_PROTO		0x30	/* Implicitly zero for ep0 */
2142731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TYPE_PROTO_SHIFT	4
2152731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TYPE_REMOTE_END	0xf	/* Implicitly zero for ep0 */
2162731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TYPE_PROTO_BULK 	2
2172731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TYPE_PROTO_INTR 	3
2182731b9a8SJean-Christophe PLAGNIOL-VILLARD 
2192731b9a8SJean-Christophe PLAGNIOL-VILLARD /* CONFIGDATA */
2202731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CONFIGDATA_MPRXE		0x80	/* Auto bulk pkt combining */
2212731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CONFIGDATA_MPTXE		0x40	/* Auto bulk pkt splitting */
2222731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CONFIGDATA_BIGENDIAN	0x20
2232731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CONFIGDATA_HBRXE		0x10	/* HB-ISO for RX */
2242731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CONFIGDATA_HBTXE		0x08	/* HB-ISO for TX */
2252731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CONFIGDATA_DYNFIFO		0x04	/* Dynamic FIFO sizing */
2262731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CONFIGDATA_SOFTCONE	0x02	/* SoftConnect */
2272731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_CONFIGDATA_UTMIDW		0x01	/* Data width 0/1 => 8/16bits */
2282731b9a8SJean-Christophe PLAGNIOL-VILLARD 
2292731b9a8SJean-Christophe PLAGNIOL-VILLARD /* TXCSR in Peripheral and Host mode */
2302731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_AUTOSET		0x8000
2312731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_MODE			0x2000
2322731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_DMAENAB		0x1000
2332731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_FRCDATATOG		0x0800
2342731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_DMAMODE		0x0400
2352731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_CLRDATATOG		0x0040
2362731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_FLUSHFIFO		0x0008
2372731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_FIFONOTEMPTY		0x0002
2382731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_TXPKTRDY		0x0001
2392731b9a8SJean-Christophe PLAGNIOL-VILLARD 
2402731b9a8SJean-Christophe PLAGNIOL-VILLARD /* TXCSR in Peripheral mode */
2412731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_P_ISO		0x4000
2422731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_P_INCOMPTX		0x0080
2432731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_P_SENTSTALL		0x0020
2442731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_P_SENDSTALL		0x0010
2452731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_P_UNDERRUN		0x0004
2462731b9a8SJean-Christophe PLAGNIOL-VILLARD 
2472731b9a8SJean-Christophe PLAGNIOL-VILLARD /* TXCSR in Host mode */
2482731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_H_WR_DATATOGGLE	0x0200
2492731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_H_DATATOGGLE		0x0100
2502731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_H_NAKTIMEOUT		0x0080
2512731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_H_RXSTALL		0x0020
2522731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_H_ERROR		0x0004
2532731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_H_DATATOGGLE_SHIFT	8
2542731b9a8SJean-Christophe PLAGNIOL-VILLARD 
2552731b9a8SJean-Christophe PLAGNIOL-VILLARD /* TXCSR bits to avoid zeroing (write zero clears, write 1 ignored) */
2562731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_P_WZC_BITS	\
2572731b9a8SJean-Christophe PLAGNIOL-VILLARD 	(MUSB_TXCSR_P_INCOMPTX | MUSB_TXCSR_P_SENTSTALL \
2582731b9a8SJean-Christophe PLAGNIOL-VILLARD 	| MUSB_TXCSR_P_UNDERRUN | MUSB_TXCSR_FIFONOTEMPTY)
2592731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_TXCSR_H_WZC_BITS	\
2602731b9a8SJean-Christophe PLAGNIOL-VILLARD 	(MUSB_TXCSR_H_NAKTIMEOUT | MUSB_TXCSR_H_RXSTALL \
2612731b9a8SJean-Christophe PLAGNIOL-VILLARD 	| MUSB_TXCSR_H_ERROR | MUSB_TXCSR_FIFONOTEMPTY)
2622731b9a8SJean-Christophe PLAGNIOL-VILLARD 
2632731b9a8SJean-Christophe PLAGNIOL-VILLARD /* RXCSR in Peripheral and Host mode */
2642731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_AUTOCLEAR		0x8000
2652731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_DMAENAB		0x2000
2662731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_DISNYET		0x1000
2672731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_PID_ERR		0x1000
2682731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_DMAMODE		0x0800
2692731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_INCOMPRX		0x0100
2702731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_CLRDATATOG		0x0080
2712731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_FLUSHFIFO		0x0010
2722731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_DATAERROR		0x0008
2732731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_FIFOFULL		0x0002
2742731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_RXPKTRDY		0x0001
2752731b9a8SJean-Christophe PLAGNIOL-VILLARD 
2762731b9a8SJean-Christophe PLAGNIOL-VILLARD /* RXCSR in Peripheral mode */
2772731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_P_ISO		0x4000
2782731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_P_SENTSTALL		0x0040
2792731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_P_SENDSTALL		0x0020
2802731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_P_OVERRUN		0x0004
2812731b9a8SJean-Christophe PLAGNIOL-VILLARD 
2822731b9a8SJean-Christophe PLAGNIOL-VILLARD /* RXCSR in Host mode */
2832731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_H_AUTOREQ		0x4000
2842731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_H_WR_DATATOGGLE	0x0400
2852731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_H_DATATOGGLE		0x0200
2862731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_H_RXSTALL		0x0040
2872731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_H_REQPKT		0x0020
2882731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_H_ERROR		0x0004
2892731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_S_RXCSR_H_DATATOGGLE	9
2902731b9a8SJean-Christophe PLAGNIOL-VILLARD 
2912731b9a8SJean-Christophe PLAGNIOL-VILLARD /* RXCSR bits to avoid zeroing (write zero clears, write 1 ignored) */
2922731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_P_WZC_BITS	\
2932731b9a8SJean-Christophe PLAGNIOL-VILLARD 	(MUSB_RXCSR_P_SENTSTALL | MUSB_RXCSR_P_OVERRUN \
2942731b9a8SJean-Christophe PLAGNIOL-VILLARD 	| MUSB_RXCSR_RXPKTRDY)
2952731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_RXCSR_H_WZC_BITS	\
2962731b9a8SJean-Christophe PLAGNIOL-VILLARD 	(MUSB_RXCSR_H_RXSTALL | MUSB_RXCSR_H_ERROR \
2972731b9a8SJean-Christophe PLAGNIOL-VILLARD 	| MUSB_RXCSR_DATAERROR | MUSB_RXCSR_RXPKTRDY)
2982731b9a8SJean-Christophe PLAGNIOL-VILLARD 
2992731b9a8SJean-Christophe PLAGNIOL-VILLARD /* HUBADDR */
3002731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MUSB_HUBADDR_MULTI_TT		0x80
3012731b9a8SJean-Christophe PLAGNIOL-VILLARD 
3022731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Endpoint configuration information. Note: The value of endpoint fifo size
3032731b9a8SJean-Christophe PLAGNIOL-VILLARD  * element should be either 8,16,32,64,128,256,512,1024,2048 or 4096. Other
3042731b9a8SJean-Christophe PLAGNIOL-VILLARD  * values are not supported
3052731b9a8SJean-Christophe PLAGNIOL-VILLARD  */
3062731b9a8SJean-Christophe PLAGNIOL-VILLARD struct musb_epinfo {
3072731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	epnum;	/* endpoint number 	*/
3082731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8	epdir;	/* endpoint direction	*/
3092731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u16	epsize;	/* endpoint FIFO size	*/
3102731b9a8SJean-Christophe PLAGNIOL-VILLARD };
3112731b9a8SJean-Christophe PLAGNIOL-VILLARD 
3122731b9a8SJean-Christophe PLAGNIOL-VILLARD /*
3132731b9a8SJean-Christophe PLAGNIOL-VILLARD  * Platform specific MUSB configuration. Any platform using the musb
3142731b9a8SJean-Christophe PLAGNIOL-VILLARD  * functionality should create one instance of this structure in the
3152731b9a8SJean-Christophe PLAGNIOL-VILLARD  * platform specific file.
3162731b9a8SJean-Christophe PLAGNIOL-VILLARD  */
3172731b9a8SJean-Christophe PLAGNIOL-VILLARD struct musb_config {
3182731b9a8SJean-Christophe PLAGNIOL-VILLARD 	struct	musb_regs	*regs;
3192731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u32			timeout;
3202731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u8			musb_speed;
3219bb47abfSAjay Kumar Gupta 	u8			extvbus;
3222731b9a8SJean-Christophe PLAGNIOL-VILLARD };
3232731b9a8SJean-Christophe PLAGNIOL-VILLARD 
3242731b9a8SJean-Christophe PLAGNIOL-VILLARD /* externally defined data */
3252731b9a8SJean-Christophe PLAGNIOL-VILLARD extern struct musb_config	musb_cfg;
3262731b9a8SJean-Christophe PLAGNIOL-VILLARD extern struct musb_regs		*musbr;
3272731b9a8SJean-Christophe PLAGNIOL-VILLARD 
3282731b9a8SJean-Christophe PLAGNIOL-VILLARD /* exported functions */
3292731b9a8SJean-Christophe PLAGNIOL-VILLARD extern void musb_start(void);
3300228348eSMike Frysinger extern void musb_configure_ep(const struct musb_epinfo *epinfo, u8 cnt);
3312731b9a8SJean-Christophe PLAGNIOL-VILLARD extern void write_fifo(u8 ep, u32 length, void *fifo_data);
3322731b9a8SJean-Christophe PLAGNIOL-VILLARD extern void read_fifo(u8 ep, u32 length, void *fifo_data);
3332731b9a8SJean-Christophe PLAGNIOL-VILLARD 
musb_read_ulpi_buscontrol(struct musb_regs * musbr)3349bb47abfSAjay Kumar Gupta static inline u8 musb_read_ulpi_buscontrol(struct musb_regs *musbr)
3359bb47abfSAjay Kumar Gupta {
3369bb47abfSAjay Kumar Gupta 	return readb(&musbr->ulpi_busctl);
3379bb47abfSAjay Kumar Gupta }
musb_write_ulpi_buscontrol(struct musb_regs * musbr,u8 val)3389bb47abfSAjay Kumar Gupta static inline void musb_write_ulpi_buscontrol(struct musb_regs *musbr, u8 val)
3399bb47abfSAjay Kumar Gupta {
3409bb47abfSAjay Kumar Gupta 	writeb(val, &musbr->ulpi_busctl);
3419bb47abfSAjay Kumar Gupta }
342e608f221SBryan Wu 
3432731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif	/* __MUSB_HDRC_DEFS_H__ */
344