xusb-padctl.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. /*
  2. * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
  3. *
  4. * SPDX-License-Identifier: GPL-2.0
  5. */
  6. #define pr_fmt(fmt) "tegra-xusb-padctl: " fmt
  7. #include <common.h>
  8. #include <errno.h>
  9. #include <fdtdec.h>
  10. #include <malloc.h>
  11. #include <asm/io.h>
  12. #include <asm/arch/clock.h>
  13. #include <asm/arch-tegra/xusb-padctl.h>
  14. #include <dt-bindings/pinctrl/pinctrl-tegra-xusb.h>
  15. struct tegra_xusb_phy_ops {
  16. int (*prepare)(struct tegra_xusb_phy *phy);
  17. int (*enable)(struct tegra_xusb_phy *phy);
  18. int (*disable)(struct tegra_xusb_phy *phy);
  19. int (*unprepare)(struct tegra_xusb_phy *phy);
  20. };
  21. struct tegra_xusb_phy {
  22. const struct tegra_xusb_phy_ops *ops;
  23. struct tegra_xusb_padctl *padctl;
  24. };
  25. struct tegra_xusb_padctl {
  26. struct fdt_resource regs;
  27. unsigned int enable;
  28. struct tegra_xusb_phy phys[2];
  29. };
  30. static inline u32 padctl_readl(struct tegra_xusb_padctl *padctl,
  31. unsigned long offset)
  32. {
  33. u32 value = readl(padctl->regs.start + offset);
  34. debug("padctl: %08lx > %08x\n", offset, value);
  35. return value;
  36. }
  37. static inline void padctl_writel(struct tegra_xusb_padctl *padctl,
  38. u32 value, unsigned long offset)
  39. {
  40. debug("padctl: %08lx < %08x\n", offset, value);
  41. writel(value, padctl->regs.start + offset);
  42. }
  43. #define XUSB_PADCTL_ELPG_PROGRAM 0x024
  44. #define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN (1 << 31)
  45. #define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY (1 << 30)
  46. #define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN (1 << 29)
  47. static int tegra_xusb_padctl_enable(struct tegra_xusb_padctl *padctl)
  48. {
  49. u32 value;
  50. if (padctl->enable++ > 0)
  51. return 0;
  52. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
  53. value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
  54. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
  55. udelay(100);
  56. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
  57. value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
  58. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
  59. udelay(100);
  60. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
  61. value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
  62. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
  63. return 0;
  64. }
  65. static int tegra_xusb_padctl_disable(struct tegra_xusb_padctl *padctl)
  66. {
  67. u32 value;
  68. if (padctl->enable == 0) {
  69. error("unbalanced enable/disable");
  70. return 0;
  71. }
  72. if (--padctl->enable > 0)
  73. return 0;
  74. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
  75. value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
  76. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
  77. udelay(100);
  78. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
  79. value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
  80. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
  81. udelay(100);
  82. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
  83. value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
  84. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
  85. return 0;
  86. }
  87. static int phy_prepare(struct tegra_xusb_phy *phy)
  88. {
  89. int err;
  90. err = tegra_xusb_padctl_enable(phy->padctl);
  91. if (err < 0)
  92. return err;
  93. reset_set_enable(PERIPH_ID_PEX_USB_UPHY, 0);
  94. return 0;
  95. }
  96. static int phy_unprepare(struct tegra_xusb_phy *phy)
  97. {
  98. reset_set_enable(PERIPH_ID_PEX_USB_UPHY, 1);
  99. return tegra_xusb_padctl_disable(phy->padctl);
  100. }
  101. #define XUSB_PADCTL_UPHY_PLL_P0_CTL1 0x360
  102. #define XUSB_PADCTL_UPHY_PLL_P0_CTL1_FREQ_NDIV_MASK (0xff << 20)
  103. #define XUSB_PADCTL_UPHY_PLL_P0_CTL1_FREQ_NDIV(x) (((x) & 0xff) << 20)
  104. #define XUSB_PADCTL_UPHY_PLL_P0_CTL1_FREQ_MDIV_MASK (0x3 << 16)
  105. #define XUSB_PADCTL_UPHY_PLL_P0_CTL1_LOCKDET_STATUS (1 << 15)
  106. #define XUSB_PADCTL_UPHY_PLL_P0_CTL1_PWR_OVRD (1 << 4)
  107. #define XUSB_PADCTL_UPHY_PLL_P0_CTL1_ENABLE (1 << 3)
  108. #define XUSB_PADCTL_UPHY_PLL_P0_CTL1_SLEEP_MASK (0x3 << 1)
  109. #define XUSB_PADCTL_UPHY_PLL_P0_CTL1_SLEEP(x) (((x) & 0x3) << 1)
  110. #define XUSB_PADCTL_UPHY_PLL_P0_CTL1_IDDQ (1 << 0)
  111. #define XUSB_PADCTL_UPHY_PLL_P0_CTL2 0x364
  112. #define XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_CTRL_MASK (0xffffff << 4)
  113. #define XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_CTRL(x) (((x) & 0xffffff) << 4)
  114. #define XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_OVRD (1 << 2)
  115. #define XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_DONE (1 << 1)
  116. #define XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_EN (1 << 0)
  117. #define XUSB_PADCTL_UPHY_PLL_P0_CTL4 0x36c
  118. #define XUSB_PADCTL_UPHY_PLL_P0_CTL4_TXCLKREF_EN (1 << 15)
  119. #define XUSB_PADCTL_UPHY_PLL_P0_CTL4_TXCLKREF_SEL_MASK (0x3 << 12)
  120. #define XUSB_PADCTL_UPHY_PLL_P0_CTL4_TXCLKREF_SEL(x) (((x) & 0x3) << 12)
  121. #define XUSB_PADCTL_UPHY_PLL_P0_CTL4_REFCLKBUF_EN (1 << 8)
  122. #define XUSB_PADCTL_UPHY_PLL_P0_CTL4_REFCLK_SEL_MASK (0xf << 4)
  123. #define XUSB_PADCTL_UPHY_PLL_P0_CTL5 0x370
  124. #define XUSB_PADCTL_UPHY_PLL_P0_CTL5_DCO_CTRL_MASK (0xff << 16)
  125. #define XUSB_PADCTL_UPHY_PLL_P0_CTL5_DCO_CTRL(x) (((x) & 0xff) << 16)
  126. #define XUSB_PADCTL_UPHY_PLL_P0_CTL8 0x37c
  127. #define XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_DONE (1 << 31)
  128. #define XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_OVRD (1 << 15)
  129. #define XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_CLK_EN (1 << 13)
  130. #define XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_EN (1 << 12)
  131. #define CLK_RST_XUSBIO_PLL_CFG0 0x51c
  132. #define CLK_RST_XUSBIO_PLL_CFG0_SEQ_ENABLE (1 << 24)
  133. #define CLK_RST_XUSBIO_PLL_CFG0_PADPLL_SLEEP_IDDQ (1 << 13)
  134. #define CLK_RST_XUSBIO_PLL_CFG0_PADPLL_USE_LOCKDET (1 << 6)
  135. #define CLK_RST_XUSBIO_PLL_CFG0_CLK_ENABLE_SWCTL (1 << 2)
  136. #define CLK_RST_XUSBIO_PLL_CFG0_PADPLL_RESET_SWCTL (1 << 0)
  137. static int pcie_phy_enable(struct tegra_xusb_phy *phy)
  138. {
  139. struct tegra_xusb_padctl *padctl = phy->padctl;
  140. unsigned long start;
  141. u32 value;
  142. debug("> %s(phy=%p)\n", __func__, phy);
  143. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  144. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_CTRL_MASK;
  145. value |= XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_CTRL(0x136);
  146. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  147. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL5);
  148. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL5_DCO_CTRL_MASK;
  149. value |= XUSB_PADCTL_UPHY_PLL_P0_CTL5_DCO_CTRL(0x2a);
  150. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL5);
  151. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  152. value |= XUSB_PADCTL_UPHY_PLL_P0_CTL1_PWR_OVRD;
  153. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  154. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  155. value |= XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_OVRD;
  156. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  157. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  158. value |= XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_OVRD;
  159. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  160. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL4);
  161. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL4_TXCLKREF_SEL_MASK;
  162. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL4_REFCLK_SEL_MASK;
  163. value |= XUSB_PADCTL_UPHY_PLL_P0_CTL4_TXCLKREF_SEL(2);
  164. value |= XUSB_PADCTL_UPHY_PLL_P0_CTL4_TXCLKREF_EN;
  165. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL4);
  166. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  167. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL1_FREQ_MDIV_MASK;
  168. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL1_FREQ_NDIV_MASK;
  169. value |= XUSB_PADCTL_UPHY_PLL_P0_CTL1_FREQ_NDIV(25);
  170. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  171. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  172. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL1_IDDQ;
  173. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  174. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  175. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL1_SLEEP_MASK;
  176. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  177. udelay(1);
  178. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL4);
  179. value |= XUSB_PADCTL_UPHY_PLL_P0_CTL4_REFCLKBUF_EN;
  180. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL4);
  181. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  182. value |= XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_EN;
  183. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  184. debug(" waiting for calibration\n");
  185. start = get_timer(0);
  186. while (get_timer(start) < 250) {
  187. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  188. if (value & XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_DONE)
  189. break;
  190. }
  191. debug(" done\n");
  192. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  193. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_EN;
  194. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  195. debug(" waiting for calibration to stop\n");
  196. start = get_timer(0);
  197. while (get_timer(start) < 250) {
  198. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  199. if ((value & XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_DONE) == 0)
  200. break;
  201. }
  202. debug(" done\n");
  203. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  204. value |= XUSB_PADCTL_UPHY_PLL_P0_CTL1_ENABLE;
  205. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  206. debug(" waiting for PLL to lock...\n");
  207. start = get_timer(0);
  208. while (get_timer(start) < 250) {
  209. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  210. if (value & XUSB_PADCTL_UPHY_PLL_P0_CTL1_LOCKDET_STATUS)
  211. break;
  212. }
  213. debug(" done\n");
  214. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  215. value |= XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_CLK_EN;
  216. value |= XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_EN;
  217. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  218. debug(" waiting for register calibration...\n");
  219. start = get_timer(0);
  220. while (get_timer(start) < 250) {
  221. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  222. if (value & XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_DONE)
  223. break;
  224. }
  225. debug(" done\n");
  226. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  227. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_EN;
  228. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  229. debug(" waiting for register calibration to stop...\n");
  230. start = get_timer(0);
  231. while (get_timer(start) < 250) {
  232. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  233. if ((value & XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_DONE) == 0)
  234. break;
  235. }
  236. debug(" done\n");
  237. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  238. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_CLK_EN;
  239. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  240. value = readl(NV_PA_CLK_RST_BASE + CLK_RST_XUSBIO_PLL_CFG0);
  241. value &= ~CLK_RST_XUSBIO_PLL_CFG0_PADPLL_RESET_SWCTL;
  242. value &= ~CLK_RST_XUSBIO_PLL_CFG0_CLK_ENABLE_SWCTL;
  243. value |= CLK_RST_XUSBIO_PLL_CFG0_PADPLL_USE_LOCKDET;
  244. value |= CLK_RST_XUSBIO_PLL_CFG0_PADPLL_SLEEP_IDDQ;
  245. writel(value, NV_PA_CLK_RST_BASE + CLK_RST_XUSBIO_PLL_CFG0);
  246. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  247. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL1_PWR_OVRD;
  248. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  249. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  250. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_OVRD;
  251. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  252. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  253. value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_OVRD;
  254. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  255. udelay(1);
  256. value = readl(NV_PA_CLK_RST_BASE + CLK_RST_XUSBIO_PLL_CFG0);
  257. value |= CLK_RST_XUSBIO_PLL_CFG0_SEQ_ENABLE;
  258. writel(value, NV_PA_CLK_RST_BASE + CLK_RST_XUSBIO_PLL_CFG0);
  259. debug("< %s()\n", __func__);
  260. return 0;
  261. }
  262. static int pcie_phy_disable(struct tegra_xusb_phy *phy)
  263. {
  264. return 0;
  265. }
  266. static const struct tegra_xusb_phy_ops pcie_phy_ops = {
  267. .prepare = phy_prepare,
  268. .enable = pcie_phy_enable,
  269. .disable = pcie_phy_disable,
  270. .unprepare = phy_unprepare,
  271. };
  272. static struct tegra_xusb_padctl *padctl = &(struct tegra_xusb_padctl) {
  273. .phys = {
  274. [0] = {
  275. .ops = &pcie_phy_ops,
  276. },
  277. },
  278. };
  279. static int tegra_xusb_padctl_parse_dt(struct tegra_xusb_padctl *padctl,
  280. const void *fdt, int node)
  281. {
  282. int err;
  283. err = fdt_get_resource(fdt, node, "reg", 0, &padctl->regs);
  284. if (err < 0) {
  285. error("registers not found");
  286. return err;
  287. }
  288. debug("regs: %pa-%pa\n", &padctl->regs.start,
  289. &padctl->regs.end);
  290. return 0;
  291. }
  292. static int process_nodes(const void *fdt, int nodes[], unsigned int count)
  293. {
  294. unsigned int i;
  295. int err;
  296. debug("> %s(fdt=%p, nodes=%p, count=%u)\n", __func__, fdt, nodes,
  297. count);
  298. for (i = 0; i < count; i++) {
  299. enum fdt_compat_id id;
  300. if (!fdtdec_get_is_enabled(fdt, nodes[i]))
  301. continue;
  302. id = fdtdec_lookup(fdt, nodes[i]);
  303. switch (id) {
  304. case COMPAT_NVIDIA_TEGRA124_XUSB_PADCTL:
  305. case COMPAT_NVIDIA_TEGRA210_XUSB_PADCTL:
  306. break;
  307. default:
  308. error("unsupported compatible: %s",
  309. fdtdec_get_compatible(id));
  310. continue;
  311. }
  312. err = tegra_xusb_padctl_parse_dt(padctl, fdt, nodes[i]);
  313. if (err < 0) {
  314. error("failed to parse DT: %d",
  315. err);
  316. continue;
  317. }
  318. /* deassert XUSB padctl reset */
  319. reset_set_enable(PERIPH_ID_XUSB_PADCTL, 0);
  320. /* only a single instance is supported */
  321. break;
  322. }
  323. debug("< %s()\n", __func__);
  324. return 0;
  325. }
  326. struct tegra_xusb_phy *tegra_xusb_phy_get(unsigned int type)
  327. {
  328. struct tegra_xusb_phy *phy = NULL;
  329. switch (type) {
  330. case TEGRA_XUSB_PADCTL_PCIE:
  331. phy = &padctl->phys[0];
  332. phy->padctl = padctl;
  333. break;
  334. }
  335. return phy;
  336. }
  337. int tegra_xusb_phy_prepare(struct tegra_xusb_phy *phy)
  338. {
  339. if (phy && phy->ops && phy->ops->prepare)
  340. return phy->ops->prepare(phy);
  341. return phy ? -ENOSYS : -EINVAL;
  342. }
  343. int tegra_xusb_phy_enable(struct tegra_xusb_phy *phy)
  344. {
  345. if (phy && phy->ops && phy->ops->enable)
  346. return phy->ops->enable(phy);
  347. return phy ? -ENOSYS : -EINVAL;
  348. }
  349. int tegra_xusb_phy_disable(struct tegra_xusb_phy *phy)
  350. {
  351. if (phy && phy->ops && phy->ops->disable)
  352. return phy->ops->disable(phy);
  353. return phy ? -ENOSYS : -EINVAL;
  354. }
  355. int tegra_xusb_phy_unprepare(struct tegra_xusb_phy *phy)
  356. {
  357. if (phy && phy->ops && phy->ops->unprepare)
  358. return phy->ops->unprepare(phy);
  359. return phy ? -ENOSYS : -EINVAL;
  360. }
  361. void tegra_xusb_padctl_init(const void *fdt)
  362. {
  363. int count, nodes[1];
  364. debug("> %s(fdt=%p)\n", __func__, fdt);
  365. count = fdtdec_find_aliases_for_id(fdt, "padctl",
  366. COMPAT_NVIDIA_TEGRA210_XUSB_PADCTL,
  367. nodes, ARRAY_SIZE(nodes));
  368. if (process_nodes(fdt, nodes, count))
  369. return;
  370. count = fdtdec_find_aliases_for_id(fdt, "padctl",
  371. COMPAT_NVIDIA_TEGRA124_XUSB_PADCTL,
  372. nodes, ARRAY_SIZE(nodes));
  373. if (process_nodes(fdt, nodes, count))
  374. return;
  375. debug("< %s()\n", __func__);
  376. }