xref: /OK3568_Linux_fs/kernel/include/linux/usb/usb338x.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * USB 338x super/high/full speed USB device controller.
4*4882a593Smuzhiyun  * Unlike many such controllers, this one talks PCI.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Copyright (C) 2002 NetChip Technology, Inc. (http://www.netchip.com)
7*4882a593Smuzhiyun  * Copyright (C) 2003 David Brownell
8*4882a593Smuzhiyun  * Copyright (C) 2014 Ricardo Ribalda - Qtechnology/AS
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify
11*4882a593Smuzhiyun  * it under the terms of the GNU General Public License as published by
12*4882a593Smuzhiyun  * the Free Software Foundation; either version 2 of the License, or
13*4882a593Smuzhiyun  * (at your option) any later version.
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful,
16*4882a593Smuzhiyun  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*4882a593Smuzhiyun  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*4882a593Smuzhiyun  * GNU General Public License for more details.
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  */
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #ifndef __LINUX_USB_USB338X_H
23*4882a593Smuzhiyun #define __LINUX_USB_USB338X_H
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #include <linux/usb/net2280.h>
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /*
28*4882a593Smuzhiyun  * Extra defined bits for net2280 registers
29*4882a593Smuzhiyun  */
30*4882a593Smuzhiyun #define     SCRATCH			      0x0b
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define     DEFECT7374_FSM_FIELD                28
33*4882a593Smuzhiyun #define     SUPER_SPEED				 8
34*4882a593Smuzhiyun #define     DMA_REQUEST_OUTSTANDING              5
35*4882a593Smuzhiyun #define     DMA_PAUSE_DONE_INTERRUPT            26
36*4882a593Smuzhiyun #define     SET_ISOCHRONOUS_DELAY               24
37*4882a593Smuzhiyun #define     SET_SEL                             22
38*4882a593Smuzhiyun #define     SUPER_SPEED_MODE                     8
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /*ep_cfg*/
41*4882a593Smuzhiyun #define     MAX_BURST_SIZE                      24
42*4882a593Smuzhiyun #define     EP_FIFO_BYTE_COUNT                  16
43*4882a593Smuzhiyun #define     IN_ENDPOINT_ENABLE                  14
44*4882a593Smuzhiyun #define     IN_ENDPOINT_TYPE                    12
45*4882a593Smuzhiyun #define     OUT_ENDPOINT_ENABLE                 10
46*4882a593Smuzhiyun #define     OUT_ENDPOINT_TYPE                    8
47*4882a593Smuzhiyun #define USB3380_EP_CFG_MASK_IN ((0x3 << IN_ENDPOINT_TYPE) | \
48*4882a593Smuzhiyun 				BIT(IN_ENDPOINT_ENABLE))
49*4882a593Smuzhiyun #define USB3380_EP_CFG_MASK_OUT ((0x3 << OUT_ENDPOINT_TYPE) | \
50*4882a593Smuzhiyun 				BIT(OUT_ENDPOINT_ENABLE))
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun struct usb338x_usb_ext_regs {
53*4882a593Smuzhiyun 	u32     usbclass;
54*4882a593Smuzhiyun #define     DEVICE_PROTOCOL                     16
55*4882a593Smuzhiyun #define     DEVICE_SUB_CLASS                     8
56*4882a593Smuzhiyun #define     DEVICE_CLASS                         0
57*4882a593Smuzhiyun 	u32     ss_sel;
58*4882a593Smuzhiyun #define     U2_SYSTEM_EXIT_LATENCY               8
59*4882a593Smuzhiyun #define     U1_SYSTEM_EXIT_LATENCY               0
60*4882a593Smuzhiyun 	u32     ss_del;
61*4882a593Smuzhiyun #define     U2_DEVICE_EXIT_LATENCY               8
62*4882a593Smuzhiyun #define     U1_DEVICE_EXIT_LATENCY               0
63*4882a593Smuzhiyun 	u32     usb2lpm;
64*4882a593Smuzhiyun #define     USB_L1_LPM_HIRD                      2
65*4882a593Smuzhiyun #define     USB_L1_LPM_REMOTE_WAKE               1
66*4882a593Smuzhiyun #define     USB_L1_LPM_SUPPORT                   0
67*4882a593Smuzhiyun 	u32     usb3belt;
68*4882a593Smuzhiyun #define     BELT_MULTIPLIER                     10
69*4882a593Smuzhiyun #define     BEST_EFFORT_LATENCY_TOLERANCE        0
70*4882a593Smuzhiyun 	u32     usbctl2;
71*4882a593Smuzhiyun #define     LTM_ENABLE                           7
72*4882a593Smuzhiyun #define     U2_ENABLE                            6
73*4882a593Smuzhiyun #define     U1_ENABLE                            5
74*4882a593Smuzhiyun #define     FUNCTION_SUSPEND                     4
75*4882a593Smuzhiyun #define     USB3_CORE_ENABLE                     3
76*4882a593Smuzhiyun #define     USB2_CORE_ENABLE                     2
77*4882a593Smuzhiyun #define     SERIAL_NUMBER_STRING_ENABLE          0
78*4882a593Smuzhiyun 	u32     in_timeout;
79*4882a593Smuzhiyun #define     GPEP3_TIMEOUT                       19
80*4882a593Smuzhiyun #define     GPEP2_TIMEOUT                       18
81*4882a593Smuzhiyun #define     GPEP1_TIMEOUT                       17
82*4882a593Smuzhiyun #define     GPEP0_TIMEOUT                       16
83*4882a593Smuzhiyun #define     GPEP3_TIMEOUT_VALUE                 13
84*4882a593Smuzhiyun #define     GPEP3_TIMEOUT_ENABLE                12
85*4882a593Smuzhiyun #define     GPEP2_TIMEOUT_VALUE                  9
86*4882a593Smuzhiyun #define     GPEP2_TIMEOUT_ENABLE                 8
87*4882a593Smuzhiyun #define     GPEP1_TIMEOUT_VALUE                  5
88*4882a593Smuzhiyun #define     GPEP1_TIMEOUT_ENABLE                 4
89*4882a593Smuzhiyun #define     GPEP0_TIMEOUT_VALUE                  1
90*4882a593Smuzhiyun #define     GPEP0_TIMEOUT_ENABLE                 0
91*4882a593Smuzhiyun 	u32     isodelay;
92*4882a593Smuzhiyun #define     ISOCHRONOUS_DELAY                    0
93*4882a593Smuzhiyun } __packed;
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun struct usb338x_fifo_regs {
96*4882a593Smuzhiyun 	/* offset 0x0500, 0x0520, 0x0540, 0x0560, 0x0580 */
97*4882a593Smuzhiyun 	u32     ep_fifo_size_base;
98*4882a593Smuzhiyun #define     IN_FIFO_BASE_ADDRESS                                22
99*4882a593Smuzhiyun #define     IN_FIFO_SIZE                                        16
100*4882a593Smuzhiyun #define     OUT_FIFO_BASE_ADDRESS                               6
101*4882a593Smuzhiyun #define     OUT_FIFO_SIZE                                       0
102*4882a593Smuzhiyun 	u32     ep_fifo_out_wrptr;
103*4882a593Smuzhiyun 	u32     ep_fifo_out_rdptr;
104*4882a593Smuzhiyun 	u32     ep_fifo_in_wrptr;
105*4882a593Smuzhiyun 	u32     ep_fifo_in_rdptr;
106*4882a593Smuzhiyun 	u32     unused[3];
107*4882a593Smuzhiyun } __packed;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun /* Link layer */
111*4882a593Smuzhiyun struct usb338x_ll_regs {
112*4882a593Smuzhiyun 	/* offset 0x700 */
113*4882a593Smuzhiyun 	u32   ll_ltssm_ctrl1;
114*4882a593Smuzhiyun 	u32   ll_ltssm_ctrl2;
115*4882a593Smuzhiyun 	u32   ll_ltssm_ctrl3;
116*4882a593Smuzhiyun 	u32   unused1;
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	/* 0x710 */
119*4882a593Smuzhiyun 	u32   unused2;
120*4882a593Smuzhiyun 	u32   ll_general_ctrl0;
121*4882a593Smuzhiyun 	u32   ll_general_ctrl1;
122*4882a593Smuzhiyun #define     PM_U3_AUTO_EXIT                                     29
123*4882a593Smuzhiyun #define     PM_U2_AUTO_EXIT                                     28
124*4882a593Smuzhiyun #define     PM_U1_AUTO_EXIT                                     27
125*4882a593Smuzhiyun #define     PM_FORCE_U2_ENTRY                                   26
126*4882a593Smuzhiyun #define     PM_FORCE_U1_ENTRY                                   25
127*4882a593Smuzhiyun #define     PM_LGO_COLLISION_SEND_LAU                           24
128*4882a593Smuzhiyun #define     PM_DIR_LINK_REJECT                                  23
129*4882a593Smuzhiyun #define     PM_FORCE_LINK_ACCEPT                                22
130*4882a593Smuzhiyun #define     PM_DIR_ENTRY_U3                                     20
131*4882a593Smuzhiyun #define     PM_DIR_ENTRY_U2                                     19
132*4882a593Smuzhiyun #define     PM_DIR_ENTRY_U1                                     18
133*4882a593Smuzhiyun #define     PM_U2_ENABLE                                        17
134*4882a593Smuzhiyun #define     PM_U1_ENABLE                                        16
135*4882a593Smuzhiyun #define     SKP_THRESHOLD_ADJUST_FMW                            8
136*4882a593Smuzhiyun #define     RESEND_DPP_ON_LRTY_FMW                              7
137*4882a593Smuzhiyun #define     DL_BIT_VALUE_FMW                                    6
138*4882a593Smuzhiyun #define     FORCE_DL_BIT                                        5
139*4882a593Smuzhiyun 	u32   ll_general_ctrl2;
140*4882a593Smuzhiyun #define     SELECT_INVERT_LANE_POLARITY                         7
141*4882a593Smuzhiyun #define     FORCE_INVERT_LANE_POLARITY                          6
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	/* 0x720 */
144*4882a593Smuzhiyun 	u32   ll_general_ctrl3;
145*4882a593Smuzhiyun 	u32   ll_general_ctrl4;
146*4882a593Smuzhiyun 	u32   ll_error_gen;
147*4882a593Smuzhiyun 	u32   unused3;
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 	/* 0x730 */
150*4882a593Smuzhiyun 	u32   unused4[4];
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	/* 0x740 */
153*4882a593Smuzhiyun 	u32   unused5[2];
154*4882a593Smuzhiyun 	u32   ll_lfps_5;
155*4882a593Smuzhiyun #define     TIMER_LFPS_6US                                      16
156*4882a593Smuzhiyun 	u32   ll_lfps_6;
157*4882a593Smuzhiyun #define     TIMER_LFPS_80US                                     0
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	/* 0x750 */
160*4882a593Smuzhiyun 	u32   unused6[8];
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	/* 0x770 */
163*4882a593Smuzhiyun 	u32   unused7[3];
164*4882a593Smuzhiyun 	u32   ll_tsn_counters_2;
165*4882a593Smuzhiyun #define     HOT_TX_NORESET_TS2                                  24
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	/* 0x780 */
168*4882a593Smuzhiyun 	u32   ll_tsn_counters_3;
169*4882a593Smuzhiyun #define     HOT_RX_RESET_TS2                                    0
170*4882a593Smuzhiyun 	u32   unused8[3];
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	/* 0x790 */
173*4882a593Smuzhiyun 	u32   unused9;
174*4882a593Smuzhiyun 	u32   ll_lfps_timers_2;
175*4882a593Smuzhiyun #define     LFPS_TIMERS_2_WORKAROUND_VALUE			0x084d
176*4882a593Smuzhiyun 	u32   unused10;
177*4882a593Smuzhiyun 	u32   ll_tsn_chicken_bit;
178*4882a593Smuzhiyun #define     RECOVERY_IDLE_TO_RECOVER_FMW                        3
179*4882a593Smuzhiyun } __packed;
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun /* protocol layer */
182*4882a593Smuzhiyun struct usb338x_pl_regs {
183*4882a593Smuzhiyun 	/* offset 0x800 */
184*4882a593Smuzhiyun 	u32   pl_reg_1;
185*4882a593Smuzhiyun 	u32   pl_reg_2;
186*4882a593Smuzhiyun 	u32   pl_reg_3;
187*4882a593Smuzhiyun 	u32   pl_reg_4;
188*4882a593Smuzhiyun 	u32   pl_ep_ctrl;
189*4882a593Smuzhiyun 	/* Protocol Layer Endpoint Control*/
190*4882a593Smuzhiyun #define     PL_EP_CTRL                                  0x810
191*4882a593Smuzhiyun #define     ENDPOINT_SELECT                             0
192*4882a593Smuzhiyun 	/* [4:0] */
193*4882a593Smuzhiyun #define     EP_INITIALIZED                              16
194*4882a593Smuzhiyun #define     SEQUENCE_NUMBER_RESET                       17
195*4882a593Smuzhiyun #define     CLEAR_ACK_ERROR_CODE                        20
196*4882a593Smuzhiyun 	u32   pl_reg_6;
197*4882a593Smuzhiyun 	u32   pl_reg_7;
198*4882a593Smuzhiyun 	u32   pl_reg_8;
199*4882a593Smuzhiyun 	u32   pl_ep_status_1;
200*4882a593Smuzhiyun 	/* Protocol Layer Endpoint Status 1*/
201*4882a593Smuzhiyun #define     PL_EP_STATUS_1                              0x820
202*4882a593Smuzhiyun #define     STATE                                       16
203*4882a593Smuzhiyun #define     ACK_GOOD_NORMAL                             0x11
204*4882a593Smuzhiyun #define     ACK_GOOD_MORE_ACKS_TO_COME                  0x16
205*4882a593Smuzhiyun 	u32   pl_ep_status_2;
206*4882a593Smuzhiyun 	u32   pl_ep_status_3;
207*4882a593Smuzhiyun 	/* Protocol Layer Endpoint Status 3*/
208*4882a593Smuzhiyun #define     PL_EP_STATUS_3                              0x828
209*4882a593Smuzhiyun #define     SEQUENCE_NUMBER                             0
210*4882a593Smuzhiyun 	u32   pl_ep_status_4;
211*4882a593Smuzhiyun 	/* Protocol Layer Endpoint Status 4*/
212*4882a593Smuzhiyun #define     PL_EP_STATUS_4                              0x82c
213*4882a593Smuzhiyun 	u32   pl_ep_cfg_4;
214*4882a593Smuzhiyun 	/* Protocol Layer Endpoint Configuration 4*/
215*4882a593Smuzhiyun #define     PL_EP_CFG_4                                 0x830
216*4882a593Smuzhiyun #define     NON_CTRL_IN_TOLERATE_BAD_DIR                6
217*4882a593Smuzhiyun } __packed;
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun #endif /* __LINUX_USB_USB338X_H */
220