Linux Audio

Check our new training course

Loading...
v6.2
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2014, NVIDIA CORPORATION.  All rights reserved.
 
 
 
 
 
 
 
 
 
   4 */
   5
   6#include <linux/delay.h>
   7#include <linux/io.h>
   8#include <linux/mailbox_client.h>
   9#include <linux/module.h>
  10#include <linux/of.h>
  11#include <linux/phy/phy.h>
  12#include <linux/platform_device.h>
  13#include <linux/regulator/consumer.h>
  14#include <linux/reset.h>
  15#include <linux/slab.h>
  16
  17#include <soc/tegra/fuse.h>
  18
  19#include "xusb.h"
  20
  21#define FUSE_SKU_CALIB_HS_CURR_LEVEL_PADX_SHIFT(x) ((x) ? 15 : 0)
  22#define FUSE_SKU_CALIB_HS_CURR_LEVEL_PAD_MASK 0x3f
  23#define FUSE_SKU_CALIB_HS_IREF_CAP_SHIFT 13
  24#define FUSE_SKU_CALIB_HS_IREF_CAP_MASK 0x3
  25#define FUSE_SKU_CALIB_HS_SQUELCH_LEVEL_SHIFT 11
  26#define FUSE_SKU_CALIB_HS_SQUELCH_LEVEL_MASK 0x3
  27#define FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_SHIFT 7
  28#define FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_MASK 0xf
  29
  30#define XUSB_PADCTL_USB2_PORT_CAP 0x008
  31#define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_SHIFT(x) ((x) * 4)
  32#define XUSB_PADCTL_USB2_PORT_CAP_PORT_CAP_MASK 0x3
  33#define XUSB_PADCTL_USB2_PORT_CAP_DISABLED 0x0
  34#define XUSB_PADCTL_USB2_PORT_CAP_HOST 0x1
  35#define XUSB_PADCTL_USB2_PORT_CAP_DEVICE 0x2
  36#define XUSB_PADCTL_USB2_PORT_CAP_OTG 0x3
  37
  38#define XUSB_PADCTL_SS_PORT_MAP 0x014
  39#define XUSB_PADCTL_SS_PORT_MAP_PORTX_INTERNAL(x) (1 << (((x) * 4) + 3))
  40#define XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP_SHIFT(x) ((x) * 4)
  41#define XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP_MASK(x) (0x7 << ((x) * 4))
  42#define XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP(x, v) (((v) & 0x7) << ((x) * 4))
  43#define XUSB_PADCTL_SS_PORT_MAP_PORT_MAP_MASK 0x7
  44
  45#define XUSB_PADCTL_ELPG_PROGRAM 0x01c
  46#define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN (1 << 26)
  47#define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY (1 << 25)
  48#define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN (1 << 24)
  49#define XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_VCORE_DOWN(x) (1 << (18 + (x) * 4))
  50#define XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_CLAMP_EN_EARLY(x) \
  51							(1 << (17 + (x) * 4))
  52#define XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_CLAMP_EN(x) (1 << (16 + (x) * 4))
  53
  54#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1 0x040
  55#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL0_LOCKDET (1 << 19)
  56#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_REFCLK_SEL_MASK (0xf << 12)
  57#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST (1 << 1)
  58
  59#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2 0x044
  60#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_REFCLKBUF_EN (1 << 6)
  61#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_EN (1 << 5)
  62#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_SEL (1 << 4)
  63
  64#define XUSB_PADCTL_IOPHY_USB3_PADX_CTL2(x) (0x058 + (x) * 4)
  65#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_SHIFT 24
  66#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_MASK 0xff
  67#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_VAL 0x24
  68#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_SHIFT 16
  69#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_MASK 0x3f
  70#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_SHIFT 8
  71#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_MASK 0x3f
  72#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_SHIFT 8
  73#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_MASK 0xffff
  74#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_VAL 0xf070
  75#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_SHIFT 4
  76#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_MASK 0xf
  77#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_VAL 0xf
  78
  79#define XUSB_PADCTL_IOPHY_USB3_PADX_CTL4(x) (0x068 + (x) * 4)
  80#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_SHIFT 24
  81#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_MASK 0x1f
  82#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_SHIFT 16
  83#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_MASK 0x7f
  84#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_VAL 0x002008ee
  85
  86#define XUSB_PADCTL_IOPHY_MISC_PAD_PX_CTL2(x) ((x) < 2 ? 0x078 + (x) * 4 : \
  87					       0x0f8 + (x) * 4)
  88#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_SHIFT 28
  89#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_MASK 0x3
  90#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_VAL 0x1
  91
  92#define XUSB_PADCTL_IOPHY_MISC_PAD_PX_CTL5(x) ((x) < 2 ? 0x090 + (x) * 4 : \
  93					       0x11c + (x) * 4)
  94#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL5_RX_QEYE_EN (1 << 8)
  95
  96#define XUSB_PADCTL_IOPHY_MISC_PAD_PX_CTL6(x) ((x) < 2 ? 0x098 + (x) * 4 : \
  97					       0x128 + (x) * 4)
  98#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SHIFT 24
  99#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_G_Z_MASK 0x3f
 100#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_TAP_MASK 0x1f
 101#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_AMP_MASK 0x7f
 102#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT 16
 103#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_MASK 0xff
 104#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_G_Z 0x21
 105#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_TAP 0x32
 106#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_AMP 0x33
 107#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_CTLE_Z 0x48
 108#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_LATCH_G_Z 0xa1
 109
 110#define XUSB_PADCTL_USB2_OTG_PADX_CTL0(x) (0x0a0 + (x) * 4)
 111#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI (1 << 21)
 112#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2 (1 << 20)
 113#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD (1 << 19)
 114#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_SHIFT 14
 115#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_MASK 0x3
 116#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_VAL(x) ((x) ? 0x0 : 0x3)
 117#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_SHIFT 6
 118#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_MASK 0x3f
 119#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_VAL 0x0e
 120#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_SHIFT 0
 121#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_MASK 0x3f
 122
 123#define XUSB_PADCTL_USB2_OTG_PADX_CTL1(x) (0x0ac + (x) * 4)
 124#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP_SHIFT 9
 125#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP_MASK 0x3
 126#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_SHIFT 3
 127#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_MASK 0x7
 128#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR (1 << 2)
 129#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DISC_FORCE_POWERUP (1 << 1)
 130#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_CHRP_FORCE_POWERUP (1 << 0)
 131
 132#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0 0x0b8
 133#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD (1 << 12)
 134#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_SHIFT 2
 135#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_MASK 0x7
 136#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_VAL 0x5
 137#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_SHIFT 0
 138#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_MASK 0x3
 139
 140#define XUSB_PADCTL_HSIC_PADX_CTL0(x) (0x0c0 + (x) * 4)
 141#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWN_SHIFT 12
 142#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWN_MASK 0x7
 143#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWP_SHIFT 8
 144#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWP_MASK 0x7
 145#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEN_SHIFT 4
 146#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEN_MASK 0x7
 147#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEP_SHIFT 0
 148#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEP_MASK 0x7
 149
 150#define XUSB_PADCTL_HSIC_PADX_CTL1(x) (0x0c8 + (x) * 4)
 151#define XUSB_PADCTL_HSIC_PAD_CTL1_RPU_STROBE (1 << 10)
 152#define XUSB_PADCTL_HSIC_PAD_CTL1_RPU_DATA (1 << 9)
 153#define XUSB_PADCTL_HSIC_PAD_CTL1_RPD_STROBE (1 << 8)
 154#define XUSB_PADCTL_HSIC_PAD_CTL1_RPD_DATA (1 << 7)
 155#define XUSB_PADCTL_HSIC_PAD_CTL1_PD_ZI (1 << 5)
 156#define XUSB_PADCTL_HSIC_PAD_CTL1_PD_RX (1 << 4)
 157#define XUSB_PADCTL_HSIC_PAD_CTL1_PD_TRX (1 << 3)
 158#define XUSB_PADCTL_HSIC_PAD_CTL1_PD_TX (1 << 2)
 159#define XUSB_PADCTL_HSIC_PAD_CTL1_AUTO_TERM_EN (1 << 0)
 160
 161#define XUSB_PADCTL_HSIC_PADX_CTL2(x) (0x0d0 + (x) * 4)
 162#define XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_SHIFT 4
 163#define XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_MASK 0x7
 164#define XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_SHIFT 0
 165#define XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_MASK 0x7
 166
 167#define XUSB_PADCTL_HSIC_STRB_TRIM_CONTROL 0x0e0
 168#define XUSB_PADCTL_HSIC_STRB_TRIM_CONTROL_STRB_TRIM_MASK 0x1f
 169
 170#define XUSB_PADCTL_USB3_PAD_MUX 0x134
 171#define XUSB_PADCTL_USB3_PAD_MUX_PCIE_IDDQ_DISABLE(x) (1 << (1 + (x)))
 172#define XUSB_PADCTL_USB3_PAD_MUX_SATA_IDDQ_DISABLE(x) (1 << (6 + (x)))
 173
 174#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1 0x138
 175#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET (1 << 27)
 176#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE (1 << 24)
 177#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL0_REFCLK_NDIV_SHIFT 20
 178#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL0_REFCLK_NDIV_MASK 0x3
 179#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD (1 << 3)
 180#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST (1 << 1)
 181#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ (1 << 0)
 182
 183#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2 0x13c
 184#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL1_CP_CNTL_SHIFT 20
 185#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL1_CP_CNTL_MASK 0xf
 186#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL0_CP_CNTL_SHIFT 16
 187#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL0_CP_CNTL_MASK 0xf
 188#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_TCLKOUT_EN (1 << 12)
 189#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_TXCLKREF_SEL (1 << 4)
 190#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_XDIGCLK_SEL_SHIFT 0
 191#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_XDIGCLK_SEL_MASK 0x7
 192
 193#define XUSB_PADCTL_IOPHY_PLL_S0_CTL3 0x140
 194#define XUSB_PADCTL_IOPHY_PLL_S0_CTL3_RCAL_BYPASS (1 << 7)
 195
 196#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1 0x148
 197#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD (1 << 1)
 198#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ (1 << 0)
 199
 200#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL2 0x14c
 201
 202#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL5 0x158
 203
 204#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL6 0x15c
 205
 206struct tegra124_xusb_fuse_calibration {
 207	u32 hs_curr_level[3];
 208	u32 hs_iref_cap;
 209	u32 hs_term_range_adj;
 210	u32 hs_squelch_level;
 211};
 212
 213struct tegra124_xusb_padctl {
 214	struct tegra_xusb_padctl base;
 215
 216	struct tegra124_xusb_fuse_calibration fuse;
 217};
 218
 219static inline struct tegra124_xusb_padctl *
 220to_tegra124_xusb_padctl(struct tegra_xusb_padctl *padctl)
 221{
 222	return container_of(padctl, struct tegra124_xusb_padctl, base);
 223}
 224
 225static int tegra124_xusb_padctl_enable(struct tegra_xusb_padctl *padctl)
 226{
 227	u32 value;
 228
 229	mutex_lock(&padctl->lock);
 230
 231	if (padctl->enable++ > 0)
 232		goto out;
 233
 234	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 235	value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
 236	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 237
 238	usleep_range(100, 200);
 239
 240	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 241	value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
 242	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 243
 244	usleep_range(100, 200);
 245
 246	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 247	value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
 248	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 249
 250out:
 251	mutex_unlock(&padctl->lock);
 252	return 0;
 253}
 254
 255static int tegra124_xusb_padctl_disable(struct tegra_xusb_padctl *padctl)
 256{
 257	u32 value;
 258
 259	mutex_lock(&padctl->lock);
 260
 261	if (WARN_ON(padctl->enable == 0))
 262		goto out;
 263
 264	if (--padctl->enable > 0)
 265		goto out;
 266
 267	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 268	value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
 269	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 270
 271	usleep_range(100, 200);
 272
 273	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 274	value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
 275	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 276
 277	usleep_range(100, 200);
 278
 279	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 280	value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
 281	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 282
 283out:
 284	mutex_unlock(&padctl->lock);
 285	return 0;
 286}
 287
 288static int tegra124_usb3_save_context(struct tegra_xusb_padctl *padctl,
 289				      unsigned int index)
 290{
 291	struct tegra_xusb_usb3_port *port;
 292	struct tegra_xusb_lane *lane;
 293	u32 value, offset;
 294
 295	port = tegra_xusb_find_usb3_port(padctl, index);
 296	if (!port)
 297		return -ENODEV;
 298
 299	port->context_saved = true;
 300	lane = port->base.lane;
 301
 302	if (lane->pad == padctl->pcie)
 303		offset = XUSB_PADCTL_IOPHY_MISC_PAD_PX_CTL6(lane->index);
 304	else
 305		offset = XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL6;
 306
 307	value = padctl_readl(padctl, offset);
 308	value &= ~(XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_MASK <<
 309		   XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT);
 310	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_TAP <<
 311		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT;
 312	padctl_writel(padctl, value, offset);
 313
 314	value = padctl_readl(padctl, offset) >>
 315		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SHIFT;
 316	port->tap1 = value & XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_TAP_MASK;
 317
 318	value = padctl_readl(padctl, offset);
 319	value &= ~(XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_MASK <<
 320		   XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT);
 321	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_AMP <<
 322		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT;
 323	padctl_writel(padctl, value, offset);
 324
 325	value = padctl_readl(padctl, offset) >>
 326		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SHIFT;
 327	port->amp = value & XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_AMP_MASK;
 328
 329	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_USB3_PADX_CTL4(index));
 330	value &= ~((XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_MASK <<
 331		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_SHIFT) |
 332		   (XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_MASK <<
 333		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_SHIFT));
 334	value |= (port->tap1 <<
 335		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_SHIFT) |
 336		 (port->amp <<
 337		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_SHIFT);
 338	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_USB3_PADX_CTL4(index));
 339
 340	value = padctl_readl(padctl, offset);
 341	value &= ~(XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_MASK <<
 342		   XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT);
 343	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_LATCH_G_Z <<
 344		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT;
 345	padctl_writel(padctl, value, offset);
 346
 347	value = padctl_readl(padctl, offset);
 348	value &= ~(XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_MASK <<
 349		   XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT);
 350	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_G_Z <<
 351		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT;
 352	padctl_writel(padctl, value, offset);
 353
 354	value = padctl_readl(padctl, offset) >>
 355		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SHIFT;
 356	port->ctle_g = value &
 357		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_G_Z_MASK;
 358
 359	value = padctl_readl(padctl, offset);
 360	value &= ~(XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_MASK <<
 361		   XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT);
 362	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_CTLE_Z <<
 363		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT;
 364	padctl_writel(padctl, value, offset);
 365
 366	value = padctl_readl(padctl, offset) >>
 367		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SHIFT;
 368	port->ctle_z = value &
 369		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_G_Z_MASK;
 370
 371	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_USB3_PADX_CTL2(index));
 372	value &= ~((XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_MASK <<
 373		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_SHIFT) |
 374		   (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_MASK <<
 375		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_SHIFT));
 376	value |= (port->ctle_g <<
 377		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_SHIFT) |
 378		 (port->ctle_z <<
 379		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_SHIFT);
 380	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_USB3_PADX_CTL2(index));
 381
 382	return 0;
 383}
 384
 385static int tegra124_hsic_set_idle(struct tegra_xusb_padctl *padctl,
 386				  unsigned int index, bool idle)
 387{
 388	u32 value;
 389
 390	value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 391
 392	if (idle)
 393		value |= XUSB_PADCTL_HSIC_PAD_CTL1_RPD_DATA |
 394			 XUSB_PADCTL_HSIC_PAD_CTL1_RPU_STROBE;
 395	else
 396		value &= ~(XUSB_PADCTL_HSIC_PAD_CTL1_RPD_DATA |
 397			   XUSB_PADCTL_HSIC_PAD_CTL1_RPU_STROBE);
 398
 399	padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 400
 401	return 0;
 402}
 403
 404#define TEGRA124_LANE(_name, _offset, _shift, _mask, _type)		\
 405	{								\
 406		.name = _name,						\
 407		.offset = _offset,					\
 408		.shift = _shift,					\
 409		.mask = _mask,						\
 410		.num_funcs = ARRAY_SIZE(tegra124_##_type##_functions),	\
 411		.funcs = tegra124_##_type##_functions,			\
 412	}
 413
 414static const char * const tegra124_usb2_functions[] = {
 415	"snps",
 416	"xusb",
 417	"uart",
 418};
 419
 420static const struct tegra_xusb_lane_soc tegra124_usb2_lanes[] = {
 421	TEGRA124_LANE("usb2-0", 0x004,  0, 0x3, usb2),
 422	TEGRA124_LANE("usb2-1", 0x004,  2, 0x3, usb2),
 423	TEGRA124_LANE("usb2-2", 0x004,  4, 0x3, usb2),
 424};
 425
 426static struct tegra_xusb_lane *
 427tegra124_usb2_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
 428			 unsigned int index)
 429{
 430	struct tegra_xusb_usb2_lane *usb2;
 431	int err;
 432
 433	usb2 = kzalloc(sizeof(*usb2), GFP_KERNEL);
 434	if (!usb2)
 435		return ERR_PTR(-ENOMEM);
 436
 437	INIT_LIST_HEAD(&usb2->base.list);
 438	usb2->base.soc = &pad->soc->lanes[index];
 439	usb2->base.index = index;
 440	usb2->base.pad = pad;
 441	usb2->base.np = np;
 442
 443	err = tegra_xusb_lane_parse_dt(&usb2->base, np);
 444	if (err < 0) {
 445		kfree(usb2);
 446		return ERR_PTR(err);
 447	}
 448
 449	return &usb2->base;
 450}
 451
 452static void tegra124_usb2_lane_remove(struct tegra_xusb_lane *lane)
 453{
 454	struct tegra_xusb_usb2_lane *usb2 = to_usb2_lane(lane);
 455
 456	kfree(usb2);
 457}
 458
 459static const struct tegra_xusb_lane_ops tegra124_usb2_lane_ops = {
 460	.probe = tegra124_usb2_lane_probe,
 461	.remove = tegra124_usb2_lane_remove,
 462};
 463
 464static int tegra124_usb2_phy_init(struct phy *phy)
 465{
 466	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 467
 468	return tegra124_xusb_padctl_enable(lane->pad->padctl);
 469}
 470
 471static int tegra124_usb2_phy_exit(struct phy *phy)
 472{
 473	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 474
 475	return tegra124_xusb_padctl_disable(lane->pad->padctl);
 476}
 477
 478static int tegra124_usb2_phy_power_on(struct phy *phy)
 479{
 480	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 481	struct tegra_xusb_usb2_lane *usb2 = to_usb2_lane(lane);
 482	struct tegra_xusb_usb2_pad *pad = to_usb2_pad(lane->pad);
 483	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
 484	struct tegra124_xusb_padctl *priv;
 485	struct tegra_xusb_usb2_port *port;
 486	unsigned int index = lane->index;
 487	u32 value;
 488	int err;
 489
 490	port = tegra_xusb_find_usb2_port(padctl, index);
 491	if (!port) {
 492		dev_err(&phy->dev, "no port found for USB2 lane %u\n", index);
 493		return -ENODEV;
 494	}
 495
 496	priv = to_tegra124_xusb_padctl(padctl);
 497
 498	value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
 499	value &= ~((XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_MASK <<
 500		    XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_SHIFT) |
 501		   (XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_MASK <<
 502		    XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_SHIFT));
 503	value |= (priv->fuse.hs_squelch_level <<
 504		  XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_SHIFT) |
 505		 (XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_VAL <<
 506		  XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_SHIFT);
 507	padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
 508
 509	value = padctl_readl(padctl, XUSB_PADCTL_USB2_PORT_CAP);
 510	value &= ~(XUSB_PADCTL_USB2_PORT_CAP_PORT_CAP_MASK <<
 511		   XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_SHIFT(index));
 512	value |= XUSB_PADCTL_USB2_PORT_CAP_HOST <<
 513		XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_SHIFT(index);
 514	padctl_writel(padctl, value, XUSB_PADCTL_USB2_PORT_CAP);
 515
 516	value = padctl_readl(padctl, XUSB_PADCTL_USB2_OTG_PADX_CTL0(index));
 517	value &= ~((XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_MASK <<
 518		    XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_SHIFT) |
 519		   (XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_MASK <<
 520		    XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_SHIFT) |
 521		   (XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_MASK <<
 522		    XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_SHIFT) |
 523		   XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD |
 524		   XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2 |
 525		   XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI);
 526	value |= (priv->fuse.hs_curr_level[index] +
 527		  usb2->hs_curr_level_offset) <<
 528		XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_SHIFT;
 529	value |= XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_VAL <<
 530		XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_SHIFT;
 531	value |= XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_VAL(index) <<
 532		XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_SHIFT;
 533	padctl_writel(padctl, value, XUSB_PADCTL_USB2_OTG_PADX_CTL0(index));
 534
 535	value = padctl_readl(padctl, XUSB_PADCTL_USB2_OTG_PADX_CTL1(index));
 536	value &= ~((XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_MASK <<
 537		    XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_SHIFT) |
 538		   (XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP_MASK <<
 539		    XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP_SHIFT) |
 540		   XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR |
 541		   XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_CHRP_FORCE_POWERUP |
 542		   XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DISC_FORCE_POWERUP);
 543	value |= (priv->fuse.hs_term_range_adj <<
 544		  XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_SHIFT) |
 545		 (priv->fuse.hs_iref_cap <<
 546		  XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP_SHIFT);
 547	padctl_writel(padctl, value, XUSB_PADCTL_USB2_OTG_PADX_CTL1(index));
 548
 549	err = regulator_enable(port->supply);
 550	if (err)
 551		return err;
 552
 553	mutex_lock(&pad->lock);
 554
 555	if (pad->enable++ > 0)
 556		goto out;
 557
 558	value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
 559	value &= ~XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD;
 560	padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
 561
 562out:
 563	mutex_unlock(&pad->lock);
 564	return 0;
 565}
 566
 567static int tegra124_usb2_phy_power_off(struct phy *phy)
 568{
 569	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 570	struct tegra_xusb_usb2_pad *pad = to_usb2_pad(lane->pad);
 571	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
 572	struct tegra_xusb_usb2_port *port;
 573	u32 value;
 574
 575	port = tegra_xusb_find_usb2_port(padctl, lane->index);
 576	if (!port) {
 577		dev_err(&phy->dev, "no port found for USB2 lane %u\n",
 578			lane->index);
 579		return -ENODEV;
 580	}
 581
 582	mutex_lock(&pad->lock);
 583
 584	if (WARN_ON(pad->enable == 0))
 585		goto out;
 586
 587	if (--pad->enable > 0)
 588		goto out;
 589
 590	value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
 591	value |= XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD;
 592	padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
 593
 594out:
 595	regulator_disable(port->supply);
 596	mutex_unlock(&pad->lock);
 597	return 0;
 598}
 599
 600static const struct phy_ops tegra124_usb2_phy_ops = {
 601	.init = tegra124_usb2_phy_init,
 602	.exit = tegra124_usb2_phy_exit,
 603	.power_on = tegra124_usb2_phy_power_on,
 604	.power_off = tegra124_usb2_phy_power_off,
 605	.owner = THIS_MODULE,
 606};
 607
 608static struct tegra_xusb_pad *
 609tegra124_usb2_pad_probe(struct tegra_xusb_padctl *padctl,
 610			const struct tegra_xusb_pad_soc *soc,
 611			struct device_node *np)
 612{
 613	struct tegra_xusb_usb2_pad *usb2;
 614	struct tegra_xusb_pad *pad;
 615	int err;
 616
 617	usb2 = kzalloc(sizeof(*usb2), GFP_KERNEL);
 618	if (!usb2)
 619		return ERR_PTR(-ENOMEM);
 620
 621	mutex_init(&usb2->lock);
 622
 623	pad = &usb2->base;
 624	pad->ops = &tegra124_usb2_lane_ops;
 625	pad->soc = soc;
 626
 627	err = tegra_xusb_pad_init(pad, padctl, np);
 628	if (err < 0) {
 629		kfree(usb2);
 630		goto out;
 631	}
 632
 633	err = tegra_xusb_pad_register(pad, &tegra124_usb2_phy_ops);
 634	if (err < 0)
 635		goto unregister;
 636
 637	dev_set_drvdata(&pad->dev, pad);
 638
 639	return pad;
 640
 641unregister:
 642	device_unregister(&pad->dev);
 643out:
 644	return ERR_PTR(err);
 645}
 646
 647static void tegra124_usb2_pad_remove(struct tegra_xusb_pad *pad)
 648{
 649	struct tegra_xusb_usb2_pad *usb2 = to_usb2_pad(pad);
 650
 651	kfree(usb2);
 652}
 653
 654static const struct tegra_xusb_pad_ops tegra124_usb2_ops = {
 655	.probe = tegra124_usb2_pad_probe,
 656	.remove = tegra124_usb2_pad_remove,
 657};
 658
 659static const struct tegra_xusb_pad_soc tegra124_usb2_pad = {
 660	.name = "usb2",
 661	.num_lanes = ARRAY_SIZE(tegra124_usb2_lanes),
 662	.lanes = tegra124_usb2_lanes,
 663	.ops = &tegra124_usb2_ops,
 664};
 665
 666static const char * const tegra124_ulpi_functions[] = {
 667	"snps",
 668	"xusb",
 669};
 670
 671static const struct tegra_xusb_lane_soc tegra124_ulpi_lanes[] = {
 672	TEGRA124_LANE("ulpi-0", 0x004, 12, 0x1, ulpi),
 673};
 674
 675static struct tegra_xusb_lane *
 676tegra124_ulpi_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
 677			 unsigned int index)
 678{
 679	struct tegra_xusb_ulpi_lane *ulpi;
 680	int err;
 681
 682	ulpi = kzalloc(sizeof(*ulpi), GFP_KERNEL);
 683	if (!ulpi)
 684		return ERR_PTR(-ENOMEM);
 685
 686	INIT_LIST_HEAD(&ulpi->base.list);
 687	ulpi->base.soc = &pad->soc->lanes[index];
 688	ulpi->base.index = index;
 689	ulpi->base.pad = pad;
 690	ulpi->base.np = np;
 691
 692	err = tegra_xusb_lane_parse_dt(&ulpi->base, np);
 693	if (err < 0) {
 694		kfree(ulpi);
 695		return ERR_PTR(err);
 696	}
 697
 698	return &ulpi->base;
 699}
 700
 701static void tegra124_ulpi_lane_remove(struct tegra_xusb_lane *lane)
 702{
 703	struct tegra_xusb_ulpi_lane *ulpi = to_ulpi_lane(lane);
 704
 705	kfree(ulpi);
 706}
 707
 708static const struct tegra_xusb_lane_ops tegra124_ulpi_lane_ops = {
 709	.probe = tegra124_ulpi_lane_probe,
 710	.remove = tegra124_ulpi_lane_remove,
 711};
 712
 713static int tegra124_ulpi_phy_init(struct phy *phy)
 714{
 715	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 716
 717	return tegra124_xusb_padctl_enable(lane->pad->padctl);
 718}
 719
 720static int tegra124_ulpi_phy_exit(struct phy *phy)
 721{
 722	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 723
 724	return tegra124_xusb_padctl_disable(lane->pad->padctl);
 725}
 726
 727static int tegra124_ulpi_phy_power_on(struct phy *phy)
 728{
 729	return 0;
 730}
 731
 732static int tegra124_ulpi_phy_power_off(struct phy *phy)
 733{
 734	return 0;
 735}
 736
 737static const struct phy_ops tegra124_ulpi_phy_ops = {
 738	.init = tegra124_ulpi_phy_init,
 739	.exit = tegra124_ulpi_phy_exit,
 740	.power_on = tegra124_ulpi_phy_power_on,
 741	.power_off = tegra124_ulpi_phy_power_off,
 742	.owner = THIS_MODULE,
 743};
 744
 745static struct tegra_xusb_pad *
 746tegra124_ulpi_pad_probe(struct tegra_xusb_padctl *padctl,
 747			const struct tegra_xusb_pad_soc *soc,
 748			struct device_node *np)
 749{
 750	struct tegra_xusb_ulpi_pad *ulpi;
 751	struct tegra_xusb_pad *pad;
 752	int err;
 753
 754	ulpi = kzalloc(sizeof(*ulpi), GFP_KERNEL);
 755	if (!ulpi)
 756		return ERR_PTR(-ENOMEM);
 757
 758	pad = &ulpi->base;
 759	pad->ops = &tegra124_ulpi_lane_ops;
 760	pad->soc = soc;
 761
 762	err = tegra_xusb_pad_init(pad, padctl, np);
 763	if (err < 0) {
 764		kfree(ulpi);
 765		goto out;
 766	}
 767
 768	err = tegra_xusb_pad_register(pad, &tegra124_ulpi_phy_ops);
 769	if (err < 0)
 770		goto unregister;
 771
 772	dev_set_drvdata(&pad->dev, pad);
 773
 774	return pad;
 775
 776unregister:
 777	device_unregister(&pad->dev);
 778out:
 779	return ERR_PTR(err);
 780}
 781
 782static void tegra124_ulpi_pad_remove(struct tegra_xusb_pad *pad)
 783{
 784	struct tegra_xusb_ulpi_pad *ulpi = to_ulpi_pad(pad);
 785
 786	kfree(ulpi);
 787}
 788
 789static const struct tegra_xusb_pad_ops tegra124_ulpi_ops = {
 790	.probe = tegra124_ulpi_pad_probe,
 791	.remove = tegra124_ulpi_pad_remove,
 792};
 793
 794static const struct tegra_xusb_pad_soc tegra124_ulpi_pad = {
 795	.name = "ulpi",
 796	.num_lanes = ARRAY_SIZE(tegra124_ulpi_lanes),
 797	.lanes = tegra124_ulpi_lanes,
 798	.ops = &tegra124_ulpi_ops,
 799};
 800
 801static const char * const tegra124_hsic_functions[] = {
 802	"snps",
 803	"xusb",
 804};
 805
 806static const struct tegra_xusb_lane_soc tegra124_hsic_lanes[] = {
 807	TEGRA124_LANE("hsic-0", 0x004, 14, 0x1, hsic),
 808	TEGRA124_LANE("hsic-1", 0x004, 15, 0x1, hsic),
 809};
 810
 811static struct tegra_xusb_lane *
 812tegra124_hsic_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
 813			 unsigned int index)
 814{
 815	struct tegra_xusb_hsic_lane *hsic;
 816	int err;
 817
 818	hsic = kzalloc(sizeof(*hsic), GFP_KERNEL);
 819	if (!hsic)
 820		return ERR_PTR(-ENOMEM);
 821
 822	INIT_LIST_HEAD(&hsic->base.list);
 823	hsic->base.soc = &pad->soc->lanes[index];
 824	hsic->base.index = index;
 825	hsic->base.pad = pad;
 826	hsic->base.np = np;
 827
 828	err = tegra_xusb_lane_parse_dt(&hsic->base, np);
 829	if (err < 0) {
 830		kfree(hsic);
 831		return ERR_PTR(err);
 832	}
 833
 834	return &hsic->base;
 835}
 836
 837static void tegra124_hsic_lane_remove(struct tegra_xusb_lane *lane)
 838{
 839	struct tegra_xusb_hsic_lane *hsic = to_hsic_lane(lane);
 840
 841	kfree(hsic);
 842}
 843
 844static const struct tegra_xusb_lane_ops tegra124_hsic_lane_ops = {
 845	.probe = tegra124_hsic_lane_probe,
 846	.remove = tegra124_hsic_lane_remove,
 847};
 848
 849static int tegra124_hsic_phy_init(struct phy *phy)
 850{
 851	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 852
 853	return tegra124_xusb_padctl_enable(lane->pad->padctl);
 854}
 855
 856static int tegra124_hsic_phy_exit(struct phy *phy)
 857{
 858	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 859
 860	return tegra124_xusb_padctl_disable(lane->pad->padctl);
 861}
 862
 863static int tegra124_hsic_phy_power_on(struct phy *phy)
 864{
 865	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 866	struct tegra_xusb_hsic_lane *hsic = to_hsic_lane(lane);
 867	struct tegra_xusb_hsic_pad *pad = to_hsic_pad(lane->pad);
 868	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
 869	unsigned int index = lane->index;
 870	u32 value;
 871	int err;
 872
 873	err = regulator_enable(pad->supply);
 874	if (err)
 875		return err;
 876
 877	padctl_writel(padctl, hsic->strobe_trim,
 878		      XUSB_PADCTL_HSIC_STRB_TRIM_CONTROL);
 879
 880	value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 881
 882	if (hsic->auto_term)
 883		value |= XUSB_PADCTL_HSIC_PAD_CTL1_AUTO_TERM_EN;
 884	else
 885		value &= ~XUSB_PADCTL_HSIC_PAD_CTL1_AUTO_TERM_EN;
 886
 887	padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 888
 889	value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL0(index));
 890	value &= ~((XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEN_MASK <<
 891		    XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEN_SHIFT) |
 892		   (XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEP_MASK <<
 893		    XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEP_SHIFT) |
 894		   (XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWN_MASK <<
 895		    XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWN_SHIFT) |
 896		   (XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWP_MASK <<
 897		    XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWP_SHIFT));
 898	value |= (hsic->tx_rtune_n <<
 899		  XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEN_SHIFT) |
 900		(hsic->tx_rtune_p <<
 901		  XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEP_SHIFT) |
 902		(hsic->tx_rslew_n <<
 903		 XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWN_SHIFT) |
 904		(hsic->tx_rslew_p <<
 905		 XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWP_SHIFT);
 906	padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL0(index));
 907
 908	value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL2(index));
 909	value &= ~((XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_MASK <<
 910		    XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_SHIFT) |
 911		   (XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_MASK <<
 912		    XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_SHIFT));
 913	value |= (hsic->rx_strobe_trim <<
 914		  XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_SHIFT) |
 915		(hsic->rx_data_trim <<
 916		 XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_SHIFT);
 917	padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL2(index));
 918
 919	value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 920	value &= ~(XUSB_PADCTL_HSIC_PAD_CTL1_RPD_STROBE |
 921		   XUSB_PADCTL_HSIC_PAD_CTL1_RPU_DATA |
 922		   XUSB_PADCTL_HSIC_PAD_CTL1_PD_RX |
 923		   XUSB_PADCTL_HSIC_PAD_CTL1_PD_ZI |
 924		   XUSB_PADCTL_HSIC_PAD_CTL1_PD_TRX |
 925		   XUSB_PADCTL_HSIC_PAD_CTL1_PD_TX);
 926	value |= XUSB_PADCTL_HSIC_PAD_CTL1_RPD_DATA |
 927		 XUSB_PADCTL_HSIC_PAD_CTL1_RPU_STROBE;
 928	padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 929
 930	return 0;
 931}
 932
 933static int tegra124_hsic_phy_power_off(struct phy *phy)
 934{
 935	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 936	struct tegra_xusb_hsic_pad *pad = to_hsic_pad(lane->pad);
 937	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
 938	unsigned int index = lane->index;
 939	u32 value;
 940
 941	value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 942	value |= XUSB_PADCTL_HSIC_PAD_CTL1_PD_RX |
 943		 XUSB_PADCTL_HSIC_PAD_CTL1_PD_ZI |
 944		 XUSB_PADCTL_HSIC_PAD_CTL1_PD_TRX |
 945		 XUSB_PADCTL_HSIC_PAD_CTL1_PD_TX;
 946	padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 947
 948	regulator_disable(pad->supply);
 949
 950	return 0;
 951}
 952
 953static const struct phy_ops tegra124_hsic_phy_ops = {
 954	.init = tegra124_hsic_phy_init,
 955	.exit = tegra124_hsic_phy_exit,
 956	.power_on = tegra124_hsic_phy_power_on,
 957	.power_off = tegra124_hsic_phy_power_off,
 958	.owner = THIS_MODULE,
 959};
 960
 961static struct tegra_xusb_pad *
 962tegra124_hsic_pad_probe(struct tegra_xusb_padctl *padctl,
 963			const struct tegra_xusb_pad_soc *soc,
 964			struct device_node *np)
 965{
 966	struct tegra_xusb_hsic_pad *hsic;
 967	struct tegra_xusb_pad *pad;
 968	int err;
 969
 970	hsic = kzalloc(sizeof(*hsic), GFP_KERNEL);
 971	if (!hsic)
 972		return ERR_PTR(-ENOMEM);
 973
 974	pad = &hsic->base;
 975	pad->ops = &tegra124_hsic_lane_ops;
 976	pad->soc = soc;
 977
 978	err = tegra_xusb_pad_init(pad, padctl, np);
 979	if (err < 0) {
 980		kfree(hsic);
 981		goto out;
 982	}
 983
 984	err = tegra_xusb_pad_register(pad, &tegra124_hsic_phy_ops);
 985	if (err < 0)
 986		goto unregister;
 987
 988	dev_set_drvdata(&pad->dev, pad);
 989
 990	return pad;
 991
 992unregister:
 993	device_unregister(&pad->dev);
 994out:
 995	return ERR_PTR(err);
 996}
 997
 998static void tegra124_hsic_pad_remove(struct tegra_xusb_pad *pad)
 999{
1000	struct tegra_xusb_hsic_pad *hsic = to_hsic_pad(pad);
1001
1002	kfree(hsic);
1003}
1004
1005static const struct tegra_xusb_pad_ops tegra124_hsic_ops = {
1006	.probe = tegra124_hsic_pad_probe,
1007	.remove = tegra124_hsic_pad_remove,
1008};
1009
1010static const struct tegra_xusb_pad_soc tegra124_hsic_pad = {
1011	.name = "hsic",
1012	.num_lanes = ARRAY_SIZE(tegra124_hsic_lanes),
1013	.lanes = tegra124_hsic_lanes,
1014	.ops = &tegra124_hsic_ops,
1015};
1016
1017static const char * const tegra124_pcie_functions[] = {
1018	"pcie",
1019	"usb3-ss",
1020	"sata",
1021};
1022
1023static const struct tegra_xusb_lane_soc tegra124_pcie_lanes[] = {
1024	TEGRA124_LANE("pcie-0", 0x134, 16, 0x3, pcie),
1025	TEGRA124_LANE("pcie-1", 0x134, 18, 0x3, pcie),
1026	TEGRA124_LANE("pcie-2", 0x134, 20, 0x3, pcie),
1027	TEGRA124_LANE("pcie-3", 0x134, 22, 0x3, pcie),
1028	TEGRA124_LANE("pcie-4", 0x134, 24, 0x3, pcie),
1029};
1030
1031static struct tegra_xusb_lane *
1032tegra124_pcie_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
1033			 unsigned int index)
1034{
1035	struct tegra_xusb_pcie_lane *pcie;
1036	int err;
1037
1038	pcie = kzalloc(sizeof(*pcie), GFP_KERNEL);
1039	if (!pcie)
1040		return ERR_PTR(-ENOMEM);
1041
1042	INIT_LIST_HEAD(&pcie->base.list);
1043	pcie->base.soc = &pad->soc->lanes[index];
1044	pcie->base.index = index;
1045	pcie->base.pad = pad;
1046	pcie->base.np = np;
1047
1048	err = tegra_xusb_lane_parse_dt(&pcie->base, np);
1049	if (err < 0) {
1050		kfree(pcie);
1051		return ERR_PTR(err);
1052	}
1053
1054	return &pcie->base;
1055}
1056
1057static void tegra124_pcie_lane_remove(struct tegra_xusb_lane *lane)
1058{
1059	struct tegra_xusb_pcie_lane *pcie = to_pcie_lane(lane);
1060
1061	kfree(pcie);
1062}
1063
1064static const struct tegra_xusb_lane_ops tegra124_pcie_lane_ops = {
1065	.probe = tegra124_pcie_lane_probe,
1066	.remove = tegra124_pcie_lane_remove,
1067};
1068
1069static int tegra124_pcie_phy_init(struct phy *phy)
1070{
1071	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1072
1073	return tegra124_xusb_padctl_enable(lane->pad->padctl);
1074}
1075
1076static int tegra124_pcie_phy_exit(struct phy *phy)
1077{
1078	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1079
1080	return tegra124_xusb_padctl_disable(lane->pad->padctl);
1081}
1082
1083static int tegra124_pcie_phy_power_on(struct phy *phy)
1084{
1085	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1086	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
1087	unsigned long timeout;
1088	int err = -ETIMEDOUT;
1089	u32 value;
1090
1091	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1092	value &= ~XUSB_PADCTL_IOPHY_PLL_P0_CTL1_REFCLK_SEL_MASK;
1093	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1094
1095	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL2);
1096	value |= XUSB_PADCTL_IOPHY_PLL_P0_CTL2_REFCLKBUF_EN |
1097		 XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_EN |
1098		 XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_SEL;
1099	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL2);
1100
1101	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1102	value |= XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST;
1103	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1104
1105	timeout = jiffies + msecs_to_jiffies(50);
1106
1107	while (time_before(jiffies, timeout)) {
1108		value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1109		if (value & XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL0_LOCKDET) {
1110			err = 0;
1111			break;
1112		}
1113
1114		usleep_range(100, 200);
1115	}
1116
1117	value = padctl_readl(padctl, XUSB_PADCTL_USB3_PAD_MUX);
1118	value |= XUSB_PADCTL_USB3_PAD_MUX_PCIE_IDDQ_DISABLE(lane->index);
1119	padctl_writel(padctl, value, XUSB_PADCTL_USB3_PAD_MUX);
1120
1121	return err;
1122}
1123
1124static int tegra124_pcie_phy_power_off(struct phy *phy)
1125{
1126	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1127	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
1128	u32 value;
1129
1130	value = padctl_readl(padctl, XUSB_PADCTL_USB3_PAD_MUX);
1131	value &= ~XUSB_PADCTL_USB3_PAD_MUX_PCIE_IDDQ_DISABLE(lane->index);
1132	padctl_writel(padctl, value, XUSB_PADCTL_USB3_PAD_MUX);
1133
1134	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1135	value &= ~XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST;
1136	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1137
1138	return 0;
1139}
1140
1141static const struct phy_ops tegra124_pcie_phy_ops = {
1142	.init = tegra124_pcie_phy_init,
1143	.exit = tegra124_pcie_phy_exit,
1144	.power_on = tegra124_pcie_phy_power_on,
1145	.power_off = tegra124_pcie_phy_power_off,
1146	.owner = THIS_MODULE,
1147};
1148
1149static struct tegra_xusb_pad *
1150tegra124_pcie_pad_probe(struct tegra_xusb_padctl *padctl,
1151			const struct tegra_xusb_pad_soc *soc,
1152			struct device_node *np)
1153{
1154	struct tegra_xusb_pcie_pad *pcie;
1155	struct tegra_xusb_pad *pad;
1156	int err;
1157
1158	pcie = kzalloc(sizeof(*pcie), GFP_KERNEL);
1159	if (!pcie)
1160		return ERR_PTR(-ENOMEM);
1161
1162	pad = &pcie->base;
1163	pad->ops = &tegra124_pcie_lane_ops;
1164	pad->soc = soc;
1165
1166	err = tegra_xusb_pad_init(pad, padctl, np);
1167	if (err < 0) {
1168		kfree(pcie);
1169		goto out;
1170	}
1171
1172	err = tegra_xusb_pad_register(pad, &tegra124_pcie_phy_ops);
1173	if (err < 0)
1174		goto unregister;
1175
1176	dev_set_drvdata(&pad->dev, pad);
1177
1178	return pad;
1179
1180unregister:
1181	device_unregister(&pad->dev);
1182out:
1183	return ERR_PTR(err);
1184}
1185
1186static void tegra124_pcie_pad_remove(struct tegra_xusb_pad *pad)
1187{
1188	struct tegra_xusb_pcie_pad *pcie = to_pcie_pad(pad);
1189
1190	kfree(pcie);
1191}
1192
1193static const struct tegra_xusb_pad_ops tegra124_pcie_ops = {
1194	.probe = tegra124_pcie_pad_probe,
1195	.remove = tegra124_pcie_pad_remove,
1196};
1197
1198static const struct tegra_xusb_pad_soc tegra124_pcie_pad = {
1199	.name = "pcie",
1200	.num_lanes = ARRAY_SIZE(tegra124_pcie_lanes),
1201	.lanes = tegra124_pcie_lanes,
1202	.ops = &tegra124_pcie_ops,
1203};
1204
1205static const struct tegra_xusb_lane_soc tegra124_sata_lanes[] = {
1206	TEGRA124_LANE("sata-0", 0x134, 26, 0x3, pcie),
1207};
1208
1209static struct tegra_xusb_lane *
1210tegra124_sata_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
1211			 unsigned int index)
1212{
1213	struct tegra_xusb_sata_lane *sata;
1214	int err;
1215
1216	sata = kzalloc(sizeof(*sata), GFP_KERNEL);
1217	if (!sata)
1218		return ERR_PTR(-ENOMEM);
1219
1220	INIT_LIST_HEAD(&sata->base.list);
1221	sata->base.soc = &pad->soc->lanes[index];
1222	sata->base.index = index;
1223	sata->base.pad = pad;
1224	sata->base.np = np;
1225
1226	err = tegra_xusb_lane_parse_dt(&sata->base, np);
1227	if (err < 0) {
1228		kfree(sata);
1229		return ERR_PTR(err);
1230	}
1231
1232	return &sata->base;
1233}
1234
1235static void tegra124_sata_lane_remove(struct tegra_xusb_lane *lane)
1236{
1237	struct tegra_xusb_sata_lane *sata = to_sata_lane(lane);
1238
1239	kfree(sata);
1240}
1241
1242static const struct tegra_xusb_lane_ops tegra124_sata_lane_ops = {
1243	.probe = tegra124_sata_lane_probe,
1244	.remove = tegra124_sata_lane_remove,
1245};
1246
1247static int tegra124_sata_phy_init(struct phy *phy)
1248{
1249	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1250
1251	return tegra124_xusb_padctl_enable(lane->pad->padctl);
1252}
1253
1254static int tegra124_sata_phy_exit(struct phy *phy)
1255{
1256	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1257
1258	return tegra124_xusb_padctl_disable(lane->pad->padctl);
1259}
1260
1261static int tegra124_sata_phy_power_on(struct phy *phy)
1262{
1263	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1264	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
1265	unsigned long timeout;
1266	int err = -ETIMEDOUT;
1267	u32 value;
1268
1269	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
1270	value &= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD;
1271	value &= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ;
1272	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
1273
1274	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1275	value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD;
1276	value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ;
1277	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1278
1279	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1280	value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE;
1281	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1282
1283	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1284	value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST;
1285	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1286
1287	timeout = jiffies + msecs_to_jiffies(50);
1288
1289	while (time_before(jiffies, timeout)) {
1290		value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1291		if (value & XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET) {
1292			err = 0;
1293			break;
1294		}
1295
1296		usleep_range(100, 200);
1297	}
1298
1299	value = padctl_readl(padctl, XUSB_PADCTL_USB3_PAD_MUX);
1300	value |= XUSB_PADCTL_USB3_PAD_MUX_SATA_IDDQ_DISABLE(lane->index);
1301	padctl_writel(padctl, value, XUSB_PADCTL_USB3_PAD_MUX);
1302
1303	return err;
1304}
1305
1306static int tegra124_sata_phy_power_off(struct phy *phy)
1307{
1308	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1309	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
1310	u32 value;
1311
1312	value = padctl_readl(padctl, XUSB_PADCTL_USB3_PAD_MUX);
1313	value &= ~XUSB_PADCTL_USB3_PAD_MUX_SATA_IDDQ_DISABLE(lane->index);
1314	padctl_writel(padctl, value, XUSB_PADCTL_USB3_PAD_MUX);
1315
1316	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1317	value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST;
1318	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1319
1320	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1321	value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE;
1322	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1323
1324	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1325	value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD;
1326	value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ;
1327	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1328
1329	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
1330	value |= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD;
1331	value |= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ;
1332	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
1333
1334	return 0;
1335}
1336
1337static const struct phy_ops tegra124_sata_phy_ops = {
1338	.init = tegra124_sata_phy_init,
1339	.exit = tegra124_sata_phy_exit,
1340	.power_on = tegra124_sata_phy_power_on,
1341	.power_off = tegra124_sata_phy_power_off,
1342	.owner = THIS_MODULE,
1343};
1344
1345static struct tegra_xusb_pad *
1346tegra124_sata_pad_probe(struct tegra_xusb_padctl *padctl,
1347			const struct tegra_xusb_pad_soc *soc,
1348			struct device_node *np)
1349{
1350	struct tegra_xusb_sata_pad *sata;
1351	struct tegra_xusb_pad *pad;
1352	int err;
1353
1354	sata = kzalloc(sizeof(*sata), GFP_KERNEL);
1355	if (!sata)
1356		return ERR_PTR(-ENOMEM);
1357
1358	pad = &sata->base;
1359	pad->ops = &tegra124_sata_lane_ops;
1360	pad->soc = soc;
1361
1362	err = tegra_xusb_pad_init(pad, padctl, np);
1363	if (err < 0) {
1364		kfree(sata);
1365		goto out;
1366	}
1367
1368	err = tegra_xusb_pad_register(pad, &tegra124_sata_phy_ops);
1369	if (err < 0)
1370		goto unregister;
1371
1372	dev_set_drvdata(&pad->dev, pad);
1373
1374	return pad;
1375
1376unregister:
1377	device_unregister(&pad->dev);
1378out:
1379	return ERR_PTR(err);
1380}
1381
1382static void tegra124_sata_pad_remove(struct tegra_xusb_pad *pad)
1383{
1384	struct tegra_xusb_sata_pad *sata = to_sata_pad(pad);
1385
1386	kfree(sata);
1387}
1388
1389static const struct tegra_xusb_pad_ops tegra124_sata_ops = {
1390	.probe = tegra124_sata_pad_probe,
1391	.remove = tegra124_sata_pad_remove,
1392};
1393
1394static const struct tegra_xusb_pad_soc tegra124_sata_pad = {
1395	.name = "sata",
1396	.num_lanes = ARRAY_SIZE(tegra124_sata_lanes),
1397	.lanes = tegra124_sata_lanes,
1398	.ops = &tegra124_sata_ops,
1399};
1400
1401static const struct tegra_xusb_pad_soc *tegra124_pads[] = {
1402	&tegra124_usb2_pad,
1403	&tegra124_ulpi_pad,
1404	&tegra124_hsic_pad,
1405	&tegra124_pcie_pad,
1406	&tegra124_sata_pad,
1407};
1408
1409static int tegra124_usb2_port_enable(struct tegra_xusb_port *port)
1410{
1411	return 0;
1412}
1413
1414static void tegra124_usb2_port_disable(struct tegra_xusb_port *port)
1415{
1416}
1417
1418static struct tegra_xusb_lane *
1419tegra124_usb2_port_map(struct tegra_xusb_port *port)
1420{
1421	return tegra_xusb_find_lane(port->padctl, "usb2", port->index);
1422}
1423
1424static const struct tegra_xusb_port_ops tegra124_usb2_port_ops = {
1425	.release = tegra_xusb_usb2_port_release,
1426	.remove = tegra_xusb_usb2_port_remove,
1427	.enable = tegra124_usb2_port_enable,
1428	.disable = tegra124_usb2_port_disable,
1429	.map = tegra124_usb2_port_map,
1430};
1431
1432static int tegra124_ulpi_port_enable(struct tegra_xusb_port *port)
1433{
1434	return 0;
1435}
1436
1437static void tegra124_ulpi_port_disable(struct tegra_xusb_port *port)
1438{
1439}
1440
1441static struct tegra_xusb_lane *
1442tegra124_ulpi_port_map(struct tegra_xusb_port *port)
1443{
1444	return tegra_xusb_find_lane(port->padctl, "ulpi", port->index);
1445}
1446
1447static const struct tegra_xusb_port_ops tegra124_ulpi_port_ops = {
1448	.release = tegra_xusb_ulpi_port_release,
1449	.enable = tegra124_ulpi_port_enable,
1450	.disable = tegra124_ulpi_port_disable,
1451	.map = tegra124_ulpi_port_map,
1452};
1453
1454static int tegra124_hsic_port_enable(struct tegra_xusb_port *port)
1455{
1456	return 0;
1457}
1458
1459static void tegra124_hsic_port_disable(struct tegra_xusb_port *port)
1460{
1461}
1462
1463static struct tegra_xusb_lane *
1464tegra124_hsic_port_map(struct tegra_xusb_port *port)
1465{
1466	return tegra_xusb_find_lane(port->padctl, "hsic", port->index);
1467}
1468
1469static const struct tegra_xusb_port_ops tegra124_hsic_port_ops = {
1470	.release = tegra_xusb_hsic_port_release,
1471	.enable = tegra124_hsic_port_enable,
1472	.disable = tegra124_hsic_port_disable,
1473	.map = tegra124_hsic_port_map,
1474};
1475
1476static int tegra124_usb3_port_enable(struct tegra_xusb_port *port)
1477{
1478	struct tegra_xusb_usb3_port *usb3 = to_usb3_port(port);
1479	struct tegra_xusb_padctl *padctl = port->padctl;
1480	struct tegra_xusb_lane *lane = usb3->base.lane;
1481	unsigned int index = port->index, offset;
1482	u32 value;
1483
1484	value = padctl_readl(padctl, XUSB_PADCTL_SS_PORT_MAP);
1485
1486	if (!usb3->internal)
1487		value &= ~XUSB_PADCTL_SS_PORT_MAP_PORTX_INTERNAL(index);
1488	else
1489		value |= XUSB_PADCTL_SS_PORT_MAP_PORTX_INTERNAL(index);
1490
1491	value &= ~XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP_MASK(index);
1492	value |= XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP(index, usb3->port);
1493	padctl_writel(padctl, value, XUSB_PADCTL_SS_PORT_MAP);
1494
1495	/*
1496	 * TODO: move this code into the PCIe/SATA PHY ->power_on() callbacks
1497	 * and conditionalize based on mux function? This seems to work, but
1498	 * might not be the exact proper sequence.
1499	 */
1500	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_USB3_PADX_CTL2(index));
1501	value &= ~((XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_MASK <<
1502		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_SHIFT) |
1503		   (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_MASK <<
1504		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_SHIFT) |
1505		   (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_MASK <<
1506		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_SHIFT));
1507	value |= (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_VAL <<
1508		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_SHIFT) |
1509		 (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_VAL <<
1510		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_SHIFT) |
1511		 (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_VAL <<
1512		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_SHIFT);
1513
1514	if (usb3->context_saved) {
1515		value &= ~((XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_MASK <<
1516			    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_SHIFT) |
1517			   (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_MASK <<
1518			    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_SHIFT));
1519		value |= (usb3->ctle_g <<
1520			  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_SHIFT) |
1521			 (usb3->ctle_z <<
1522			  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_SHIFT);
1523	}
1524
1525	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_USB3_PADX_CTL2(index));
1526
1527	value = XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_VAL;
1528
1529	if (usb3->context_saved) {
1530		value &= ~((XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_MASK <<
1531			    XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_SHIFT) |
1532			   (XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_MASK <<
1533			    XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_SHIFT));
1534		value |= (usb3->tap1 <<
1535			  XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_SHIFT) |
1536			 (usb3->amp <<
1537			  XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_SHIFT);
1538	}
1539
1540	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_USB3_PADX_CTL4(index));
1541
1542	if (lane->pad == padctl->pcie)
1543		offset = XUSB_PADCTL_IOPHY_MISC_PAD_PX_CTL2(lane->index);
1544	else
1545		offset = XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL2;
1546
1547	value = padctl_readl(padctl, offset);
1548	value &= ~(XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_MASK <<
1549		   XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_SHIFT);
1550	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_VAL <<
1551		XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_SHIFT;
1552	padctl_writel(padctl, value, offset);
1553
1554	if (lane->pad == padctl->pcie)
1555		offset = XUSB_PADCTL_IOPHY_MISC_PAD_PX_CTL5(lane->index);
1556	else
1557		offset = XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL5;
1558
1559	value = padctl_readl(padctl, offset);
1560	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL5_RX_QEYE_EN;
1561	padctl_writel(padctl, value, offset);
1562
1563	/* Enable SATA PHY when SATA lane is used */
1564	if (lane->pad == padctl->sata) {
1565		value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1566		value &= ~(XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL0_REFCLK_NDIV_MASK <<
1567			   XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL0_REFCLK_NDIV_SHIFT);
1568		value |= 0x2 <<
1569			XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL0_REFCLK_NDIV_SHIFT;
1570		padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1571
1572		value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL2);
1573		value &= ~((XUSB_PADCTL_IOPHY_PLL_S0_CTL2_XDIGCLK_SEL_MASK <<
1574			    XUSB_PADCTL_IOPHY_PLL_S0_CTL2_XDIGCLK_SEL_SHIFT) |
1575			   (XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL1_CP_CNTL_MASK <<
1576			    XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL1_CP_CNTL_SHIFT) |
1577			   (XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL0_CP_CNTL_MASK <<
1578			    XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL0_CP_CNTL_SHIFT) |
1579			   XUSB_PADCTL_IOPHY_PLL_S0_CTL2_TCLKOUT_EN);
1580		value |= (0x7 <<
1581			  XUSB_PADCTL_IOPHY_PLL_S0_CTL2_XDIGCLK_SEL_SHIFT) |
1582			 (0x8 <<
1583			  XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL1_CP_CNTL_SHIFT) |
1584			 (0x8 <<
1585			  XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL0_CP_CNTL_SHIFT) |
1586			 XUSB_PADCTL_IOPHY_PLL_S0_CTL2_TXCLKREF_SEL;
1587		padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL2);
1588
1589		value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL3);
1590		value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL3_RCAL_BYPASS;
1591		padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL3);
1592	}
1593
1594	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
1595	value &= ~XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_VCORE_DOWN(index);
1596	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
1597
1598	usleep_range(100, 200);
1599
1600	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
1601	value &= ~XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_CLAMP_EN_EARLY(index);
1602	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
1603
1604	usleep_range(100, 200);
1605
1606	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
1607	value &= ~XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_CLAMP_EN(index);
1608	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
1609
1610	return 0;
1611}
1612
1613static void tegra124_usb3_port_disable(struct tegra_xusb_port *port)
1614{
1615	struct tegra_xusb_padctl *padctl = port->padctl;
1616	u32 value;
1617
1618	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
1619	value |= XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_CLAMP_EN_EARLY(port->index);
1620	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
1621
1622	usleep_range(100, 200);
1623
1624	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
1625	value |= XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_CLAMP_EN(port->index);
1626	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
1627
1628	usleep_range(250, 350);
1629
1630	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
1631	value |= XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_VCORE_DOWN(port->index);
1632	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
1633
1634	value = padctl_readl(padctl, XUSB_PADCTL_SS_PORT_MAP);
1635	value &= ~XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP_MASK(port->index);
1636	value |= XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP(port->index, 0x7);
1637	padctl_writel(padctl, value, XUSB_PADCTL_SS_PORT_MAP);
1638}
1639
1640static const struct tegra_xusb_lane_map tegra124_usb3_map[] = {
1641	{ 0, "pcie", 0 },
1642	{ 1, "pcie", 1 },
1643	{ 1, "sata", 0 },
1644	{ 0, NULL,   0 },
1645};
1646
1647static struct tegra_xusb_lane *
1648tegra124_usb3_port_map(struct tegra_xusb_port *port)
1649{
1650	return tegra_xusb_port_find_lane(port, tegra124_usb3_map, "usb3-ss");
1651}
1652
1653static const struct tegra_xusb_port_ops tegra124_usb3_port_ops = {
1654	.release = tegra_xusb_usb3_port_release,
1655	.enable = tegra124_usb3_port_enable,
1656	.disable = tegra124_usb3_port_disable,
1657	.map = tegra124_usb3_port_map,
1658};
1659
1660static int
1661tegra124_xusb_read_fuse_calibration(struct tegra124_xusb_fuse_calibration *fuse)
1662{
1663	unsigned int i;
1664	int err;
1665	u32 value;
1666
1667	err = tegra_fuse_readl(TEGRA_FUSE_SKU_CALIB_0, &value);
1668	if (err < 0)
1669		return err;
1670
1671	for (i = 0; i < ARRAY_SIZE(fuse->hs_curr_level); i++) {
1672		fuse->hs_curr_level[i] =
1673			(value >> FUSE_SKU_CALIB_HS_CURR_LEVEL_PADX_SHIFT(i)) &
1674			FUSE_SKU_CALIB_HS_CURR_LEVEL_PAD_MASK;
1675	}
1676	fuse->hs_iref_cap =
1677		(value >> FUSE_SKU_CALIB_HS_IREF_CAP_SHIFT) &
1678		FUSE_SKU_CALIB_HS_IREF_CAP_MASK;
1679	fuse->hs_term_range_adj =
1680		(value >> FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_SHIFT) &
1681		FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_MASK;
1682	fuse->hs_squelch_level =
1683		(value >> FUSE_SKU_CALIB_HS_SQUELCH_LEVEL_SHIFT) &
1684		FUSE_SKU_CALIB_HS_SQUELCH_LEVEL_MASK;
1685
1686	return 0;
1687}
1688
1689static struct tegra_xusb_padctl *
1690tegra124_xusb_padctl_probe(struct device *dev,
1691			   const struct tegra_xusb_padctl_soc *soc)
1692{
1693	struct tegra124_xusb_padctl *padctl;
1694	int err;
1695
1696	padctl = devm_kzalloc(dev, sizeof(*padctl), GFP_KERNEL);
1697	if (!padctl)
1698		return ERR_PTR(-ENOMEM);
1699
1700	padctl->base.dev = dev;
1701	padctl->base.soc = soc;
1702
1703	err = tegra124_xusb_read_fuse_calibration(&padctl->fuse);
1704	if (err < 0)
1705		return ERR_PTR(err);
1706
1707	return &padctl->base;
1708}
1709
1710static void tegra124_xusb_padctl_remove(struct tegra_xusb_padctl *padctl)
1711{
1712}
1713
1714static const struct tegra_xusb_padctl_ops tegra124_xusb_padctl_ops = {
1715	.probe = tegra124_xusb_padctl_probe,
1716	.remove = tegra124_xusb_padctl_remove,
1717	.usb3_save_context = tegra124_usb3_save_context,
1718	.hsic_set_idle = tegra124_hsic_set_idle,
1719};
1720
1721static const char * const tegra124_xusb_padctl_supply_names[] = {
1722	"avdd-pll-utmip",
1723	"avdd-pll-erefe",
1724	"avdd-pex-pll",
1725	"hvdd-pex-pll-e",
1726};
1727
1728const struct tegra_xusb_padctl_soc tegra124_xusb_padctl_soc = {
1729	.num_pads = ARRAY_SIZE(tegra124_pads),
1730	.pads = tegra124_pads,
1731	.ports = {
1732		.usb2 = {
1733			.ops = &tegra124_usb2_port_ops,
1734			.count = 3,
1735		},
1736		.ulpi = {
1737			.ops = &tegra124_ulpi_port_ops,
1738			.count = 1,
1739		},
1740		.hsic = {
1741			.ops = &tegra124_hsic_port_ops,
1742			.count = 2,
1743		},
1744		.usb3 = {
1745			.ops = &tegra124_usb3_port_ops,
1746			.count = 2,
1747		},
1748	},
1749	.ops = &tegra124_xusb_padctl_ops,
1750	.supply_names = tegra124_xusb_padctl_supply_names,
1751	.num_supplies = ARRAY_SIZE(tegra124_xusb_padctl_supply_names),
1752};
1753EXPORT_SYMBOL_GPL(tegra124_xusb_padctl_soc);
1754
1755MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
1756MODULE_DESCRIPTION("NVIDIA Tegra 124 XUSB Pad Controller driver");
1757MODULE_LICENSE("GPL v2");
v4.10.11
 
   1/*
   2 * Copyright (c) 2014, NVIDIA CORPORATION.  All rights reserved.
   3 *
   4 * This program is free software; you can redistribute it and/or modify it
   5 * under the terms and conditions of the GNU General Public License,
   6 * version 2, as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope it will be useful, but WITHOUT
   9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  11 * more details.
  12 */
  13
  14#include <linux/delay.h>
  15#include <linux/io.h>
  16#include <linux/mailbox_client.h>
  17#include <linux/module.h>
  18#include <linux/of.h>
  19#include <linux/phy/phy.h>
  20#include <linux/platform_device.h>
  21#include <linux/regulator/consumer.h>
  22#include <linux/reset.h>
  23#include <linux/slab.h>
  24
  25#include <soc/tegra/fuse.h>
  26
  27#include "xusb.h"
  28
  29#define FUSE_SKU_CALIB_HS_CURR_LEVEL_PADX_SHIFT(x) ((x) ? 15 : 0)
  30#define FUSE_SKU_CALIB_HS_CURR_LEVEL_PAD_MASK 0x3f
  31#define FUSE_SKU_CALIB_HS_IREF_CAP_SHIFT 13
  32#define FUSE_SKU_CALIB_HS_IREF_CAP_MASK 0x3
  33#define FUSE_SKU_CALIB_HS_SQUELCH_LEVEL_SHIFT 11
  34#define FUSE_SKU_CALIB_HS_SQUELCH_LEVEL_MASK 0x3
  35#define FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_SHIFT 7
  36#define FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_MASK 0xf
  37
  38#define XUSB_PADCTL_USB2_PORT_CAP 0x008
  39#define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_SHIFT(x) ((x) * 4)
  40#define XUSB_PADCTL_USB2_PORT_CAP_PORT_CAP_MASK 0x3
  41#define XUSB_PADCTL_USB2_PORT_CAP_DISABLED 0x0
  42#define XUSB_PADCTL_USB2_PORT_CAP_HOST 0x1
  43#define XUSB_PADCTL_USB2_PORT_CAP_DEVICE 0x2
  44#define XUSB_PADCTL_USB2_PORT_CAP_OTG 0x3
  45
  46#define XUSB_PADCTL_SS_PORT_MAP 0x014
  47#define XUSB_PADCTL_SS_PORT_MAP_PORTX_INTERNAL(x) (1 << (((x) * 4) + 3))
  48#define XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP_SHIFT(x) ((x) * 4)
  49#define XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP_MASK(x) (0x7 << ((x) * 4))
  50#define XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP(x, v) (((v) & 0x7) << ((x) * 4))
  51#define XUSB_PADCTL_SS_PORT_MAP_PORT_MAP_MASK 0x7
  52
  53#define XUSB_PADCTL_ELPG_PROGRAM 0x01c
  54#define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN (1 << 26)
  55#define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY (1 << 25)
  56#define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN (1 << 24)
  57#define XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_VCORE_DOWN(x) (1 << (18 + (x) * 4))
  58#define XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_CLAMP_EN_EARLY(x) \
  59							(1 << (17 + (x) * 4))
  60#define XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_CLAMP_EN(x) (1 << (16 + (x) * 4))
  61
  62#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1 0x040
  63#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL0_LOCKDET (1 << 19)
  64#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_REFCLK_SEL_MASK (0xf << 12)
  65#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST (1 << 1)
  66
  67#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2 0x044
  68#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_REFCLKBUF_EN (1 << 6)
  69#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_EN (1 << 5)
  70#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_SEL (1 << 4)
  71
  72#define XUSB_PADCTL_IOPHY_USB3_PADX_CTL2(x) (0x058 + (x) * 4)
  73#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_SHIFT 24
  74#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_MASK 0xff
  75#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_VAL 0x24
  76#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_SHIFT 16
  77#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_MASK 0x3f
  78#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_SHIFT 8
  79#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_MASK 0x3f
  80#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_SHIFT 8
  81#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_MASK 0xffff
  82#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_VAL 0xf070
  83#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_SHIFT 4
  84#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_MASK 0xf
  85#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_VAL 0xf
  86
  87#define XUSB_PADCTL_IOPHY_USB3_PADX_CTL4(x) (0x068 + (x) * 4)
  88#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_SHIFT 24
  89#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_MASK 0x1f
  90#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_SHIFT 16
  91#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_MASK 0x7f
  92#define XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_VAL 0x002008ee
  93
  94#define XUSB_PADCTL_IOPHY_MISC_PAD_PX_CTL2(x) ((x) < 2 ? 0x078 + (x) * 4 : \
  95					       0x0f8 + (x) * 4)
  96#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_SHIFT 28
  97#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_MASK 0x3
  98#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_VAL 0x1
  99
 100#define XUSB_PADCTL_IOPHY_MISC_PAD_PX_CTL5(x) ((x) < 2 ? 0x090 + (x) * 4 : \
 101					       0x11c + (x) * 4)
 102#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL5_RX_QEYE_EN (1 << 8)
 103
 104#define XUSB_PADCTL_IOPHY_MISC_PAD_PX_CTL6(x) ((x) < 2 ? 0x098 + (x) * 4 : \
 105					       0x128 + (x) * 4)
 106#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SHIFT 24
 107#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_G_Z_MASK 0x3f
 108#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_TAP_MASK 0x1f
 109#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_AMP_MASK 0x7f
 110#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT 16
 111#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_MASK 0xff
 112#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_G_Z 0x21
 113#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_TAP 0x32
 114#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_AMP 0x33
 115#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_CTLE_Z 0x48
 116#define XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_LATCH_G_Z 0xa1
 117
 118#define XUSB_PADCTL_USB2_OTG_PADX_CTL0(x) (0x0a0 + (x) * 4)
 119#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI (1 << 21)
 120#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2 (1 << 20)
 121#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD (1 << 19)
 122#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_SHIFT 14
 123#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_MASK 0x3
 124#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_VAL(x) ((x) ? 0x0 : 0x3)
 125#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_SHIFT 6
 126#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_MASK 0x3f
 127#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_VAL 0x0e
 128#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_SHIFT 0
 129#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_MASK 0x3f
 130
 131#define XUSB_PADCTL_USB2_OTG_PADX_CTL1(x) (0x0ac + (x) * 4)
 132#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP_SHIFT 9
 133#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP_MASK 0x3
 134#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_SHIFT 3
 135#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_MASK 0x7
 136#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR (1 << 2)
 137#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DISC_FORCE_POWERUP (1 << 1)
 138#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_CHRP_FORCE_POWERUP (1 << 0)
 139
 140#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0 0x0b8
 141#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD (1 << 12)
 142#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_SHIFT 2
 143#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_MASK 0x7
 144#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_VAL 0x5
 145#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_SHIFT 0
 146#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_MASK 0x3
 147
 148#define XUSB_PADCTL_HSIC_PADX_CTL0(x) (0x0c0 + (x) * 4)
 149#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWN_SHIFT 12
 150#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWN_MASK 0x7
 151#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWP_SHIFT 8
 152#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWP_MASK 0x7
 153#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEN_SHIFT 4
 154#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEN_MASK 0x7
 155#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEP_SHIFT 0
 156#define XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEP_MASK 0x7
 157
 158#define XUSB_PADCTL_HSIC_PADX_CTL1(x) (0x0c8 + (x) * 4)
 159#define XUSB_PADCTL_HSIC_PAD_CTL1_RPU_STROBE (1 << 10)
 160#define XUSB_PADCTL_HSIC_PAD_CTL1_RPU_DATA (1 << 9)
 161#define XUSB_PADCTL_HSIC_PAD_CTL1_RPD_STROBE (1 << 8)
 162#define XUSB_PADCTL_HSIC_PAD_CTL1_RPD_DATA (1 << 7)
 163#define XUSB_PADCTL_HSIC_PAD_CTL1_PD_ZI (1 << 5)
 164#define XUSB_PADCTL_HSIC_PAD_CTL1_PD_RX (1 << 4)
 165#define XUSB_PADCTL_HSIC_PAD_CTL1_PD_TRX (1 << 3)
 166#define XUSB_PADCTL_HSIC_PAD_CTL1_PD_TX (1 << 2)
 167#define XUSB_PADCTL_HSIC_PAD_CTL1_AUTO_TERM_EN (1 << 0)
 168
 169#define XUSB_PADCTL_HSIC_PADX_CTL2(x) (0x0d0 + (x) * 4)
 170#define XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_SHIFT 4
 171#define XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_MASK 0x7
 172#define XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_SHIFT 0
 173#define XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_MASK 0x7
 174
 175#define XUSB_PADCTL_HSIC_STRB_TRIM_CONTROL 0x0e0
 176#define XUSB_PADCTL_HSIC_STRB_TRIM_CONTROL_STRB_TRIM_MASK 0x1f
 177
 178#define XUSB_PADCTL_USB3_PAD_MUX 0x134
 179#define XUSB_PADCTL_USB3_PAD_MUX_PCIE_IDDQ_DISABLE(x) (1 << (1 + (x)))
 180#define XUSB_PADCTL_USB3_PAD_MUX_SATA_IDDQ_DISABLE(x) (1 << (6 + (x)))
 181
 182#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1 0x138
 183#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET (1 << 27)
 184#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE (1 << 24)
 185#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL0_REFCLK_NDIV_SHIFT 20
 186#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL0_REFCLK_NDIV_MASK 0x3
 187#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD (1 << 3)
 188#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST (1 << 1)
 189#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ (1 << 0)
 190
 191#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2 0x13c
 192#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL1_CP_CNTL_SHIFT 20
 193#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL1_CP_CNTL_MASK 0xf
 194#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL0_CP_CNTL_SHIFT 16
 195#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL0_CP_CNTL_MASK 0xf
 196#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_TCLKOUT_EN (1 << 12)
 197#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_TXCLKREF_SEL (1 << 4)
 198#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_XDIGCLK_SEL_SHIFT 0
 199#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_XDIGCLK_SEL_MASK 0x7
 200
 201#define XUSB_PADCTL_IOPHY_PLL_S0_CTL3 0x140
 202#define XUSB_PADCTL_IOPHY_PLL_S0_CTL3_RCAL_BYPASS (1 << 7)
 203
 204#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1 0x148
 205#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD (1 << 1)
 206#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ (1 << 0)
 207
 208#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL2 0x14c
 209
 210#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL5 0x158
 211
 212#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL6 0x15c
 213
 214struct tegra124_xusb_fuse_calibration {
 215	u32 hs_curr_level[3];
 216	u32 hs_iref_cap;
 217	u32 hs_term_range_adj;
 218	u32 hs_squelch_level;
 219};
 220
 221struct tegra124_xusb_padctl {
 222	struct tegra_xusb_padctl base;
 223
 224	struct tegra124_xusb_fuse_calibration fuse;
 225};
 226
 227static inline struct tegra124_xusb_padctl *
 228to_tegra124_xusb_padctl(struct tegra_xusb_padctl *padctl)
 229{
 230	return container_of(padctl, struct tegra124_xusb_padctl, base);
 231}
 232
 233static int tegra124_xusb_padctl_enable(struct tegra_xusb_padctl *padctl)
 234{
 235	u32 value;
 236
 237	mutex_lock(&padctl->lock);
 238
 239	if (padctl->enable++ > 0)
 240		goto out;
 241
 242	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 243	value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
 244	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 245
 246	usleep_range(100, 200);
 247
 248	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 249	value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
 250	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 251
 252	usleep_range(100, 200);
 253
 254	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 255	value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
 256	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 257
 258out:
 259	mutex_unlock(&padctl->lock);
 260	return 0;
 261}
 262
 263static int tegra124_xusb_padctl_disable(struct tegra_xusb_padctl *padctl)
 264{
 265	u32 value;
 266
 267	mutex_lock(&padctl->lock);
 268
 269	if (WARN_ON(padctl->enable == 0))
 270		goto out;
 271
 272	if (--padctl->enable > 0)
 273		goto out;
 274
 275	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 276	value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
 277	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 278
 279	usleep_range(100, 200);
 280
 281	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 282	value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
 283	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 284
 285	usleep_range(100, 200);
 286
 287	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 288	value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
 289	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 290
 291out:
 292	mutex_unlock(&padctl->lock);
 293	return 0;
 294}
 295
 296static int tegra124_usb3_save_context(struct tegra_xusb_padctl *padctl,
 297				      unsigned int index)
 298{
 299	struct tegra_xusb_usb3_port *port;
 300	struct tegra_xusb_lane *lane;
 301	u32 value, offset;
 302
 303	port = tegra_xusb_find_usb3_port(padctl, index);
 304	if (!port)
 305		return -ENODEV;
 306
 307	port->context_saved = true;
 308	lane = port->base.lane;
 309
 310	if (lane->pad == padctl->pcie)
 311		offset = XUSB_PADCTL_IOPHY_MISC_PAD_PX_CTL6(lane->index);
 312	else
 313		offset = XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL6;
 314
 315	value = padctl_readl(padctl, offset);
 316	value &= ~(XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_MASK <<
 317		   XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT);
 318	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_TAP <<
 319		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT;
 320	padctl_writel(padctl, value, offset);
 321
 322	value = padctl_readl(padctl, offset) >>
 323		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SHIFT;
 324	port->tap1 = value & XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_TAP_MASK;
 325
 326	value = padctl_readl(padctl, offset);
 327	value &= ~(XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_MASK <<
 328		   XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT);
 329	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_AMP <<
 330		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT;
 331	padctl_writel(padctl, value, offset);
 332
 333	value = padctl_readl(padctl, offset) >>
 334		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SHIFT;
 335	port->amp = value & XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_AMP_MASK;
 336
 337	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_USB3_PADX_CTL4(index));
 338	value &= ~((XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_MASK <<
 339		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_SHIFT) |
 340		   (XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_MASK <<
 341		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_SHIFT));
 342	value |= (port->tap1 <<
 343		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_SHIFT) |
 344		 (port->amp <<
 345		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_SHIFT);
 346	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_USB3_PADX_CTL4(index));
 347
 348	value = padctl_readl(padctl, offset);
 349	value &= ~(XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_MASK <<
 350		   XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT);
 351	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_LATCH_G_Z <<
 352		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT;
 353	padctl_writel(padctl, value, offset);
 354
 355	value = padctl_readl(padctl, offset);
 356	value &= ~(XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_MASK <<
 357		   XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT);
 358	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_G_Z <<
 359		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT;
 360	padctl_writel(padctl, value, offset);
 361
 362	value = padctl_readl(padctl, offset) >>
 363		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SHIFT;
 364	port->ctle_g = value &
 365		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_G_Z_MASK;
 366
 367	value = padctl_readl(padctl, offset);
 368	value &= ~(XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_MASK <<
 369		   XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT);
 370	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_CTLE_Z <<
 371		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SEL_SHIFT;
 372	padctl_writel(padctl, value, offset);
 373
 374	value = padctl_readl(padctl, offset) >>
 375		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_SHIFT;
 376	port->ctle_z = value &
 377		XUSB_PADCTL_IOPHY_MISC_PAD_CTL6_MISC_OUT_G_Z_MASK;
 378
 379	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_USB3_PADX_CTL2(index));
 380	value &= ~((XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_MASK <<
 381		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_SHIFT) |
 382		   (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_MASK <<
 383		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_SHIFT));
 384	value |= (port->ctle_g <<
 385		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_SHIFT) |
 386		 (port->ctle_z <<
 387		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_SHIFT);
 388	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_USB3_PADX_CTL2(index));
 389
 390	return 0;
 391}
 392
 393static int tegra124_hsic_set_idle(struct tegra_xusb_padctl *padctl,
 394				  unsigned int index, bool idle)
 395{
 396	u32 value;
 397
 398	value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 399
 400	if (idle)
 401		value |= XUSB_PADCTL_HSIC_PAD_CTL1_RPD_DATA |
 402			 XUSB_PADCTL_HSIC_PAD_CTL1_RPU_STROBE;
 403	else
 404		value &= ~(XUSB_PADCTL_HSIC_PAD_CTL1_RPD_DATA |
 405			   XUSB_PADCTL_HSIC_PAD_CTL1_RPU_STROBE);
 406
 407	padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 408
 409	return 0;
 410}
 411
 412#define TEGRA124_LANE(_name, _offset, _shift, _mask, _type)		\
 413	{								\
 414		.name = _name,						\
 415		.offset = _offset,					\
 416		.shift = _shift,					\
 417		.mask = _mask,						\
 418		.num_funcs = ARRAY_SIZE(tegra124_##_type##_functions),	\
 419		.funcs = tegra124_##_type##_functions,			\
 420	}
 421
 422static const char * const tegra124_usb2_functions[] = {
 423	"snps",
 424	"xusb",
 425	"uart",
 426};
 427
 428static const struct tegra_xusb_lane_soc tegra124_usb2_lanes[] = {
 429	TEGRA124_LANE("usb2-0", 0x004,  0, 0x3, usb2),
 430	TEGRA124_LANE("usb2-1", 0x004,  2, 0x3, usb2),
 431	TEGRA124_LANE("usb2-2", 0x004,  4, 0x3, usb2),
 432};
 433
 434static struct tegra_xusb_lane *
 435tegra124_usb2_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
 436			 unsigned int index)
 437{
 438	struct tegra_xusb_usb2_lane *usb2;
 439	int err;
 440
 441	usb2 = kzalloc(sizeof(*usb2), GFP_KERNEL);
 442	if (!usb2)
 443		return ERR_PTR(-ENOMEM);
 444
 445	INIT_LIST_HEAD(&usb2->base.list);
 446	usb2->base.soc = &pad->soc->lanes[index];
 447	usb2->base.index = index;
 448	usb2->base.pad = pad;
 449	usb2->base.np = np;
 450
 451	err = tegra_xusb_lane_parse_dt(&usb2->base, np);
 452	if (err < 0) {
 453		kfree(usb2);
 454		return ERR_PTR(err);
 455	}
 456
 457	return &usb2->base;
 458}
 459
 460static void tegra124_usb2_lane_remove(struct tegra_xusb_lane *lane)
 461{
 462	struct tegra_xusb_usb2_lane *usb2 = to_usb2_lane(lane);
 463
 464	kfree(usb2);
 465}
 466
 467static const struct tegra_xusb_lane_ops tegra124_usb2_lane_ops = {
 468	.probe = tegra124_usb2_lane_probe,
 469	.remove = tegra124_usb2_lane_remove,
 470};
 471
 472static int tegra124_usb2_phy_init(struct phy *phy)
 473{
 474	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 475
 476	return tegra124_xusb_padctl_enable(lane->pad->padctl);
 477}
 478
 479static int tegra124_usb2_phy_exit(struct phy *phy)
 480{
 481	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 482
 483	return tegra124_xusb_padctl_disable(lane->pad->padctl);
 484}
 485
 486static int tegra124_usb2_phy_power_on(struct phy *phy)
 487{
 488	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 489	struct tegra_xusb_usb2_lane *usb2 = to_usb2_lane(lane);
 490	struct tegra_xusb_usb2_pad *pad = to_usb2_pad(lane->pad);
 491	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
 492	struct tegra124_xusb_padctl *priv;
 493	struct tegra_xusb_usb2_port *port;
 494	unsigned int index = lane->index;
 495	u32 value;
 496	int err;
 497
 498	port = tegra_xusb_find_usb2_port(padctl, index);
 499	if (!port) {
 500		dev_err(&phy->dev, "no port found for USB2 lane %u\n", index);
 501		return -ENODEV;
 502	}
 503
 504	priv = to_tegra124_xusb_padctl(padctl);
 505
 506	value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
 507	value &= ~((XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_MASK <<
 508		    XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_SHIFT) |
 509		   (XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_MASK <<
 510		    XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_SHIFT));
 511	value |= (priv->fuse.hs_squelch_level <<
 512		  XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_SHIFT) |
 513		 (XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_VAL <<
 514		  XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_SHIFT);
 515	padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
 516
 517	value = padctl_readl(padctl, XUSB_PADCTL_USB2_PORT_CAP);
 518	value &= ~(XUSB_PADCTL_USB2_PORT_CAP_PORT_CAP_MASK <<
 519		   XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_SHIFT(index));
 520	value |= XUSB_PADCTL_USB2_PORT_CAP_HOST <<
 521		XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_SHIFT(index);
 522	padctl_writel(padctl, value, XUSB_PADCTL_USB2_PORT_CAP);
 523
 524	value = padctl_readl(padctl, XUSB_PADCTL_USB2_OTG_PADX_CTL0(index));
 525	value &= ~((XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_MASK <<
 526		    XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_SHIFT) |
 527		   (XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_MASK <<
 528		    XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_SHIFT) |
 529		   (XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_MASK <<
 530		    XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_SHIFT) |
 531		   XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD |
 532		   XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2 |
 533		   XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI);
 534	value |= (priv->fuse.hs_curr_level[index] +
 535		  usb2->hs_curr_level_offset) <<
 536		XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_SHIFT;
 537	value |= XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_VAL <<
 538		XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_SHIFT;
 539	value |= XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_VAL(index) <<
 540		XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_SHIFT;
 541	padctl_writel(padctl, value, XUSB_PADCTL_USB2_OTG_PADX_CTL0(index));
 542
 543	value = padctl_readl(padctl, XUSB_PADCTL_USB2_OTG_PADX_CTL1(index));
 544	value &= ~((XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_MASK <<
 545		    XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_SHIFT) |
 546		   (XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP_MASK <<
 547		    XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP_SHIFT) |
 548		   XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR |
 549		   XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_CHRP_FORCE_POWERUP |
 550		   XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DISC_FORCE_POWERUP);
 551	value |= (priv->fuse.hs_term_range_adj <<
 552		  XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_SHIFT) |
 553		 (priv->fuse.hs_iref_cap <<
 554		  XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP_SHIFT);
 555	padctl_writel(padctl, value, XUSB_PADCTL_USB2_OTG_PADX_CTL1(index));
 556
 557	err = regulator_enable(port->supply);
 558	if (err)
 559		return err;
 560
 561	mutex_lock(&pad->lock);
 562
 563	if (pad->enable++ > 0)
 564		goto out;
 565
 566	value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
 567	value &= ~XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD;
 568	padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
 569
 570out:
 571	mutex_unlock(&pad->lock);
 572	return 0;
 573}
 574
 575static int tegra124_usb2_phy_power_off(struct phy *phy)
 576{
 577	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 578	struct tegra_xusb_usb2_pad *pad = to_usb2_pad(lane->pad);
 579	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
 580	struct tegra_xusb_usb2_port *port;
 581	u32 value;
 582
 583	port = tegra_xusb_find_usb2_port(padctl, lane->index);
 584	if (!port) {
 585		dev_err(&phy->dev, "no port found for USB2 lane %u\n",
 586			lane->index);
 587		return -ENODEV;
 588	}
 589
 590	mutex_lock(&pad->lock);
 591
 592	if (WARN_ON(pad->enable == 0))
 593		goto out;
 594
 595	if (--pad->enable > 0)
 596		goto out;
 597
 598	value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
 599	value |= XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD;
 600	padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
 601
 602out:
 603	regulator_disable(port->supply);
 604	mutex_unlock(&pad->lock);
 605	return 0;
 606}
 607
 608static const struct phy_ops tegra124_usb2_phy_ops = {
 609	.init = tegra124_usb2_phy_init,
 610	.exit = tegra124_usb2_phy_exit,
 611	.power_on = tegra124_usb2_phy_power_on,
 612	.power_off = tegra124_usb2_phy_power_off,
 613	.owner = THIS_MODULE,
 614};
 615
 616static struct tegra_xusb_pad *
 617tegra124_usb2_pad_probe(struct tegra_xusb_padctl *padctl,
 618			const struct tegra_xusb_pad_soc *soc,
 619			struct device_node *np)
 620{
 621	struct tegra_xusb_usb2_pad *usb2;
 622	struct tegra_xusb_pad *pad;
 623	int err;
 624
 625	usb2 = kzalloc(sizeof(*usb2), GFP_KERNEL);
 626	if (!usb2)
 627		return ERR_PTR(-ENOMEM);
 628
 629	mutex_init(&usb2->lock);
 630
 631	pad = &usb2->base;
 632	pad->ops = &tegra124_usb2_lane_ops;
 633	pad->soc = soc;
 634
 635	err = tegra_xusb_pad_init(pad, padctl, np);
 636	if (err < 0) {
 637		kfree(usb2);
 638		goto out;
 639	}
 640
 641	err = tegra_xusb_pad_register(pad, &tegra124_usb2_phy_ops);
 642	if (err < 0)
 643		goto unregister;
 644
 645	dev_set_drvdata(&pad->dev, pad);
 646
 647	return pad;
 648
 649unregister:
 650	device_unregister(&pad->dev);
 651out:
 652	return ERR_PTR(err);
 653}
 654
 655static void tegra124_usb2_pad_remove(struct tegra_xusb_pad *pad)
 656{
 657	struct tegra_xusb_usb2_pad *usb2 = to_usb2_pad(pad);
 658
 659	kfree(usb2);
 660}
 661
 662static const struct tegra_xusb_pad_ops tegra124_usb2_ops = {
 663	.probe = tegra124_usb2_pad_probe,
 664	.remove = tegra124_usb2_pad_remove,
 665};
 666
 667static const struct tegra_xusb_pad_soc tegra124_usb2_pad = {
 668	.name = "usb2",
 669	.num_lanes = ARRAY_SIZE(tegra124_usb2_lanes),
 670	.lanes = tegra124_usb2_lanes,
 671	.ops = &tegra124_usb2_ops,
 672};
 673
 674static const char * const tegra124_ulpi_functions[] = {
 675	"snps",
 676	"xusb",
 677};
 678
 679static const struct tegra_xusb_lane_soc tegra124_ulpi_lanes[] = {
 680	TEGRA124_LANE("ulpi-0", 0x004, 12, 0x1, ulpi),
 681};
 682
 683static struct tegra_xusb_lane *
 684tegra124_ulpi_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
 685			 unsigned int index)
 686{
 687	struct tegra_xusb_ulpi_lane *ulpi;
 688	int err;
 689
 690	ulpi = kzalloc(sizeof(*ulpi), GFP_KERNEL);
 691	if (!ulpi)
 692		return ERR_PTR(-ENOMEM);
 693
 694	INIT_LIST_HEAD(&ulpi->base.list);
 695	ulpi->base.soc = &pad->soc->lanes[index];
 696	ulpi->base.index = index;
 697	ulpi->base.pad = pad;
 698	ulpi->base.np = np;
 699
 700	err = tegra_xusb_lane_parse_dt(&ulpi->base, np);
 701	if (err < 0) {
 702		kfree(ulpi);
 703		return ERR_PTR(err);
 704	}
 705
 706	return &ulpi->base;
 707}
 708
 709static void tegra124_ulpi_lane_remove(struct tegra_xusb_lane *lane)
 710{
 711	struct tegra_xusb_ulpi_lane *ulpi = to_ulpi_lane(lane);
 712
 713	kfree(ulpi);
 714}
 715
 716static const struct tegra_xusb_lane_ops tegra124_ulpi_lane_ops = {
 717	.probe = tegra124_ulpi_lane_probe,
 718	.remove = tegra124_ulpi_lane_remove,
 719};
 720
 721static int tegra124_ulpi_phy_init(struct phy *phy)
 722{
 723	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 724
 725	return tegra124_xusb_padctl_enable(lane->pad->padctl);
 726}
 727
 728static int tegra124_ulpi_phy_exit(struct phy *phy)
 729{
 730	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 731
 732	return tegra124_xusb_padctl_disable(lane->pad->padctl);
 733}
 734
 735static int tegra124_ulpi_phy_power_on(struct phy *phy)
 736{
 737	return 0;
 738}
 739
 740static int tegra124_ulpi_phy_power_off(struct phy *phy)
 741{
 742	return 0;
 743}
 744
 745static const struct phy_ops tegra124_ulpi_phy_ops = {
 746	.init = tegra124_ulpi_phy_init,
 747	.exit = tegra124_ulpi_phy_exit,
 748	.power_on = tegra124_ulpi_phy_power_on,
 749	.power_off = tegra124_ulpi_phy_power_off,
 750	.owner = THIS_MODULE,
 751};
 752
 753static struct tegra_xusb_pad *
 754tegra124_ulpi_pad_probe(struct tegra_xusb_padctl *padctl,
 755			const struct tegra_xusb_pad_soc *soc,
 756			struct device_node *np)
 757{
 758	struct tegra_xusb_ulpi_pad *ulpi;
 759	struct tegra_xusb_pad *pad;
 760	int err;
 761
 762	ulpi = kzalloc(sizeof(*ulpi), GFP_KERNEL);
 763	if (!ulpi)
 764		return ERR_PTR(-ENOMEM);
 765
 766	pad = &ulpi->base;
 767	pad->ops = &tegra124_ulpi_lane_ops;
 768	pad->soc = soc;
 769
 770	err = tegra_xusb_pad_init(pad, padctl, np);
 771	if (err < 0) {
 772		kfree(ulpi);
 773		goto out;
 774	}
 775
 776	err = tegra_xusb_pad_register(pad, &tegra124_ulpi_phy_ops);
 777	if (err < 0)
 778		goto unregister;
 779
 780	dev_set_drvdata(&pad->dev, pad);
 781
 782	return pad;
 783
 784unregister:
 785	device_unregister(&pad->dev);
 786out:
 787	return ERR_PTR(err);
 788}
 789
 790static void tegra124_ulpi_pad_remove(struct tegra_xusb_pad *pad)
 791{
 792	struct tegra_xusb_ulpi_pad *ulpi = to_ulpi_pad(pad);
 793
 794	kfree(ulpi);
 795}
 796
 797static const struct tegra_xusb_pad_ops tegra124_ulpi_ops = {
 798	.probe = tegra124_ulpi_pad_probe,
 799	.remove = tegra124_ulpi_pad_remove,
 800};
 801
 802static const struct tegra_xusb_pad_soc tegra124_ulpi_pad = {
 803	.name = "ulpi",
 804	.num_lanes = ARRAY_SIZE(tegra124_ulpi_lanes),
 805	.lanes = tegra124_ulpi_lanes,
 806	.ops = &tegra124_ulpi_ops,
 807};
 808
 809static const char * const tegra124_hsic_functions[] = {
 810	"snps",
 811	"xusb",
 812};
 813
 814static const struct tegra_xusb_lane_soc tegra124_hsic_lanes[] = {
 815	TEGRA124_LANE("hsic-0", 0x004, 14, 0x1, hsic),
 816	TEGRA124_LANE("hsic-1", 0x004, 15, 0x1, hsic),
 817};
 818
 819static struct tegra_xusb_lane *
 820tegra124_hsic_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
 821			 unsigned int index)
 822{
 823	struct tegra_xusb_hsic_lane *hsic;
 824	int err;
 825
 826	hsic = kzalloc(sizeof(*hsic), GFP_KERNEL);
 827	if (!hsic)
 828		return ERR_PTR(-ENOMEM);
 829
 830	INIT_LIST_HEAD(&hsic->base.list);
 831	hsic->base.soc = &pad->soc->lanes[index];
 832	hsic->base.index = index;
 833	hsic->base.pad = pad;
 834	hsic->base.np = np;
 835
 836	err = tegra_xusb_lane_parse_dt(&hsic->base, np);
 837	if (err < 0) {
 838		kfree(hsic);
 839		return ERR_PTR(err);
 840	}
 841
 842	return &hsic->base;
 843}
 844
 845static void tegra124_hsic_lane_remove(struct tegra_xusb_lane *lane)
 846{
 847	struct tegra_xusb_hsic_lane *hsic = to_hsic_lane(lane);
 848
 849	kfree(hsic);
 850}
 851
 852static const struct tegra_xusb_lane_ops tegra124_hsic_lane_ops = {
 853	.probe = tegra124_hsic_lane_probe,
 854	.remove = tegra124_hsic_lane_remove,
 855};
 856
 857static int tegra124_hsic_phy_init(struct phy *phy)
 858{
 859	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 860
 861	return tegra124_xusb_padctl_enable(lane->pad->padctl);
 862}
 863
 864static int tegra124_hsic_phy_exit(struct phy *phy)
 865{
 866	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 867
 868	return tegra124_xusb_padctl_disable(lane->pad->padctl);
 869}
 870
 871static int tegra124_hsic_phy_power_on(struct phy *phy)
 872{
 873	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 874	struct tegra_xusb_hsic_lane *hsic = to_hsic_lane(lane);
 875	struct tegra_xusb_hsic_pad *pad = to_hsic_pad(lane->pad);
 876	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
 877	unsigned int index = lane->index;
 878	u32 value;
 879	int err;
 880
 881	err = regulator_enable(pad->supply);
 882	if (err)
 883		return err;
 884
 885	padctl_writel(padctl, hsic->strobe_trim,
 886		      XUSB_PADCTL_HSIC_STRB_TRIM_CONTROL);
 887
 888	value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 889
 890	if (hsic->auto_term)
 891		value |= XUSB_PADCTL_HSIC_PAD_CTL1_AUTO_TERM_EN;
 892	else
 893		value &= ~XUSB_PADCTL_HSIC_PAD_CTL1_AUTO_TERM_EN;
 894
 895	padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 896
 897	value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL0(index));
 898	value &= ~((XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEN_MASK <<
 899		    XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEN_SHIFT) |
 900		   (XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEP_MASK <<
 901		    XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEP_SHIFT) |
 902		   (XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWN_MASK <<
 903		    XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWN_SHIFT) |
 904		   (XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWP_MASK <<
 905		    XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWP_SHIFT));
 906	value |= (hsic->tx_rtune_n <<
 907		  XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEN_SHIFT) |
 908		(hsic->tx_rtune_p <<
 909		  XUSB_PADCTL_HSIC_PAD_CTL0_TX_RTUNEP_SHIFT) |
 910		(hsic->tx_rslew_n <<
 911		 XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWN_SHIFT) |
 912		(hsic->tx_rslew_p <<
 913		 XUSB_PADCTL_HSIC_PAD_CTL0_TX_RSLEWP_SHIFT);
 914	padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL0(index));
 915
 916	value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL2(index));
 917	value &= ~((XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_MASK <<
 918		    XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_SHIFT) |
 919		   (XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_MASK <<
 920		    XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_SHIFT));
 921	value |= (hsic->rx_strobe_trim <<
 922		  XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_SHIFT) |
 923		(hsic->rx_data_trim <<
 924		 XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_SHIFT);
 925	padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL2(index));
 926
 927	value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 928	value &= ~(XUSB_PADCTL_HSIC_PAD_CTL1_RPD_STROBE |
 929		   XUSB_PADCTL_HSIC_PAD_CTL1_RPU_DATA |
 930		   XUSB_PADCTL_HSIC_PAD_CTL1_PD_RX |
 931		   XUSB_PADCTL_HSIC_PAD_CTL1_PD_ZI |
 932		   XUSB_PADCTL_HSIC_PAD_CTL1_PD_TRX |
 933		   XUSB_PADCTL_HSIC_PAD_CTL1_PD_TX);
 934	value |= XUSB_PADCTL_HSIC_PAD_CTL1_RPD_DATA |
 935		 XUSB_PADCTL_HSIC_PAD_CTL1_RPU_STROBE;
 936	padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 937
 938	return 0;
 939}
 940
 941static int tegra124_hsic_phy_power_off(struct phy *phy)
 942{
 943	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 944	struct tegra_xusb_hsic_pad *pad = to_hsic_pad(lane->pad);
 945	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
 946	unsigned int index = lane->index;
 947	u32 value;
 948
 949	value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 950	value |= XUSB_PADCTL_HSIC_PAD_CTL1_PD_RX |
 951		 XUSB_PADCTL_HSIC_PAD_CTL1_PD_ZI |
 952		 XUSB_PADCTL_HSIC_PAD_CTL1_PD_TRX |
 953		 XUSB_PADCTL_HSIC_PAD_CTL1_PD_TX;
 954	padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL1(index));
 955
 956	regulator_disable(pad->supply);
 957
 958	return 0;
 959}
 960
 961static const struct phy_ops tegra124_hsic_phy_ops = {
 962	.init = tegra124_hsic_phy_init,
 963	.exit = tegra124_hsic_phy_exit,
 964	.power_on = tegra124_hsic_phy_power_on,
 965	.power_off = tegra124_hsic_phy_power_off,
 966	.owner = THIS_MODULE,
 967};
 968
 969static struct tegra_xusb_pad *
 970tegra124_hsic_pad_probe(struct tegra_xusb_padctl *padctl,
 971			const struct tegra_xusb_pad_soc *soc,
 972			struct device_node *np)
 973{
 974	struct tegra_xusb_hsic_pad *hsic;
 975	struct tegra_xusb_pad *pad;
 976	int err;
 977
 978	hsic = kzalloc(sizeof(*hsic), GFP_KERNEL);
 979	if (!hsic)
 980		return ERR_PTR(-ENOMEM);
 981
 982	pad = &hsic->base;
 983	pad->ops = &tegra124_hsic_lane_ops;
 984	pad->soc = soc;
 985
 986	err = tegra_xusb_pad_init(pad, padctl, np);
 987	if (err < 0) {
 988		kfree(hsic);
 989		goto out;
 990	}
 991
 992	err = tegra_xusb_pad_register(pad, &tegra124_hsic_phy_ops);
 993	if (err < 0)
 994		goto unregister;
 995
 996	dev_set_drvdata(&pad->dev, pad);
 997
 998	return pad;
 999
1000unregister:
1001	device_unregister(&pad->dev);
1002out:
1003	return ERR_PTR(err);
1004}
1005
1006static void tegra124_hsic_pad_remove(struct tegra_xusb_pad *pad)
1007{
1008	struct tegra_xusb_hsic_pad *hsic = to_hsic_pad(pad);
1009
1010	kfree(hsic);
1011}
1012
1013static const struct tegra_xusb_pad_ops tegra124_hsic_ops = {
1014	.probe = tegra124_hsic_pad_probe,
1015	.remove = tegra124_hsic_pad_remove,
1016};
1017
1018static const struct tegra_xusb_pad_soc tegra124_hsic_pad = {
1019	.name = "hsic",
1020	.num_lanes = ARRAY_SIZE(tegra124_hsic_lanes),
1021	.lanes = tegra124_hsic_lanes,
1022	.ops = &tegra124_hsic_ops,
1023};
1024
1025static const char * const tegra124_pcie_functions[] = {
1026	"pcie",
1027	"usb3-ss",
1028	"sata",
1029};
1030
1031static const struct tegra_xusb_lane_soc tegra124_pcie_lanes[] = {
1032	TEGRA124_LANE("pcie-0", 0x134, 16, 0x3, pcie),
1033	TEGRA124_LANE("pcie-1", 0x134, 18, 0x3, pcie),
1034	TEGRA124_LANE("pcie-2", 0x134, 20, 0x3, pcie),
1035	TEGRA124_LANE("pcie-3", 0x134, 22, 0x3, pcie),
1036	TEGRA124_LANE("pcie-4", 0x134, 24, 0x3, pcie),
1037};
1038
1039static struct tegra_xusb_lane *
1040tegra124_pcie_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
1041			 unsigned int index)
1042{
1043	struct tegra_xusb_pcie_lane *pcie;
1044	int err;
1045
1046	pcie = kzalloc(sizeof(*pcie), GFP_KERNEL);
1047	if (!pcie)
1048		return ERR_PTR(-ENOMEM);
1049
1050	INIT_LIST_HEAD(&pcie->base.list);
1051	pcie->base.soc = &pad->soc->lanes[index];
1052	pcie->base.index = index;
1053	pcie->base.pad = pad;
1054	pcie->base.np = np;
1055
1056	err = tegra_xusb_lane_parse_dt(&pcie->base, np);
1057	if (err < 0) {
1058		kfree(pcie);
1059		return ERR_PTR(err);
1060	}
1061
1062	return &pcie->base;
1063}
1064
1065static void tegra124_pcie_lane_remove(struct tegra_xusb_lane *lane)
1066{
1067	struct tegra_xusb_pcie_lane *pcie = to_pcie_lane(lane);
1068
1069	kfree(pcie);
1070}
1071
1072static const struct tegra_xusb_lane_ops tegra124_pcie_lane_ops = {
1073	.probe = tegra124_pcie_lane_probe,
1074	.remove = tegra124_pcie_lane_remove,
1075};
1076
1077static int tegra124_pcie_phy_init(struct phy *phy)
1078{
1079	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1080
1081	return tegra124_xusb_padctl_enable(lane->pad->padctl);
1082}
1083
1084static int tegra124_pcie_phy_exit(struct phy *phy)
1085{
1086	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1087
1088	return tegra124_xusb_padctl_disable(lane->pad->padctl);
1089}
1090
1091static int tegra124_pcie_phy_power_on(struct phy *phy)
1092{
1093	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1094	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
1095	unsigned long timeout;
1096	int err = -ETIMEDOUT;
1097	u32 value;
1098
1099	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1100	value &= ~XUSB_PADCTL_IOPHY_PLL_P0_CTL1_REFCLK_SEL_MASK;
1101	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1102
1103	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL2);
1104	value |= XUSB_PADCTL_IOPHY_PLL_P0_CTL2_REFCLKBUF_EN |
1105		 XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_EN |
1106		 XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_SEL;
1107	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL2);
1108
1109	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1110	value |= XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST;
1111	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1112
1113	timeout = jiffies + msecs_to_jiffies(50);
1114
1115	while (time_before(jiffies, timeout)) {
1116		value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1117		if (value & XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL0_LOCKDET) {
1118			err = 0;
1119			break;
1120		}
1121
1122		usleep_range(100, 200);
1123	}
1124
1125	value = padctl_readl(padctl, XUSB_PADCTL_USB3_PAD_MUX);
1126	value |= XUSB_PADCTL_USB3_PAD_MUX_PCIE_IDDQ_DISABLE(lane->index);
1127	padctl_writel(padctl, value, XUSB_PADCTL_USB3_PAD_MUX);
1128
1129	return err;
1130}
1131
1132static int tegra124_pcie_phy_power_off(struct phy *phy)
1133{
1134	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1135	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
1136	u32 value;
1137
1138	value = padctl_readl(padctl, XUSB_PADCTL_USB3_PAD_MUX);
1139	value &= ~XUSB_PADCTL_USB3_PAD_MUX_PCIE_IDDQ_DISABLE(lane->index);
1140	padctl_writel(padctl, value, XUSB_PADCTL_USB3_PAD_MUX);
1141
1142	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1143	value &= ~XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST;
1144	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
1145
1146	return 0;
1147}
1148
1149static const struct phy_ops tegra124_pcie_phy_ops = {
1150	.init = tegra124_pcie_phy_init,
1151	.exit = tegra124_pcie_phy_exit,
1152	.power_on = tegra124_pcie_phy_power_on,
1153	.power_off = tegra124_pcie_phy_power_off,
1154	.owner = THIS_MODULE,
1155};
1156
1157static struct tegra_xusb_pad *
1158tegra124_pcie_pad_probe(struct tegra_xusb_padctl *padctl,
1159			const struct tegra_xusb_pad_soc *soc,
1160			struct device_node *np)
1161{
1162	struct tegra_xusb_pcie_pad *pcie;
1163	struct tegra_xusb_pad *pad;
1164	int err;
1165
1166	pcie = kzalloc(sizeof(*pcie), GFP_KERNEL);
1167	if (!pcie)
1168		return ERR_PTR(-ENOMEM);
1169
1170	pad = &pcie->base;
1171	pad->ops = &tegra124_pcie_lane_ops;
1172	pad->soc = soc;
1173
1174	err = tegra_xusb_pad_init(pad, padctl, np);
1175	if (err < 0) {
1176		kfree(pcie);
1177		goto out;
1178	}
1179
1180	err = tegra_xusb_pad_register(pad, &tegra124_pcie_phy_ops);
1181	if (err < 0)
1182		goto unregister;
1183
1184	dev_set_drvdata(&pad->dev, pad);
1185
1186	return pad;
1187
1188unregister:
1189	device_unregister(&pad->dev);
1190out:
1191	return ERR_PTR(err);
1192}
1193
1194static void tegra124_pcie_pad_remove(struct tegra_xusb_pad *pad)
1195{
1196	struct tegra_xusb_pcie_pad *pcie = to_pcie_pad(pad);
1197
1198	kfree(pcie);
1199}
1200
1201static const struct tegra_xusb_pad_ops tegra124_pcie_ops = {
1202	.probe = tegra124_pcie_pad_probe,
1203	.remove = tegra124_pcie_pad_remove,
1204};
1205
1206static const struct tegra_xusb_pad_soc tegra124_pcie_pad = {
1207	.name = "pcie",
1208	.num_lanes = ARRAY_SIZE(tegra124_pcie_lanes),
1209	.lanes = tegra124_pcie_lanes,
1210	.ops = &tegra124_pcie_ops,
1211};
1212
1213static const struct tegra_xusb_lane_soc tegra124_sata_lanes[] = {
1214	TEGRA124_LANE("sata-0", 0x134, 26, 0x3, pcie),
1215};
1216
1217static struct tegra_xusb_lane *
1218tegra124_sata_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
1219			 unsigned int index)
1220{
1221	struct tegra_xusb_sata_lane *sata;
1222	int err;
1223
1224	sata = kzalloc(sizeof(*sata), GFP_KERNEL);
1225	if (!sata)
1226		return ERR_PTR(-ENOMEM);
1227
1228	INIT_LIST_HEAD(&sata->base.list);
1229	sata->base.soc = &pad->soc->lanes[index];
1230	sata->base.index = index;
1231	sata->base.pad = pad;
1232	sata->base.np = np;
1233
1234	err = tegra_xusb_lane_parse_dt(&sata->base, np);
1235	if (err < 0) {
1236		kfree(sata);
1237		return ERR_PTR(err);
1238	}
1239
1240	return &sata->base;
1241}
1242
1243static void tegra124_sata_lane_remove(struct tegra_xusb_lane *lane)
1244{
1245	struct tegra_xusb_sata_lane *sata = to_sata_lane(lane);
1246
1247	kfree(sata);
1248}
1249
1250static const struct tegra_xusb_lane_ops tegra124_sata_lane_ops = {
1251	.probe = tegra124_sata_lane_probe,
1252	.remove = tegra124_sata_lane_remove,
1253};
1254
1255static int tegra124_sata_phy_init(struct phy *phy)
1256{
1257	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1258
1259	return tegra124_xusb_padctl_enable(lane->pad->padctl);
1260}
1261
1262static int tegra124_sata_phy_exit(struct phy *phy)
1263{
1264	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1265
1266	return tegra124_xusb_padctl_disable(lane->pad->padctl);
1267}
1268
1269static int tegra124_sata_phy_power_on(struct phy *phy)
1270{
1271	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1272	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
1273	unsigned long timeout;
1274	int err = -ETIMEDOUT;
1275	u32 value;
1276
1277	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
1278	value &= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD;
1279	value &= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ;
1280	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
1281
1282	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1283	value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD;
1284	value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ;
1285	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1286
1287	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1288	value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE;
1289	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1290
1291	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1292	value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST;
1293	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1294
1295	timeout = jiffies + msecs_to_jiffies(50);
1296
1297	while (time_before(jiffies, timeout)) {
1298		value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1299		if (value & XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET) {
1300			err = 0;
1301			break;
1302		}
1303
1304		usleep_range(100, 200);
1305	}
1306
1307	value = padctl_readl(padctl, XUSB_PADCTL_USB3_PAD_MUX);
1308	value |= XUSB_PADCTL_USB3_PAD_MUX_SATA_IDDQ_DISABLE(lane->index);
1309	padctl_writel(padctl, value, XUSB_PADCTL_USB3_PAD_MUX);
1310
1311	return err;
1312}
1313
1314static int tegra124_sata_phy_power_off(struct phy *phy)
1315{
1316	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
1317	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
1318	u32 value;
1319
1320	value = padctl_readl(padctl, XUSB_PADCTL_USB3_PAD_MUX);
1321	value &= ~XUSB_PADCTL_USB3_PAD_MUX_SATA_IDDQ_DISABLE(lane->index);
1322	padctl_writel(padctl, value, XUSB_PADCTL_USB3_PAD_MUX);
1323
1324	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1325	value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST;
1326	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1327
1328	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1329	value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE;
1330	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1331
1332	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1333	value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD;
1334	value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ;
1335	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1336
1337	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
1338	value |= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD;
1339	value |= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ;
1340	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
1341
1342	return 0;
1343}
1344
1345static const struct phy_ops tegra124_sata_phy_ops = {
1346	.init = tegra124_sata_phy_init,
1347	.exit = tegra124_sata_phy_exit,
1348	.power_on = tegra124_sata_phy_power_on,
1349	.power_off = tegra124_sata_phy_power_off,
1350	.owner = THIS_MODULE,
1351};
1352
1353static struct tegra_xusb_pad *
1354tegra124_sata_pad_probe(struct tegra_xusb_padctl *padctl,
1355			const struct tegra_xusb_pad_soc *soc,
1356			struct device_node *np)
1357{
1358	struct tegra_xusb_sata_pad *sata;
1359	struct tegra_xusb_pad *pad;
1360	int err;
1361
1362	sata = kzalloc(sizeof(*sata), GFP_KERNEL);
1363	if (!sata)
1364		return ERR_PTR(-ENOMEM);
1365
1366	pad = &sata->base;
1367	pad->ops = &tegra124_sata_lane_ops;
1368	pad->soc = soc;
1369
1370	err = tegra_xusb_pad_init(pad, padctl, np);
1371	if (err < 0) {
1372		kfree(sata);
1373		goto out;
1374	}
1375
1376	err = tegra_xusb_pad_register(pad, &tegra124_sata_phy_ops);
1377	if (err < 0)
1378		goto unregister;
1379
1380	dev_set_drvdata(&pad->dev, pad);
1381
1382	return pad;
1383
1384unregister:
1385	device_unregister(&pad->dev);
1386out:
1387	return ERR_PTR(err);
1388}
1389
1390static void tegra124_sata_pad_remove(struct tegra_xusb_pad *pad)
1391{
1392	struct tegra_xusb_sata_pad *sata = to_sata_pad(pad);
1393
1394	kfree(sata);
1395}
1396
1397static const struct tegra_xusb_pad_ops tegra124_sata_ops = {
1398	.probe = tegra124_sata_pad_probe,
1399	.remove = tegra124_sata_pad_remove,
1400};
1401
1402static const struct tegra_xusb_pad_soc tegra124_sata_pad = {
1403	.name = "sata",
1404	.num_lanes = ARRAY_SIZE(tegra124_sata_lanes),
1405	.lanes = tegra124_sata_lanes,
1406	.ops = &tegra124_sata_ops,
1407};
1408
1409static const struct tegra_xusb_pad_soc *tegra124_pads[] = {
1410	&tegra124_usb2_pad,
1411	&tegra124_ulpi_pad,
1412	&tegra124_hsic_pad,
1413	&tegra124_pcie_pad,
1414	&tegra124_sata_pad,
1415};
1416
1417static int tegra124_usb2_port_enable(struct tegra_xusb_port *port)
1418{
1419	return 0;
1420}
1421
1422static void tegra124_usb2_port_disable(struct tegra_xusb_port *port)
1423{
1424}
1425
1426static struct tegra_xusb_lane *
1427tegra124_usb2_port_map(struct tegra_xusb_port *port)
1428{
1429	return tegra_xusb_find_lane(port->padctl, "usb2", port->index);
1430}
1431
1432static const struct tegra_xusb_port_ops tegra124_usb2_port_ops = {
 
 
1433	.enable = tegra124_usb2_port_enable,
1434	.disable = tegra124_usb2_port_disable,
1435	.map = tegra124_usb2_port_map,
1436};
1437
1438static int tegra124_ulpi_port_enable(struct tegra_xusb_port *port)
1439{
1440	return 0;
1441}
1442
1443static void tegra124_ulpi_port_disable(struct tegra_xusb_port *port)
1444{
1445}
1446
1447static struct tegra_xusb_lane *
1448tegra124_ulpi_port_map(struct tegra_xusb_port *port)
1449{
1450	return tegra_xusb_find_lane(port->padctl, "ulpi", port->index);
1451}
1452
1453static const struct tegra_xusb_port_ops tegra124_ulpi_port_ops = {
 
1454	.enable = tegra124_ulpi_port_enable,
1455	.disable = tegra124_ulpi_port_disable,
1456	.map = tegra124_ulpi_port_map,
1457};
1458
1459static int tegra124_hsic_port_enable(struct tegra_xusb_port *port)
1460{
1461	return 0;
1462}
1463
1464static void tegra124_hsic_port_disable(struct tegra_xusb_port *port)
1465{
1466}
1467
1468static struct tegra_xusb_lane *
1469tegra124_hsic_port_map(struct tegra_xusb_port *port)
1470{
1471	return tegra_xusb_find_lane(port->padctl, "hsic", port->index);
1472}
1473
1474static const struct tegra_xusb_port_ops tegra124_hsic_port_ops = {
 
1475	.enable = tegra124_hsic_port_enable,
1476	.disable = tegra124_hsic_port_disable,
1477	.map = tegra124_hsic_port_map,
1478};
1479
1480static int tegra124_usb3_port_enable(struct tegra_xusb_port *port)
1481{
1482	struct tegra_xusb_usb3_port *usb3 = to_usb3_port(port);
1483	struct tegra_xusb_padctl *padctl = port->padctl;
1484	struct tegra_xusb_lane *lane = usb3->base.lane;
1485	unsigned int index = port->index, offset;
1486	u32 value;
1487
1488	value = padctl_readl(padctl, XUSB_PADCTL_SS_PORT_MAP);
1489
1490	if (!usb3->internal)
1491		value &= ~XUSB_PADCTL_SS_PORT_MAP_PORTX_INTERNAL(index);
1492	else
1493		value |= XUSB_PADCTL_SS_PORT_MAP_PORTX_INTERNAL(index);
1494
1495	value &= ~XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP_MASK(index);
1496	value |= XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP(index, usb3->port);
1497	padctl_writel(padctl, value, XUSB_PADCTL_SS_PORT_MAP);
1498
1499	/*
1500	 * TODO: move this code into the PCIe/SATA PHY ->power_on() callbacks
1501	 * and conditionalize based on mux function? This seems to work, but
1502	 * might not be the exact proper sequence.
1503	 */
1504	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_USB3_PADX_CTL2(index));
1505	value &= ~((XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_MASK <<
1506		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_SHIFT) |
1507		   (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_MASK <<
1508		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_SHIFT) |
1509		   (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_MASK <<
1510		    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_SHIFT));
1511	value |= (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_VAL <<
1512		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_WANDER_SHIFT) |
1513		 (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_VAL <<
1514		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_CDR_CNTL_SHIFT) |
1515		 (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_VAL <<
1516		  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_SHIFT);
1517
1518	if (usb3->context_saved) {
1519		value &= ~((XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_MASK <<
1520			    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_SHIFT) |
1521			   (XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_MASK <<
1522			    XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_SHIFT));
1523		value |= (usb3->ctle_g <<
1524			  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_G_SHIFT) |
1525			 (usb3->ctle_z <<
1526			  XUSB_PADCTL_IOPHY_USB3_PAD_CTL2_RX_EQ_Z_SHIFT);
1527	}
1528
1529	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_USB3_PADX_CTL2(index));
1530
1531	value = XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_VAL;
1532
1533	if (usb3->context_saved) {
1534		value &= ~((XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_MASK <<
1535			    XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_SHIFT) |
1536			   (XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_MASK <<
1537			    XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_SHIFT));
1538		value |= (usb3->tap1 <<
1539			  XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_TAP_SHIFT) |
1540			 (usb3->amp <<
1541			  XUSB_PADCTL_IOPHY_USB3_PAD_CTL4_DFE_CNTL_AMP_SHIFT);
1542	}
1543
1544	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_USB3_PADX_CTL4(index));
1545
1546	if (lane->pad == padctl->pcie)
1547		offset = XUSB_PADCTL_IOPHY_MISC_PAD_PX_CTL2(lane->index);
1548	else
1549		offset = XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL2;
1550
1551	value = padctl_readl(padctl, offset);
1552	value &= ~(XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_MASK <<
1553		   XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_SHIFT);
1554	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_VAL <<
1555		XUSB_PADCTL_IOPHY_MISC_PAD_CTL2_SPARE_IN_SHIFT;
1556	padctl_writel(padctl, value, offset);
1557
1558	if (lane->pad == padctl->pcie)
1559		offset = XUSB_PADCTL_IOPHY_MISC_PAD_PX_CTL5(lane->index);
1560	else
1561		offset = XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL5;
1562
1563	value = padctl_readl(padctl, offset);
1564	value |= XUSB_PADCTL_IOPHY_MISC_PAD_CTL5_RX_QEYE_EN;
1565	padctl_writel(padctl, value, offset);
1566
1567	/* Enable SATA PHY when SATA lane is used */
1568	if (lane->pad == padctl->sata) {
1569		value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1570		value &= ~(XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL0_REFCLK_NDIV_MASK <<
1571			   XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL0_REFCLK_NDIV_SHIFT);
1572		value |= 0x2 <<
1573			XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL0_REFCLK_NDIV_SHIFT;
1574		padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
1575
1576		value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL2);
1577		value &= ~((XUSB_PADCTL_IOPHY_PLL_S0_CTL2_XDIGCLK_SEL_MASK <<
1578			    XUSB_PADCTL_IOPHY_PLL_S0_CTL2_XDIGCLK_SEL_SHIFT) |
1579			   (XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL1_CP_CNTL_MASK <<
1580			    XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL1_CP_CNTL_SHIFT) |
1581			   (XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL0_CP_CNTL_MASK <<
1582			    XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL0_CP_CNTL_SHIFT) |
1583			   XUSB_PADCTL_IOPHY_PLL_S0_CTL2_TCLKOUT_EN);
1584		value |= (0x7 <<
1585			  XUSB_PADCTL_IOPHY_PLL_S0_CTL2_XDIGCLK_SEL_SHIFT) |
1586			 (0x8 <<
1587			  XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL1_CP_CNTL_SHIFT) |
1588			 (0x8 <<
1589			  XUSB_PADCTL_IOPHY_PLL_S0_CTL2_PLL0_CP_CNTL_SHIFT) |
1590			 XUSB_PADCTL_IOPHY_PLL_S0_CTL2_TXCLKREF_SEL;
1591		padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL2);
1592
1593		value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL3);
1594		value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL3_RCAL_BYPASS;
1595		padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL3);
1596	}
1597
1598	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
1599	value &= ~XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_VCORE_DOWN(index);
1600	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
1601
1602	usleep_range(100, 200);
1603
1604	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
1605	value &= ~XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_CLAMP_EN_EARLY(index);
1606	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
1607
1608	usleep_range(100, 200);
1609
1610	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
1611	value &= ~XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_CLAMP_EN(index);
1612	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
1613
1614	return 0;
1615}
1616
1617static void tegra124_usb3_port_disable(struct tegra_xusb_port *port)
1618{
1619	struct tegra_xusb_padctl *padctl = port->padctl;
1620	u32 value;
1621
1622	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
1623	value |= XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_CLAMP_EN_EARLY(port->index);
1624	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
1625
1626	usleep_range(100, 200);
1627
1628	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
1629	value |= XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_CLAMP_EN(port->index);
1630	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
1631
1632	usleep_range(250, 350);
1633
1634	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
1635	value |= XUSB_PADCTL_ELPG_PROGRAM_SSPX_ELPG_VCORE_DOWN(port->index);
1636	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
1637
1638	value = padctl_readl(padctl, XUSB_PADCTL_SS_PORT_MAP);
1639	value &= ~XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP_MASK(port->index);
1640	value |= XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP(port->index, 0x7);
1641	padctl_writel(padctl, value, XUSB_PADCTL_SS_PORT_MAP);
1642}
1643
1644static const struct tegra_xusb_lane_map tegra124_usb3_map[] = {
1645	{ 0, "pcie", 0 },
1646	{ 1, "pcie", 1 },
1647	{ 1, "sata", 0 },
1648	{ 0, NULL,   0 },
1649};
1650
1651static struct tegra_xusb_lane *
1652tegra124_usb3_port_map(struct tegra_xusb_port *port)
1653{
1654	return tegra_xusb_port_find_lane(port, tegra124_usb3_map, "usb3-ss");
1655}
1656
1657static const struct tegra_xusb_port_ops tegra124_usb3_port_ops = {
 
1658	.enable = tegra124_usb3_port_enable,
1659	.disable = tegra124_usb3_port_disable,
1660	.map = tegra124_usb3_port_map,
1661};
1662
1663static int
1664tegra124_xusb_read_fuse_calibration(struct tegra124_xusb_fuse_calibration *fuse)
1665{
1666	unsigned int i;
1667	int err;
1668	u32 value;
1669
1670	err = tegra_fuse_readl(TEGRA_FUSE_SKU_CALIB_0, &value);
1671	if (err < 0)
1672		return err;
1673
1674	for (i = 0; i < ARRAY_SIZE(fuse->hs_curr_level); i++) {
1675		fuse->hs_curr_level[i] =
1676			(value >> FUSE_SKU_CALIB_HS_CURR_LEVEL_PADX_SHIFT(i)) &
1677			FUSE_SKU_CALIB_HS_CURR_LEVEL_PAD_MASK;
1678	}
1679	fuse->hs_iref_cap =
1680		(value >> FUSE_SKU_CALIB_HS_IREF_CAP_SHIFT) &
1681		FUSE_SKU_CALIB_HS_IREF_CAP_MASK;
1682	fuse->hs_term_range_adj =
1683		(value >> FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_SHIFT) &
1684		FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_MASK;
1685	fuse->hs_squelch_level =
1686		(value >> FUSE_SKU_CALIB_HS_SQUELCH_LEVEL_SHIFT) &
1687		FUSE_SKU_CALIB_HS_SQUELCH_LEVEL_MASK;
1688
1689	return 0;
1690}
1691
1692static struct tegra_xusb_padctl *
1693tegra124_xusb_padctl_probe(struct device *dev,
1694			   const struct tegra_xusb_padctl_soc *soc)
1695{
1696	struct tegra124_xusb_padctl *padctl;
1697	int err;
1698
1699	padctl = devm_kzalloc(dev, sizeof(*padctl), GFP_KERNEL);
1700	if (!padctl)
1701		return ERR_PTR(-ENOMEM);
1702
1703	padctl->base.dev = dev;
1704	padctl->base.soc = soc;
1705
1706	err = tegra124_xusb_read_fuse_calibration(&padctl->fuse);
1707	if (err < 0)
1708		return ERR_PTR(err);
1709
1710	return &padctl->base;
1711}
1712
1713static void tegra124_xusb_padctl_remove(struct tegra_xusb_padctl *padctl)
1714{
1715}
1716
1717static const struct tegra_xusb_padctl_ops tegra124_xusb_padctl_ops = {
1718	.probe = tegra124_xusb_padctl_probe,
1719	.remove = tegra124_xusb_padctl_remove,
1720	.usb3_save_context = tegra124_usb3_save_context,
1721	.hsic_set_idle = tegra124_hsic_set_idle,
1722};
1723
 
 
 
 
 
 
 
1724const struct tegra_xusb_padctl_soc tegra124_xusb_padctl_soc = {
1725	.num_pads = ARRAY_SIZE(tegra124_pads),
1726	.pads = tegra124_pads,
1727	.ports = {
1728		.usb2 = {
1729			.ops = &tegra124_usb2_port_ops,
1730			.count = 3,
1731		},
1732		.ulpi = {
1733			.ops = &tegra124_ulpi_port_ops,
1734			.count = 1,
1735		},
1736		.hsic = {
1737			.ops = &tegra124_hsic_port_ops,
1738			.count = 2,
1739		},
1740		.usb3 = {
1741			.ops = &tegra124_usb3_port_ops,
1742			.count = 2,
1743		},
1744	},
1745	.ops = &tegra124_xusb_padctl_ops,
 
 
1746};
1747EXPORT_SYMBOL_GPL(tegra124_xusb_padctl_soc);
1748
1749MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
1750MODULE_DESCRIPTION("NVIDIA Tegra 124 XUSB Pad Controller driver");
1751MODULE_LICENSE("GPL v2");