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