109f455dcSMasahiro Yamada /* 21680d7b6SStephen Warren * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. 309f455dcSMasahiro Yamada * 409f455dcSMasahiro Yamada * SPDX-License-Identifier: GPL-2.0 509f455dcSMasahiro Yamada */ 609f455dcSMasahiro Yamada 709f455dcSMasahiro Yamada #define pr_fmt(fmt) "tegra-xusb-padctl: " fmt 809f455dcSMasahiro Yamada 909f455dcSMasahiro Yamada #include <common.h> 1009f455dcSMasahiro Yamada #include <errno.h> 1109f455dcSMasahiro Yamada 121680d7b6SStephen Warren #include "../xusb-padctl-common.h" 131680d7b6SStephen Warren 1409f455dcSMasahiro Yamada #include <dt-bindings/pinctrl/pinctrl-tegra-xusb.h> 1509f455dcSMasahiro Yamada 1609f455dcSMasahiro Yamada #define XUSB_PADCTL_ELPG_PROGRAM 0x01c 1709f455dcSMasahiro Yamada #define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN (1 << 26) 1809f455dcSMasahiro Yamada #define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY (1 << 25) 1909f455dcSMasahiro Yamada #define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN (1 << 24) 2009f455dcSMasahiro Yamada 2109f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_P0_CTL1 0x040 2209f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL0_LOCKDET (1 << 19) 2309f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_REFCLK_SEL_MASK (0xf << 12) 2409f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST (1 << 1) 2509f455dcSMasahiro Yamada 2609f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_P0_CTL2 0x044 2709f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_REFCLKBUF_EN (1 << 6) 2809f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_EN (1 << 5) 2909f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_SEL (1 << 4) 3009f455dcSMasahiro Yamada 3109f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_S0_CTL1 0x138 3209f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET (1 << 27) 3309f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE (1 << 24) 3409f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD (1 << 3) 3509f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST (1 << 1) 3609f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ (1 << 0) 3709f455dcSMasahiro Yamada 3809f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1 0x148 3909f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD (1 << 1) 4009f455dcSMasahiro Yamada #define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ (1 << 0) 4109f455dcSMasahiro Yamada 4209f455dcSMasahiro Yamada enum tegra124_function { 4309f455dcSMasahiro Yamada TEGRA124_FUNC_SNPS, 4409f455dcSMasahiro Yamada TEGRA124_FUNC_XUSB, 4509f455dcSMasahiro Yamada TEGRA124_FUNC_UART, 4609f455dcSMasahiro Yamada TEGRA124_FUNC_PCIE, 4709f455dcSMasahiro Yamada TEGRA124_FUNC_USB3, 4809f455dcSMasahiro Yamada TEGRA124_FUNC_SATA, 4909f455dcSMasahiro Yamada TEGRA124_FUNC_RSVD, 5009f455dcSMasahiro Yamada }; 5109f455dcSMasahiro Yamada 5209f455dcSMasahiro Yamada static const char *const tegra124_functions[] = { 5309f455dcSMasahiro Yamada "snps", 5409f455dcSMasahiro Yamada "xusb", 5509f455dcSMasahiro Yamada "uart", 5609f455dcSMasahiro Yamada "pcie", 5709f455dcSMasahiro Yamada "usb3", 5809f455dcSMasahiro Yamada "sata", 5909f455dcSMasahiro Yamada "rsvd", 6009f455dcSMasahiro Yamada }; 6109f455dcSMasahiro Yamada 6209f455dcSMasahiro Yamada static const unsigned int tegra124_otg_functions[] = { 6309f455dcSMasahiro Yamada TEGRA124_FUNC_SNPS, 6409f455dcSMasahiro Yamada TEGRA124_FUNC_XUSB, 6509f455dcSMasahiro Yamada TEGRA124_FUNC_UART, 6609f455dcSMasahiro Yamada TEGRA124_FUNC_RSVD, 6709f455dcSMasahiro Yamada }; 6809f455dcSMasahiro Yamada 6909f455dcSMasahiro Yamada static const unsigned int tegra124_usb_functions[] = { 7009f455dcSMasahiro Yamada TEGRA124_FUNC_SNPS, 7109f455dcSMasahiro Yamada TEGRA124_FUNC_XUSB, 7209f455dcSMasahiro Yamada }; 7309f455dcSMasahiro Yamada 7409f455dcSMasahiro Yamada static const unsigned int tegra124_pci_functions[] = { 7509f455dcSMasahiro Yamada TEGRA124_FUNC_PCIE, 7609f455dcSMasahiro Yamada TEGRA124_FUNC_USB3, 7709f455dcSMasahiro Yamada TEGRA124_FUNC_SATA, 7809f455dcSMasahiro Yamada TEGRA124_FUNC_RSVD, 7909f455dcSMasahiro Yamada }; 8009f455dcSMasahiro Yamada 8109f455dcSMasahiro Yamada #define TEGRA124_LANE(_name, _offset, _shift, _mask, _iddq, _funcs) \ 8209f455dcSMasahiro Yamada { \ 8309f455dcSMasahiro Yamada .name = _name, \ 8409f455dcSMasahiro Yamada .offset = _offset, \ 8509f455dcSMasahiro Yamada .shift = _shift, \ 8609f455dcSMasahiro Yamada .mask = _mask, \ 8709f455dcSMasahiro Yamada .iddq = _iddq, \ 8809f455dcSMasahiro Yamada .num_funcs = ARRAY_SIZE(tegra124_##_funcs##_functions), \ 8909f455dcSMasahiro Yamada .funcs = tegra124_##_funcs##_functions, \ 9009f455dcSMasahiro Yamada } 9109f455dcSMasahiro Yamada 9209f455dcSMasahiro Yamada static const struct tegra_xusb_padctl_lane tegra124_lanes[] = { 9309f455dcSMasahiro Yamada TEGRA124_LANE("otg-0", 0x004, 0, 0x3, 0, otg), 9409f455dcSMasahiro Yamada TEGRA124_LANE("otg-1", 0x004, 2, 0x3, 0, otg), 9509f455dcSMasahiro Yamada TEGRA124_LANE("otg-2", 0x004, 4, 0x3, 0, otg), 9609f455dcSMasahiro Yamada TEGRA124_LANE("ulpi-0", 0x004, 12, 0x1, 0, usb), 9709f455dcSMasahiro Yamada TEGRA124_LANE("hsic-0", 0x004, 14, 0x1, 0, usb), 9809f455dcSMasahiro Yamada TEGRA124_LANE("hsic-1", 0x004, 15, 0x1, 0, usb), 9909f455dcSMasahiro Yamada TEGRA124_LANE("pcie-0", 0x134, 16, 0x3, 1, pci), 10009f455dcSMasahiro Yamada TEGRA124_LANE("pcie-1", 0x134, 18, 0x3, 2, pci), 10109f455dcSMasahiro Yamada TEGRA124_LANE("pcie-2", 0x134, 20, 0x3, 3, pci), 10209f455dcSMasahiro Yamada TEGRA124_LANE("pcie-3", 0x134, 22, 0x3, 4, pci), 10309f455dcSMasahiro Yamada TEGRA124_LANE("pcie-4", 0x134, 24, 0x3, 5, pci), 10409f455dcSMasahiro Yamada TEGRA124_LANE("sata-0", 0x134, 26, 0x3, 6, pci), 10509f455dcSMasahiro Yamada }; 10609f455dcSMasahiro Yamada 10709f455dcSMasahiro Yamada static int tegra_xusb_padctl_enable(struct tegra_xusb_padctl *padctl) 10809f455dcSMasahiro Yamada { 10909f455dcSMasahiro Yamada u32 value; 11009f455dcSMasahiro Yamada 11109f455dcSMasahiro Yamada if (padctl->enable++ > 0) 11209f455dcSMasahiro Yamada return 0; 11309f455dcSMasahiro Yamada 11409f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM); 11509f455dcSMasahiro Yamada value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN; 11609f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM); 11709f455dcSMasahiro Yamada 11809f455dcSMasahiro Yamada udelay(100); 11909f455dcSMasahiro Yamada 12009f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM); 12109f455dcSMasahiro Yamada value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY; 12209f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM); 12309f455dcSMasahiro Yamada 12409f455dcSMasahiro Yamada udelay(100); 12509f455dcSMasahiro Yamada 12609f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM); 12709f455dcSMasahiro Yamada value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN; 12809f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM); 12909f455dcSMasahiro Yamada 13009f455dcSMasahiro Yamada return 0; 13109f455dcSMasahiro Yamada } 13209f455dcSMasahiro Yamada 13309f455dcSMasahiro Yamada static int tegra_xusb_padctl_disable(struct tegra_xusb_padctl *padctl) 13409f455dcSMasahiro Yamada { 13509f455dcSMasahiro Yamada u32 value; 13609f455dcSMasahiro Yamada 13709f455dcSMasahiro Yamada if (padctl->enable == 0) { 138057fd32fSStephen Warren error("unbalanced enable/disable"); 13909f455dcSMasahiro Yamada return 0; 14009f455dcSMasahiro Yamada } 14109f455dcSMasahiro Yamada 14209f455dcSMasahiro Yamada if (--padctl->enable > 0) 14309f455dcSMasahiro Yamada return 0; 14409f455dcSMasahiro Yamada 14509f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM); 14609f455dcSMasahiro Yamada value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN; 14709f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM); 14809f455dcSMasahiro Yamada 14909f455dcSMasahiro Yamada udelay(100); 15009f455dcSMasahiro Yamada 15109f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM); 15209f455dcSMasahiro Yamada value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY; 15309f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM); 15409f455dcSMasahiro Yamada 15509f455dcSMasahiro Yamada udelay(100); 15609f455dcSMasahiro Yamada 15709f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM); 15809f455dcSMasahiro Yamada value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN; 15909f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM); 16009f455dcSMasahiro Yamada 16109f455dcSMasahiro Yamada return 0; 16209f455dcSMasahiro Yamada } 16309f455dcSMasahiro Yamada 16409f455dcSMasahiro Yamada static int phy_prepare(struct tegra_xusb_phy *phy) 16509f455dcSMasahiro Yamada { 16609f455dcSMasahiro Yamada return tegra_xusb_padctl_enable(phy->padctl); 16709f455dcSMasahiro Yamada } 16809f455dcSMasahiro Yamada 16909f455dcSMasahiro Yamada static int phy_unprepare(struct tegra_xusb_phy *phy) 17009f455dcSMasahiro Yamada { 17109f455dcSMasahiro Yamada return tegra_xusb_padctl_disable(phy->padctl); 17209f455dcSMasahiro Yamada } 17309f455dcSMasahiro Yamada 17409f455dcSMasahiro Yamada static int pcie_phy_enable(struct tegra_xusb_phy *phy) 17509f455dcSMasahiro Yamada { 17609f455dcSMasahiro Yamada struct tegra_xusb_padctl *padctl = phy->padctl; 17709f455dcSMasahiro Yamada int err = -ETIMEDOUT; 17809f455dcSMasahiro Yamada unsigned long start; 17909f455dcSMasahiro Yamada u32 value; 18009f455dcSMasahiro Yamada 18109f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1); 18209f455dcSMasahiro Yamada value &= ~XUSB_PADCTL_IOPHY_PLL_P0_CTL1_REFCLK_SEL_MASK; 18309f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1); 18409f455dcSMasahiro Yamada 18509f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL2); 18609f455dcSMasahiro Yamada value |= XUSB_PADCTL_IOPHY_PLL_P0_CTL2_REFCLKBUF_EN | 18709f455dcSMasahiro Yamada XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_EN | 18809f455dcSMasahiro Yamada XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_SEL; 18909f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL2); 19009f455dcSMasahiro Yamada 19109f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1); 19209f455dcSMasahiro Yamada value |= XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST; 19309f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1); 19409f455dcSMasahiro Yamada 19509f455dcSMasahiro Yamada start = get_timer(0); 19609f455dcSMasahiro Yamada 19709f455dcSMasahiro Yamada while (get_timer(start) < 50) { 19809f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1); 19909f455dcSMasahiro Yamada if (value & XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL0_LOCKDET) { 20009f455dcSMasahiro Yamada err = 0; 20109f455dcSMasahiro Yamada break; 20209f455dcSMasahiro Yamada } 20309f455dcSMasahiro Yamada } 20409f455dcSMasahiro Yamada 20509f455dcSMasahiro Yamada return err; 20609f455dcSMasahiro Yamada } 20709f455dcSMasahiro Yamada 20809f455dcSMasahiro Yamada static int pcie_phy_disable(struct tegra_xusb_phy *phy) 20909f455dcSMasahiro Yamada { 21009f455dcSMasahiro Yamada struct tegra_xusb_padctl *padctl = phy->padctl; 21109f455dcSMasahiro Yamada u32 value; 21209f455dcSMasahiro Yamada 21309f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1); 21409f455dcSMasahiro Yamada value &= ~XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST; 21509f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1); 21609f455dcSMasahiro Yamada 21709f455dcSMasahiro Yamada return 0; 21809f455dcSMasahiro Yamada } 21909f455dcSMasahiro Yamada 22009f455dcSMasahiro Yamada static int sata_phy_enable(struct tegra_xusb_phy *phy) 22109f455dcSMasahiro Yamada { 22209f455dcSMasahiro Yamada struct tegra_xusb_padctl *padctl = phy->padctl; 22309f455dcSMasahiro Yamada int err = -ETIMEDOUT; 22409f455dcSMasahiro Yamada unsigned long start; 22509f455dcSMasahiro Yamada u32 value; 22609f455dcSMasahiro Yamada 22709f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1); 22809f455dcSMasahiro Yamada value &= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD; 22909f455dcSMasahiro Yamada value &= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ; 23009f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1); 23109f455dcSMasahiro Yamada 23209f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1); 23309f455dcSMasahiro Yamada value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD; 23409f455dcSMasahiro Yamada value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ; 23509f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1); 23609f455dcSMasahiro Yamada 23709f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1); 23809f455dcSMasahiro Yamada value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE; 23909f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1); 24009f455dcSMasahiro Yamada 24109f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1); 24209f455dcSMasahiro Yamada value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST; 24309f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1); 24409f455dcSMasahiro Yamada 24509f455dcSMasahiro Yamada start = get_timer(0); 24609f455dcSMasahiro Yamada 24709f455dcSMasahiro Yamada while (get_timer(start) < 50) { 24809f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1); 24909f455dcSMasahiro Yamada if (value & XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET) { 25009f455dcSMasahiro Yamada err = 0; 25109f455dcSMasahiro Yamada break; 25209f455dcSMasahiro Yamada } 25309f455dcSMasahiro Yamada } 25409f455dcSMasahiro Yamada 25509f455dcSMasahiro Yamada return err; 25609f455dcSMasahiro Yamada } 25709f455dcSMasahiro Yamada 25809f455dcSMasahiro Yamada static int sata_phy_disable(struct tegra_xusb_phy *phy) 25909f455dcSMasahiro Yamada { 26009f455dcSMasahiro Yamada struct tegra_xusb_padctl *padctl = phy->padctl; 26109f455dcSMasahiro Yamada u32 value; 26209f455dcSMasahiro Yamada 26309f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1); 26409f455dcSMasahiro Yamada value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST; 26509f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1); 26609f455dcSMasahiro Yamada 26709f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1); 26809f455dcSMasahiro Yamada value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE; 26909f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1); 27009f455dcSMasahiro Yamada 27109f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1); 27209f455dcSMasahiro Yamada value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD; 27309f455dcSMasahiro Yamada value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ; 27409f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1); 27509f455dcSMasahiro Yamada 27609f455dcSMasahiro Yamada value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1); 27709f455dcSMasahiro Yamada value |= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD; 27809f455dcSMasahiro Yamada value |= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ; 27909f455dcSMasahiro Yamada padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1); 28009f455dcSMasahiro Yamada 28109f455dcSMasahiro Yamada return 0; 28209f455dcSMasahiro Yamada } 28309f455dcSMasahiro Yamada 28409f455dcSMasahiro Yamada static const struct tegra_xusb_phy_ops pcie_phy_ops = { 28509f455dcSMasahiro Yamada .prepare = phy_prepare, 28609f455dcSMasahiro Yamada .enable = pcie_phy_enable, 28709f455dcSMasahiro Yamada .disable = pcie_phy_disable, 28809f455dcSMasahiro Yamada .unprepare = phy_unprepare, 28909f455dcSMasahiro Yamada }; 29009f455dcSMasahiro Yamada 29109f455dcSMasahiro Yamada static const struct tegra_xusb_phy_ops sata_phy_ops = { 29209f455dcSMasahiro Yamada .prepare = phy_prepare, 29309f455dcSMasahiro Yamada .enable = sata_phy_enable, 29409f455dcSMasahiro Yamada .disable = sata_phy_disable, 29509f455dcSMasahiro Yamada .unprepare = phy_unprepare, 29609f455dcSMasahiro Yamada }; 29709f455dcSMasahiro Yamada 298*095e6583SStephen Warren static struct tegra_xusb_phy tegra124_phys[] = { 299*095e6583SStephen Warren { 300*095e6583SStephen Warren .type = TEGRA_XUSB_PADCTL_PCIE, 30109f455dcSMasahiro Yamada .ops = &pcie_phy_ops, 302*095e6583SStephen Warren .padctl = &padctl, 30309f455dcSMasahiro Yamada }, 304*095e6583SStephen Warren { 305*095e6583SStephen Warren .type = TEGRA_XUSB_PADCTL_SATA, 30609f455dcSMasahiro Yamada .ops = &sata_phy_ops, 307*095e6583SStephen Warren .padctl = &padctl, 30809f455dcSMasahiro Yamada }, 30909f455dcSMasahiro Yamada }; 31009f455dcSMasahiro Yamada 311*095e6583SStephen Warren static const struct tegra_xusb_padctl_soc tegra124_socdata = { 312*095e6583SStephen Warren .lanes = tegra124_lanes, 313*095e6583SStephen Warren .num_lanes = ARRAY_SIZE(tegra124_lanes), 314*095e6583SStephen Warren .functions = tegra124_functions, 315*095e6583SStephen Warren .num_functions = ARRAY_SIZE(tegra124_functions), 316*095e6583SStephen Warren .phys = tegra124_phys, 317*095e6583SStephen Warren .num_phys = ARRAY_SIZE(tegra124_phys), 318*095e6583SStephen Warren }; 31909f455dcSMasahiro Yamada 32009f455dcSMasahiro Yamada void tegra_xusb_padctl_init(const void *fdt) 32109f455dcSMasahiro Yamada { 32209f455dcSMasahiro Yamada int count, nodes[1]; 32309f455dcSMasahiro Yamada 32409f455dcSMasahiro Yamada count = fdtdec_find_aliases_for_id(fdt, "padctl", 32509f455dcSMasahiro Yamada COMPAT_NVIDIA_TEGRA124_XUSB_PADCTL, 32609f455dcSMasahiro Yamada nodes, ARRAY_SIZE(nodes)); 327*095e6583SStephen Warren if (tegra_xusb_process_nodes(fdt, nodes, count, &tegra124_socdata)) 32809f455dcSMasahiro Yamada return; 32909f455dcSMasahiro Yamada } 330