blob: 7c3882aa1e028ac0f4acf3ded713a21386b7d061 [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Lukasz Dalek3c09a282012-10-02 17:04:32 +02002/*
3 * Intel PXA25x on-chip full speed USB device controller
4 *
5 * Copyright (C) 2003 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix
6 * Copyright (C) 2003 David Brownell
7 * Copyright (C) 2012 Lukasz Dalek <luk0104@gmail.com>
Lukasz Dalek3c09a282012-10-02 17:04:32 +02008 */
9
10#ifndef __LINUX_USB_GADGET_PXA25X_H
11#define __LINUX_USB_GADGET_PXA25X_H
12
13#include <linux/types.h>
14#include <asm/arch/regs-usb.h>
15
16/*
17 * Prefetching support - only ARMv5.
18 */
19
20#ifdef ARCH_HAS_PREFETCH
21static inline void prefetch(const void *ptr)
22{
23 __asm__ __volatile__(
24 "pld\t%a0"
25 :
26 : "p" (ptr)
27 : "cc");
28}
29
30#define prefetchw(ptr) prefetch(ptr)
31#endif /* ARCH_HAS_PREFETCH */
32
33/*-------------------------------------------------------------------------*/
34
35#define UDC_REGS ((struct pxa25x_udc_regs *)PXA25X_UDC_BASE)
36
37/*-------------------------------------------------------------------------*/
38
39struct pxa2xx_udc_mach_info {
40 int (*udc_is_connected)(void); /* do we see host? */
41 void (*udc_command)(int cmd);
42#define PXA2XX_UDC_CMD_CONNECT 0 /* let host see us */
43#define PXA2XX_UDC_CMD_DISCONNECT 1 /* so host won't see us */
44};
45
46struct pxa25x_udc;
47
48struct pxa25x_ep {
49 struct usb_ep ep;
50 struct pxa25x_udc *dev;
51
52 const struct usb_endpoint_descriptor *desc;
53 struct list_head queue;
54 unsigned long pio_irqs;
55
56 unsigned short fifo_size;
57 u8 bEndpointAddress;
58 u8 bmAttributes;
59
60 unsigned stopped:1;
61
62 /* UDCCS = UDC Control/Status for this EP
63 * UBCR = UDC Byte Count Remaining (contents of OUT fifo)
64 * UDDR = UDC Endpoint Data Register (the fifo)
65 * DRCM = DMA Request Channel Map
66 */
67 u32 *reg_udccs;
68 u32 *reg_ubcr;
69 u32 *reg_uddr;
70};
71
72struct pxa25x_request {
73 struct usb_request req;
74 struct list_head queue;
75};
76
77enum ep0_state {
78 EP0_IDLE,
79 EP0_IN_DATA_PHASE,
80 EP0_OUT_DATA_PHASE,
81 EP0_END_XFER,
82 EP0_STALL,
83};
84
85#define EP0_FIFO_SIZE 16U
86#define BULK_FIFO_SIZE 64U
87#define ISO_FIFO_SIZE 256U
88#define INT_FIFO_SIZE 8U
89
90struct udc_stats {
91 struct ep0stats {
92 unsigned long ops;
93 unsigned long bytes;
94 } read, write;
95 unsigned long irqs;
96};
97
98#ifdef CONFIG_USB_PXA25X_SMALL
99/* when memory's tight, SMALL config saves code+data. */
100#define PXA_UDC_NUM_ENDPOINTS 3
101#endif
102
103#ifndef PXA_UDC_NUM_ENDPOINTS
104#define PXA_UDC_NUM_ENDPOINTS 16
105#endif
106
107struct pxa25x_watchdog {
108 unsigned running:1;
109 ulong period;
110 ulong base;
111 struct pxa25x_udc *udc;
112
113 void (*function)(struct pxa25x_udc *udc);
114};
115
116struct pxa25x_udc {
117 struct usb_gadget gadget;
118 struct usb_gadget_driver *driver;
119 struct pxa25x_udc_regs *regs;
120
121 enum ep0_state ep0state;
122 struct udc_stats stats;
123 unsigned got_irq:1,
124 pullup:1,
125 has_cfr:1,
126 req_pending:1,
127 req_std:1,
128 req_config:1,
129 active:1;
130
131 struct clk *clk;
132 struct pxa2xx_udc_mach_info *mach;
133 u64 dma_mask;
134 struct pxa25x_ep ep[PXA_UDC_NUM_ENDPOINTS];
135
136 struct pxa25x_watchdog watchdog;
137};
138
139/*-------------------------------------------------------------------------*/
140
141static struct pxa25x_udc *the_controller;
142
143/*-------------------------------------------------------------------------*/
144
145#ifndef DEBUG
146# define NOISY 0
147#endif
148
149#endif /* __LINUX_USB_GADGET_PXA25X_H */