18ea1fbf7SHeiko Schocher /* 28ea1fbf7SHeiko Schocher * Copyright (C) 2004 by Thomas Rathbone, HP Labs 38ea1fbf7SHeiko Schocher * Copyright (C) 2005 by Ivan Kokshaysky 48ea1fbf7SHeiko Schocher * Copyright (C) 2006 by SAN People 58ea1fbf7SHeiko Schocher * 6*5b8031ccSTom Rini * SPDX-License-Identifier: GPL-2.0+ 78ea1fbf7SHeiko Schocher */ 88ea1fbf7SHeiko Schocher 98ea1fbf7SHeiko Schocher #ifndef AT91_UDC_H 108ea1fbf7SHeiko Schocher #define AT91_UDC_H 118ea1fbf7SHeiko Schocher 128ea1fbf7SHeiko Schocher /* 138ea1fbf7SHeiko Schocher * USB Device Port (UDP) registers. 148ea1fbf7SHeiko Schocher * Based on AT91RM9200 datasheet revision E. 158ea1fbf7SHeiko Schocher */ 168ea1fbf7SHeiko Schocher 178ea1fbf7SHeiko Schocher #define AT91_UDP_FRM_NUM 0x00 /* Frame Number Register */ 188ea1fbf7SHeiko Schocher #define AT91_UDP_NUM (0x7ff << 0) /* Frame Number */ 198ea1fbf7SHeiko Schocher #define AT91_UDP_FRM_ERR (1 << 16) /* Frame Error */ 208ea1fbf7SHeiko Schocher #define AT91_UDP_FRM_OK (1 << 17) /* Frame OK */ 218ea1fbf7SHeiko Schocher 228ea1fbf7SHeiko Schocher #define AT91_UDP_GLB_STAT 0x04 /* Global State Register */ 238ea1fbf7SHeiko Schocher #define AT91_UDP_FADDEN (1 << 0) /* Function Address Enable */ 248ea1fbf7SHeiko Schocher #define AT91_UDP_CONFG (1 << 1) /* Configured */ 258ea1fbf7SHeiko Schocher #define AT91_UDP_ESR (1 << 2) /* Enable Send Resume */ 268ea1fbf7SHeiko Schocher #define AT91_UDP_RSMINPR (1 << 3) /* Resume has been sent */ 278ea1fbf7SHeiko Schocher #define AT91_UDP_RMWUPE (1 << 4) /* Remote Wake Up Enable */ 288ea1fbf7SHeiko Schocher 298ea1fbf7SHeiko Schocher #define AT91_UDP_FADDR 0x08 /* Function Address Register */ 308ea1fbf7SHeiko Schocher #define AT91_UDP_FADD (0x7f << 0) /* Function Address Value */ 318ea1fbf7SHeiko Schocher #define AT91_UDP_FEN (1 << 8) /* Function Enable */ 328ea1fbf7SHeiko Schocher 338ea1fbf7SHeiko Schocher #define AT91_UDP_IER 0x10 /* Interrupt Enable Register */ 348ea1fbf7SHeiko Schocher #define AT91_UDP_IDR 0x14 /* Interrupt Disable Register */ 358ea1fbf7SHeiko Schocher #define AT91_UDP_IMR 0x18 /* Interrupt Mask Register */ 368ea1fbf7SHeiko Schocher 378ea1fbf7SHeiko Schocher #define AT91_UDP_ISR 0x1c /* Interrupt Status Register */ 388ea1fbf7SHeiko Schocher #define AT91_UDP_EP(n) (1 << (n)) /* Endpoint Interrupt Status */ 398ea1fbf7SHeiko Schocher #define AT91_UDP_RXSUSP (1 << 8) /* USB Suspend Interrupt Status */ 408ea1fbf7SHeiko Schocher #define AT91_UDP_RXRSM (1 << 9) /* USB Resume Interrupt Status */ 418ea1fbf7SHeiko Schocher #define AT91_UDP_EXTRSM (1 << 10) /* External Resume Interrupt Status [AT91RM9200 only] */ 428ea1fbf7SHeiko Schocher #define AT91_UDP_SOFINT (1 << 11) /* Start of Frame Interrupt Status */ 438ea1fbf7SHeiko Schocher #define AT91_UDP_ENDBUSRES (1 << 12) /* End of Bus Reset Interrupt Status */ 448ea1fbf7SHeiko Schocher #define AT91_UDP_WAKEUP (1 << 13) /* USB Wakeup Interrupt Status [AT91RM9200 only] */ 458ea1fbf7SHeiko Schocher 468ea1fbf7SHeiko Schocher #define AT91_UDP_ICR 0x20 /* Interrupt Clear Register */ 478ea1fbf7SHeiko Schocher #define AT91_UDP_RST_EP 0x28 /* Reset Endpoint Register */ 488ea1fbf7SHeiko Schocher 498ea1fbf7SHeiko Schocher #define AT91_UDP_CSR(n) (0x30+((n)*4)) /* Endpoint Control/Status Registers 0-7 */ 508ea1fbf7SHeiko Schocher #define AT91_UDP_TXCOMP (1 << 0) /* Generates IN packet with data previously written in DPR */ 518ea1fbf7SHeiko Schocher #define AT91_UDP_RX_DATA_BK0 (1 << 1) /* Receive Data Bank 0 */ 528ea1fbf7SHeiko Schocher #define AT91_UDP_RXSETUP (1 << 2) /* Send STALL to the host */ 538ea1fbf7SHeiko Schocher #define AT91_UDP_STALLSENT (1 << 3) /* Stall Sent / Isochronous error (Isochronous endpoints) */ 548ea1fbf7SHeiko Schocher #define AT91_UDP_TXPKTRDY (1 << 4) /* Transmit Packet Ready */ 558ea1fbf7SHeiko Schocher #define AT91_UDP_FORCESTALL (1 << 5) /* Force Stall */ 568ea1fbf7SHeiko Schocher #define AT91_UDP_RX_DATA_BK1 (1 << 6) /* Receive Data Bank 1 */ 578ea1fbf7SHeiko Schocher #define AT91_UDP_DIR (1 << 7) /* Transfer Direction */ 588ea1fbf7SHeiko Schocher #define AT91_UDP_EPTYPE (7 << 8) /* Endpoint Type */ 598ea1fbf7SHeiko Schocher #define AT91_UDP_EPTYPE_CTRL (0 << 8) 608ea1fbf7SHeiko Schocher #define AT91_UDP_EPTYPE_ISO_OUT (1 << 8) 618ea1fbf7SHeiko Schocher #define AT91_UDP_EPTYPE_BULK_OUT (2 << 8) 628ea1fbf7SHeiko Schocher #define AT91_UDP_EPTYPE_INT_OUT (3 << 8) 638ea1fbf7SHeiko Schocher #define AT91_UDP_EPTYPE_ISO_IN (5 << 8) 648ea1fbf7SHeiko Schocher #define AT91_UDP_EPTYPE_BULK_IN (6 << 8) 658ea1fbf7SHeiko Schocher #define AT91_UDP_EPTYPE_INT_IN (7 << 8) 668ea1fbf7SHeiko Schocher #define AT91_UDP_DTGLE (1 << 11) /* Data Toggle */ 678ea1fbf7SHeiko Schocher #define AT91_UDP_EPEDS (1 << 15) /* Endpoint Enable/Disable */ 688ea1fbf7SHeiko Schocher #define AT91_UDP_RXBYTECNT (0x7ff << 16) /* Number of bytes in FIFO */ 698ea1fbf7SHeiko Schocher 708ea1fbf7SHeiko Schocher #define AT91_UDP_FDR(n) (0x50+((n)*4)) /* Endpoint FIFO Data Registers 0-7 */ 718ea1fbf7SHeiko Schocher 728ea1fbf7SHeiko Schocher #define AT91_UDP_TXVC 0x74 /* Transceiver Control Register */ 738ea1fbf7SHeiko Schocher #define AT91_UDP_TXVC_TXVDIS (1 << 8) /* Transceiver Disable */ 748ea1fbf7SHeiko Schocher #define AT91_UDP_TXVC_PUON (1 << 9) /* PullUp On [AT91SAM9260 only] */ 758ea1fbf7SHeiko Schocher 768ea1fbf7SHeiko Schocher /*-------------------------------------------------------------------------*/ 778ea1fbf7SHeiko Schocher 788ea1fbf7SHeiko Schocher /* 798ea1fbf7SHeiko Schocher * controller driver data structures 808ea1fbf7SHeiko Schocher */ 818ea1fbf7SHeiko Schocher 828ea1fbf7SHeiko Schocher #define NUM_ENDPOINTS 6 838ea1fbf7SHeiko Schocher 848ea1fbf7SHeiko Schocher /* 858ea1fbf7SHeiko Schocher * hardware won't disable bus reset, or resume while the controller 868ea1fbf7SHeiko Schocher * is suspended ... watching suspend helps keep the logic symmetric. 878ea1fbf7SHeiko Schocher */ 888ea1fbf7SHeiko Schocher #define MINIMUS_INTERRUPTUS \ 898ea1fbf7SHeiko Schocher (AT91_UDP_ENDBUSRES | AT91_UDP_RXRSM | AT91_UDP_RXSUSP) 908ea1fbf7SHeiko Schocher 918ea1fbf7SHeiko Schocher struct at91_ep { 928ea1fbf7SHeiko Schocher struct usb_ep ep; 938ea1fbf7SHeiko Schocher struct list_head queue; 948ea1fbf7SHeiko Schocher struct at91_udc *udc; 958ea1fbf7SHeiko Schocher void __iomem *creg; 968ea1fbf7SHeiko Schocher 978ea1fbf7SHeiko Schocher unsigned maxpacket:16; 988ea1fbf7SHeiko Schocher u8 int_mask; 998ea1fbf7SHeiko Schocher unsigned is_pingpong:1; 1008ea1fbf7SHeiko Schocher 1018ea1fbf7SHeiko Schocher unsigned stopped:1; 1028ea1fbf7SHeiko Schocher unsigned is_in:1; 1038ea1fbf7SHeiko Schocher unsigned is_iso:1; 1048ea1fbf7SHeiko Schocher unsigned fifo_bank:1; 1058ea1fbf7SHeiko Schocher }; 1068ea1fbf7SHeiko Schocher 1078ea1fbf7SHeiko Schocher struct at91_udc_caps { 1088ea1fbf7SHeiko Schocher int (*init)(struct at91_udc *udc); 1098ea1fbf7SHeiko Schocher void (*pullup)(struct at91_udc *udc, int is_on); 1108ea1fbf7SHeiko Schocher }; 1118ea1fbf7SHeiko Schocher 1128ea1fbf7SHeiko Schocher /* 1138ea1fbf7SHeiko Schocher * driver is non-SMP, and just blocks IRQs whenever it needs 1148ea1fbf7SHeiko Schocher * access protection for chip registers or driver state 1158ea1fbf7SHeiko Schocher */ 1168ea1fbf7SHeiko Schocher struct at91_udc { 1178ea1fbf7SHeiko Schocher struct usb_gadget gadget; 1188ea1fbf7SHeiko Schocher struct at91_ep ep[NUM_ENDPOINTS]; 1198ea1fbf7SHeiko Schocher struct usb_gadget_driver *driver; 1208ea1fbf7SHeiko Schocher const struct at91_udc_caps *caps; 1218ea1fbf7SHeiko Schocher unsigned vbus:1; 1228ea1fbf7SHeiko Schocher unsigned enabled:1; 1238ea1fbf7SHeiko Schocher unsigned clocked:1; 1248ea1fbf7SHeiko Schocher unsigned suspended:1; 1258ea1fbf7SHeiko Schocher unsigned req_pending:1; 1268ea1fbf7SHeiko Schocher unsigned wait_for_addr_ack:1; 1278ea1fbf7SHeiko Schocher unsigned wait_for_config_ack:1; 12862019767SHeiko Schocher unsigned selfpowered:1; 1298ea1fbf7SHeiko Schocher unsigned active_suspend:1; 1308ea1fbf7SHeiko Schocher u8 addr; 1318ea1fbf7SHeiko Schocher struct at91_udc_data board; 1328ea1fbf7SHeiko Schocher void __iomem *udp_baseaddr; 1338ea1fbf7SHeiko Schocher int udp_irq; 1348ea1fbf7SHeiko Schocher spinlock_t lock; 13562019767SHeiko Schocher struct at91_matrix *matrix; 1368ea1fbf7SHeiko Schocher }; 1378ea1fbf7SHeiko Schocher to_udc(struct usb_gadget * g)1388ea1fbf7SHeiko Schocherstatic inline struct at91_udc *to_udc(struct usb_gadget *g) 1398ea1fbf7SHeiko Schocher { 1408ea1fbf7SHeiko Schocher return container_of(g, struct at91_udc, gadget); 1418ea1fbf7SHeiko Schocher } 1428ea1fbf7SHeiko Schocher 1438ea1fbf7SHeiko Schocher struct at91_request { 1448ea1fbf7SHeiko Schocher struct usb_request req; 1458ea1fbf7SHeiko Schocher struct list_head queue; 1468ea1fbf7SHeiko Schocher }; 1478ea1fbf7SHeiko Schocher 1488ea1fbf7SHeiko Schocher /*-------------------------------------------------------------------------*/ 1498ea1fbf7SHeiko Schocher 1508ea1fbf7SHeiko Schocher #ifdef VERBOSE_DEBUG 1518ea1fbf7SHeiko Schocher # define VDBG DBG 1528ea1fbf7SHeiko Schocher #else 1538ea1fbf7SHeiko Schocher # define VDBG(stuff...) do{}while(0) 1548ea1fbf7SHeiko Schocher #endif 1558ea1fbf7SHeiko Schocher 1568ea1fbf7SHeiko Schocher #ifdef PACKET_TRACE 1578ea1fbf7SHeiko Schocher # define PACKET VDBG 1588ea1fbf7SHeiko Schocher #else 1598ea1fbf7SHeiko Schocher # define PACKET(stuff...) do{}while(0) 1608ea1fbf7SHeiko Schocher #endif 1618ea1fbf7SHeiko Schocher 16262019767SHeiko Schocher #define ERR(stuff...) debug("udc: " stuff) 16362019767SHeiko Schocher #define WARNING(stuff...) debug("udc: " stuff) 16462019767SHeiko Schocher #define INFO(stuff...) debug("udc: " stuff) 16562019767SHeiko Schocher #define DBG(stuff...) debug("udc: " stuff) 1668ea1fbf7SHeiko Schocher 1678ea1fbf7SHeiko Schocher #endif 1688ea1fbf7SHeiko Schocher 169