The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/arm/nvidia/tegra124/tegra124_xusbpadctl.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 1cf78ce86f39a377c0bbb43546ef27aa


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.