Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/arm/nvidia/tegra124/tegra124_xusbpadctl.c
39507 views
1
/*-
2
* Copyright (c) 2016 Michal Meloun <[email protected]>
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
* SUCH DAMAGE.
25
*/
26
27
#include <sys/param.h>
28
#include <sys/systm.h>
29
#include <sys/bus.h>
30
#include <sys/kernel.h>
31
#include <sys/module.h>
32
#include <sys/malloc.h>
33
#include <sys/rman.h>
34
35
#include <machine/bus.h>
36
#include <machine/fdt.h>
37
38
#include <dev/hwreset/hwreset.h>
39
#include <dev/phy/phy.h>
40
#include <dev/regulator/regulator.h>
41
#include <dev/fdt/fdt_common.h>
42
#include <dev/fdt/fdt_pinctrl.h>
43
#include <dev/ofw/openfirm.h>
44
#include <dev/ofw/ofw_bus.h>
45
#include <dev/ofw/ofw_bus_subr.h>
46
47
#include <arm/nvidia/tegra_efuse.h>
48
49
#include <dt-bindings/pinctrl/pinctrl-tegra-xusb.h>
50
51
#include "phydev_if.h"
52
53
/* FUSE calibration data. */
54
#define FUSE_XUSB_CALIB 0x0F0
55
#define FUSE_XUSB_CALIB_HS_CURR_LEVEL_123(x) (((x) >> 15) & 0x3F);
56
#define FUSE_XUSB_CALIB_HS_IREF_CAP(x) (((x) >> 13) & 0x03);
57
#define FUSE_XUSB_CALIB_HS_SQUELCH_LEVEL(x) (((x) >> 11) & 0x03);
58
#define FUSE_XUSB_CALIB_HS_TERM_RANGE_ADJ(x) (((x) >> 7) & 0x0F);
59
#define FUSE_XUSB_CALIB_HS_CURR_LEVEL_0(x) (((x) >> 0) & 0x3F);
60
61
/* Registers. */
62
#define XUSB_PADCTL_USB2_PAD_MUX 0x004
63
64
#define XUSB_PADCTL_USB2_PORT_CAP 0x008
65
#define USB2_PORT_CAP_ULPI_PORT_INTERNAL (1 << 25)
66
#define USB2_PORT_CAP_ULPI_PORT_CAP (1 << 24)
67
#define USB2_PORT_CAP_PORT_REVERSE_ID(p) (1 << (3 + (p) * 4))
68
#define USB2_PORT_CAP_PORT_INTERNAL(p) (1 << (2 + (p) * 4))
69
#define USB2_PORT_CAP_PORT_CAP(p, x) (((x) & 3) << ((p) * 4))
70
#define USB2_PORT_CAP_PORT_CAP_OTG 0x3
71
#define USB2_PORT_CAP_PORT_CAP_DEVICE 0x2
72
#define USB2_PORT_CAP_PORT_CAP_HOST 0x1
73
#define USB2_PORT_CAP_PORT_CAP_DISABLED 0x0
74
75
#define XUSB_PADCTL_SS_PORT_MAP 0x014
76
#define SS_PORT_MAP_PORT_INTERNAL(p) (1 << (3 + (p) * 4))
77
#define SS_PORT_MAP_PORT_MAP(p, x) (((x) & 7) << ((p) * 4))
78
79
#define XUSB_PADCTL_ELPG_PROGRAM 0x01C
80
#define ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN (1 << 26)
81
#define ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY (1 << 25)
82
#define ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN (1 << 24)
83
#define ELPG_PROGRAM_SSP_ELPG_VCORE_DOWN(x) (1 << (18 + (x) * 4))
84
#define ELPG_PROGRAM_SSP_ELPG_CLAMP_EN_EARLY(x) (1 << (17 + (x) * 4))
85
#define ELPG_PROGRAM_SSP_ELPG_CLAMP_EN(x) (1 << (16 + (x) * 4))
86
87
#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1 0x040
88
#define IOPHY_PLL_P0_CTL1_PLL0_LOCKDET (1 << 19)
89
#define IOPHY_PLL_P0_CTL1_REFCLK_SEL(x) (((x) & 0xF) << 12)
90
#define IOPHY_PLL_P0_CTL1_PLL_RST (1 << 1)
91
92
#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2 0x044
93
#define IOPHY_PLL_P0_CTL2_REFCLKBUF_EN (1 << 6)
94
#define IOPHY_PLL_P0_CTL2_TXCLKREF_EN (1 << 5)
95
#define IOPHY_PLL_P0_CTL2_TXCLKREF_SEL (1 << 4)
96
97
#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2(x) (0x058 + (x) * 4)
98
#define IOPHY_USB3_PAD_CTL2_CDR_CNTL(x) (((x) & 0x00FF) << 4)
99
#define IOPHY_USB3_PAD_CTL2_RX_EQ(x) (((x) & 0xFFFF) << 8)
100
#define IOPHY_USB3_PAD_CTL2_RX_WANDER(x) (((x) & 0x000F) << 4)
101
#define IOPHY_USB3_PAD_CTL2_RX_TERM_CNTL(x) (((x) & 0x0003) << 2)
102
#define IOPHY_USB3_PAD_CTL2_TX_TERM_CNTL(x) (((x) & 0x0003) << 0)
103
104
#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL4(x) (0x068 + (x) * 4)
105
106
#define XUSB_PADCTL_USB2_OTG_PAD_CTL0(x) (0x0A0 + (x) * 4)
107
#define USB2_OTG_PAD_CTL0_LSBIAS_SEL (1 << 23)
108
#define USB2_OTG_PAD_CTL0_DISCON_DETECT_METHOD (1 << 22)
109
#define USB2_OTG_PAD_CTL0_PD_ZI (1 << 21)
110
#define USB2_OTG_PAD_CTL0_PD2 (1 << 20)
111
#define USB2_OTG_PAD_CTL0_PD (1 << 19)
112
#define USB2_OTG_PAD_CTL0_TERM_EN (1 << 18)
113
#define USB2_OTG_PAD_CTL0_LS_LS_FSLEW(x) (((x) & 0x03) << 16)
114
#define USB2_OTG_PAD_CTL0_LS_RSLEW(x) (((x) & 0x03) << 14)
115
#define USB2_OTG_PAD_CTL0_FS_SLEW(x) (((x) & 0x03) << 12)
116
#define USB2_OTG_PAD_CTL0_HS_SLEW(x) (((x) & 0x3F) << 6)
117
#define USB2_OTG_PAD_CTL0_HS_CURR_LEVEL(x) (((x) & 0x3F) << 0)
118
119
#define XUSB_PADCTL_USB2_OTG_PAD_CTL1(x) (0x0AC + (x) * 4)
120
#define USB2_OTG_PAD_CTL1_RPU_RANGE_ADJ(x) (((x) & 0x3) << 11)
121
#define USB2_OTG_PAD_CTL1_HS_IREF_CAP(x) (((x) & 0x3) << 9)
122
#define USB2_OTG_PAD_CTL1_SPARE(x) (((x) & 0x3) << 7)
123
#define USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ(x) (((x) & 0xF) << 3)
124
#define USB2_OTG_PAD_CTL1_PD_DR (1 << 2)
125
#define USB2_OTG_PAD_CTL1_PD_DISC_FORCE_POWERUP (1 << 1)
126
#define USB2_OTG_PAD_CTL1_PD_CHRP_FORCE_POWERUP (1 << 0)
127
128
#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0 0x0B8
129
#define USB2_BIAS_PAD_CTL0_ADJRPU(x) (((x) & 0x7) << 14)
130
#define USB2_BIAS_PAD_CTL0_PD_TRK (1 << 13)
131
#define USB2_BIAS_PAD_CTL0_PD (1 << 12)
132
#define USB2_BIAS_PAD_CTL0_TERM_OFFSETL(x) (((x) & 0x3) << 9)
133
#define USB2_BIAS_PAD_CTL0_VBUS_LEVEL(x) (((x) & 0x3) << 7)
134
#define USB2_BIAS_PAD_CTL0_HS_CHIRP_LEVEL(x) (((x) & 0x3) << 5)
135
#define USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL(x) (((x) & 0x7) << 2)
136
#define USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL(x) (((x) & 0x3) << 0)
137
138
#define XUSB_PADCTL_HSIC_PAD0_CTL0 0x0C8
139
#define HSIC_PAD0_CTL0_HSIC_OPT(x) (((x) & 0xF) << 16)
140
#define HSIC_PAD0_CTL0_TX_SLEWN(x) (((x) & 0xF) << 12)
141
#define HSIC_PAD0_CTL0_TX_SLEWP(x) (((x) & 0xF) << 8)
142
#define HSIC_PAD0_CTL0_TX_RTUNEN(x) (((x) & 0xF) << 4)
143
#define HSIC_PAD0_CTL0_TX_RTUNEP(x) (((x) & 0xF) << 0)
144
145
#define XUSB_PADCTL_USB3_PAD_MUX 0x134
146
#define USB3_PAD_MUX_PCIE_IDDQ_DISABLE(x) (1 << (1 + (x)))
147
#define USB3_PAD_MUX_SATA_IDDQ_DISABLE (1 << 6)
148
149
#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1 0x138
150
#define IOPHY_PLL_S0_CTL1_PLL1_LOCKDET (1 << 27)
151
#define IOPHY_PLL_S0_CTL1_PLL1_MODE (1 << 24)
152
#define IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD (1 << 3)
153
#define IOPHY_PLL_S0_CTL1_PLL_RST_L (1 << 1)
154
#define IOPHY_PLL_S0_CTL1_PLL_IDDQ (1 << 0)
155
156
#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2 0x13C
157
#define XUSB_PADCTL_IOPHY_PLL_S0_CTL3 0x140
158
#define XUSB_PADCTL_IOPHY_PLL_S0_CTL4 0x144
159
160
#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1 0x148
161
#define IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD (1 << 1)
162
#define IOPHY_MISC_PAD_S0_CTL1_IDDQ (1 << 0)
163
164
#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL2 0x14C
165
#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL3 0x150
166
#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL4 0x154
167
#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL5 0x158
168
#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL6 0x15C
169
170
#define WR4(_sc, _r, _v) bus_write_4((_sc)->mem_res, (_r), (_v))
171
#define RD4(_sc, _r) bus_read_4((_sc)->mem_res, (_r))
172
173
struct padctl_softc {
174
device_t dev;
175
struct resource *mem_res;
176
hwreset_t rst;
177
int phy_ena_cnt;
178
179
/* Fuses calibration data */
180
uint32_t hs_curr_level_0;
181
uint32_t hs_curr_level_123;
182
uint32_t hs_iref_cap;
183
uint32_t hs_term_range_adj;
184
uint32_t hs_squelch_level;
185
186
uint32_t hs_curr_level_offset;
187
};
188
189
static struct ofw_compat_data compat_data[] = {
190
{"nvidia,tegra124-xusb-padctl", 1},
191
{NULL, 0},
192
};
193
194
/* Ports. */
195
enum padctl_port_type {
196
PADCTL_PORT_USB2,
197
PADCTL_PORT_ULPI,
198
PADCTL_PORT_HSIC,
199
PADCTL_PORT_USB3,
200
};
201
202
struct padctl_lane;
203
struct padctl_port {
204
enum padctl_port_type type;
205
const char *name;
206
const char *base_name;
207
int idx;
208
int (*init)(struct padctl_softc *sc,
209
struct padctl_port *port);
210
211
/* Runtime data. */
212
bool enabled;
213
regulator_t supply_vbus; /* USB2, USB3 */
214
bool internal; /* ULPI, USB2, USB3 */
215
uint32_t companion; /* USB3 */
216
struct padctl_lane *lane;
217
};
218
219
static int usb3_port_init(struct padctl_softc *sc, struct padctl_port *port);
220
221
#define PORT(t, n, p, i) { \
222
.type = t, \
223
.name = n "-" #p, \
224
.base_name = n, \
225
.idx = p, \
226
.init = i, \
227
}
228
static struct padctl_port ports_tbl[] = {
229
PORT(PADCTL_PORT_USB2, "usb2", 0, NULL),
230
PORT(PADCTL_PORT_USB2, "usb2", 1, NULL),
231
PORT(PADCTL_PORT_USB2, "usb2", 2, NULL),
232
PORT(PADCTL_PORT_ULPI, "ulpi", 0, NULL),
233
PORT(PADCTL_PORT_HSIC, "hsic", 0, NULL),
234
PORT(PADCTL_PORT_HSIC, "hsic", 1, NULL),
235
PORT(PADCTL_PORT_USB3, "usb3", 0, usb3_port_init),
236
PORT(PADCTL_PORT_USB3, "usb3", 1, usb3_port_init),
237
};
238
239
/* Pads - a group of lannes. */
240
enum padctl_pad_type {
241
PADCTL_PAD_USB2,
242
PADCTL_PAD_ULPI,
243
PADCTL_PAD_HSIC,
244
PADCTL_PAD_PCIE,
245
PADCTL_PAD_SATA,
246
};
247
248
struct padctl_lane;
249
struct padctl_pad {
250
const char *name;
251
enum padctl_pad_type type;
252
int (*powerup)(struct padctl_softc *sc,
253
struct padctl_lane *lane);
254
int (*powerdown)(struct padctl_softc *sc,
255
struct padctl_lane *lane);
256
/* Runtime data. */
257
bool enabled;
258
struct padctl_lane *lanes[8]; /* Safe maximum value. */
259
int nlanes;
260
};
261
262
static int usb2_powerup(struct padctl_softc *sc, struct padctl_lane *lane);
263
static int usb2_powerdown(struct padctl_softc *sc, struct padctl_lane *lane);
264
static int pcie_powerup(struct padctl_softc *sc, struct padctl_lane *lane);
265
static int pcie_powerdown(struct padctl_softc *sc, struct padctl_lane *lane);
266
static int sata_powerup(struct padctl_softc *sc, struct padctl_lane *lane);
267
static int sata_powerdown(struct padctl_softc *sc, struct padctl_lane *lane);
268
269
#define PAD(n, t, u, d) { \
270
.name = n, \
271
.type = t, \
272
.powerup = u, \
273
.powerdown = d, \
274
}
275
static struct padctl_pad pads_tbl[] = {
276
PAD("usb2", PADCTL_PAD_USB2, usb2_powerup, usb2_powerdown),
277
PAD("ulpi", PADCTL_PAD_ULPI, NULL, NULL),
278
PAD("hsic", PADCTL_PAD_HSIC, NULL, NULL),
279
PAD("pcie", PADCTL_PAD_PCIE, pcie_powerup, pcie_powerdown),
280
PAD("sata", PADCTL_PAD_SATA, sata_powerup, sata_powerdown),
281
};
282
283
/* Lanes. */
284
static char *otg_mux[] = {"snps", "xusb", "uart", "rsvd"};
285
static char *usb_mux[] = {"snps", "xusb"};
286
static char *pci_mux[] = {"pcie", "usb3-ss", "sata", "rsvd"};
287
288
struct padctl_lane {
289
const char *name;
290
int idx;
291
bus_size_t reg;
292
uint32_t shift;
293
uint32_t mask;
294
char **mux;
295
int nmux;
296
/* Runtime data. */
297
bool enabled;
298
struct padctl_pad *pad;
299
struct padctl_port *port;
300
int mux_idx;
301
302
};
303
304
#define LANE(n, p, r, s, m, mx) { \
305
.name = n "-" #p, \
306
.idx = p, \
307
.reg = r, \
308
.shift = s, \
309
.mask = m, \
310
.mux = mx, \
311
.nmux = nitems(mx), \
312
}
313
static struct padctl_lane lanes_tbl[] = {
314
LANE("usb2", 0, XUSB_PADCTL_USB2_PAD_MUX, 0, 0x3, otg_mux),
315
LANE("usb2", 1, XUSB_PADCTL_USB2_PAD_MUX, 2, 0x3, otg_mux),
316
LANE("usb2", 2, XUSB_PADCTL_USB2_PAD_MUX, 4, 0x3, otg_mux),
317
LANE("ulpi", 0, XUSB_PADCTL_USB2_PAD_MUX, 12, 0x1, usb_mux),
318
LANE("hsic", 0, XUSB_PADCTL_USB2_PAD_MUX, 14, 0x1, usb_mux),
319
LANE("hsic", 1, XUSB_PADCTL_USB2_PAD_MUX, 15, 0x1, usb_mux),
320
LANE("pcie", 0, XUSB_PADCTL_USB3_PAD_MUX, 16, 0x3, pci_mux),
321
LANE("pcie", 1, XUSB_PADCTL_USB3_PAD_MUX, 18, 0x3, pci_mux),
322
LANE("pcie", 2, XUSB_PADCTL_USB3_PAD_MUX, 20, 0x3, pci_mux),
323
LANE("pcie", 3, XUSB_PADCTL_USB3_PAD_MUX, 22, 0x3, pci_mux),
324
LANE("pcie", 4, XUSB_PADCTL_USB3_PAD_MUX, 24, 0x3, pci_mux),
325
LANE("sata", 0, XUSB_PADCTL_USB3_PAD_MUX, 26, 0x3, pci_mux),
326
};
327
328
/* Define all possible mappings for USB3 port lanes */
329
struct padctl_lane_map {
330
int port_idx;
331
enum padctl_pad_type pad_type;
332
int lane_idx;
333
};
334
335
#define LANE_MAP(pi, pt, li) { \
336
.port_idx = pi, \
337
.pad_type = pt, \
338
.lane_idx = li, \
339
}
340
static struct padctl_lane_map lane_map_tbl[] = {
341
LANE_MAP(0, PADCTL_PAD_PCIE, 0), /* port USB3-0 -> lane PCIE-0 */
342
LANE_MAP(1, PADCTL_PAD_PCIE, 1), /* port USB3-1 -> lane PCIE-1 */
343
/* -- or -- */
344
LANE_MAP(1, PADCTL_PAD_SATA, 0), /* port USB3-1 -> lane SATA-0 */
345
};
346
347
/* Phy class and methods. */
348
static int xusbpadctl_phy_enable(struct phynode *phy, bool enable);
349
static phynode_method_t xusbpadctl_phynode_methods[] = {
350
PHYNODEMETHOD(phynode_enable, xusbpadctl_phy_enable),
351
PHYNODEMETHOD_END
352
353
};
354
DEFINE_CLASS_1(xusbpadctl_phynode, xusbpadctl_phynode_class,
355
xusbpadctl_phynode_methods, 0, phynode_class);
356
357
static struct padctl_port *search_lane_port(struct padctl_softc *sc,
358
struct padctl_lane *lane);
359
/* -------------------------------------------------------------------------
360
*
361
* PHY functions
362
*/
363
static int
364
usb3_port_init(struct padctl_softc *sc, struct padctl_port *port)
365
{
366
uint32_t reg;
367
368
reg = RD4(sc, XUSB_PADCTL_SS_PORT_MAP);
369
if (port->internal)
370
reg &= ~SS_PORT_MAP_PORT_INTERNAL(port->idx);
371
else
372
reg |= SS_PORT_MAP_PORT_INTERNAL(port->idx);
373
reg &= ~SS_PORT_MAP_PORT_MAP(port->idx, ~0);
374
reg |= SS_PORT_MAP_PORT_MAP(port->idx, port->companion);
375
WR4(sc, XUSB_PADCTL_SS_PORT_MAP, reg);
376
377
reg = RD4(sc, XUSB_PADCTL_IOPHY_USB3_PAD_CTL2(port->idx));
378
reg &= ~IOPHY_USB3_PAD_CTL2_CDR_CNTL(~0);
379
reg &= ~IOPHY_USB3_PAD_CTL2_RX_EQ(~0);
380
reg &= ~IOPHY_USB3_PAD_CTL2_RX_WANDER(~0);
381
reg |= IOPHY_USB3_PAD_CTL2_CDR_CNTL(0x24);
382
reg |= IOPHY_USB3_PAD_CTL2_RX_EQ(0xF070);
383
reg |= IOPHY_USB3_PAD_CTL2_RX_WANDER(0xF);
384
WR4(sc, XUSB_PADCTL_IOPHY_USB3_PAD_CTL2(port->idx), reg);
385
386
WR4(sc, XUSB_PADCTL_IOPHY_USB3_PAD_CTL4(port->idx),
387
0x002008EE);
388
389
reg = RD4(sc, XUSB_PADCTL_ELPG_PROGRAM);
390
reg &= ~ELPG_PROGRAM_SSP_ELPG_VCORE_DOWN(port->idx);
391
WR4(sc, XUSB_PADCTL_ELPG_PROGRAM, reg);
392
DELAY(100);
393
394
reg = RD4(sc, XUSB_PADCTL_ELPG_PROGRAM);
395
reg &= ~ELPG_PROGRAM_SSP_ELPG_CLAMP_EN_EARLY(port->idx);
396
WR4(sc, XUSB_PADCTL_ELPG_PROGRAM, reg);
397
DELAY(100);
398
399
reg = RD4(sc, XUSB_PADCTL_ELPG_PROGRAM);
400
reg &= ~ELPG_PROGRAM_SSP_ELPG_CLAMP_EN(port->idx);
401
WR4(sc, XUSB_PADCTL_ELPG_PROGRAM, reg);
402
DELAY(100);
403
404
return (0);
405
}
406
407
static int
408
pcie_powerup(struct padctl_softc *sc, struct padctl_lane *lane)
409
{
410
uint32_t reg;
411
int i;
412
413
reg = RD4(sc, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
414
reg &= ~IOPHY_PLL_P0_CTL1_REFCLK_SEL(~0);
415
WR4(sc, XUSB_PADCTL_IOPHY_PLL_P0_CTL1, reg);
416
DELAY(100);
417
418
reg = RD4(sc, XUSB_PADCTL_IOPHY_PLL_P0_CTL2);
419
reg |= IOPHY_PLL_P0_CTL2_REFCLKBUF_EN;
420
reg |= IOPHY_PLL_P0_CTL2_TXCLKREF_EN;
421
reg |= IOPHY_PLL_P0_CTL2_TXCLKREF_SEL;
422
WR4(sc, XUSB_PADCTL_IOPHY_PLL_P0_CTL2, reg);
423
DELAY(100);
424
425
reg = RD4(sc, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
426
reg |= IOPHY_PLL_P0_CTL1_PLL_RST;
427
WR4(sc, XUSB_PADCTL_IOPHY_PLL_P0_CTL1, reg);
428
DELAY(100);
429
430
for (i = 100; i > 0; i--) {
431
reg = RD4(sc, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
432
if (reg & IOPHY_PLL_P0_CTL1_PLL0_LOCKDET)
433
break;
434
DELAY(10);
435
}
436
if (i <= 0) {
437
device_printf(sc->dev, "Failed to power up PCIe phy\n");
438
return (ETIMEDOUT);
439
}
440
reg = RD4(sc, XUSB_PADCTL_USB3_PAD_MUX);
441
reg |= USB3_PAD_MUX_PCIE_IDDQ_DISABLE(lane->idx);
442
WR4(sc, XUSB_PADCTL_USB3_PAD_MUX, reg);
443
444
return (0);
445
}
446
447
static int
448
pcie_powerdown(struct padctl_softc *sc, struct padctl_lane *lane)
449
{
450
uint32_t reg;
451
452
reg = RD4(sc, XUSB_PADCTL_USB3_PAD_MUX);
453
reg &= ~USB3_PAD_MUX_PCIE_IDDQ_DISABLE(lane->idx);
454
WR4(sc, XUSB_PADCTL_USB3_PAD_MUX, reg);
455
456
reg = RD4(sc, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
457
reg &= ~IOPHY_PLL_P0_CTL1_PLL_RST;
458
WR4(sc, XUSB_PADCTL_IOPHY_PLL_P0_CTL1, reg);
459
DELAY(100);
460
461
return (0);
462
463
}
464
465
static int
466
sata_powerup(struct padctl_softc *sc, struct padctl_lane *lane)
467
{
468
uint32_t reg;
469
int i;
470
471
reg = RD4(sc, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
472
reg &= ~IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD;
473
reg &= ~IOPHY_MISC_PAD_S0_CTL1_IDDQ;
474
WR4(sc, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1, reg);
475
476
reg = RD4(sc, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
477
reg &= ~IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD;
478
reg &= ~IOPHY_PLL_S0_CTL1_PLL_IDDQ;
479
WR4(sc, XUSB_PADCTL_IOPHY_PLL_S0_CTL1, reg);
480
481
reg = RD4(sc, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
482
reg |= IOPHY_PLL_S0_CTL1_PLL1_MODE;
483
WR4(sc, XUSB_PADCTL_IOPHY_PLL_S0_CTL1, reg);
484
485
reg = RD4(sc, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
486
reg |= IOPHY_PLL_S0_CTL1_PLL_RST_L;
487
WR4(sc, XUSB_PADCTL_IOPHY_PLL_S0_CTL1, reg);
488
489
for (i = 100; i >= 0; i--) {
490
reg = RD4(sc, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
491
if (reg & IOPHY_PLL_S0_CTL1_PLL1_LOCKDET)
492
break;
493
DELAY(100);
494
}
495
if (i <= 0) {
496
device_printf(sc->dev, "Failed to power up SATA phy\n");
497
return (ETIMEDOUT);
498
}
499
reg = RD4(sc, XUSB_PADCTL_USB3_PAD_MUX);
500
reg |= IOPHY_PLL_S0_CTL1_PLL_RST_L;
501
WR4(sc, XUSB_PADCTL_USB3_PAD_MUX, reg);
502
503
reg = RD4(sc, XUSB_PADCTL_USB3_PAD_MUX);
504
reg |= USB3_PAD_MUX_SATA_IDDQ_DISABLE;
505
WR4(sc, XUSB_PADCTL_USB3_PAD_MUX, reg);
506
507
return (0);
508
}
509
510
static int
511
sata_powerdown(struct padctl_softc *sc, struct padctl_lane *lane)
512
{
513
uint32_t reg;
514
515
reg = RD4(sc, XUSB_PADCTL_USB3_PAD_MUX);
516
reg &= ~USB3_PAD_MUX_SATA_IDDQ_DISABLE;
517
WR4(sc, XUSB_PADCTL_USB3_PAD_MUX, reg);
518
519
reg = RD4(sc, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
520
reg &= ~IOPHY_PLL_S0_CTL1_PLL_RST_L;
521
WR4(sc, XUSB_PADCTL_IOPHY_PLL_S0_CTL1, reg);
522
DELAY(100);
523
524
reg = RD4(sc, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
525
reg &= ~IOPHY_PLL_S0_CTL1_PLL1_MODE;
526
WR4(sc, XUSB_PADCTL_IOPHY_PLL_S0_CTL1, reg);
527
DELAY(100);
528
529
reg = RD4(sc, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
530
reg |= IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD;
531
reg |= IOPHY_PLL_S0_CTL1_PLL_IDDQ;
532
WR4(sc, XUSB_PADCTL_IOPHY_PLL_S0_CTL1, reg);
533
DELAY(100);
534
535
reg = RD4(sc, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
536
reg |= IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD;
537
reg |= IOPHY_MISC_PAD_S0_CTL1_IDDQ;
538
WR4(sc, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1, reg);
539
DELAY(100);
540
541
return (0);
542
}
543
544
static int
545
usb2_powerup(struct padctl_softc *sc, struct padctl_lane *lane)
546
{
547
uint32_t reg;
548
struct padctl_port *port;
549
int rv;
550
551
port = search_lane_port(sc, lane);
552
if (port == NULL) {
553
device_printf(sc->dev, "Cannot find port for lane: %s\n",
554
lane->name);
555
}
556
reg = RD4(sc, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
557
reg &= ~USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL(~0);
558
reg &= ~USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL(~0);
559
reg |= USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL(sc->hs_squelch_level);
560
reg |= USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL(5);
561
WR4(sc, XUSB_PADCTL_USB2_BIAS_PAD_CTL0, reg);
562
563
reg = RD4(sc, XUSB_PADCTL_USB2_PORT_CAP);
564
reg &= ~USB2_PORT_CAP_PORT_CAP(lane->idx, ~0);
565
reg |= USB2_PORT_CAP_PORT_CAP(lane->idx, USB2_PORT_CAP_PORT_CAP_HOST);
566
WR4(sc, XUSB_PADCTL_USB2_PORT_CAP, reg);
567
568
reg = RD4(sc, XUSB_PADCTL_USB2_OTG_PAD_CTL0(lane->idx));
569
reg &= ~USB2_OTG_PAD_CTL0_HS_CURR_LEVEL(~0);
570
reg &= ~USB2_OTG_PAD_CTL0_HS_SLEW(~0);
571
reg &= ~USB2_OTG_PAD_CTL0_LS_RSLEW(~0);
572
reg &= ~USB2_OTG_PAD_CTL0_PD;
573
reg &= ~USB2_OTG_PAD_CTL0_PD2;
574
reg &= ~USB2_OTG_PAD_CTL0_PD_ZI;
575
576
reg |= USB2_OTG_PAD_CTL0_HS_SLEW(14);
577
if (lane->idx == 0) {
578
reg |= USB2_OTG_PAD_CTL0_HS_CURR_LEVEL(sc->hs_curr_level_0);
579
reg |= USB2_OTG_PAD_CTL0_LS_RSLEW(3);
580
} else {
581
reg |= USB2_OTG_PAD_CTL0_HS_CURR_LEVEL(sc->hs_curr_level_123);
582
reg |= USB2_OTG_PAD_CTL0_LS_RSLEW(0);
583
}
584
WR4(sc, XUSB_PADCTL_USB2_OTG_PAD_CTL0(lane->idx), reg);
585
586
reg = RD4(sc, XUSB_PADCTL_USB2_OTG_PAD_CTL1(lane->idx));
587
reg &= ~USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ(~0);
588
reg &= ~USB2_OTG_PAD_CTL1_HS_IREF_CAP(~0);
589
reg &= ~USB2_OTG_PAD_CTL1_PD_DR;
590
reg &= ~USB2_OTG_PAD_CTL1_PD_DISC_FORCE_POWERUP;
591
reg &= ~USB2_OTG_PAD_CTL1_PD_CHRP_FORCE_POWERUP;
592
593
reg |= USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ(sc->hs_term_range_adj);
594
reg |= USB2_OTG_PAD_CTL1_HS_IREF_CAP(sc->hs_iref_cap);
595
WR4(sc, XUSB_PADCTL_USB2_OTG_PAD_CTL1(lane->idx), reg);
596
597
if (port != NULL && port->supply_vbus != NULL) {
598
rv = regulator_enable(port->supply_vbus);
599
if (rv != 0) {
600
device_printf(sc->dev,
601
"Cannot enable vbus regulator\n");
602
return (rv);
603
}
604
}
605
reg = RD4(sc, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
606
reg &= ~USB2_BIAS_PAD_CTL0_PD;
607
WR4(sc, XUSB_PADCTL_USB2_BIAS_PAD_CTL0, reg);
608
609
return (0);
610
}
611
612
static int
613
usb2_powerdown(struct padctl_softc *sc, struct padctl_lane *lane)
614
{
615
uint32_t reg;
616
struct padctl_port *port;
617
int rv;
618
619
port = search_lane_port(sc, lane);
620
if (port == NULL) {
621
device_printf(sc->dev, "Cannot find port for lane: %s\n",
622
lane->name);
623
}
624
reg = RD4(sc, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
625
reg |= USB2_BIAS_PAD_CTL0_PD;
626
WR4(sc, XUSB_PADCTL_USB2_BIAS_PAD_CTL0, reg);
627
628
if (port != NULL && port->supply_vbus != NULL) {
629
rv = regulator_enable(port->supply_vbus);
630
if (rv != 0) {
631
device_printf(sc->dev,
632
"Cannot disable vbus regulator\n");
633
return (rv);
634
}
635
}
636
return (0);
637
}
638
639
static int
640
phy_powerup(struct padctl_softc *sc)
641
{
642
uint32_t reg;
643
644
reg = RD4(sc, XUSB_PADCTL_ELPG_PROGRAM);
645
reg &= ~ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
646
WR4(sc, XUSB_PADCTL_ELPG_PROGRAM, reg);
647
DELAY(100);
648
649
reg = RD4(sc, XUSB_PADCTL_ELPG_PROGRAM);
650
reg &= ~ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
651
WR4(sc, XUSB_PADCTL_ELPG_PROGRAM, reg);
652
DELAY(100);
653
654
reg = RD4(sc, XUSB_PADCTL_ELPG_PROGRAM);
655
reg &= ~ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
656
WR4(sc, XUSB_PADCTL_ELPG_PROGRAM, reg);
657
DELAY(100);
658
659
return (0);
660
}
661
662
static int
663
phy_powerdown(struct padctl_softc *sc)
664
{
665
uint32_t reg;
666
667
reg = RD4(sc, XUSB_PADCTL_ELPG_PROGRAM);
668
reg |= ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
669
WR4(sc, XUSB_PADCTL_ELPG_PROGRAM, reg);
670
DELAY(100);
671
672
reg = RD4(sc, XUSB_PADCTL_ELPG_PROGRAM);
673
reg |= ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
674
WR4(sc, XUSB_PADCTL_ELPG_PROGRAM, reg);
675
DELAY(100);
676
677
reg = RD4(sc, XUSB_PADCTL_ELPG_PROGRAM);
678
reg |= ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
679
WR4(sc, XUSB_PADCTL_ELPG_PROGRAM, reg);
680
DELAY(100);
681
682
return (0);
683
}
684
685
static int
686
xusbpadctl_phy_enable(struct phynode *phy, bool enable)
687
{
688
device_t dev;
689
intptr_t id;
690
struct padctl_softc *sc;
691
struct padctl_lane *lane;
692
struct padctl_pad *pad;
693
int rv;
694
695
dev = phynode_get_device(phy);
696
id = phynode_get_id(phy);
697
sc = device_get_softc(dev);
698
699
if (id < 0 || id >= nitems(lanes_tbl)) {
700
device_printf(dev, "Unknown phy: %d\n", id);
701
return (ENXIO);
702
}
703
lane = lanes_tbl + id;
704
if (!lane->enabled) {
705
device_printf(dev, "Lane is not enabled/configured: %s\n",
706
lane->name);
707
return (ENXIO);
708
}
709
pad = lane->pad;
710
if (enable) {
711
if (sc->phy_ena_cnt == 0) {
712
rv = phy_powerup(sc);
713
if (rv != 0)
714
return (rv);
715
}
716
sc->phy_ena_cnt++;
717
}
718
719
if (enable)
720
rv = pad->powerup(sc, lane);
721
else
722
rv = pad->powerdown(sc, lane);
723
if (rv != 0)
724
return (rv);
725
726
if (!enable) {
727
if (sc->phy_ena_cnt == 1) {
728
rv = phy_powerdown(sc);
729
if (rv != 0)
730
return (rv);
731
}
732
sc->phy_ena_cnt--;
733
}
734
735
return (0);
736
}
737
738
/* -------------------------------------------------------------------------
739
*
740
* FDT processing
741
*/
742
static struct padctl_port *
743
search_port(struct padctl_softc *sc, char *port_name)
744
{
745
int i;
746
747
for (i = 0; i < nitems(ports_tbl); i++) {
748
if (strcmp(port_name, ports_tbl[i].name) == 0)
749
return (&ports_tbl[i]);
750
}
751
return (NULL);
752
}
753
754
static struct padctl_port *
755
search_lane_port(struct padctl_softc *sc, struct padctl_lane *lane)
756
{
757
int i;
758
759
for (i = 0; i < nitems(ports_tbl); i++) {
760
if (!ports_tbl[i].enabled)
761
continue;
762
if (ports_tbl[i].lane == lane)
763
return (ports_tbl + i);
764
}
765
return (NULL);
766
}
767
768
static struct padctl_lane *
769
search_lane(struct padctl_softc *sc, char *lane_name)
770
{
771
int i;
772
773
for (i = 0; i < nitems(lanes_tbl); i++) {
774
if (strcmp(lane_name, lanes_tbl[i].name) == 0)
775
return (lanes_tbl + i);
776
}
777
return (NULL);
778
}
779
780
static struct padctl_lane *
781
search_pad_lane(struct padctl_softc *sc, enum padctl_pad_type type, int idx)
782
{
783
int i;
784
785
for (i = 0; i < nitems(lanes_tbl); i++) {
786
if (!lanes_tbl[i].enabled)
787
continue;
788
if (type == lanes_tbl[i].pad->type && idx == lanes_tbl[i].idx)
789
return (lanes_tbl + i);
790
}
791
return (NULL);
792
}
793
794
static struct padctl_lane *
795
search_usb3_pad_lane(struct padctl_softc *sc, int idx)
796
{
797
int i;
798
struct padctl_lane *lane, *tmp;
799
800
lane = NULL;
801
for (i = 0; i < nitems(lane_map_tbl); i++) {
802
if (idx != lane_map_tbl[i].port_idx)
803
continue;
804
tmp = search_pad_lane(sc, lane_map_tbl[i].pad_type,
805
lane_map_tbl[i].lane_idx);
806
if (tmp == NULL)
807
continue;
808
if (strcmp(tmp->mux[tmp->mux_idx], "usb3-ss") != 0)
809
continue;
810
if (lane != NULL) {
811
device_printf(sc->dev, "Duplicated mappings found for"
812
" lanes: %s and %s\n", lane->name, tmp->name);
813
return (NULL);
814
}
815
lane = tmp;
816
}
817
return (lane);
818
}
819
820
static struct padctl_pad *
821
search_pad(struct padctl_softc *sc, char *pad_name)
822
{
823
int i;
824
825
for (i = 0; i < nitems(pads_tbl); i++) {
826
if (strcmp(pad_name, pads_tbl[i].name) == 0)
827
return (pads_tbl + i);
828
}
829
return (NULL);
830
}
831
832
static int
833
search_mux(struct padctl_softc *sc, struct padctl_lane *lane, char *fnc_name)
834
{
835
int i;
836
837
for (i = 0; i < lane->nmux; i++) {
838
if (strcmp(fnc_name, lane->mux[i]) == 0)
839
return (i);
840
}
841
return (-1);
842
}
843
844
static int
845
config_lane(struct padctl_softc *sc, struct padctl_lane *lane)
846
{
847
uint32_t reg;
848
849
reg = RD4(sc, lane->reg);
850
reg &= ~(lane->mask << lane->shift);
851
reg |= (lane->mux_idx & lane->mask) << lane->shift;
852
WR4(sc, lane->reg, reg);
853
return (0);
854
}
855
856
static int
857
process_lane(struct padctl_softc *sc, phandle_t node, struct padctl_pad *pad)
858
{
859
struct padctl_lane *lane;
860
struct phynode *phynode;
861
struct phynode_init_def phy_init;
862
char *name;
863
char *function;
864
int rv;
865
866
name = NULL;
867
function = NULL;
868
rv = OF_getprop_alloc(node, "name", (void **)&name);
869
if (rv <= 0) {
870
device_printf(sc->dev, "Cannot read lane name.\n");
871
return (ENXIO);
872
}
873
874
lane = search_lane(sc, name);
875
if (lane == NULL) {
876
device_printf(sc->dev, "Unknown lane: %s\n", name);
877
rv = ENXIO;
878
goto end;
879
}
880
881
/* Read function (mux) settings. */
882
rv = OF_getprop_alloc(node, "nvidia,function", (void **)&function);
883
if (rv <= 0) {
884
device_printf(sc->dev, "Cannot read lane function.\n");
885
rv = ENXIO;
886
goto end;
887
}
888
889
lane->mux_idx = search_mux(sc, lane, function);
890
if (lane->mux_idx == ~0) {
891
device_printf(sc->dev, "Unknown function %s for lane %s\n",
892
function, name);
893
rv = ENXIO;
894
goto end;
895
}
896
897
rv = config_lane(sc, lane);
898
if (rv != 0) {
899
device_printf(sc->dev, "Cannot configure lane: %s: %d\n",
900
name, rv);
901
rv = ENXIO;
902
goto end;
903
}
904
lane->pad = pad;
905
lane->enabled = true;
906
pad->lanes[pad->nlanes++] = lane;
907
908
/* Create and register phy. */
909
bzero(&phy_init, sizeof(phy_init));
910
phy_init.id = lane - lanes_tbl;
911
phy_init.ofw_node = node;
912
phynode = phynode_create(sc->dev, &xusbpadctl_phynode_class, &phy_init);
913
if (phynode == NULL) {
914
device_printf(sc->dev, "Cannot create phy\n");
915
rv = ENXIO;
916
goto end;
917
}
918
if (phynode_register(phynode) == NULL) {
919
device_printf(sc->dev, "Cannot create phy\n");
920
return (ENXIO);
921
}
922
923
rv = 0;
924
925
end:
926
if (name != NULL)
927
OF_prop_free(name);
928
if (function != NULL)
929
OF_prop_free(function);
930
return (rv);
931
}
932
933
static int
934
process_pad(struct padctl_softc *sc, phandle_t node)
935
{
936
struct padctl_pad *pad;
937
char *name;
938
int rv;
939
940
name = NULL;
941
rv = OF_getprop_alloc(node, "name", (void **)&name);
942
if (rv <= 0) {
943
device_printf(sc->dev, "Cannot read pad name.\n");
944
return (ENXIO);
945
}
946
pad = search_pad(sc, name);
947
if (pad == NULL) {
948
device_printf(sc->dev, "Unknown pad: %s\n", name);
949
rv = ENXIO;
950
goto end;
951
}
952
953
/* Read and process associated lanes. */
954
node = ofw_bus_find_child(node, "lanes");
955
if (node <= 0) {
956
device_printf(sc->dev, "Cannot find regulators subnode\n");
957
rv = ENXIO;
958
goto end;
959
}
960
961
for (node = OF_child(node); node != 0; node = OF_peer(node)) {
962
if (!ofw_bus_node_status_okay(node))
963
continue;
964
965
rv = process_lane(sc, node, pad);
966
if (rv != 0)
967
goto end;
968
}
969
pad->enabled = true;
970
rv = 0;
971
end:
972
if (name != NULL)
973
OF_prop_free(name);
974
return (rv);
975
}
976
977
static int
978
process_port(struct padctl_softc *sc, phandle_t node)
979
{
980
981
struct padctl_port *port;
982
char *name;
983
int rv;
984
985
name = NULL;
986
rv = OF_getprop_alloc(node, "name", (void **)&name);
987
if (rv <= 0) {
988
device_printf(sc->dev, "Cannot read port name.\n");
989
return (ENXIO);
990
}
991
992
port = search_port(sc, name);
993
if (port == NULL) {
994
device_printf(sc->dev, "Unknown port: %s\n", name);
995
rv = ENXIO;
996
goto end;
997
}
998
999
if (port->type == PADCTL_PORT_USB3) {
1000
rv = OF_getencprop(node, "nvidia,usb2-companion",
1001
&(port->companion), sizeof(port->companion));
1002
if (rv <= 0) {
1003
device_printf(sc->dev,
1004
"Missing 'nvidia,usb2-companion' property "
1005
"for port: %s\n", name);
1006
rv = ENXIO;
1007
goto end;
1008
}
1009
}
1010
1011
if (OF_hasprop(node, "vbus-supply")) {
1012
rv = regulator_get_by_ofw_property(sc->dev, 0,
1013
"vbus-supply", &port->supply_vbus);
1014
if (rv <= 0) {
1015
device_printf(sc->dev,
1016
"Cannot get 'vbus-supply' regulator "
1017
"for port: %s\n", name);
1018
rv = ENXIO;
1019
goto end;
1020
}
1021
}
1022
1023
if (OF_hasprop(node, "nvidia,internal"))
1024
port->internal = true;
1025
/* Find assigned lane */
1026
if (port->lane == NULL) {
1027
switch(port->type) {
1028
/* Routing is fixed for USB2, ULPI AND HSIC. */
1029
case PADCTL_PORT_USB2:
1030
port->lane = search_pad_lane(sc, PADCTL_PAD_USB2,
1031
port->idx);
1032
break;
1033
case PADCTL_PORT_ULPI:
1034
port->lane = search_pad_lane(sc, PADCTL_PAD_ULPI,
1035
port->idx);
1036
break;
1037
case PADCTL_PORT_HSIC:
1038
port->lane = search_pad_lane(sc, PADCTL_PAD_HSIC,
1039
port->idx);
1040
break;
1041
case PADCTL_PORT_USB3:
1042
port->lane = search_usb3_pad_lane(sc, port->idx);
1043
break;
1044
}
1045
}
1046
if (port->lane == NULL) {
1047
device_printf(sc->dev, "Cannot find lane for port: %s\n", name);
1048
rv = ENXIO;
1049
goto end;
1050
}
1051
port->enabled = true;
1052
rv = 0;
1053
end:
1054
if (name != NULL)
1055
OF_prop_free(name);
1056
return (rv);
1057
}
1058
1059
static int
1060
parse_fdt(struct padctl_softc *sc, phandle_t base_node)
1061
{
1062
phandle_t node;
1063
int rv;
1064
1065
rv = 0;
1066
node = ofw_bus_find_child(base_node, "pads");
1067
1068
if (node <= 0) {
1069
device_printf(sc->dev, "Cannot find pads subnode.\n");
1070
return (ENXIO);
1071
}
1072
for (node = OF_child(node); node != 0; node = OF_peer(node)) {
1073
if (!ofw_bus_node_status_okay(node))
1074
continue;
1075
rv = process_pad(sc, node);
1076
if (rv != 0)
1077
return (rv);
1078
}
1079
1080
node = ofw_bus_find_child(base_node, "ports");
1081
if (node <= 0) {
1082
device_printf(sc->dev, "Cannot find ports subnode.\n");
1083
return (ENXIO);
1084
}
1085
for (node = OF_child(node); node != 0; node = OF_peer(node)) {
1086
if (!ofw_bus_node_status_okay(node))
1087
continue;
1088
rv = process_port(sc, node);
1089
if (rv != 0)
1090
return (rv);
1091
}
1092
1093
return (0);
1094
}
1095
1096
static void
1097
load_calibration(struct padctl_softc *sc)
1098
{
1099
uint32_t reg;
1100
1101
/* All XUSB pad calibrations are packed into single dword.*/
1102
reg = tegra_fuse_read_4(FUSE_XUSB_CALIB);
1103
sc->hs_curr_level_0 = FUSE_XUSB_CALIB_HS_CURR_LEVEL_0(reg);
1104
sc->hs_curr_level_123 = FUSE_XUSB_CALIB_HS_CURR_LEVEL_123(reg);
1105
sc->hs_iref_cap = FUSE_XUSB_CALIB_HS_IREF_CAP(reg);
1106
sc->hs_squelch_level = FUSE_XUSB_CALIB_HS_SQUELCH_LEVEL(reg);
1107
sc->hs_term_range_adj = FUSE_XUSB_CALIB_HS_TERM_RANGE_ADJ(reg);
1108
}
1109
1110
/* -------------------------------------------------------------------------
1111
*
1112
* BUS functions
1113
*/
1114
static int
1115
xusbpadctl_probe(device_t dev)
1116
{
1117
1118
if (!ofw_bus_status_okay(dev))
1119
return (ENXIO);
1120
1121
if (!ofw_bus_search_compatible(dev, compat_data)->ocd_data)
1122
return (ENXIO);
1123
1124
device_set_desc(dev, "Tegra XUSB phy");
1125
return (BUS_PROBE_DEFAULT);
1126
}
1127
1128
static int
1129
xusbpadctl_detach(device_t dev)
1130
{
1131
1132
/* This device is always present. */
1133
return (EBUSY);
1134
}
1135
1136
static int
1137
xusbpadctl_attach(device_t dev)
1138
{
1139
struct padctl_softc * sc;
1140
int i, rid, rv;
1141
struct padctl_port *port;
1142
phandle_t node;
1143
1144
sc = device_get_softc(dev);
1145
sc->dev = dev;
1146
node = ofw_bus_get_node(dev);
1147
1148
rid = 0;
1149
sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
1150
RF_ACTIVE);
1151
if (sc->mem_res == NULL) {
1152
device_printf(dev, "Cannot allocate memory resources\n");
1153
return (ENXIO);
1154
}
1155
1156
rv = hwreset_get_by_ofw_name(dev, 0, "padctl", &sc->rst);
1157
if (rv != 0) {
1158
device_printf(dev, "Cannot get 'padctl' reset: %d\n", rv);
1159
return (rv);
1160
}
1161
rv = hwreset_deassert(sc->rst);
1162
if (rv != 0) {
1163
device_printf(dev, "Cannot unreset 'padctl' reset: %d\n", rv);
1164
return (rv);
1165
}
1166
1167
load_calibration(sc);
1168
1169
rv = parse_fdt(sc, node);
1170
if (rv != 0) {
1171
device_printf(dev, "Cannot parse fdt configuration: %d\n", rv);
1172
return (rv);
1173
}
1174
for (i = 0; i < nitems(ports_tbl); i++) {
1175
port = ports_tbl + i;
1176
if (!port->enabled)
1177
continue;
1178
if (port->init == NULL)
1179
continue;
1180
rv = port->init(sc, port);
1181
if (rv != 0) {
1182
device_printf(dev, "Cannot init port '%s'\n",
1183
port->name);
1184
return (rv);
1185
}
1186
}
1187
return (0);
1188
}
1189
1190
static device_method_t tegra_xusbpadctl_methods[] = {
1191
/* Device interface */
1192
DEVMETHOD(device_probe, xusbpadctl_probe),
1193
DEVMETHOD(device_attach, xusbpadctl_attach),
1194
DEVMETHOD(device_detach, xusbpadctl_detach),
1195
1196
DEVMETHOD_END
1197
};
1198
1199
static DEFINE_CLASS_0(xusbpadctl, tegra_xusbpadctl_driver,
1200
tegra_xusbpadctl_methods, sizeof(struct padctl_softc));
1201
EARLY_DRIVER_MODULE(tegra_xusbpadctl, simplebus, tegra_xusbpadctl_driver,
1202
NULL, NULL, 73);
1203
1204