2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright 2020 Michal Meloun <mmel@FreeBSD.org>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 #include <sys/param.h>
29 #include <sys/systm.h>
31 #include <sys/kernel.h>
32 #include <sys/module.h>
33 #include <sys/malloc.h>
36 #include <machine/bus.h>
38 #include <dev/clk/clk.h>
39 #include <dev/hwreset/hwreset.h>
40 #include <dev/phy/phy.h>
41 #include <dev/regulator/regulator.h>
42 #include <dev/fdt/fdt_common.h>
43 #include <dev/fdt/fdt_pinctrl.h>
44 #include <dev/ofw/openfirm.h>
45 #include <dev/ofw/ofw_bus.h>
46 #include <dev/ofw/ofw_bus_subr.h>
48 #include <arm/nvidia/tegra_efuse.h>
50 #include <dt-bindings/pinctrl/pinctrl-tegra-xusb.h>
52 #include "phynode_if.h"
54 /* FUSE calibration data. */
55 #define FUSE_SKU_CALIB_0 0x0F0
56 #define FUSE_SKU_CALIB_0_HS_CURR_LEVEL_123(x, i) (((x) >> (11 + ((i) - 1) * 6)) & 0x3F);
57 #define FUSE_SKU_CALIB_0_HS_TERM_RANGE_ADJ(x) (((x) >> 7) & 0x0F);
58 #define FUSE_SKU_CALIB_0_HS_CURR_LEVEL_0(x) (((x) >> 0) & 0x3F);
60 #define FUSE_USB_CALIB_EXT_0 0x250
61 #define FUSE_USB_CALIB_EXT_0_RPD_CTRL(x) (((x) >> 0) & 0x1F);
65 #define XUSB_PADCTL_USB2_PAD_MUX 0x004
67 #define XUSB_PADCTL_USB2_PORT_CAP 0x008
68 #define USB2_PORT_CAP_PORT_REVERSE_ID(p) (1 << (3 + (p) * 4))
69 #define USB2_PORT_CAP_PORT_INTERNAL(p) (1 << (2 + (p) * 4))
70 #define USB2_PORT_CAP_PORT_CAP(p, x) (((x) & 3) << ((p) * 4))
71 #define USB2_PORT_CAP_PORT_CAP_OTG 0x3
72 #define USB2_PORT_CAP_PORT_CAP_DEVICE 0x2
73 #define USB2_PORT_CAP_PORT_CAP_HOST 0x1
74 #define USB2_PORT_CAP_PORT_CAP_DISABLED 0x0
76 #define XUSB_PADCTL_SS_PORT_MAP 0x014
77 #define SS_PORT_MAP_PORT_INTERNAL(p) (1 << (3 + (p) * 4))
78 #define SS_PORT_MAP_PORT_MAP(p, x) (((x) & 7) << ((p) * 4))
80 #define XUSB_PADCTL_ELPG_PROGRAM1 0x024
81 #define ELPG_PROGRAM1_AUX_MUX_LP0_VCORE_DOWN (1 << 31)
82 #define ELPG_PROGRAM1_AUX_MUX_LP0_CLAMP_EN_EARLY (1 << 30)
83 #define ELPG_PROGRAM1_AUX_MUX_LP0_CLAMP_EN (1 << 29)
84 #define ELPG_PROGRAM1_SSP_ELPG_VCORE_DOWN(x) (1 << (2 + (x) * 3))
85 #define ELPG_PROGRAM1_SSP_ELPG_CLAMP_EN_EARLY(x) (1 << (1 + (x) * 3))
86 #define ELPG_PROGRAM1_SSP_ELPG_CLAMP_EN(x) (1 << (0 + (x) * 3))
88 #define XUSB_PADCTL_USB3_PAD_MUX 0x028
89 #define USB3_PAD_MUX_SATA_IDDQ_DISABLE(x) (1 << (8 + (x)))
90 #define USB3_PAD_MUX_PCIE_IDDQ_DISABLE(x) (1 << (1 + (x)))
92 #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1(x) (0x084 + (x) * 0x40)
93 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_USBON_RPU_OVRD_VAL (1 << 23)
94 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_USBON_RPU_OVRD ( 1 << 22)
95 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_USBON_RPD_OVRD_VAL (1 << 21)
96 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_USBON_RPD_OVRD (1 << 20)
97 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_USBOP_RPU_OVRD_VAL (1 << 19)
98 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_USBOP_RPU_OVRD (1 << 18)
99 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_USBOP_RPD_OVRD_VAL (1 << 17)
100 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_USBOP_RPD_OVRD (1 << 16)
101 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_DYN_DLY(x) (((x) & 0x3) << 9)
102 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV(x) (((x) & 0x3) << 7)
103 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_FIX18 (1 << 6)
104 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_DIV_DET_EN (1 << 4)
105 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_VOP_DIV2P7_DET (1 << 3)
106 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_VOP_DIV2P0_DET (1 << 2)
107 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_VON_DIV2P7_DET (1 << 1)
108 #define USB2_BATTERY_CHRG_OTGPAD_CTL1_VON_DIV2P0_DET (1 << 0)
110 #define XUSB_PADCTL_USB2_OTG_PAD_CTL0(x) (0x088 + (x) * 0x40)
111 #define USB2_OTG_PAD_CTL0_PD_ZI (1 << 29)
112 #define USB2_OTG_PAD_CTL0_PD2_OVRD_EN (1 << 28)
113 #define USB2_OTG_PAD_CTL0_PD2 (1 << 27)
114 #define USB2_OTG_PAD_CTL0_PD (1 << 26)
115 #define USB2_OTG_PAD_CTL0_TERM_EN (1 << 25)
116 #define USB2_OTG_PAD_CTL0_LS_FSLEW(x) (((x) & 0x0F) << 21)
117 #define USB2_OTG_PAD_CTL0_LS_RSLEW(x) (((x) & 0x0F) << 17)
118 #define USB2_OTG_PAD_CTL0_FS_FSLEW(x) (((x) & 0x0F) << 13)
119 #define USB2_OTG_PAD_CTL0_FS_RSLEW(x) (((x) & 0x0F) << 9)
120 #define USB2_OTG_PAD_CTL0_HS_SLEW(x) (((x) & 0x3F) << 6)
121 #define USB2_OTG_PAD_CTL0_HS_CURR_LEVEL(x) (((x) & 0x3F) << 0)
123 #define XUSB_PADCTL_USB2_OTG_PAD_CTL1(x) (0x08C + (x) * 0x40)
124 #define USB2_OTG_PAD_CTL1_RPD_CTRL(x) (((x) & 0x1F) << 26)
125 #define USB2_OTG_PAD_CTL1_RPU_STATUS_HIGH (1 << 25)
126 #define USB2_OTG_PAD_CTL1_RPU_SWITCH_LOW (1 << 24)
127 #define USB2_OTG_PAD_CTL1_RPU_SWITCH_OVRD (1 << 23)
128 #define USB2_OTG_PAD_CTL1_HS_LOOPBACK_OVRD_VAL (1 << 22)
129 #define USB2_OTG_PAD_CTL1_HS_LOOPBACK_OVRD_EN (1 << 21)
130 #define USB2_OTG_PAD_CTL1_PTERM_RANGE_ADJ(x) (((x) & 0x0F) << 17)
131 #define USB2_OTG_PAD_CTL1_PD_DISC_OVRD_VAL (1 << 16)
132 #define USB2_OTG_PAD_CTL1_PD_CHRP_OVRD_VAL (1 << 15)
133 #define USB2_OTG_PAD_CTL1_RPU_RANGE_ADJ(x) (((x) & 0x03) << 13)
134 #define USB2_OTG_PAD_CTL1_HS_COUP_EN(x) (((x) & 0x03) << 11)
135 #define USB2_OTG_PAD_CTL1_SPARE(x) (((x) & 0x0F) << 7)
136 #define USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ(x) (((x) & 0x0F) << 3)
137 #define USB2_OTG_PAD_CTL1_PD_DR (1 << 2)
138 #define USB2_OTG_PAD_CTL1_PD_DISC_OVRD (1 << 1)
139 #define USB2_OTG_PAD_CTL1_PD_CHRP_OVRD (1 << 0)
141 #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL0(x) (0x0C0 + (x) * 0x40)
142 #define XUSB_PADCTL_USB2_BIAS_PAD_CTL0 0x0284
143 #define USB2_BIAS_PAD_CTL0_TRK_PWR_ENA (1 << 29)
144 #define USB2_BIAS_PAD_CTL0_SPARE(x) (((x) & 0xF) << 25)
145 #define USB2_BIAS_PAD_CTL0_CHG_DIV(x) (((x) & 0xF) << 21)
146 #define USB2_BIAS_PAD_CTL0_TEMP_COEF(x) (((x) & 0x7) << 18)
147 #define USB2_BIAS_PAD_CTL0_VREF_CTRL(x) (((x) & 0x7) << 15)
148 #define USB2_BIAS_PAD_CTL0_ADJRPU(x) (((x) & 0x7) << 12)
149 #define USB2_BIAS_PAD_CTL0_PD (1 << 11)
150 #define USB2_BIAS_PAD_CTL0_TERM_OFFSETL(x) (((x) & 0x7) << 8)
151 #define USB2_BIAS_PAD_CTL0_HS_CHIRP_LEVEL(x) (((x) & 0x3) << 6)
152 #define USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL(x) (((x) & 0x7) << 3)
153 #define USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL(x) (((x) & 0x7) << 0)
155 #define XUSB_PADCTL_USB2_BIAS_PAD_CTL1 0x0288
156 #define USB2_BIAS_PAD_CTL1_FORCE_TRK_CLK_EN (1 << 30)
157 #define USB2_BIAS_PAD_CTL1_TRK_SW_OVRD (1 << 29)
158 #define USB2_BIAS_PAD_CTL1_TRK_DONE (1 << 28)
159 #define USB2_BIAS_PAD_CTL1_TRK_START (1 << 27)
160 #define USB2_BIAS_PAD_CTL1_PD_TRK (1 << 26)
161 #define USB2_BIAS_PAD_CTL1_TRK_DONE_RESET_TIMER(x) (((x) & 0x7F) << 19)
162 #define USB2_BIAS_PAD_CTL1_TRK_START_TIMER(x) (((x) & 0x7F) << 12)
163 #define USB2_BIAS_PAD_CTL1_PCTRL(x) (((x) & 0x3F) << 6)
164 #define USB2_BIAS_PAD_CTL1_TCTRL(x) (((x) & 0x3F) << 0)
166 #define XUSB_PADCTL_HSIC_PAD_CTL0(x) (0x300 + (x) * 0x20)
167 #define HSIC_PAD_CTL0_RPU_STROBE (1 << 18)
168 #define HSIC_PAD_CTL0_RPU_DATA1 (1 << 17)
169 #define HSIC_PAD_CTL0_RPU_DATA0 (1 << 16)
170 #define HSIC_PAD_CTL0_RPD_STROBE (1 << 15)
171 #define HSIC_PAD_CTL0_RPD_DATA1 (1 << 14)
172 #define HSIC_PAD_CTL0_RPD_DATA0 (1 << 13)
173 #define HSIC_PAD_CTL0_LPBK_STROBE (1 << 12)
174 #define HSIC_PAD_CTL0_LPBK_DATA1 (1 << 11)
175 #define HSIC_PAD_CTL0_LPBK_DATA0 (1 << 10)
176 #define HSIC_PAD_CTL0_PD_ZI_STROBE (1 << 9)
177 #define HSIC_PAD_CTL0_PD_ZI_DATA1 (1 << 8)
178 #define HSIC_PAD_CTL0_PD_ZI_DATA0 (1 << 7)
179 #define HSIC_PAD_CTL0_PD_RX_STROBE (1 << 6)
180 #define HSIC_PAD_CTL0_PD_RX_DATA1 (1 << 5)
181 #define HSIC_PAD_CTL0_PD_RX_DATA0 (1 << 4)
182 #define HSIC_PAD_CTL0_PD_TX_STROBE (1 << 3)
183 #define HSIC_PAD_CTL0_PD_TX_DATA1 (1 << 2)
184 #define HSIC_PAD_CTL0_PD_TX_DATA0 (1 << 1)
185 #define HSIC_PAD_CTL0_IDDQ (1 << 0)
187 #define XUSB_PADCTL_HSIC_PAD_CTL1(x) (0x304 + (x) * 0x20)
188 #define HSIC_PAD_CTL1_RTERM(x) (((x) & 0xF) << 12)
189 #define HSIC_PAD_CTL1_HSIC_OPT(x) (((x) & 0xF) << 8)
190 #define HSIC_PAD_CTL1_TX_SLEW(x) (((x) & 0xF) << 4)
191 #define HSIC_PAD_CTL1_TX_RTUNEP(x) (((x) & 0xF) << 0)
193 #define XUSB_PADCTL_HSIC_PAD_CTL2(x) (0x308 + (x) * 0x20)
194 #define HSIC_PAD_CTL2_RX_STROBE_TRIM(x) (((x) & 0xF) << 8)
195 #define HSIC_PAD_CTL2_RX_DATA1_TRIM(x) (((x) & 0xF) << 4)
196 #define HSIC_PAD_CTL2_RX_DATA0_TRIM(x) (((x) & 0xF) << 0)
198 #define XUSB_PADCTL_HSIC_PAD_TRK_CTL 0x340
199 #define HSIC_PAD_TRK_CTL_AUTO_RTERM_EN (1 << 24)
200 #define HSIC_PAD_TRK_CTL_FORCE_TRK_CLK_EN (1 << 23)
201 #define HSIC_PAD_TRK_CTL_TRK_SW_OVRD (1 << 22)
202 #define HSIC_PAD_TRK_CTL_TRK_DONE (1 << 21)
203 #define HSIC_PAD_TRK_CTL_TRK_START (1 << 20)
204 #define HSIC_PAD_TRK_CTL_PD_TRK (1 << 19)
205 #define HSIC_PAD_TRK_CTL_TRK_DONE_RESET_TIMER(x) (((x) & 0x3F) << 12)
206 #define HSIC_PAD_TRK_CTL_TRK_START_TIMER(x) (((x) & 0x7F) << 5)
207 #define HSIC_PAD_TRK_CTL_RTERM_OUT(x) (((x) & 0x1F) << 0)
209 #define XUSB_PADCTL_HSIC_STRB_TRIM_CONTROL 0x344
211 #define XUSB_PADCTL_UPHY_PLL_P0_CTL1 0x360
212 #define UPHY_PLL_P0_CTL1_PLL0_FREQ_PSDIV(x) (((x) & 0x03) << 28)
213 #define UPHY_PLL_P0_CTL1_PLL0_FREQ_NDIV(x) (((x) & 0xFF) << 20)
214 #define UPHY_PLL_P0_CTL1_PLL0_FREQ_MDIV(x) (((x) & 0x03) << 16)
215 #define UPHY_PLL_P0_CTL1_PLL0_LOCKDET_STATUS (1 << 15)
216 #define UPHY_PLL_P0_CTL1_PLL0_MODE_GET(x) (((x) >> 8) & 0x03)
217 #define UPHY_PLL_P0_CTL1_PLL0_BYPASS_EN (1 << 7)
218 #define UPHY_PLL_P0_CTL1_PLL0_FREERUN_EN (1 << 6)
219 #define UPHY_PLL_P0_CTL1_PLL0_PWR_OVRD (1 << 4)
220 #define UPHY_PLL_P0_CTL1_PLL0_ENABLE (1 << 3)
221 #define UPHY_PLL_P0_CTL1_PLL0_SLEEP(x) (((x) & 0x03) << 1)
222 #define UPHY_PLL_P0_CTL1_PLL0_IDDQ (1 << 0)
224 #define XUSB_PADCTL_UPHY_PLL_P0_CTL2 0x364
225 #define UPHY_PLL_P0_CTL2_PLL0_CAL_CTRL(x) (((x) & 0xFFFFFF) << 4)
226 #define UPHY_PLL_P0_CTL2_PLL0_CAL_RESET (1 << 3)
227 #define UPHY_PLL_P0_CTL2_PLL0_CAL_OVRD (1 << 2)
228 #define UPHY_PLL_P0_CTL2_PLL0_CAL_DONE (1 << 1)
229 #define UPHY_PLL_P0_CTL2_PLL0_CAL_EN (1 << 0)
231 #define XUSB_PADCTL_UPHY_PLL_P0_CTL4 0x36c
232 #define UPHY_PLL_P0_CTL4_PLL0_TCLKOUT_EN (1 << 28)
233 #define UPHY_PLL_P0_CTL4_PLL0_CLKDIST_CTRL(x) (((x) & 0xF) << 20)
234 #define UPHY_PLL_P0_CTL4_PLL0_XDIGCLK_EN (1 << 19)
235 #define UPHY_PLL_P0_CTL4_PLL0_XDIGCLK_SEL(x) (((x) & 0x7) << 16)
236 #define UPHY_PLL_P0_CTL4_PLL0_TXCLKREF_EN (1 << 15)
237 #define UPHY_PLL_P0_CTL4_PLL0_TXCLKREF_SEL(x) (((x) & 0x3) << 12)
238 #define UPHY_PLL_P0_CTL4_PLL0_FBCLKBUF_EN (1 << 9)
239 #define UPHY_PLL_P0_CTL4_PLL0_REFCLKBUF_EN (1 << 8)
240 #define UPHY_PLL_P0_CTL4_PLL0_REFCLK_SEL(x) (((x) & 0xF) << 4)
241 #define UPHY_PLL_P0_CTL4_PLL0_REFCLK_TERM100 (1 << 0)
243 #define XUSB_PADCTL_UPHY_PLL_P0_CTL5 0x370
244 #define UPHY_PLL_P0_CTL5_PLL0_DCO_CTRL(x) (((x) & 0xFF) << 16)
245 #define UPHY_PLL_P0_CTL5_PLL0_LPF_CTRL(x) (((x) & 0xFF) << 8)
246 #define UPHY_PLL_P0_CTL5_PLL0_CP_CTRL(x) (((x) & 0x0F) << 4)
247 #define UPHY_PLL_P0_CTL5_PLL0_PFD_CTRL(x) (((x) & 0x03) << 0)
249 #define XUSB_PADCTL_UPHY_PLL_P0_CTL8 0x37c
250 #define UPHY_PLL_P0_CTL8_PLL0_RCAL_DONE (1U << 31)
251 #define UPHY_PLL_P0_CTL8_PLL0_RCAL_VAL(x) (((x) & 0x1F) << 24)
252 #define UPHY_PLL_P0_CTL8_PLL0_RCAL_BYP_EN (1 << 23)
253 #define UPHY_PLL_P0_CTL8_PLL0_RCAL_BYP_CODE(x) (((x) & 0x1F) << 16)
254 #define UPHY_PLL_P0_CTL8_PLL0_RCAL_OVRD (1 << 15)
255 #define UPHY_PLL_P0_CTL8_PLL0_RCAL_CLK_EN (1 << 13)
256 #define UPHY_PLL_P0_CTL8_PLL0_RCAL_EN (1 << 12)
257 #define UPHY_PLL_P0_CTL8_PLL0_BGAP_CTRL(x) (((x) & 0xFFF) << 0)
259 #define XUSB_PADCTL_UPHY_MISC_PAD_P_CTL1(x) (0x460 + (x) * 0x40)
260 #define XUSB_PADCTL_UPHY_PLL_S0_CTL1 0x860
261 #define UPHY_PLL_S0_CTL1_PLL0_FREQ_PSDIV(x) (((x) & 0x03) << 28)
262 #define UPHY_PLL_S0_CTL1_PLL0_FREQ_NDIV(x) (((x) & 0xFF) << 20)
263 #define UPHY_PLL_S0_CTL1_PLL0_FREQ_MDIV(x) (((x) & 0x03) << 16)
264 #define UPHY_PLL_S0_CTL1_PLL0_LOCKDET_STATUS (1 << 15)
265 #define UPHY_PLL_S0_CTL1_PLL0_MODE_GET(x) (((x) >> 8) & 0x03)
266 #define UPHY_PLL_S0_CTL1_PLL0_BYPASS_EN (1 << 7)
267 #define UPHY_PLL_S0_CTL1_PLL0_FREERUN_EN (1 << 6)
268 #define UPHY_PLL_S0_CTL1_PLL0_PWR_OVRD (1 << 4)
269 #define UPHY_PLL_S0_CTL1_PLL0_ENABLE (1 << 3)
270 #define UPHY_PLL_S0_CTL1_PLL0_SLEEP(x) (((x) & 0x03) << 1)
271 #define UPHY_PLL_S0_CTL1_PLL0_IDDQ (1 << 0)
273 #define XUSB_PADCTL_UPHY_PLL_S0_CTL2 0x864
274 #define UPHY_PLL_S0_CTL2_PLL0_CAL_CTRL(x) (((x) & 0xFFFFFF) << 4)
275 #define UPHY_PLL_S0_CTL2_PLL0_CAL_RESET (1 << 3)
276 #define UPHY_PLL_S0_CTL2_PLL0_CAL_OVRD (1 << 2)
277 #define UPHY_PLL_S0_CTL2_PLL0_CAL_DONE (1 << 1)
278 #define UPHY_PLL_S0_CTL2_PLL0_CAL_EN (1 << 0)
280 #define XUSB_PADCTL_UPHY_PLL_S0_CTL4 0x86c
281 #define UPHY_PLL_S0_CTL4_PLL0_TCLKOUT_EN (1 << 28)
282 #define UPHY_PLL_S0_CTL4_PLL0_CLKDIST_CTRL(x) (((x) & 0xF) << 20)
283 #define UPHY_PLL_S0_CTL4_PLL0_XDIGCLK_EN (1 << 19)
284 #define UPHY_PLL_S0_CTL4_PLL0_XDIGCLK_SEL(x) (((x) & 0x7) << 16)
285 #define UPHY_PLL_S0_CTL4_PLL0_TXCLKREF_EN (1 << 15)
286 #define UPHY_PLL_S0_CTL4_PLL0_TXCLKREF_SEL(x) (((x) & 0x3) << 12)
287 #define UPHY_PLL_S0_CTL4_PLL0_FBCLKBUF_EN (1 << 9)
288 #define UPHY_PLL_S0_CTL4_PLL0_REFCLKBUF_EN (1 << 8)
289 #define UPHY_PLL_S0_CTL4_PLL0_REFCLK_SEL(x) (((x) & 0xF) << 4)
290 #define UPHY_PLL_S0_CTL4_PLL0_REFCLK_TERM100 (1 << 0)
292 #define XUSB_PADCTL_UPHY_PLL_S0_CTL5 0x870
293 #define UPHY_PLL_S0_CTL5_PLL0_DCO_CTRL(x) (((x) & 0xFF) << 16)
294 #define UPHY_PLL_S0_CTL5_PLL0_LPF_CTRL(x) (((x) & 0xFF) << 8)
295 #define UPHY_PLL_S0_CTL5_PLL0_CP_CTRL(x) (((x) & 0x0F) << 4)
296 #define UPHY_PLL_S0_CTL5_PLL0_PFD_CTRL(x) (((x) & 0x03) << 0)
298 #define XUSB_PADCTL_UPHY_PLL_S0_CTL8 0x87c
299 #define UPHY_PLL_S0_CTL8_PLL0_RCAL_DONE (1U << 31)
300 #define UPHY_PLL_S0_CTL8_PLL0_RCAL_VAL(x) (((x) & 0x1F) << 24)
301 #define UPHY_PLL_S0_CTL8_PLL0_RCAL_BYP_EN (1 << 23)
302 #define UPHY_PLL_S0_CTL8_PLL0_RCAL_BYP_CODE(x) (((x) & 0x1F) << 16)
303 #define UPHY_PLL_S0_CTL8_PLL0_RCAL_OVRD (1 << 15)
304 #define UPHY_PLL_S0_CTL8_PLL0_RCAL_CLK_EN (1 << 13)
305 #define UPHY_PLL_S0_CTL8_PLL0_RCAL_EN (1 << 12)
306 #define UPHY_PLL_S0_CTL8_PLL0_BGAP_CTRL(x) (((x) & 0xFFF) << 0)
308 #define XUSB_PADCTL_UPHY_MISC_PAD_S0_CTL1 0x960
309 #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL1(x) (0xa60 + (x) * 0x40)
310 #define UPHY_USB3_PAD_ECTL1_TX_TERM_CTRL(x) (((x) & 0x3) << 16)
312 #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL2(x) (0xa64 + (x) * 0x40)
313 #define UPHY_USB3_PAD_ECTL2_RX_IQ_CTRL(x) (((x) & 0x000F) << 16)
314 #define UPHY_USB3_PAD_ECTL2_RX_CTLE(x) (((x) & 0xFFFF) << 0)
316 #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL3(x) (0xa68 + (x) * 0x40)
317 #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL4(x) (0xa6c + (x) * 0x40)
318 #define UPHY_USB3_PAD_ECTL4_RX_CDR_CTRL(x) (((x) & 0xFFFF) << 16)
319 #define UPHY_USB3_PAD_ECTL4_RX_PI_CTRL(x) (((x) & 0x00FF) << 0)
321 #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL6(x) (0xa74 + (x) * 0x40)
324 #define WR4(_sc, _r, _v) bus_write_4((_sc)->mem_res, (_r), (_v))
325 #define RD4(_sc, _r) bus_read_4((_sc)->mem_res, (_r))
328 struct padctl_softc
{
330 struct resource
*mem_res
;
336 /* Fuses calibration data */
338 uint32_t hs_curr_level
[4];
339 uint32_t hs_curr_level_offs
; /* Not inited yet, always 0 */
340 uint32_t hs_term_range_adj
;
344 uint32_t rx_strobe_trim
; /* Not inited yet, always 0 */
345 uint32_t rx_data0_trim
; /* Not inited yet, always 0 */
346 uint32_t rx_data1_trim
; /* Not inited yet, always 0 */
347 uint32_t tx_rtune_p
; /* Not inited yet, always 0 */
348 uint32_t strobe_trim
; /* Not inited yet, always 0 */
351 static struct ofw_compat_data compat_data
[] = {
352 {"nvidia,tegra210-xusb-padctl", 1},
357 enum padctl_port_type
{
365 enum padctl_port_type type
;
367 const char *base_name
;
369 int (*init
)(struct padctl_softc
*sc
,
370 struct padctl_port
*port
);
377 regulator_t supply_vbus
;
378 struct padctl_lane
*lane
;
381 static int usb3_port_init(struct padctl_softc
*sc
, struct padctl_port
*port
);
383 #define PORT(t, n, p, i) { \
390 static struct padctl_port ports_tbl
[] = {
391 PORT(PADCTL_PORT_USB2
, "usb2", 0, NULL
),
392 PORT(PADCTL_PORT_USB2
, "usb2", 1, NULL
),
393 PORT(PADCTL_PORT_USB2
, "usb2", 2, NULL
),
394 PORT(PADCTL_PORT_USB2
, "usb2", 3, NULL
),
395 PORT(PADCTL_PORT_HSIC
, "hsic", 0, NULL
),
396 PORT(PADCTL_PORT_HSIC
, "hsic", 1, NULL
),
397 PORT(PADCTL_PORT_USB3
, "usb3", 0, usb3_port_init
),
398 PORT(PADCTL_PORT_USB3
, "usb3", 1, usb3_port_init
),
401 /* Pads - a group of lannes. */
402 enum padctl_pad_type
{
412 enum padctl_pad_type type
;
413 const char *clock_name
;
414 char *reset_name
; /* XXX constify !!!!!! */
415 int (*enable
)(struct padctl_softc
*sc
,
416 struct padctl_lane
*lane
);
417 int (*disable
)(struct padctl_softc
*sc
,
418 struct padctl_lane
*lane
);
424 struct padctl_lane
*lanes
[8]; /* Safe maximum value. */
427 static int usb2_enable(struct padctl_softc
*sc
, struct padctl_lane
*lane
);
428 static int usb2_disable(struct padctl_softc
*sc
, struct padctl_lane
*lane
);
429 static int hsic_enable(struct padctl_softc
*sc
, struct padctl_lane
*lane
);
430 static int hsic_disable(struct padctl_softc
*sc
, struct padctl_lane
*lane
);
431 static int pcie_enable(struct padctl_softc
*sc
, struct padctl_lane
*lane
);
432 static int pcie_disable(struct padctl_softc
*sc
, struct padctl_lane
*lane
);
433 static int sata_enable(struct padctl_softc
*sc
, struct padctl_lane
*lane
);
434 static int sata_disable(struct padctl_softc
*sc
, struct padctl_lane
*lane
);
436 #define PAD(n, t, cn, rn, e, d) { \
444 static struct padctl_pad pads_tbl
[] = {
445 PAD("usb2", PADCTL_PAD_USB2
, "trk", NULL
, usb2_enable
, usb2_disable
),
446 PAD("hsic", PADCTL_PAD_HSIC
, "trk", NULL
, hsic_enable
, hsic_disable
),
447 PAD("pcie", PADCTL_PAD_PCIE
, "pll", "phy", pcie_enable
, pcie_disable
),
448 PAD("sata", PADCTL_PAD_SATA
, "pll", "phy", sata_enable
, sata_disable
),
452 static char *usb_mux
[] = {"snps", "xusb", "uart", "rsvd"};
453 static char *hsic_mux
[] = {"snps", "xusb"};
454 static char *pci_mux
[] = {"pcie-x1", "usb3-ss", "sata", "pcie-x4"};
467 struct padctl_pad
*pad
;
468 struct padctl_port
*port
;
473 #define LANE(n, p, r, s, m, mx) { \
480 .nmux = nitems(mx), \
482 static struct padctl_lane lanes_tbl
[] = {
483 LANE("usb2", 0, XUSB_PADCTL_USB2_PAD_MUX
, 0, 0x3, usb_mux
),
484 LANE("usb2", 1, XUSB_PADCTL_USB2_PAD_MUX
, 2, 0x3, usb_mux
),
485 LANE("usb2", 2, XUSB_PADCTL_USB2_PAD_MUX
, 4, 0x3, usb_mux
),
486 LANE("usb2", 3, XUSB_PADCTL_USB2_PAD_MUX
, 6, 0x3, usb_mux
),
487 LANE("hsic", 0, XUSB_PADCTL_USB2_PAD_MUX
, 14, 0x1, hsic_mux
),
488 LANE("hsic", 1, XUSB_PADCTL_USB2_PAD_MUX
, 15, 0x1, hsic_mux
),
489 LANE("pcie", 0, XUSB_PADCTL_USB3_PAD_MUX
, 12, 0x3, pci_mux
),
490 LANE("pcie", 1, XUSB_PADCTL_USB3_PAD_MUX
, 14, 0x3, pci_mux
),
491 LANE("pcie", 2, XUSB_PADCTL_USB3_PAD_MUX
, 16, 0x3, pci_mux
),
492 LANE("pcie", 3, XUSB_PADCTL_USB3_PAD_MUX
, 18, 0x3, pci_mux
),
493 LANE("pcie", 4, XUSB_PADCTL_USB3_PAD_MUX
, 20, 0x3, pci_mux
),
494 LANE("pcie", 5, XUSB_PADCTL_USB3_PAD_MUX
, 22, 0x3, pci_mux
),
495 LANE("pcie", 6, XUSB_PADCTL_USB3_PAD_MUX
, 24, 0x3, pci_mux
),
496 LANE("sata", 0, XUSB_PADCTL_USB3_PAD_MUX
, 30, 0x3, pci_mux
),
499 /* Define all possible mappings for USB3 port lanes */
500 struct padctl_lane_map
{
502 enum padctl_pad_type pad_type
;
506 #define LANE_MAP(pi, pt, li) { \
511 static struct padctl_lane_map lane_map_tbl
[] = {
512 LANE_MAP(0, PADCTL_PAD_PCIE
, 6), /* port USB3-0 -> lane PCIE-0 */
513 LANE_MAP(1, PADCTL_PAD_PCIE
, 5), /* port USB3-1 -> lane PCIE-1 */
514 LANE_MAP(2, PADCTL_PAD_PCIE
, 0), /* port USB3-2 -> lane PCIE-0 */
515 LANE_MAP(2, PADCTL_PAD_PCIE
, 2), /* port USB3-2 -> lane PCIE-2 */
516 LANE_MAP(3, PADCTL_PAD_PCIE
, 4), /* port USB3-3 -> lane PCIE-4 */
519 /* Phy class and methods. */
520 static int xusbpadctl_phy_enable(struct phynode
*phy
, bool enable
);
521 static phynode_method_t xusbpadctl_phynode_methods
[] = {
522 PHYNODEMETHOD(phynode_enable
, xusbpadctl_phy_enable
),
526 DEFINE_CLASS_1(xusbpadctl_phynode
, xusbpadctl_phynode_class
,
527 xusbpadctl_phynode_methods
, 0, phynode_class
);
529 static struct padctl_port
*search_lane_port(struct padctl_softc
*sc
,
530 struct padctl_lane
*lane
);
533 static void tegra210_xusb_pll_hw_control_enable(void) {}
534 static void tegra210_xusb_pll_hw_sequence_start(void) {}
535 static void tegra210_sata_pll_hw_control_enable(void) {}
536 static void tegra210_sata_pll_hw_sequence_start(void) {}
538 /* -------------------------------------------------------------------------
543 uphy_pex_enable(struct padctl_softc
*sc
, struct padctl_pad
*pad
)
548 if (sc
->pcie_ena_cnt
> 0) {
553 /* 22.8.4 UPHY PLLs, Step 4, page 1346 */
554 /* 1. Deassert PLL/Lane resets. */
555 rv
= clk_enable(pad
->clk
);
557 device_printf(sc
->dev
, "Cannot enable clock for pad '%s': %d\n",
562 rv
= hwreset_deassert(pad
->reset
);
564 device_printf(sc
->dev
, "Cannot unreset pad '%s': %d\n",
566 clk_disable(pad
->clk
);
570 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
);
571 reg
&= ~UPHY_PLL_P0_CTL2_PLL0_CAL_CTRL(~0);
572 reg
|= UPHY_PLL_P0_CTL2_PLL0_CAL_CTRL(0x136);
573 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
, reg
);
575 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL5
);
576 reg
&= ~UPHY_PLL_P0_CTL5_PLL0_DCO_CTRL(~0);
577 reg
|= UPHY_PLL_P0_CTL5_PLL0_DCO_CTRL(0x2a);
578 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL5
, reg
);
580 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL1
);
581 reg
|= UPHY_PLL_P0_CTL1_PLL0_PWR_OVRD
;
582 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL1
, reg
);
584 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
);
585 reg
|= UPHY_PLL_P0_CTL2_PLL0_CAL_OVRD
;
586 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
, reg
);
588 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL8
);
589 reg
|= UPHY_PLL_P0_CTL8_PLL0_RCAL_OVRD
;
590 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL8
, reg
);
593 * 2. For the following registers, default values
594 * take care of the desired frequency.
596 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL4
);
597 reg
&= ~UPHY_PLL_P0_CTL4_PLL0_TXCLKREF_SEL(~0);
598 reg
&= ~UPHY_PLL_P0_CTL4_PLL0_REFCLK_SEL(~0);
599 reg
|= UPHY_PLL_P0_CTL4_PLL0_TXCLKREF_SEL(0x2);
600 reg
|= UPHY_PLL_P0_CTL4_PLL0_TXCLKREF_EN
;
601 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL4
, reg
);
603 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL1
);
604 reg
&= ~UPHY_PLL_P0_CTL1_PLL0_FREQ_MDIV(~0);
605 reg
&= ~UPHY_PLL_P0_CTL1_PLL0_FREQ_NDIV(~0);
606 reg
|= UPHY_PLL_P0_CTL1_PLL0_FREQ_NDIV(0x19);
607 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL1
, reg
);
609 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL1
);
610 reg
&= ~UPHY_PLL_P0_CTL1_PLL0_IDDQ
;
611 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL1
, reg
);
613 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL1
);
614 reg
&= ~UPHY_PLL_P0_CTL1_PLL0_SLEEP(~0);
615 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL1
, reg
);
617 /* 3. Wait 100 ns. */
620 /* XXX This in not in TRM */
621 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL4
);
622 reg
|= UPHY_PLL_P0_CTL4_PLL0_REFCLKBUF_EN
;
623 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL4
, reg
);
625 /* 4. Calibration. */
626 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
);
627 reg
|= UPHY_PLL_P0_CTL2_PLL0_CAL_EN
;
628 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
, reg
);
629 for (i
= 30; i
> 0; i
--) {
630 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
);
631 if (reg
& UPHY_PLL_P0_CTL2_PLL0_CAL_DONE
)
636 device_printf(sc
->dev
, "Timedout in calibration step 1 "
637 "for pad '%s' (0x%08X).\n", pad
->name
, reg
);
642 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
);
643 reg
&= ~UPHY_PLL_P0_CTL2_PLL0_CAL_EN
;
644 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
, reg
);
645 for (i
= 10; i
> 0; i
--) {
646 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
);
647 if ((reg
& UPHY_PLL_P0_CTL2_PLL0_CAL_DONE
) == 0)
652 device_printf(sc
->dev
, "Timedout in calibration step 2 "
653 "for pad '%s'.\n", pad
->name
);
658 /* 5. Enable the PLL (20 μs Lock time) */
659 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL1
);
660 reg
|= UPHY_PLL_P0_CTL1_PLL0_ENABLE
;
661 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL1
, reg
);
662 for (i
= 10; i
> 0; i
--) {
663 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL1
);
664 if (reg
& UPHY_PLL_P0_CTL1_PLL0_LOCKDET_STATUS
)
669 device_printf(sc
->dev
, "Timedout while enabling PLL "
670 "for pad '%s'.\n", pad
->name
);
676 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL8
);
677 reg
|= UPHY_PLL_P0_CTL8_PLL0_RCAL_EN
;
678 reg
|= UPHY_PLL_P0_CTL8_PLL0_RCAL_CLK_EN
;
679 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL8
, reg
);
681 for (i
= 10; i
> 0; i
--) {
682 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL8
);
683 if (reg
& UPHY_PLL_P0_CTL8_PLL0_RCAL_DONE
)
688 device_printf(sc
->dev
, "Timedout in RX calibration step 1 "
689 "for pad '%s'.\n", pad
->name
);
694 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL8
);
695 reg
&= ~UPHY_PLL_P0_CTL8_PLL0_RCAL_EN
;
696 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL8
, reg
);
698 for (i
= 10; i
> 0; i
--) {
699 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL8
);
700 if (!(reg
& UPHY_PLL_P0_CTL8_PLL0_RCAL_DONE
))
706 device_printf(sc
->dev
, "Timedout in RX calibration step 2 "
707 "for pad '%s'.\n", pad
->name
);
712 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL8
);
713 reg
&= ~UPHY_PLL_P0_CTL8_PLL0_RCAL_CLK_EN
;
714 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL8
, reg
);
716 /* Enable Hardware Power Sequencer. */
717 tegra210_xusb_pll_hw_control_enable();
719 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL1
);
720 reg
&= ~UPHY_PLL_P0_CTL1_PLL0_PWR_OVRD
;
721 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL1
, reg
);
723 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
);
724 reg
&= ~UPHY_PLL_P0_CTL2_PLL0_CAL_OVRD
;
725 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
, reg
);
727 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL8
);
728 reg
&= ~UPHY_PLL_P0_CTL8_PLL0_RCAL_OVRD
;
729 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL8
, reg
);
733 tegra210_xusb_pll_hw_sequence_start();
740 hwreset_deassert(pad
->reset
);
741 clk_disable(pad
->clk
);
746 uphy_pex_disable(struct padctl_softc
*sc
, struct padctl_pad
*pad
)
751 if (sc
->pcie_ena_cnt
<= 0) {
752 rv
= hwreset_assert(pad
->reset
);
754 device_printf(sc
->dev
, "Cannot reset pad '%s': %d\n",
757 rv
= clk_disable(pad
->clk
);
759 device_printf(sc
->dev
,
760 "Cannot dicable clock for pad '%s': %d\n",
767 uphy_sata_enable(struct padctl_softc
*sc
, struct padctl_pad
*pad
, bool usb
)
772 /* 22.8.4 UPHY PLLs, Step 4, page 1346 */
773 /* 1. Deassert PLL/Lane resets. */
774 if (sc
->sata_ena_cnt
> 0) {
779 rv
= clk_enable(pad
->clk
);
781 device_printf(sc
->dev
, "Cannot enable clock for pad '%s': %d\n",
786 rv
= hwreset_deassert(pad
->reset
);
788 device_printf(sc
->dev
, "Cannot unreset pad '%s': %d\n",
790 clk_disable(pad
->clk
);
793 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
);
794 reg
&= ~UPHY_PLL_P0_CTL2_PLL0_CAL_CTRL(~0);
795 reg
|= UPHY_PLL_P0_CTL2_PLL0_CAL_CTRL(0x136);
796 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL2
, reg
);
798 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL5
);
799 reg
&= ~UPHY_PLL_P0_CTL5_PLL0_DCO_CTRL(~0);
800 reg
|= UPHY_PLL_P0_CTL5_PLL0_DCO_CTRL(0x2a);
801 WR4(sc
, XUSB_PADCTL_UPHY_PLL_P0_CTL5
, reg
);
803 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL1
);
804 reg
|= UPHY_PLL_S0_CTL1_PLL0_PWR_OVRD
;
805 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL1
, reg
);
807 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL2
);
808 reg
|= UPHY_PLL_S0_CTL2_PLL0_CAL_OVRD
;
809 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL2
, reg
);
811 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL8
);
812 reg
|= UPHY_PLL_S0_CTL8_PLL0_RCAL_OVRD
;
813 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL8
, reg
);
816 * 2. For the following registers, default values
817 * take care of the desired frequency.
819 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL4
);
820 reg
&= ~UPHY_PLL_S0_CTL4_PLL0_TXCLKREF_SEL(~0);
821 reg
&= ~UPHY_PLL_S0_CTL4_PLL0_REFCLK_SEL(~0);
822 reg
|= UPHY_PLL_S0_CTL4_PLL0_TXCLKREF_EN
;
825 reg
|= UPHY_PLL_S0_CTL4_PLL0_TXCLKREF_SEL(0x2);
827 reg
|= UPHY_PLL_S0_CTL4_PLL0_TXCLKREF_SEL(0x0);
829 /* XXX PLL0_XDIGCLK_EN */
832 WR4(sc, XUSB_PADCTL_UPHY_PLL_S0_CTL4, reg);
835 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL1
);
836 reg
&= ~UPHY_PLL_S0_CTL1_PLL0_FREQ_MDIV(~0);
837 reg
&= ~UPHY_PLL_S0_CTL1_PLL0_FREQ_NDIV(~0);
839 reg
|= UPHY_PLL_S0_CTL1_PLL0_FREQ_NDIV(0x19);
841 reg
|= UPHY_PLL_S0_CTL1_PLL0_FREQ_NDIV(0x1e);
842 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL1
, reg
);
844 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL1
);
845 reg
&= ~UPHY_PLL_S0_CTL1_PLL0_IDDQ
;
846 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL1
, reg
);
848 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL1
);
849 reg
&= ~UPHY_PLL_S0_CTL1_PLL0_SLEEP(~0);
850 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL1
, reg
);
852 /* 3. Wait 100 ns. */
855 /* XXX This in not in TRM */
856 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL4
);
857 reg
|= UPHY_PLL_S0_CTL4_PLL0_REFCLKBUF_EN
;
858 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL4
, reg
);
860 /* 4. Calibration. */
861 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL2
);
862 reg
|= UPHY_PLL_S0_CTL2_PLL0_CAL_EN
;
863 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL2
, reg
);
864 for (i
= 30; i
> 0; i
--) {
865 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL2
);
866 if (reg
& UPHY_PLL_S0_CTL2_PLL0_CAL_DONE
)
871 device_printf(sc
->dev
, "Timedout in calibration step 1 "
872 "for pad '%s'.\n", pad
->name
);
877 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL2
);
878 reg
&= ~UPHY_PLL_S0_CTL2_PLL0_CAL_EN
;
879 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL2
, reg
);
880 for (i
= 10; i
> 0; i
--) {
881 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL2
);
882 if ((reg
& UPHY_PLL_S0_CTL2_PLL0_CAL_DONE
) == 0)
887 device_printf(sc
->dev
, "Timedout in calibration step 2 "
888 "for pad '%s'.\n", pad
->name
);
893 /* 5. Enable the PLL (20 μs Lock time) */
894 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL1
);
895 reg
|= UPHY_PLL_S0_CTL1_PLL0_ENABLE
;
896 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL1
, reg
);
897 for (i
= 10; i
> 0; i
--) {
898 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL1
);
899 if (reg
& UPHY_PLL_S0_CTL1_PLL0_LOCKDET_STATUS
)
904 device_printf(sc
->dev
, "Timedout while enabling PLL "
905 "for pad '%s'.\n", pad
->name
);
911 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL8
);
912 reg
|= UPHY_PLL_S0_CTL8_PLL0_RCAL_EN
;
913 reg
|= UPHY_PLL_S0_CTL8_PLL0_RCAL_CLK_EN
;
914 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL8
, reg
);
915 for (i
= 10; i
> 0; i
--) {
916 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL8
);
917 if (reg
& UPHY_PLL_S0_CTL8_PLL0_RCAL_DONE
)
922 device_printf(sc
->dev
, "Timedout in RX calibration step 1 "
923 "for pad '%s'.\n", pad
->name
);
928 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL8
);
929 reg
&= ~UPHY_PLL_S0_CTL8_PLL0_RCAL_EN
;
930 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL8
, reg
);
931 for (i
= 10; i
> 0; i
--) {
932 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL8
);
933 if (!(reg
& UPHY_PLL_S0_CTL8_PLL0_RCAL_DONE
))
938 device_printf(sc
->dev
, "Timedout in RX calibration step 2 "
939 "for pad '%s'.\n", pad
->name
);
944 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL8
);
945 reg
&= ~UPHY_PLL_S0_CTL8_PLL0_RCAL_CLK_EN
;
946 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL8
, reg
);
948 /* Enable Hardware Power Sequencer. */
949 tegra210_sata_pll_hw_control_enable();
951 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL1
);
952 reg
&= ~UPHY_PLL_S0_CTL1_PLL0_PWR_OVRD
;
953 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL1
, reg
);
955 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL2
);
956 reg
&= ~UPHY_PLL_S0_CTL2_PLL0_CAL_OVRD
;
957 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL2
, reg
);
959 reg
= RD4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL8
);
960 reg
&= ~UPHY_PLL_S0_CTL8_PLL0_RCAL_OVRD
;
961 WR4(sc
, XUSB_PADCTL_UPHY_PLL_S0_CTL8
, reg
);
965 tegra210_sata_pll_hw_sequence_start();
972 hwreset_deassert(pad
->reset
);
973 clk_disable(pad
->clk
);
978 uphy_sata_disable(struct padctl_softc
*sc
, struct padctl_pad
*pad
)
983 if (sc
->sata_ena_cnt
<= 0) {
984 rv
= hwreset_assert(pad
->reset
);
986 device_printf(sc
->dev
, "Cannot reset pad '%s': %d\n",
989 rv
= clk_disable(pad
->clk
);
991 device_printf(sc
->dev
,
992 "Cannot dicable clock for pad '%s': %d\n",
1000 usb3_port_init(struct padctl_softc
*sc
, struct padctl_port
*port
)
1003 struct padctl_pad
*pad
;
1006 pad
= port
->lane
->pad
;
1007 reg
= RD4(sc
, XUSB_PADCTL_SS_PORT_MAP
);
1009 reg
&= ~SS_PORT_MAP_PORT_INTERNAL(port
->idx
);
1011 reg
|= SS_PORT_MAP_PORT_INTERNAL(port
->idx
);
1012 reg
&= ~SS_PORT_MAP_PORT_MAP(port
->idx
, ~0);
1013 reg
|= SS_PORT_MAP_PORT_MAP(port
->idx
, port
->companion
);
1014 WR4(sc
, XUSB_PADCTL_SS_PORT_MAP
, reg
);
1016 if (port
->supply_vbus
!= NULL
) {
1017 rv
= regulator_enable(port
->supply_vbus
);
1019 device_printf(sc
->dev
,
1020 "Cannot enable vbus regulator\n");
1025 reg
= RD4(sc
, XUSB_PADCTL_UPHY_USB3_PAD_ECTL1(port
->idx
));
1026 reg
&= ~UPHY_USB3_PAD_ECTL1_TX_TERM_CTRL(~0);
1027 reg
|= UPHY_USB3_PAD_ECTL1_TX_TERM_CTRL(2);
1028 WR4(sc
, XUSB_PADCTL_UPHY_USB3_PAD_ECTL1(port
->idx
), reg
);
1030 reg
= RD4(sc
, XUSB_PADCTL_UPHY_USB3_PAD_ECTL2(port
->idx
));
1031 reg
&= ~UPHY_USB3_PAD_ECTL2_RX_CTLE(~0);
1032 reg
|= UPHY_USB3_PAD_ECTL2_RX_CTLE(0x00fc);
1033 WR4(sc
, XUSB_PADCTL_UPHY_USB3_PAD_ECTL2(port
->idx
), reg
);
1035 WR4(sc
, XUSB_PADCTL_UPHY_USB3_PAD_ECTL3(port
->idx
), 0xc0077f1f);
1037 reg
= RD4(sc
, XUSB_PADCTL_UPHY_USB3_PAD_ECTL4(port
->idx
));
1038 reg
&= ~UPHY_USB3_PAD_ECTL4_RX_CDR_CTRL(~0);
1039 reg
|= UPHY_USB3_PAD_ECTL4_RX_CDR_CTRL(0x01c7);
1040 WR4(sc
, XUSB_PADCTL_UPHY_USB3_PAD_ECTL4(port
->idx
), reg
);
1042 WR4(sc
, XUSB_PADCTL_UPHY_USB3_PAD_ECTL6(port
->idx
), 0xfcf01368);
1044 if (pad
->type
== PADCTL_PAD_SATA
)
1045 rv
= uphy_sata_enable(sc
, pad
, true);
1047 rv
= uphy_pex_enable(sc
, pad
);
1051 reg
= RD4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
);
1052 reg
&= ~ELPG_PROGRAM1_SSP_ELPG_VCORE_DOWN(port
->idx
);
1053 WR4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
, reg
);
1056 reg
= RD4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
);
1057 reg
&= ~ELPG_PROGRAM1_SSP_ELPG_CLAMP_EN_EARLY(port
->idx
);
1058 WR4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
, reg
);
1061 reg
= RD4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
);
1062 reg
&= ~ELPG_PROGRAM1_SSP_ELPG_CLAMP_EN(port
->idx
);
1063 WR4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
, reg
);
1070 pcie_enable(struct padctl_softc
*sc
, struct padctl_lane
*lane
)
1075 rv
= uphy_pex_enable(sc
, lane
->pad
);
1079 reg
= RD4(sc
, XUSB_PADCTL_USB3_PAD_MUX
);
1080 reg
|= USB3_PAD_MUX_PCIE_IDDQ_DISABLE(lane
->idx
);
1081 WR4(sc
, XUSB_PADCTL_USB3_PAD_MUX
, reg
);
1087 pcie_disable(struct padctl_softc
*sc
, struct padctl_lane
*lane
)
1091 reg
= RD4(sc
, XUSB_PADCTL_USB3_PAD_MUX
);
1092 reg
&= ~USB3_PAD_MUX_PCIE_IDDQ_DISABLE(lane
->idx
);
1093 WR4(sc
, XUSB_PADCTL_USB3_PAD_MUX
, reg
);
1095 uphy_pex_disable(sc
, lane
->pad
);
1102 sata_enable(struct padctl_softc
*sc
, struct padctl_lane
*lane
)
1107 rv
= uphy_sata_enable(sc
, lane
->pad
, false);
1111 reg
= RD4(sc
, XUSB_PADCTL_USB3_PAD_MUX
);
1112 reg
|= USB3_PAD_MUX_SATA_IDDQ_DISABLE(lane
->idx
);
1113 WR4(sc
, XUSB_PADCTL_USB3_PAD_MUX
, reg
);
1119 sata_disable(struct padctl_softc
*sc
, struct padctl_lane
*lane
)
1123 reg
= RD4(sc
, XUSB_PADCTL_USB3_PAD_MUX
);
1124 reg
&= ~USB3_PAD_MUX_SATA_IDDQ_DISABLE(lane
->idx
);
1125 WR4(sc
, XUSB_PADCTL_USB3_PAD_MUX
, reg
);
1127 uphy_sata_disable(sc
, lane
->pad
);
1133 hsic_enable(struct padctl_softc
*sc
, struct padctl_lane
*lane
)
1136 struct padctl_pad
*pad
;
1137 struct padctl_port
*port
;
1140 port
= search_lane_port(sc
, lane
);
1142 device_printf(sc
->dev
, "Cannot find port for lane: %s\n",
1147 if (port
->supply_vbus
!= NULL
) {
1148 rv
= regulator_enable(port
->supply_vbus
);
1150 device_printf(sc
->dev
,
1151 "Cannot enable vbus regulator\n");
1156 WR4(sc
, XUSB_PADCTL_HSIC_STRB_TRIM_CONTROL
, sc
->strobe_trim
);
1158 reg
= RD4(sc
, XUSB_PADCTL_HSIC_PAD_CTL1(lane
->idx
));
1159 reg
&= ~HSIC_PAD_CTL1_TX_RTUNEP(~0);
1160 reg
|= HSIC_PAD_CTL1_TX_RTUNEP(sc
->tx_rtune_p
);
1161 WR4(sc
, XUSB_PADCTL_HSIC_PAD_CTL1(lane
->idx
), reg
);
1163 reg
= RD4(sc
, XUSB_PADCTL_HSIC_PAD_CTL2(lane
->idx
));
1164 reg
&= ~HSIC_PAD_CTL2_RX_STROBE_TRIM(~0);
1165 reg
&= ~HSIC_PAD_CTL2_RX_DATA1_TRIM(~0);
1166 reg
&= ~HSIC_PAD_CTL2_RX_DATA0_TRIM(~0);
1167 reg
|= HSIC_PAD_CTL2_RX_STROBE_TRIM(sc
->rx_strobe_trim
);
1168 reg
|= HSIC_PAD_CTL2_RX_DATA1_TRIM(sc
->rx_data1_trim
);
1169 reg
|= HSIC_PAD_CTL2_RX_DATA0_TRIM(sc
->rx_data0_trim
);
1170 WR4(sc
, XUSB_PADCTL_HSIC_PAD_CTL2(lane
->idx
), reg
);
1172 reg
= RD4(sc
, XUSB_PADCTL_HSIC_PAD_CTL0(lane
->idx
));
1173 reg
&= ~HSIC_PAD_CTL0_RPU_DATA0
;
1174 reg
&= ~HSIC_PAD_CTL0_RPU_DATA1
;
1175 reg
&= ~HSIC_PAD_CTL0_RPU_STROBE
;
1176 reg
&= ~HSIC_PAD_CTL0_PD_RX_DATA0
;
1177 reg
&= ~HSIC_PAD_CTL0_PD_RX_DATA1
;
1178 reg
&= ~HSIC_PAD_CTL0_PD_RX_STROBE
;
1179 reg
&= ~HSIC_PAD_CTL0_PD_ZI_DATA0
;
1180 reg
&= ~HSIC_PAD_CTL0_PD_ZI_DATA1
;
1181 reg
&= ~HSIC_PAD_CTL0_PD_ZI_STROBE
;
1182 reg
&= ~HSIC_PAD_CTL0_PD_TX_DATA0
;
1183 reg
&= ~HSIC_PAD_CTL0_PD_TX_DATA1
;
1184 reg
&= ~HSIC_PAD_CTL0_PD_TX_STROBE
;
1185 reg
|= HSIC_PAD_CTL0_RPD_DATA0
;
1186 reg
|= HSIC_PAD_CTL0_RPD_DATA1
;
1187 reg
|= HSIC_PAD_CTL0_RPD_STROBE
;
1188 WR4(sc
, XUSB_PADCTL_HSIC_PAD_CTL0(lane
->idx
), reg
);
1190 rv
= clk_enable(pad
->clk
);
1192 device_printf(sc
->dev
, "Cannot enable clock for pad '%s': %d\n",
1194 if (port
->supply_vbus
!= NULL
)
1195 regulator_disable(port
->supply_vbus
);
1199 reg
= RD4(sc
, XUSB_PADCTL_HSIC_PAD_TRK_CTL
);
1200 reg
&= ~HSIC_PAD_TRK_CTL_TRK_START_TIMER(~0);
1201 reg
&= ~HSIC_PAD_TRK_CTL_TRK_DONE_RESET_TIMER(~0);
1202 reg
|= HSIC_PAD_TRK_CTL_TRK_START_TIMER(0x1e);
1203 reg
|= HSIC_PAD_TRK_CTL_TRK_DONE_RESET_TIMER(0x0a);
1204 WR4(sc
, XUSB_PADCTL_HSIC_PAD_TRK_CTL
, reg
);
1208 reg
= RD4(sc
, XUSB_PADCTL_HSIC_PAD_TRK_CTL
);
1209 reg
&= ~HSIC_PAD_TRK_CTL_PD_TRK
;
1210 WR4(sc
, XUSB_PADCTL_HSIC_PAD_TRK_CTL
, reg
);
1213 clk_disable(pad
->clk
);
1218 hsic_disable(struct padctl_softc
*sc
, struct padctl_lane
*lane
)
1221 struct padctl_port
*port
;
1224 port
= search_lane_port(sc
, lane
);
1226 device_printf(sc
->dev
, "Cannot find port for lane: %s\n",
1230 reg
= RD4(sc
, XUSB_PADCTL_HSIC_PAD_CTL0(lane
->idx
));
1231 reg
|= HSIC_PAD_CTL0_PD_RX_DATA0
;
1232 reg
|= HSIC_PAD_CTL0_PD_RX_DATA1
;
1233 reg
|= HSIC_PAD_CTL0_PD_RX_STROBE
;
1234 reg
|= HSIC_PAD_CTL0_PD_ZI_DATA0
;
1235 reg
|= HSIC_PAD_CTL0_PD_ZI_DATA1
;
1236 reg
|= HSIC_PAD_CTL0_PD_ZI_STROBE
;
1237 reg
|= HSIC_PAD_CTL0_PD_TX_DATA0
;
1238 reg
|= HSIC_PAD_CTL0_PD_TX_DATA1
;
1239 reg
|= HSIC_PAD_CTL0_PD_TX_STROBE
;
1240 WR4(sc
, XUSB_PADCTL_HSIC_PAD_CTL1(lane
->idx
), reg
);
1242 if (port
->supply_vbus
!= NULL
) {
1243 rv
= regulator_disable(port
->supply_vbus
);
1245 device_printf(sc
->dev
,
1246 "Cannot disable vbus regulator\n");
1255 usb2_enable(struct padctl_softc
*sc
, struct padctl_lane
*lane
)
1258 struct padctl_pad
*pad
;
1259 struct padctl_port
*port
;
1262 port
= search_lane_port(sc
, lane
);
1264 device_printf(sc
->dev
, "Cannot find port for lane: %s\n",
1269 reg
= RD4(sc
, XUSB_PADCTL_USB2_BIAS_PAD_CTL0
);
1270 reg
&= ~USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL(~0);
1271 reg
&= ~USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL(~0);
1272 reg
|= USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL(0x7);
1273 WR4(sc
, XUSB_PADCTL_USB2_BIAS_PAD_CTL0
, reg
);
1275 reg
= RD4(sc
, XUSB_PADCTL_USB2_PORT_CAP
);
1276 reg
&= ~USB2_PORT_CAP_PORT_CAP(lane
->idx
, ~0);
1277 reg
|= USB2_PORT_CAP_PORT_CAP(lane
->idx
, USB2_PORT_CAP_PORT_CAP_HOST
);
1278 WR4(sc
, XUSB_PADCTL_USB2_PORT_CAP
, reg
);
1280 reg
= RD4(sc
, XUSB_PADCTL_USB2_OTG_PAD_CTL0(lane
->idx
));
1281 reg
&= ~USB2_OTG_PAD_CTL0_HS_CURR_LEVEL(~0);
1282 reg
&= ~USB2_OTG_PAD_CTL0_HS_SLEW(~0);
1283 reg
&= ~USB2_OTG_PAD_CTL0_PD
;
1284 reg
&= ~USB2_OTG_PAD_CTL0_PD2
;
1285 reg
&= ~USB2_OTG_PAD_CTL0_PD_ZI
;
1286 reg
|= USB2_OTG_PAD_CTL0_HS_SLEW(14);
1287 reg
|= USB2_OTG_PAD_CTL0_HS_CURR_LEVEL(sc
->hs_curr_level
[lane
->idx
] +
1288 sc
->hs_curr_level_offs
);
1289 WR4(sc
, XUSB_PADCTL_USB2_OTG_PAD_CTL0(lane
->idx
), reg
);
1291 reg
= RD4(sc
, XUSB_PADCTL_USB2_OTG_PAD_CTL1(lane
->idx
));
1292 reg
&= ~USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ(~0);
1293 reg
&= ~USB2_OTG_PAD_CTL1_RPD_CTRL(~0);
1294 reg
&= ~USB2_OTG_PAD_CTL1_PD_DR
;
1295 reg
&= ~USB2_OTG_PAD_CTL1_PD_CHRP_OVRD
;
1296 reg
&= ~USB2_OTG_PAD_CTL1_PD_DISC_OVRD
;
1297 reg
|= USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ(sc
->hs_term_range_adj
);
1298 reg
|= USB2_OTG_PAD_CTL1_RPD_CTRL(sc
->rpd_ctrl
);
1299 WR4(sc
, XUSB_PADCTL_USB2_OTG_PAD_CTL1(lane
->idx
), reg
);
1301 reg
= RD4(sc
, XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1(lane
->idx
));
1302 reg
&= ~USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV(~0);
1303 reg
|= USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_FIX18
;
1304 WR4(sc
, XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1(lane
->idx
), reg
);
1306 if (port
->supply_vbus
!= NULL
) {
1307 rv
= regulator_enable(port
->supply_vbus
);
1309 device_printf(sc
->dev
,
1310 "Cannot enable vbus regulator\n");
1314 rv
= clk_enable(pad
->clk
);
1316 device_printf(sc
->dev
, "Cannot enable clock for pad '%s': %d\n",
1318 if (port
->supply_vbus
!= NULL
)
1319 regulator_disable(port
->supply_vbus
);
1322 reg
= RD4(sc
, XUSB_PADCTL_USB2_BIAS_PAD_CTL1
);
1323 reg
&= ~USB2_BIAS_PAD_CTL1_TRK_START_TIMER(~0);
1324 reg
&= ~USB2_BIAS_PAD_CTL1_TRK_DONE_RESET_TIMER(~0);
1325 reg
|= USB2_BIAS_PAD_CTL1_TRK_START_TIMER(0x1e);
1326 reg
|= USB2_BIAS_PAD_CTL1_TRK_DONE_RESET_TIMER(0x0a);
1327 WR4(sc
, XUSB_PADCTL_USB2_BIAS_PAD_CTL1
, reg
);
1329 reg
= RD4(sc
, XUSB_PADCTL_USB2_BIAS_PAD_CTL0
);
1330 reg
&= ~USB2_BIAS_PAD_CTL0_PD
;
1331 WR4(sc
, XUSB_PADCTL_USB2_BIAS_PAD_CTL0
, reg
);
1336 usb2_disable(struct padctl_softc
*sc
, struct padctl_lane
*lane
)
1339 struct padctl_pad
*pad
;
1340 struct padctl_port
*port
;
1343 port
= search_lane_port(sc
, lane
);
1345 device_printf(sc
->dev
, "Cannot find port for lane: %s\n",
1350 reg
= RD4(sc
, XUSB_PADCTL_USB2_BIAS_PAD_CTL0
);
1351 reg
|= USB2_BIAS_PAD_CTL0_PD
;
1352 WR4(sc
, XUSB_PADCTL_USB2_BIAS_PAD_CTL0
, reg
);
1354 if (port
->supply_vbus
!= NULL
) {
1355 rv
= regulator_disable(port
->supply_vbus
);
1357 device_printf(sc
->dev
,
1358 "Cannot disable vbus regulator\n");
1363 rv
= clk_disable(pad
->clk
);
1365 device_printf(sc
->dev
, "Cannot disable clock for pad '%s': %d\n",
1375 pad_common_enable(struct padctl_softc
*sc
)
1379 reg
= RD4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
);
1380 reg
&= ~ELPG_PROGRAM1_AUX_MUX_LP0_CLAMP_EN
;
1381 WR4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
, reg
);
1384 reg
= RD4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
);
1385 reg
&= ~ELPG_PROGRAM1_AUX_MUX_LP0_CLAMP_EN_EARLY
;
1386 WR4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
, reg
);
1389 reg
= RD4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
);
1390 reg
&= ~ELPG_PROGRAM1_AUX_MUX_LP0_VCORE_DOWN
;
1391 WR4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
, reg
);
1398 pad_common_disable(struct padctl_softc
*sc
)
1402 reg
= RD4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
);
1403 reg
|= ELPG_PROGRAM1_AUX_MUX_LP0_VCORE_DOWN
;
1404 WR4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
, reg
);
1407 reg
= RD4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
);
1408 reg
|= ELPG_PROGRAM1_AUX_MUX_LP0_CLAMP_EN_EARLY
;
1409 WR4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
, reg
);
1412 reg
= RD4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
);
1413 reg
|= ELPG_PROGRAM1_AUX_MUX_LP0_CLAMP_EN
;
1414 WR4(sc
, XUSB_PADCTL_ELPG_PROGRAM1
, reg
);
1421 xusbpadctl_phy_enable(struct phynode
*phy
, bool enable
)
1425 struct padctl_softc
*sc
;
1426 struct padctl_lane
*lane
;
1427 struct padctl_pad
*pad
;
1430 dev
= phynode_get_device(phy
);
1431 id
= phynode_get_id(phy
);
1432 sc
= device_get_softc(dev
);
1434 if (id
< 0 || id
>= nitems(lanes_tbl
)) {
1435 device_printf(dev
, "Unknown phy: %d\n", (int)id
);
1439 lane
= lanes_tbl
+ id
;
1440 if (!lane
->enabled
) {
1441 device_printf(dev
, "Lane is not enabled/configured: %s\n",
1448 if (sc
->phy_ena_cnt
== 0) {
1449 rv
= pad_common_enable(sc
);
1457 rv
= pad
->enable(sc
, lane
);
1459 rv
= pad
->disable(sc
, lane
);
1464 if (sc
->phy_ena_cnt
== 1) {
1465 rv
= pad_common_disable(sc
);
1475 /* -------------------------------------------------------------------------
1479 static struct padctl_port
*
1480 search_port(struct padctl_softc
*sc
, char *port_name
)
1484 for (i
= 0; i
< nitems(ports_tbl
); i
++) {
1485 if (strcmp(port_name
, ports_tbl
[i
].name
) == 0)
1486 return (&ports_tbl
[i
]);
1491 static struct padctl_port
*
1492 search_lane_port(struct padctl_softc
*sc
, struct padctl_lane
*lane
)
1496 for (i
= 0; i
< nitems(ports_tbl
); i
++) {
1497 if (!ports_tbl
[i
].enabled
)
1499 if (ports_tbl
[i
].lane
== lane
)
1500 return (ports_tbl
+ i
);
1505 static struct padctl_lane
*
1506 search_lane(struct padctl_softc
*sc
, char *lane_name
)
1510 for (i
= 0; i
< nitems(lanes_tbl
); i
++) {
1511 if (strcmp(lane_name
, lanes_tbl
[i
].name
) == 0)
1512 return (lanes_tbl
+ i
);
1517 static struct padctl_lane
*
1518 search_pad_lane(struct padctl_softc
*sc
, enum padctl_pad_type type
, int idx
)
1522 for (i
= 0; i
< nitems(lanes_tbl
); i
++) {
1523 if (!lanes_tbl
[i
].enabled
)
1525 if (type
== lanes_tbl
[i
].pad
->type
&& idx
== lanes_tbl
[i
].idx
)
1526 return (lanes_tbl
+ i
);
1531 static struct padctl_lane
*
1532 search_usb3_pad_lane(struct padctl_softc
*sc
, int idx
)
1535 struct padctl_lane
*lane
, *tmp
;
1538 for (i
= 0; i
< nitems(lane_map_tbl
); i
++) {
1539 if (idx
!= lane_map_tbl
[i
].port_idx
)
1541 tmp
= search_pad_lane(sc
, lane_map_tbl
[i
].pad_type
,
1542 lane_map_tbl
[i
].lane_idx
);
1545 if (strcmp(tmp
->mux
[tmp
->mux_idx
], "usb3-ss") != 0)
1548 device_printf(sc
->dev
, "Duplicated mappings found for"
1549 " lanes: %s and %s\n", lane
->name
, tmp
->name
);
1557 static struct padctl_pad
*
1558 search_pad(struct padctl_softc
*sc
, char *pad_name
)
1562 for (i
= 0; i
< nitems(pads_tbl
); i
++) {
1563 if (strcmp(pad_name
, pads_tbl
[i
].name
) == 0)
1564 return (pads_tbl
+ i
);
1570 search_mux(struct padctl_softc
*sc
, struct padctl_lane
*lane
, char *fnc_name
)
1574 for (i
= 0; i
< lane
->nmux
; i
++) {
1575 if (strcmp(fnc_name
, lane
->mux
[i
]) == 0)
1582 config_lane(struct padctl_softc
*sc
, struct padctl_lane
*lane
)
1586 reg
= RD4(sc
, lane
->reg
);
1587 reg
&= ~(lane
->mask
<< lane
->shift
);
1588 reg
|= (lane
->mux_idx
& lane
->mask
) << lane
->shift
;
1589 WR4(sc
, lane
->reg
, reg
);
1594 process_lane(struct padctl_softc
*sc
, phandle_t node
, struct padctl_pad
*pad
)
1596 struct padctl_lane
*lane
;
1597 struct phynode
*phynode
;
1598 struct phynode_init_def phy_init
;
1605 rv
= OF_getprop_alloc(node
, "name", (void **)&name
);
1607 device_printf(sc
->dev
, "Cannot read lane name.\n");
1611 lane
= search_lane(sc
, name
);
1613 device_printf(sc
->dev
, "Unknown lane: %s\n", name
);
1618 /* Read function (mux) settings. */
1619 rv
= OF_getprop_alloc(node
, "nvidia,function", (void **)&function
);
1621 device_printf(sc
->dev
, "Cannot read lane function.\n");
1626 lane
->mux_idx
= search_mux(sc
, lane
, function
);
1627 if (lane
->mux_idx
== ~0) {
1628 device_printf(sc
->dev
, "Unknown function %s for lane %s\n",
1634 rv
= config_lane(sc
, lane
);
1636 device_printf(sc
->dev
, "Cannot configure lane: %s: %d\n",
1641 lane
->xref
= OF_xref_from_node(node
);
1643 lane
->enabled
= true;
1644 pad
->lanes
[pad
->nlanes
++] = lane
;
1646 /* Create and register phy. */
1647 bzero(&phy_init
, sizeof(phy_init
));
1648 phy_init
.id
= lane
- lanes_tbl
;
1649 phy_init
.ofw_node
= node
;
1650 phynode
= phynode_create(sc
->dev
, &xusbpadctl_phynode_class
, &phy_init
);
1651 if (phynode
== NULL
) {
1652 device_printf(sc
->dev
, "Cannot create phy\n");
1656 if (phynode_register(phynode
) == NULL
) {
1657 device_printf(sc
->dev
, "Cannot create phy\n");
1666 if (function
!= NULL
)
1667 OF_prop_free(function
);
1672 process_pad(struct padctl_softc
*sc
, phandle_t node
)
1675 struct padctl_pad
*pad
;
1680 rv
= OF_getprop_alloc(node
, "name", (void **)&name
);
1682 device_printf(sc
->dev
, "Cannot read pad name.\n");
1686 pad
= search_pad(sc
, name
);
1688 device_printf(sc
->dev
, "Unknown pad: %s\n", name
);
1693 if (pad
->clock_name
!= NULL
) {
1694 rv
= clk_get_by_ofw_name(sc
->dev
, node
, pad
->clock_name
,
1697 device_printf(sc
->dev
, "Cannot get '%s' clock\n",
1703 if (pad
->reset_name
!= NULL
) {
1704 rv
= hwreset_get_by_ofw_name(sc
->dev
, node
, pad
->reset_name
,
1707 device_printf(sc
->dev
, "Cannot get '%s' reset\n",
1713 /* Read and process associated lanes. */
1714 node
= ofw_bus_find_child(node
, "lanes");
1716 device_printf(sc
->dev
, "Cannot find 'lanes' subnode\n");
1721 for (node
= OF_child(node
); node
!= 0; node
= OF_peer(node
)) {
1722 if (!ofw_bus_node_status_okay(node
))
1725 rv
= process_lane(sc
, node
, pad
);
1729 xref
= OF_xref_from_node(node
);
1730 OF_device_register_xref(xref
, sc
->dev
);
1732 pad
->enabled
= true;
1741 process_port(struct padctl_softc
*sc
, phandle_t node
)
1744 struct padctl_port
*port
;
1749 rv
= OF_getprop_alloc(node
, "name", (void **)&name
);
1751 device_printf(sc
->dev
, "Cannot read port name.\n");
1755 port
= search_port(sc
, name
);
1757 device_printf(sc
->dev
, "Unknown port: %s\n", name
);
1762 regulator_get_by_ofw_property(sc
->dev
, node
,
1763 "vbus-supply", &port
->supply_vbus
);
1765 if (OF_hasprop(node
, "nvidia,internal"))
1766 port
->internal
= true;
1768 /* Find assigned lane */
1769 if (port
->lane
== NULL
) {
1770 switch(port
->type
) {
1771 /* Routing is fixed for USB2 AND HSIC. */
1772 case PADCTL_PORT_USB2
:
1773 port
->lane
= search_pad_lane(sc
, PADCTL_PAD_USB2
,
1776 case PADCTL_PORT_HSIC
:
1777 port
->lane
= search_pad_lane(sc
, PADCTL_PAD_HSIC
,
1780 case PADCTL_PORT_USB3
:
1781 port
->lane
= search_usb3_pad_lane(sc
, port
->idx
);
1785 if (port
->lane
== NULL
) {
1786 device_printf(sc
->dev
, "Cannot find lane for port: %s\n", name
);
1791 if (port
->type
== PADCTL_PORT_USB3
) {
1792 rv
= OF_getencprop(node
, "nvidia,usb2-companion",
1793 &(port
->companion
), sizeof(port
->companion
));
1795 device_printf(sc
->dev
,
1796 "Missing 'nvidia,usb2-companion' property "
1797 "for port: %s\n", name
);
1803 port
->enabled
= true;
1812 parse_fdt(struct padctl_softc
*sc
, phandle_t base_node
)
1818 node
= ofw_bus_find_child(base_node
, "pads");
1821 device_printf(sc
->dev
, "Cannot find pads subnode.\n");
1824 for (node
= OF_child(node
); node
!= 0; node
= OF_peer(node
)) {
1825 if (!ofw_bus_node_status_okay(node
))
1827 rv
= process_pad(sc
, node
);
1832 node
= ofw_bus_find_child(base_node
, "ports");
1834 device_printf(sc
->dev
, "Cannot find ports subnode.\n");
1837 for (node
= OF_child(node
); node
!= 0; node
= OF_peer(node
)) {
1838 if (!ofw_bus_node_status_okay(node
))
1840 rv
= process_port(sc
, node
);
1849 load_calibration(struct padctl_softc
*sc
)
1854 reg
= tegra_fuse_read_4(FUSE_SKU_CALIB_0
);
1855 sc
->hs_curr_level
[0] = FUSE_SKU_CALIB_0_HS_CURR_LEVEL_0(reg
);
1856 for (i
= 1; i
< nitems(sc
->hs_curr_level
); i
++) {
1857 sc
->hs_curr_level
[i
] =
1858 FUSE_SKU_CALIB_0_HS_CURR_LEVEL_123(reg
, i
);
1860 sc
->hs_term_range_adj
= FUSE_SKU_CALIB_0_HS_TERM_RANGE_ADJ(reg
);
1862 tegra_fuse_read_4(FUSE_USB_CALIB_EXT_0
);
1863 sc
->rpd_ctrl
= FUSE_USB_CALIB_EXT_0_RPD_CTRL(reg
);
1866 /* -------------------------------------------------------------------------
1871 xusbpadctl_probe(device_t dev
)
1874 if (!ofw_bus_status_okay(dev
))
1877 if (!ofw_bus_search_compatible(dev
, compat_data
)->ocd_data
)
1880 device_set_desc(dev
, "Tegra XUSB phy");
1881 return (BUS_PROBE_DEFAULT
);
1885 xusbpadctl_detach(device_t dev
)
1888 /* This device is always present. */
1893 xusbpadctl_attach(device_t dev
)
1895 struct padctl_softc
* sc
;
1897 struct padctl_port
*port
;
1900 sc
= device_get_softc(dev
);
1902 node
= ofw_bus_get_node(dev
);
1904 sc
->mem_res
= bus_alloc_resource_any(dev
, SYS_RES_MEMORY
, &rid
,
1906 if (sc
->mem_res
== NULL
) {
1907 device_printf(dev
, "Cannot allocate memory resources\n");
1911 rv
= hwreset_get_by_ofw_name(dev
, 0, "padctl", &sc
->rst
);
1913 device_printf(dev
, "Cannot get 'padctl' reset: %d\n", rv
);
1916 rv
= hwreset_deassert(sc
->rst
);
1918 device_printf(dev
, "Cannot unreset 'padctl' reset: %d\n", rv
);
1922 load_calibration(sc
);
1924 rv
= parse_fdt(sc
, node
);
1926 device_printf(dev
, "Cannot parse fdt configuration: %d\n", rv
);
1929 for (i
= 0; i
< nitems(ports_tbl
); i
++) {
1930 port
= ports_tbl
+ i
;
1933 if (port
->init
== NULL
)
1935 rv
= port
->init(sc
, port
);
1937 device_printf(dev
, "Cannot init port '%s'\n",
1945 static device_method_t tegra_xusbpadctl_methods
[] = {
1946 /* Device interface */
1947 DEVMETHOD(device_probe
, xusbpadctl_probe
),
1948 DEVMETHOD(device_attach
, xusbpadctl_attach
),
1949 DEVMETHOD(device_detach
, xusbpadctl_detach
),
1954 static DEFINE_CLASS_0(xusbpadctl
, tegra_xusbpadctl_driver
,
1955 tegra_xusbpadctl_methods
, sizeof(struct padctl_softc
));
1956 EARLY_DRIVER_MODULE(tegra_xusbpadctl
, simplebus
, tegra_xusbpadctl_driver
,