xusb-tegra124.c (53724B)
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 .remove = tegra_xusb_usb3_port_remove, 1656 .enable = tegra124_usb3_port_enable, 1657 .disable = tegra124_usb3_port_disable, 1658 .map = tegra124_usb3_port_map, 1659}; 1660 1661static int 1662tegra124_xusb_read_fuse_calibration(struct tegra124_xusb_fuse_calibration *fuse) 1663{ 1664 unsigned int i; 1665 int err; 1666 u32 value; 1667 1668 err = tegra_fuse_readl(TEGRA_FUSE_SKU_CALIB_0, &value); 1669 if (err < 0) 1670 return err; 1671 1672 for (i = 0; i < ARRAY_SIZE(fuse->hs_curr_level); i++) { 1673 fuse->hs_curr_level[i] = 1674 (value >> FUSE_SKU_CALIB_HS_CURR_LEVEL_PADX_SHIFT(i)) & 1675 FUSE_SKU_CALIB_HS_CURR_LEVEL_PAD_MASK; 1676 } 1677 fuse->hs_iref_cap = 1678 (value >> FUSE_SKU_CALIB_HS_IREF_CAP_SHIFT) & 1679 FUSE_SKU_CALIB_HS_IREF_CAP_MASK; 1680 fuse->hs_term_range_adj = 1681 (value >> FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_SHIFT) & 1682 FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_MASK; 1683 fuse->hs_squelch_level = 1684 (value >> FUSE_SKU_CALIB_HS_SQUELCH_LEVEL_SHIFT) & 1685 FUSE_SKU_CALIB_HS_SQUELCH_LEVEL_MASK; 1686 1687 return 0; 1688} 1689 1690static struct tegra_xusb_padctl * 1691tegra124_xusb_padctl_probe(struct device *dev, 1692 const struct tegra_xusb_padctl_soc *soc) 1693{ 1694 struct tegra124_xusb_padctl *padctl; 1695 int err; 1696 1697 padctl = devm_kzalloc(dev, sizeof(*padctl), GFP_KERNEL); 1698 if (!padctl) 1699 return ERR_PTR(-ENOMEM); 1700 1701 padctl->base.dev = dev; 1702 padctl->base.soc = soc; 1703 1704 err = tegra124_xusb_read_fuse_calibration(&padctl->fuse); 1705 if (err < 0) 1706 return ERR_PTR(err); 1707 1708 return &padctl->base; 1709} 1710 1711static void tegra124_xusb_padctl_remove(struct tegra_xusb_padctl *padctl) 1712{ 1713} 1714 1715static const struct tegra_xusb_padctl_ops tegra124_xusb_padctl_ops = { 1716 .probe = tegra124_xusb_padctl_probe, 1717 .remove = tegra124_xusb_padctl_remove, 1718 .usb3_save_context = tegra124_usb3_save_context, 1719 .hsic_set_idle = tegra124_hsic_set_idle, 1720}; 1721 1722static const char * const tegra124_xusb_padctl_supply_names[] = { 1723 "avdd-pll-utmip", 1724 "avdd-pll-erefe", 1725 "avdd-pex-pll", 1726 "hvdd-pex-pll-e", 1727}; 1728 1729const struct tegra_xusb_padctl_soc tegra124_xusb_padctl_soc = { 1730 .num_pads = ARRAY_SIZE(tegra124_pads), 1731 .pads = tegra124_pads, 1732 .ports = { 1733 .usb2 = { 1734 .ops = &tegra124_usb2_port_ops, 1735 .count = 3, 1736 }, 1737 .ulpi = { 1738 .ops = &tegra124_ulpi_port_ops, 1739 .count = 1, 1740 }, 1741 .hsic = { 1742 .ops = &tegra124_hsic_port_ops, 1743 .count = 2, 1744 }, 1745 .usb3 = { 1746 .ops = &tegra124_usb3_port_ops, 1747 .count = 2, 1748 }, 1749 }, 1750 .ops = &tegra124_xusb_padctl_ops, 1751 .supply_names = tegra124_xusb_padctl_supply_names, 1752 .num_supplies = ARRAY_SIZE(tegra124_xusb_padctl_supply_names), 1753}; 1754EXPORT_SYMBOL_GPL(tegra124_xusb_padctl_soc); 1755 1756MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>"); 1757MODULE_DESCRIPTION("NVIDIA Tegra 124 XUSB Pad Controller driver"); 1758MODULE_LICENSE("GPL v2");