1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * PLX NET2272 high/full speed USB device controller
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2005-2006 PLX Technology, Inc.
6*4882a593Smuzhiyun * Copyright (C) 2006-2011 Analog Devices, Inc.
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #ifndef __NET2272_H__
10*4882a593Smuzhiyun #define __NET2272_H__
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun /* Main Registers */
13*4882a593Smuzhiyun #define REGADDRPTR 0x00
14*4882a593Smuzhiyun #define REGDATA 0x01
15*4882a593Smuzhiyun #define IRQSTAT0 0x02
16*4882a593Smuzhiyun #define ENDPOINT_0_INTERRUPT 0
17*4882a593Smuzhiyun #define ENDPOINT_A_INTERRUPT 1
18*4882a593Smuzhiyun #define ENDPOINT_B_INTERRUPT 2
19*4882a593Smuzhiyun #define ENDPOINT_C_INTERRUPT 3
20*4882a593Smuzhiyun #define VIRTUALIZED_ENDPOINT_INTERRUPT 4
21*4882a593Smuzhiyun #define SETUP_PACKET_INTERRUPT 5
22*4882a593Smuzhiyun #define DMA_DONE_INTERRUPT 6
23*4882a593Smuzhiyun #define SOF_INTERRUPT 7
24*4882a593Smuzhiyun #define IRQSTAT1 0x03
25*4882a593Smuzhiyun #define CONTROL_STATUS_INTERRUPT 1
26*4882a593Smuzhiyun #define VBUS_INTERRUPT 2
27*4882a593Smuzhiyun #define SUSPEND_REQUEST_INTERRUPT 3
28*4882a593Smuzhiyun #define SUSPEND_REQUEST_CHANGE_INTERRUPT 4
29*4882a593Smuzhiyun #define RESUME_INTERRUPT 5
30*4882a593Smuzhiyun #define ROOT_PORT_RESET_INTERRUPT 6
31*4882a593Smuzhiyun #define RESET_STATUS 7
32*4882a593Smuzhiyun #define PAGESEL 0x04
33*4882a593Smuzhiyun #define DMAREQ 0x1c
34*4882a593Smuzhiyun #define DMA_ENDPOINT_SELECT 0
35*4882a593Smuzhiyun #define DREQ_POLARITY 1
36*4882a593Smuzhiyun #define DACK_POLARITY 2
37*4882a593Smuzhiyun #define EOT_POLARITY 3
38*4882a593Smuzhiyun #define DMA_CONTROL_DACK 4
39*4882a593Smuzhiyun #define DMA_REQUEST_ENABLE 5
40*4882a593Smuzhiyun #define DMA_REQUEST 6
41*4882a593Smuzhiyun #define DMA_BUFFER_VALID 7
42*4882a593Smuzhiyun #define SCRATCH 0x1d
43*4882a593Smuzhiyun #define IRQENB0 0x20
44*4882a593Smuzhiyun #define ENDPOINT_0_INTERRUPT_ENABLE 0
45*4882a593Smuzhiyun #define ENDPOINT_A_INTERRUPT_ENABLE 1
46*4882a593Smuzhiyun #define ENDPOINT_B_INTERRUPT_ENABLE 2
47*4882a593Smuzhiyun #define ENDPOINT_C_INTERRUPT_ENABLE 3
48*4882a593Smuzhiyun #define VIRTUALIZED_ENDPOINT_INTERRUPT_ENABLE 4
49*4882a593Smuzhiyun #define SETUP_PACKET_INTERRUPT_ENABLE 5
50*4882a593Smuzhiyun #define DMA_DONE_INTERRUPT_ENABLE 6
51*4882a593Smuzhiyun #define SOF_INTERRUPT_ENABLE 7
52*4882a593Smuzhiyun #define IRQENB1 0x21
53*4882a593Smuzhiyun #define VBUS_INTERRUPT_ENABLE 2
54*4882a593Smuzhiyun #define SUSPEND_REQUEST_INTERRUPT_ENABLE 3
55*4882a593Smuzhiyun #define SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE 4
56*4882a593Smuzhiyun #define RESUME_INTERRUPT_ENABLE 5
57*4882a593Smuzhiyun #define ROOT_PORT_RESET_INTERRUPT_ENABLE 6
58*4882a593Smuzhiyun #define LOCCTL 0x22
59*4882a593Smuzhiyun #define DATA_WIDTH 0
60*4882a593Smuzhiyun #define LOCAL_CLOCK_OUTPUT 1
61*4882a593Smuzhiyun #define LOCAL_CLOCK_OUTPUT_OFF 0
62*4882a593Smuzhiyun #define LOCAL_CLOCK_OUTPUT_3_75MHZ 1
63*4882a593Smuzhiyun #define LOCAL_CLOCK_OUTPUT_7_5MHZ 2
64*4882a593Smuzhiyun #define LOCAL_CLOCK_OUTPUT_15MHZ 3
65*4882a593Smuzhiyun #define LOCAL_CLOCK_OUTPUT_30MHZ 4
66*4882a593Smuzhiyun #define LOCAL_CLOCK_OUTPUT_60MHZ 5
67*4882a593Smuzhiyun #define DMA_SPLIT_BUS_MODE 4
68*4882a593Smuzhiyun #define BYTE_SWAP 5
69*4882a593Smuzhiyun #define BUFFER_CONFIGURATION 6
70*4882a593Smuzhiyun #define BUFFER_CONFIGURATION_EPA512_EPB512 0
71*4882a593Smuzhiyun #define BUFFER_CONFIGURATION_EPA1024_EPB512 1
72*4882a593Smuzhiyun #define BUFFER_CONFIGURATION_EPA1024_EPB1024 2
73*4882a593Smuzhiyun #define BUFFER_CONFIGURATION_EPA1024DB 3
74*4882a593Smuzhiyun #define CHIPREV_LEGACY 0x23
75*4882a593Smuzhiyun #define NET2270_LEGACY_REV 0x40
76*4882a593Smuzhiyun #define LOCCTL1 0x24
77*4882a593Smuzhiyun #define DMA_MODE 0
78*4882a593Smuzhiyun #define SLOW_DREQ 0
79*4882a593Smuzhiyun #define FAST_DREQ 1
80*4882a593Smuzhiyun #define BURST_MODE 2
81*4882a593Smuzhiyun #define DMA_DACK_ENABLE 2
82*4882a593Smuzhiyun #define CHIPREV_2272 0x25
83*4882a593Smuzhiyun #define CHIPREV_NET2272_R1 0x10
84*4882a593Smuzhiyun #define CHIPREV_NET2272_R1A 0x11
85*4882a593Smuzhiyun /* USB Registers */
86*4882a593Smuzhiyun #define USBCTL0 0x18
87*4882a593Smuzhiyun #define IO_WAKEUP_ENABLE 1
88*4882a593Smuzhiyun #define USB_DETECT_ENABLE 3
89*4882a593Smuzhiyun #define USB_ROOT_PORT_WAKEUP_ENABLE 5
90*4882a593Smuzhiyun #define USBCTL1 0x19
91*4882a593Smuzhiyun #define VBUS_PIN 0
92*4882a593Smuzhiyun #define USB_FULL_SPEED 1
93*4882a593Smuzhiyun #define USB_HIGH_SPEED 2
94*4882a593Smuzhiyun #define GENERATE_RESUME 3
95*4882a593Smuzhiyun #define VIRTUAL_ENDPOINT_ENABLE 4
96*4882a593Smuzhiyun #define FRAME0 0x1a
97*4882a593Smuzhiyun #define FRAME1 0x1b
98*4882a593Smuzhiyun #define OURADDR 0x30
99*4882a593Smuzhiyun #define FORCE_IMMEDIATE 7
100*4882a593Smuzhiyun #define USBDIAG 0x31
101*4882a593Smuzhiyun #define FORCE_TRANSMIT_CRC_ERROR 0
102*4882a593Smuzhiyun #define PREVENT_TRANSMIT_BIT_STUFF 1
103*4882a593Smuzhiyun #define FORCE_RECEIVE_ERROR 2
104*4882a593Smuzhiyun #define FAST_TIMES 4
105*4882a593Smuzhiyun #define USBTEST 0x32
106*4882a593Smuzhiyun #define TEST_MODE_SELECT 0
107*4882a593Smuzhiyun #define NORMAL_OPERATION 0
108*4882a593Smuzhiyun #define XCVRDIAG 0x33
109*4882a593Smuzhiyun #define FORCE_FULL_SPEED 2
110*4882a593Smuzhiyun #define FORCE_HIGH_SPEED 3
111*4882a593Smuzhiyun #define OPMODE 4
112*4882a593Smuzhiyun #define NORMAL_OPERATION 0
113*4882a593Smuzhiyun #define NON_DRIVING 1
114*4882a593Smuzhiyun #define DISABLE_BITSTUFF_AND_NRZI_ENCODE 2
115*4882a593Smuzhiyun #define LINESTATE 6
116*4882a593Smuzhiyun #define SE0_STATE 0
117*4882a593Smuzhiyun #define J_STATE 1
118*4882a593Smuzhiyun #define K_STATE 2
119*4882a593Smuzhiyun #define SE1_STATE 3
120*4882a593Smuzhiyun #define VIRTOUT0 0x34
121*4882a593Smuzhiyun #define VIRTOUT1 0x35
122*4882a593Smuzhiyun #define VIRTIN0 0x36
123*4882a593Smuzhiyun #define VIRTIN1 0x37
124*4882a593Smuzhiyun #define SETUP0 0x40
125*4882a593Smuzhiyun #define SETUP1 0x41
126*4882a593Smuzhiyun #define SETUP2 0x42
127*4882a593Smuzhiyun #define SETUP3 0x43
128*4882a593Smuzhiyun #define SETUP4 0x44
129*4882a593Smuzhiyun #define SETUP5 0x45
130*4882a593Smuzhiyun #define SETUP6 0x46
131*4882a593Smuzhiyun #define SETUP7 0x47
132*4882a593Smuzhiyun /* Endpoint Registers (Paged via PAGESEL) */
133*4882a593Smuzhiyun #define EP_DATA 0x05
134*4882a593Smuzhiyun #define EP_STAT0 0x06
135*4882a593Smuzhiyun #define DATA_IN_TOKEN_INTERRUPT 0
136*4882a593Smuzhiyun #define DATA_OUT_TOKEN_INTERRUPT 1
137*4882a593Smuzhiyun #define DATA_PACKET_TRANSMITTED_INTERRUPT 2
138*4882a593Smuzhiyun #define DATA_PACKET_RECEIVED_INTERRUPT 3
139*4882a593Smuzhiyun #define SHORT_PACKET_TRANSFERRED_INTERRUPT 4
140*4882a593Smuzhiyun #define NAK_OUT_PACKETS 5
141*4882a593Smuzhiyun #define BUFFER_EMPTY 6
142*4882a593Smuzhiyun #define BUFFER_FULL 7
143*4882a593Smuzhiyun #define EP_STAT1 0x07
144*4882a593Smuzhiyun #define TIMEOUT 0
145*4882a593Smuzhiyun #define USB_OUT_ACK_SENT 1
146*4882a593Smuzhiyun #define USB_OUT_NAK_SENT 2
147*4882a593Smuzhiyun #define USB_IN_ACK_RCVD 3
148*4882a593Smuzhiyun #define USB_IN_NAK_SENT 4
149*4882a593Smuzhiyun #define USB_STALL_SENT 5
150*4882a593Smuzhiyun #define LOCAL_OUT_ZLP 6
151*4882a593Smuzhiyun #define BUFFER_FLUSH 7
152*4882a593Smuzhiyun #define EP_TRANSFER0 0x08
153*4882a593Smuzhiyun #define EP_TRANSFER1 0x09
154*4882a593Smuzhiyun #define EP_TRANSFER2 0x0a
155*4882a593Smuzhiyun #define EP_IRQENB 0x0b
156*4882a593Smuzhiyun #define DATA_IN_TOKEN_INTERRUPT_ENABLE 0
157*4882a593Smuzhiyun #define DATA_OUT_TOKEN_INTERRUPT_ENABLE 1
158*4882a593Smuzhiyun #define DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE 2
159*4882a593Smuzhiyun #define DATA_PACKET_RECEIVED_INTERRUPT_ENABLE 3
160*4882a593Smuzhiyun #define SHORT_PACKET_TRANSFERRED_INTERRUPT_ENABLE 4
161*4882a593Smuzhiyun #define EP_AVAIL0 0x0c
162*4882a593Smuzhiyun #define EP_AVAIL1 0x0d
163*4882a593Smuzhiyun #define EP_RSPCLR 0x0e
164*4882a593Smuzhiyun #define EP_RSPSET 0x0f
165*4882a593Smuzhiyun #define ENDPOINT_HALT 0
166*4882a593Smuzhiyun #define ENDPOINT_TOGGLE 1
167*4882a593Smuzhiyun #define NAK_OUT_PACKETS_MODE 2
168*4882a593Smuzhiyun #define CONTROL_STATUS_PHASE_HANDSHAKE 3
169*4882a593Smuzhiyun #define INTERRUPT_MODE 4
170*4882a593Smuzhiyun #define AUTOVALIDATE 5
171*4882a593Smuzhiyun #define HIDE_STATUS_PHASE 6
172*4882a593Smuzhiyun #define ALT_NAK_OUT_PACKETS 7
173*4882a593Smuzhiyun #define EP_MAXPKT0 0x28
174*4882a593Smuzhiyun #define EP_MAXPKT1 0x29
175*4882a593Smuzhiyun #define ADDITIONAL_TRANSACTION_OPPORTUNITIES 3
176*4882a593Smuzhiyun #define NONE_ADDITIONAL_TRANSACTION 0
177*4882a593Smuzhiyun #define ONE_ADDITIONAL_TRANSACTION 1
178*4882a593Smuzhiyun #define TWO_ADDITIONAL_TRANSACTION 2
179*4882a593Smuzhiyun #define EP_CFG 0x2a
180*4882a593Smuzhiyun #define ENDPOINT_NUMBER 0
181*4882a593Smuzhiyun #define ENDPOINT_DIRECTION 4
182*4882a593Smuzhiyun #define ENDPOINT_TYPE 5
183*4882a593Smuzhiyun #define ENDPOINT_ENABLE 7
184*4882a593Smuzhiyun #define EP_HBW 0x2b
185*4882a593Smuzhiyun #define HIGH_BANDWIDTH_OUT_TRANSACTION_PID 0
186*4882a593Smuzhiyun #define DATA0_PID 0
187*4882a593Smuzhiyun #define DATA1_PID 1
188*4882a593Smuzhiyun #define DATA2_PID 2
189*4882a593Smuzhiyun #define MDATA_PID 3
190*4882a593Smuzhiyun #define EP_BUFF_STATES 0x2c
191*4882a593Smuzhiyun #define BUFFER_A_STATE 0
192*4882a593Smuzhiyun #define BUFFER_B_STATE 2
193*4882a593Smuzhiyun #define BUFF_FREE 0
194*4882a593Smuzhiyun #define BUFF_VALID 1
195*4882a593Smuzhiyun #define BUFF_LCL 2
196*4882a593Smuzhiyun #define BUFF_USB 3
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun /*---------------------------------------------------------------------------*/
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun #define PCI_DEVICE_ID_RDK1 0x9054
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun /* PCI-RDK EPLD Registers */
203*4882a593Smuzhiyun #define RDK_EPLD_IO_REGISTER1 0x00000000
204*4882a593Smuzhiyun #define RDK_EPLD_USB_RESET 0
205*4882a593Smuzhiyun #define RDK_EPLD_USB_POWERDOWN 1
206*4882a593Smuzhiyun #define RDK_EPLD_USB_WAKEUP 2
207*4882a593Smuzhiyun #define RDK_EPLD_USB_EOT 3
208*4882a593Smuzhiyun #define RDK_EPLD_DPPULL 4
209*4882a593Smuzhiyun #define RDK_EPLD_IO_REGISTER2 0x00000004
210*4882a593Smuzhiyun #define RDK_EPLD_BUSWIDTH 0
211*4882a593Smuzhiyun #define RDK_EPLD_USER 2
212*4882a593Smuzhiyun #define RDK_EPLD_RESET_INTERRUPT_ENABLE 3
213*4882a593Smuzhiyun #define RDK_EPLD_DMA_TIMEOUT_ENABLE 4
214*4882a593Smuzhiyun #define RDK_EPLD_STATUS_REGISTER 0x00000008
215*4882a593Smuzhiyun #define RDK_EPLD_USB_LRESET 0
216*4882a593Smuzhiyun #define RDK_EPLD_REVISION_REGISTER 0x0000000c
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun /* PCI-RDK PLX 9054 Registers */
219*4882a593Smuzhiyun #define INTCSR 0x68
220*4882a593Smuzhiyun #define PCI_INTERRUPT_ENABLE 8
221*4882a593Smuzhiyun #define LOCAL_INTERRUPT_INPUT_ENABLE 11
222*4882a593Smuzhiyun #define LOCAL_INPUT_INTERRUPT_ACTIVE 15
223*4882a593Smuzhiyun #define LOCAL_DMA_CHANNEL_0_INTERRUPT_ENABLE 18
224*4882a593Smuzhiyun #define LOCAL_DMA_CHANNEL_1_INTERRUPT_ENABLE 19
225*4882a593Smuzhiyun #define DMA_CHANNEL_0_INTERRUPT_ACTIVE 21
226*4882a593Smuzhiyun #define DMA_CHANNEL_1_INTERRUPT_ACTIVE 22
227*4882a593Smuzhiyun #define CNTRL 0x6C
228*4882a593Smuzhiyun #define RELOAD_CONFIGURATION_REGISTERS 29
229*4882a593Smuzhiyun #define PCI_ADAPTER_SOFTWARE_RESET 30
230*4882a593Smuzhiyun #define DMAMODE0 0x80
231*4882a593Smuzhiyun #define LOCAL_BUS_WIDTH 0
232*4882a593Smuzhiyun #define INTERNAL_WAIT_STATES 2
233*4882a593Smuzhiyun #define TA_READY_INPUT_ENABLE 6
234*4882a593Smuzhiyun #define LOCAL_BURST_ENABLE 8
235*4882a593Smuzhiyun #define SCATTER_GATHER_MODE 9
236*4882a593Smuzhiyun #define DONE_INTERRUPT_ENABLE 10
237*4882a593Smuzhiyun #define LOCAL_ADDRESSING_MODE 11
238*4882a593Smuzhiyun #define DEMAND_MODE 12
239*4882a593Smuzhiyun #define DMA_EOT_ENABLE 14
240*4882a593Smuzhiyun #define FAST_SLOW_TERMINATE_MODE_SELECT 15
241*4882a593Smuzhiyun #define DMA_CHANNEL_INTERRUPT_SELECT 17
242*4882a593Smuzhiyun #define DMAPADR0 0x84
243*4882a593Smuzhiyun #define DMALADR0 0x88
244*4882a593Smuzhiyun #define DMASIZ0 0x8c
245*4882a593Smuzhiyun #define DMADPR0 0x90
246*4882a593Smuzhiyun #define DESCRIPTOR_LOCATION 0
247*4882a593Smuzhiyun #define END_OF_CHAIN 1
248*4882a593Smuzhiyun #define INTERRUPT_AFTER_TERMINAL_COUNT 2
249*4882a593Smuzhiyun #define DIRECTION_OF_TRANSFER 3
250*4882a593Smuzhiyun #define DMACSR0 0xa8
251*4882a593Smuzhiyun #define CHANNEL_ENABLE 0
252*4882a593Smuzhiyun #define CHANNEL_START 1
253*4882a593Smuzhiyun #define CHANNEL_ABORT 2
254*4882a593Smuzhiyun #define CHANNEL_CLEAR_INTERRUPT 3
255*4882a593Smuzhiyun #define CHANNEL_DONE 4
256*4882a593Smuzhiyun #define DMATHR 0xb0
257*4882a593Smuzhiyun #define LBRD1 0xf8
258*4882a593Smuzhiyun #define MEMORY_SPACE_LOCAL_BUS_WIDTH 0
259*4882a593Smuzhiyun #define W8_BIT 0
260*4882a593Smuzhiyun #define W16_BIT 1
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun /* Special OR'ing of INTCSR bits */
263*4882a593Smuzhiyun #define LOCAL_INTERRUPT_TEST \
264*4882a593Smuzhiyun ((1 << LOCAL_INPUT_INTERRUPT_ACTIVE) | \
265*4882a593Smuzhiyun (1 << LOCAL_INTERRUPT_INPUT_ENABLE))
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun #define DMA_CHANNEL_0_TEST \
268*4882a593Smuzhiyun ((1 << DMA_CHANNEL_0_INTERRUPT_ACTIVE) | \
269*4882a593Smuzhiyun (1 << LOCAL_DMA_CHANNEL_0_INTERRUPT_ENABLE))
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun #define DMA_CHANNEL_1_TEST \
272*4882a593Smuzhiyun ((1 << DMA_CHANNEL_1_INTERRUPT_ACTIVE) | \
273*4882a593Smuzhiyun (1 << LOCAL_DMA_CHANNEL_1_INTERRUPT_ENABLE))
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun /* EPLD Registers */
276*4882a593Smuzhiyun #define RDK_EPLD_IO_REGISTER1 0x00000000
277*4882a593Smuzhiyun #define RDK_EPLD_USB_RESET 0
278*4882a593Smuzhiyun #define RDK_EPLD_USB_POWERDOWN 1
279*4882a593Smuzhiyun #define RDK_EPLD_USB_WAKEUP 2
280*4882a593Smuzhiyun #define RDK_EPLD_USB_EOT 3
281*4882a593Smuzhiyun #define RDK_EPLD_DPPULL 4
282*4882a593Smuzhiyun #define RDK_EPLD_IO_REGISTER2 0x00000004
283*4882a593Smuzhiyun #define RDK_EPLD_BUSWIDTH 0
284*4882a593Smuzhiyun #define RDK_EPLD_USER 2
285*4882a593Smuzhiyun #define RDK_EPLD_RESET_INTERRUPT_ENABLE 3
286*4882a593Smuzhiyun #define RDK_EPLD_DMA_TIMEOUT_ENABLE 4
287*4882a593Smuzhiyun #define RDK_EPLD_STATUS_REGISTER 0x00000008
288*4882a593Smuzhiyun #define RDK_EPLD_USB_LRESET 0
289*4882a593Smuzhiyun #define RDK_EPLD_REVISION_REGISTER 0x0000000c
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun #define EPLD_IO_CONTROL_REGISTER 0x400
292*4882a593Smuzhiyun #define NET2272_RESET 0
293*4882a593Smuzhiyun #define BUSWIDTH 1
294*4882a593Smuzhiyun #define MPX_MODE 3
295*4882a593Smuzhiyun #define USER 4
296*4882a593Smuzhiyun #define DMA_TIMEOUT_ENABLE 5
297*4882a593Smuzhiyun #define DMA_CTL_DACK 6
298*4882a593Smuzhiyun #define EPLD_DMA_ENABLE 7
299*4882a593Smuzhiyun #define EPLD_DMA_CONTROL_REGISTER 0x800
300*4882a593Smuzhiyun #define SPLIT_DMA_MODE 0
301*4882a593Smuzhiyun #define SPLIT_DMA_DIRECTION 1
302*4882a593Smuzhiyun #define SPLIT_DMA_ENABLE 2
303*4882a593Smuzhiyun #define SPLIT_DMA_INTERRUPT_ENABLE 3
304*4882a593Smuzhiyun #define SPLIT_DMA_INTERRUPT 4
305*4882a593Smuzhiyun #define EPLD_DMA_MODE 5
306*4882a593Smuzhiyun #define EPLD_DMA_CONTROLLER_ENABLE 7
307*4882a593Smuzhiyun #define SPLIT_DMA_ADDRESS_LOW 0xc00
308*4882a593Smuzhiyun #define SPLIT_DMA_ADDRESS_HIGH 0x1000
309*4882a593Smuzhiyun #define SPLIT_DMA_BYTE_COUNT_LOW 0x1400
310*4882a593Smuzhiyun #define SPLIT_DMA_BYTE_COUNT_HIGH 0x1800
311*4882a593Smuzhiyun #define EPLD_REVISION_REGISTER 0x1c00
312*4882a593Smuzhiyun #define SPLIT_DMA_RAM 0x4000
313*4882a593Smuzhiyun #define DMA_RAM_SIZE 0x1000
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun /*---------------------------------------------------------------------------*/
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun #define PCI_DEVICE_ID_RDK2 0x3272
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun /* PCI-RDK version 2 registers */
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun /* Main Control Registers */
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun #define RDK2_IRQENB 0x00
324*4882a593Smuzhiyun #define RDK2_IRQSTAT 0x04
325*4882a593Smuzhiyun #define PB7 23
326*4882a593Smuzhiyun #define PB6 22
327*4882a593Smuzhiyun #define PB5 21
328*4882a593Smuzhiyun #define PB4 20
329*4882a593Smuzhiyun #define PB3 19
330*4882a593Smuzhiyun #define PB2 18
331*4882a593Smuzhiyun #define PB1 17
332*4882a593Smuzhiyun #define PB0 16
333*4882a593Smuzhiyun #define GP3 23
334*4882a593Smuzhiyun #define GP2 23
335*4882a593Smuzhiyun #define GP1 23
336*4882a593Smuzhiyun #define GP0 23
337*4882a593Smuzhiyun #define DMA_RETRY_ABORT 6
338*4882a593Smuzhiyun #define DMA_PAUSE_DONE 5
339*4882a593Smuzhiyun #define DMA_ABORT_DONE 4
340*4882a593Smuzhiyun #define DMA_OUT_FIFO_TRANSFER_DONE 3
341*4882a593Smuzhiyun #define DMA_LOCAL_DONE 2
342*4882a593Smuzhiyun #define DMA_PCI_DONE 1
343*4882a593Smuzhiyun #define NET2272_PCI_IRQ 0
344*4882a593Smuzhiyun
345*4882a593Smuzhiyun #define RDK2_LOCCTLRDK 0x08
346*4882a593Smuzhiyun #define CHIP_RESET 3
347*4882a593Smuzhiyun #define SPLIT_DMA 2
348*4882a593Smuzhiyun #define MULTIPLEX_MODE 1
349*4882a593Smuzhiyun #define BUS_WIDTH 0
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun #define RDK2_GPIOCTL 0x10
352*4882a593Smuzhiyun #define GP3_OUT_ENABLE 7
353*4882a593Smuzhiyun #define GP2_OUT_ENABLE 6
354*4882a593Smuzhiyun #define GP1_OUT_ENABLE 5
355*4882a593Smuzhiyun #define GP0_OUT_ENABLE 4
356*4882a593Smuzhiyun #define GP3_DATA 3
357*4882a593Smuzhiyun #define GP2_DATA 2
358*4882a593Smuzhiyun #define GP1_DATA 1
359*4882a593Smuzhiyun #define GP0_DATA 0
360*4882a593Smuzhiyun
361*4882a593Smuzhiyun #define RDK2_LEDSW 0x14
362*4882a593Smuzhiyun #define LED3 27
363*4882a593Smuzhiyun #define LED2 26
364*4882a593Smuzhiyun #define LED1 25
365*4882a593Smuzhiyun #define LED0 24
366*4882a593Smuzhiyun #define PBUTTON 16
367*4882a593Smuzhiyun #define DIPSW 0
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun #define RDK2_DIAG 0x18
370*4882a593Smuzhiyun #define RDK2_FAST_TIMES 2
371*4882a593Smuzhiyun #define FORCE_PCI_SERR 1
372*4882a593Smuzhiyun #define FORCE_PCI_INT 0
373*4882a593Smuzhiyun #define RDK2_FPGAREV 0x1C
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun /* Dma Control registers */
376*4882a593Smuzhiyun #define RDK2_DMACTL 0x80
377*4882a593Smuzhiyun #define ADDR_HOLD 24
378*4882a593Smuzhiyun #define RETRY_COUNT 16 /* 23:16 */
379*4882a593Smuzhiyun #define FIFO_THRESHOLD 11 /* 15:11 */
380*4882a593Smuzhiyun #define MEM_WRITE_INVALIDATE 10
381*4882a593Smuzhiyun #define READ_MULTIPLE 9
382*4882a593Smuzhiyun #define READ_LINE 8
383*4882a593Smuzhiyun #define RDK2_DMA_MODE 6 /* 7:6 */
384*4882a593Smuzhiyun #define CONTROL_DACK 5
385*4882a593Smuzhiyun #define EOT_ENABLE 4
386*4882a593Smuzhiyun #define EOT_POLARITY 3
387*4882a593Smuzhiyun #define DACK_POLARITY 2
388*4882a593Smuzhiyun #define DREQ_POLARITY 1
389*4882a593Smuzhiyun #define DMA_ENABLE 0
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun #define RDK2_DMASTAT 0x84
392*4882a593Smuzhiyun #define GATHER_COUNT 12 /* 14:12 */
393*4882a593Smuzhiyun #define FIFO_COUNT 6 /* 11:6 */
394*4882a593Smuzhiyun #define FIFO_FLUSH 5
395*4882a593Smuzhiyun #define FIFO_TRANSFER 4
396*4882a593Smuzhiyun #define PAUSE_DONE 3
397*4882a593Smuzhiyun #define ABORT_DONE 2
398*4882a593Smuzhiyun #define DMA_ABORT 1
399*4882a593Smuzhiyun #define DMA_START 0
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun #define RDK2_DMAPCICOUNT 0x88
402*4882a593Smuzhiyun #define DMA_DIRECTION 31
403*4882a593Smuzhiyun #define DMA_PCI_BYTE_COUNT 0 /* 0:23 */
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun #define RDK2_DMALOCCOUNT 0x8C /* 0:23 dma local byte count */
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun #define RDK2_DMAADDR 0x90 /* 2:31 PCI bus starting address */
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun /*---------------------------------------------------------------------------*/
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun #define REG_INDEXED_THRESHOLD (1 << 5)
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun /* DRIVER DATA STRUCTURES and UTILITIES */
414*4882a593Smuzhiyun struct net2272_ep {
415*4882a593Smuzhiyun struct usb_ep ep;
416*4882a593Smuzhiyun struct net2272 *dev;
417*4882a593Smuzhiyun unsigned long irqs;
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun /* analogous to a host-side qh */
420*4882a593Smuzhiyun struct list_head queue;
421*4882a593Smuzhiyun const struct usb_endpoint_descriptor *desc;
422*4882a593Smuzhiyun unsigned num:8,
423*4882a593Smuzhiyun fifo_size:12,
424*4882a593Smuzhiyun stopped:1,
425*4882a593Smuzhiyun wedged:1,
426*4882a593Smuzhiyun is_in:1,
427*4882a593Smuzhiyun is_iso:1,
428*4882a593Smuzhiyun dma:1,
429*4882a593Smuzhiyun not_empty:1;
430*4882a593Smuzhiyun };
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun struct net2272 {
433*4882a593Smuzhiyun /* each device provides one gadget, several endpoints */
434*4882a593Smuzhiyun struct usb_gadget gadget;
435*4882a593Smuzhiyun struct device *dev;
436*4882a593Smuzhiyun unsigned short dev_id;
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun spinlock_t lock;
439*4882a593Smuzhiyun struct net2272_ep ep[4];
440*4882a593Smuzhiyun struct usb_gadget_driver *driver;
441*4882a593Smuzhiyun unsigned protocol_stall:1,
442*4882a593Smuzhiyun softconnect:1,
443*4882a593Smuzhiyun wakeup:1,
444*4882a593Smuzhiyun added:1,
445*4882a593Smuzhiyun dma_eot_polarity:1,
446*4882a593Smuzhiyun dma_dack_polarity:1,
447*4882a593Smuzhiyun dma_dreq_polarity:1,
448*4882a593Smuzhiyun dma_busy:1;
449*4882a593Smuzhiyun u16 chiprev;
450*4882a593Smuzhiyun u8 pagesel;
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun unsigned int irq;
453*4882a593Smuzhiyun unsigned short fifo_mode;
454*4882a593Smuzhiyun
455*4882a593Smuzhiyun unsigned int base_shift;
456*4882a593Smuzhiyun u16 __iomem *base_addr;
457*4882a593Smuzhiyun union {
458*4882a593Smuzhiyun #ifdef CONFIG_USB_PCI
459*4882a593Smuzhiyun struct {
460*4882a593Smuzhiyun void __iomem *plx9054_base_addr;
461*4882a593Smuzhiyun void __iomem *epld_base_addr;
462*4882a593Smuzhiyun } rdk1;
463*4882a593Smuzhiyun struct {
464*4882a593Smuzhiyun /* Bar0, Bar1 is base_addr both mem-mapped */
465*4882a593Smuzhiyun void __iomem *fpga_base_addr;
466*4882a593Smuzhiyun } rdk2;
467*4882a593Smuzhiyun #endif
468*4882a593Smuzhiyun };
469*4882a593Smuzhiyun };
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun static void __iomem *
net2272_reg_addr(struct net2272 * dev,unsigned int reg)472*4882a593Smuzhiyun net2272_reg_addr(struct net2272 *dev, unsigned int reg)
473*4882a593Smuzhiyun {
474*4882a593Smuzhiyun return dev->base_addr + (reg << dev->base_shift);
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun static void
net2272_write(struct net2272 * dev,unsigned int reg,u8 value)478*4882a593Smuzhiyun net2272_write(struct net2272 *dev, unsigned int reg, u8 value)
479*4882a593Smuzhiyun {
480*4882a593Smuzhiyun if (reg >= REG_INDEXED_THRESHOLD) {
481*4882a593Smuzhiyun /*
482*4882a593Smuzhiyun * Indexed register; use REGADDRPTR/REGDATA
483*4882a593Smuzhiyun * - Save and restore REGADDRPTR. This prevents REGADDRPTR from
484*4882a593Smuzhiyun * changes between other code sections, but it is time consuming.
485*4882a593Smuzhiyun * - Performance tips: either do not save and restore REGADDRPTR (if it
486*4882a593Smuzhiyun * is safe) or do save/restore operations only in critical sections.
487*4882a593Smuzhiyun u8 tmp = readb(dev->base_addr + REGADDRPTR);
488*4882a593Smuzhiyun */
489*4882a593Smuzhiyun writeb((u8)reg, net2272_reg_addr(dev, REGADDRPTR));
490*4882a593Smuzhiyun writeb(value, net2272_reg_addr(dev, REGDATA));
491*4882a593Smuzhiyun /* writeb(tmp, net2272_reg_addr(dev, REGADDRPTR)); */
492*4882a593Smuzhiyun } else
493*4882a593Smuzhiyun writeb(value, net2272_reg_addr(dev, reg));
494*4882a593Smuzhiyun }
495*4882a593Smuzhiyun
496*4882a593Smuzhiyun static u8
net2272_read(struct net2272 * dev,unsigned int reg)497*4882a593Smuzhiyun net2272_read(struct net2272 *dev, unsigned int reg)
498*4882a593Smuzhiyun {
499*4882a593Smuzhiyun u8 ret;
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun if (reg >= REG_INDEXED_THRESHOLD) {
502*4882a593Smuzhiyun /*
503*4882a593Smuzhiyun * Indexed register; use REGADDRPTR/REGDATA
504*4882a593Smuzhiyun * - Save and restore REGADDRPTR. This prevents REGADDRPTR from
505*4882a593Smuzhiyun * changes between other code sections, but it is time consuming.
506*4882a593Smuzhiyun * - Performance tips: either do not save and restore REGADDRPTR (if it
507*4882a593Smuzhiyun * is safe) or do save/restore operations only in critical sections.
508*4882a593Smuzhiyun u8 tmp = readb(dev->base_addr + REGADDRPTR);
509*4882a593Smuzhiyun */
510*4882a593Smuzhiyun writeb((u8)reg, net2272_reg_addr(dev, REGADDRPTR));
511*4882a593Smuzhiyun ret = readb(net2272_reg_addr(dev, REGDATA));
512*4882a593Smuzhiyun /* writeb(tmp, net2272_reg_addr(dev, REGADDRPTR)); */
513*4882a593Smuzhiyun } else
514*4882a593Smuzhiyun ret = readb(net2272_reg_addr(dev, reg));
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun return ret;
517*4882a593Smuzhiyun }
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun static void
net2272_ep_write(struct net2272_ep * ep,unsigned int reg,u8 value)520*4882a593Smuzhiyun net2272_ep_write(struct net2272_ep *ep, unsigned int reg, u8 value)
521*4882a593Smuzhiyun {
522*4882a593Smuzhiyun struct net2272 *dev = ep->dev;
523*4882a593Smuzhiyun
524*4882a593Smuzhiyun if (dev->pagesel != ep->num) {
525*4882a593Smuzhiyun net2272_write(dev, PAGESEL, ep->num);
526*4882a593Smuzhiyun dev->pagesel = ep->num;
527*4882a593Smuzhiyun }
528*4882a593Smuzhiyun net2272_write(dev, reg, value);
529*4882a593Smuzhiyun }
530*4882a593Smuzhiyun
531*4882a593Smuzhiyun static u8
net2272_ep_read(struct net2272_ep * ep,unsigned int reg)532*4882a593Smuzhiyun net2272_ep_read(struct net2272_ep *ep, unsigned int reg)
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun struct net2272 *dev = ep->dev;
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun if (dev->pagesel != ep->num) {
537*4882a593Smuzhiyun net2272_write(dev, PAGESEL, ep->num);
538*4882a593Smuzhiyun dev->pagesel = ep->num;
539*4882a593Smuzhiyun }
540*4882a593Smuzhiyun return net2272_read(dev, reg);
541*4882a593Smuzhiyun }
542*4882a593Smuzhiyun
allow_status(struct net2272_ep * ep)543*4882a593Smuzhiyun static void allow_status(struct net2272_ep *ep)
544*4882a593Smuzhiyun {
545*4882a593Smuzhiyun /* ep0 only */
546*4882a593Smuzhiyun net2272_ep_write(ep, EP_RSPCLR,
547*4882a593Smuzhiyun (1 << CONTROL_STATUS_PHASE_HANDSHAKE) |
548*4882a593Smuzhiyun (1 << ALT_NAK_OUT_PACKETS) |
549*4882a593Smuzhiyun (1 << NAK_OUT_PACKETS_MODE));
550*4882a593Smuzhiyun ep->stopped = 1;
551*4882a593Smuzhiyun }
552*4882a593Smuzhiyun
set_halt(struct net2272_ep * ep)553*4882a593Smuzhiyun static void set_halt(struct net2272_ep *ep)
554*4882a593Smuzhiyun {
555*4882a593Smuzhiyun /* ep0 and bulk/intr endpoints */
556*4882a593Smuzhiyun net2272_ep_write(ep, EP_RSPCLR, 1 << CONTROL_STATUS_PHASE_HANDSHAKE);
557*4882a593Smuzhiyun net2272_ep_write(ep, EP_RSPSET, 1 << ENDPOINT_HALT);
558*4882a593Smuzhiyun }
559*4882a593Smuzhiyun
clear_halt(struct net2272_ep * ep)560*4882a593Smuzhiyun static void clear_halt(struct net2272_ep *ep)
561*4882a593Smuzhiyun {
562*4882a593Smuzhiyun /* ep0 and bulk/intr endpoints */
563*4882a593Smuzhiyun net2272_ep_write(ep, EP_RSPCLR,
564*4882a593Smuzhiyun (1 << ENDPOINT_HALT) | (1 << ENDPOINT_TOGGLE));
565*4882a593Smuzhiyun }
566*4882a593Smuzhiyun
567*4882a593Smuzhiyun /* count (<= 4) bytes in the next fifo write will be valid */
set_fifo_bytecount(struct net2272_ep * ep,unsigned count)568*4882a593Smuzhiyun static void set_fifo_bytecount(struct net2272_ep *ep, unsigned count)
569*4882a593Smuzhiyun {
570*4882a593Smuzhiyun /* net2272_ep_write will truncate to u8 for us */
571*4882a593Smuzhiyun net2272_ep_write(ep, EP_TRANSFER2, count >> 16);
572*4882a593Smuzhiyun net2272_ep_write(ep, EP_TRANSFER1, count >> 8);
573*4882a593Smuzhiyun net2272_ep_write(ep, EP_TRANSFER0, count);
574*4882a593Smuzhiyun }
575*4882a593Smuzhiyun
576*4882a593Smuzhiyun struct net2272_request {
577*4882a593Smuzhiyun struct usb_request req;
578*4882a593Smuzhiyun struct list_head queue;
579*4882a593Smuzhiyun unsigned mapped:1,
580*4882a593Smuzhiyun valid:1;
581*4882a593Smuzhiyun };
582*4882a593Smuzhiyun
583*4882a593Smuzhiyun #endif
584