16900aedaSKishon Vijay Abraham I /** 26900aedaSKishon Vijay Abraham I * ti_usb_phy.c - USB3 and USB3 PHY programming for dwc3 36900aedaSKishon Vijay Abraham I * 46900aedaSKishon Vijay Abraham I * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com 56900aedaSKishon Vijay Abraham I * 66900aedaSKishon Vijay Abraham I * Author: Kishon Vijay Abraham I <kishon@ti.com> 76900aedaSKishon Vijay Abraham I * 86900aedaSKishon Vijay Abraham I * Taken from Linux Kernel v3.16 (drivers/phy/phy-ti-pipe3.c and 96900aedaSKishon Vijay Abraham I * drivers/phy/phy-omap-usb2.c) and ported to uboot. 106900aedaSKishon Vijay Abraham I * 116900aedaSKishon Vijay Abraham I * "commit 56042e : phy: ti-pipe3: Fix suspend/resume and module reload" for 126900aedaSKishon Vijay Abraham I * phy-ti-pipe3.c 136900aedaSKishon Vijay Abraham I * 146900aedaSKishon Vijay Abraham I * "commit eb82a3 : phy: omap-usb2: Balance pm_runtime_enable() on probe failure 156900aedaSKishon Vijay Abraham I * and remove" for phy-omap-usb2.c 166900aedaSKishon Vijay Abraham I * 176900aedaSKishon Vijay Abraham I * SPDX-License-Identifier: GPL-2.0+ 186900aedaSKishon Vijay Abraham I */ 196900aedaSKishon Vijay Abraham I 206900aedaSKishon Vijay Abraham I #include <common.h> 216900aedaSKishon Vijay Abraham I #include <malloc.h> 226900aedaSKishon Vijay Abraham I #include <ti-usb-phy-uboot.h> 236900aedaSKishon Vijay Abraham I #include <usb/lin_gadget_compat.h> 246900aedaSKishon Vijay Abraham I #include <linux/ioport.h> 256900aedaSKishon Vijay Abraham I #include <asm/io.h> 266900aedaSKishon Vijay Abraham I #include <asm/arch/sys_proto.h> 276900aedaSKishon Vijay Abraham I 286900aedaSKishon Vijay Abraham I #include "linux-compat.h" 296900aedaSKishon Vijay Abraham I 306900aedaSKishon Vijay Abraham I #define PLL_STATUS 0x00000004 316900aedaSKishon Vijay Abraham I #define PLL_GO 0x00000008 326900aedaSKishon Vijay Abraham I #define PLL_CONFIGURATION1 0x0000000C 336900aedaSKishon Vijay Abraham I #define PLL_CONFIGURATION2 0x00000010 346900aedaSKishon Vijay Abraham I #define PLL_CONFIGURATION3 0x00000014 356900aedaSKishon Vijay Abraham I #define PLL_CONFIGURATION4 0x00000020 366900aedaSKishon Vijay Abraham I 376900aedaSKishon Vijay Abraham I #define PLL_REGM_MASK 0x001FFE00 386900aedaSKishon Vijay Abraham I #define PLL_REGM_SHIFT 0x9 396900aedaSKishon Vijay Abraham I #define PLL_REGM_F_MASK 0x0003FFFF 406900aedaSKishon Vijay Abraham I #define PLL_REGM_F_SHIFT 0x0 416900aedaSKishon Vijay Abraham I #define PLL_REGN_MASK 0x000001FE 426900aedaSKishon Vijay Abraham I #define PLL_REGN_SHIFT 0x1 436900aedaSKishon Vijay Abraham I #define PLL_SELFREQDCO_MASK 0x0000000E 446900aedaSKishon Vijay Abraham I #define PLL_SELFREQDCO_SHIFT 0x1 456900aedaSKishon Vijay Abraham I #define PLL_SD_MASK 0x0003FC00 466900aedaSKishon Vijay Abraham I #define PLL_SD_SHIFT 10 476900aedaSKishon Vijay Abraham I #define SET_PLL_GO 0x1 486900aedaSKishon Vijay Abraham I #define PLL_LDOPWDN BIT(15) 496900aedaSKishon Vijay Abraham I #define PLL_TICOPWDN BIT(16) 506900aedaSKishon Vijay Abraham I #define PLL_LOCK 0x2 516900aedaSKishon Vijay Abraham I #define PLL_IDLE 0x1 526900aedaSKishon Vijay Abraham I 536900aedaSKishon Vijay Abraham I #define OMAP_CTRL_DEV_PHY_PD BIT(0) 546900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB3_PHY_PWRCTL_CLK_CMD_MASK 0x003FC000 556900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB3_PHY_PWRCTL_CLK_CMD_SHIFT 0xE 566900aedaSKishon Vijay Abraham I 576900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB3_PHY_PWRCTL_CLK_FREQ_MASK 0xFFC00000 586900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB3_PHY_PWRCTL_CLK_FREQ_SHIFT 0x16 596900aedaSKishon Vijay Abraham I 606900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB3_PHY_TX_RX_POWERON 0x3 616900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB3_PHY_TX_RX_POWEROFF 0x0 626900aedaSKishon Vijay Abraham I 636900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB2_PHY_PD BIT(28) 646900aedaSKishon Vijay Abraham I 656900aedaSKishon Vijay Abraham I #define AM437X_CTRL_USB2_PHY_PD BIT(0) 666900aedaSKishon Vijay Abraham I #define AM437X_CTRL_USB2_OTG_PD BIT(1) 676900aedaSKishon Vijay Abraham I #define AM437X_CTRL_USB2_OTGVDET_EN BIT(19) 686900aedaSKishon Vijay Abraham I #define AM437X_CTRL_USB2_OTGSESSEND_EN BIT(20) 696900aedaSKishon Vijay Abraham I 706900aedaSKishon Vijay Abraham I static LIST_HEAD(ti_usb_phy_list); 716900aedaSKishon Vijay Abraham I typedef unsigned int u32; 726900aedaSKishon Vijay Abraham I 736900aedaSKishon Vijay Abraham I struct usb3_dpll_params { 746900aedaSKishon Vijay Abraham I u16 m; 756900aedaSKishon Vijay Abraham I u8 n; 766900aedaSKishon Vijay Abraham I u8 freq:3; 776900aedaSKishon Vijay Abraham I u8 sd; 786900aedaSKishon Vijay Abraham I u32 mf; 796900aedaSKishon Vijay Abraham I }; 806900aedaSKishon Vijay Abraham I 816900aedaSKishon Vijay Abraham I struct usb3_dpll_map { 826900aedaSKishon Vijay Abraham I unsigned long rate; 836900aedaSKishon Vijay Abraham I struct usb3_dpll_params params; 846900aedaSKishon Vijay Abraham I struct usb3_dpll_map *dpll_map; 856900aedaSKishon Vijay Abraham I }; 866900aedaSKishon Vijay Abraham I 876900aedaSKishon Vijay Abraham I struct ti_usb_phy { 886900aedaSKishon Vijay Abraham I void __iomem *pll_ctrl_base; 896900aedaSKishon Vijay Abraham I void __iomem *usb2_phy_power; 906900aedaSKishon Vijay Abraham I void __iomem *usb3_phy_power; 916900aedaSKishon Vijay Abraham I struct usb3_dpll_map *dpll_map; 926900aedaSKishon Vijay Abraham I struct list_head list; 936900aedaSKishon Vijay Abraham I int index; 946900aedaSKishon Vijay Abraham I }; 956900aedaSKishon Vijay Abraham I 966900aedaSKishon Vijay Abraham I static struct usb3_dpll_map dpll_map_usb[] = { 976900aedaSKishon Vijay Abraham I {12000000, {1250, 5, 4, 20, 0} }, /* 12 MHz */ 986900aedaSKishon Vijay Abraham I {16800000, {3125, 20, 4, 20, 0} }, /* 16.8 MHz */ 996900aedaSKishon Vijay Abraham I {19200000, {1172, 8, 4, 20, 65537} }, /* 19.2 MHz */ 1006900aedaSKishon Vijay Abraham I {20000000, {1000, 7, 4, 10, 0} }, /* 20 MHz */ 1016900aedaSKishon Vijay Abraham I {26000000, {1250, 12, 4, 20, 0} }, /* 26 MHz */ 1026900aedaSKishon Vijay Abraham I {38400000, {3125, 47, 4, 20, 92843} }, /* 38.4 MHz */ 1036900aedaSKishon Vijay Abraham I { }, /* Terminator */ 1046900aedaSKishon Vijay Abraham I }; 1056900aedaSKishon Vijay Abraham I 1066900aedaSKishon Vijay Abraham I static inline unsigned int ti_usb3_readl(void __iomem *base, u32 offset) 1076900aedaSKishon Vijay Abraham I { 1086900aedaSKishon Vijay Abraham I return readl(base + offset); 1096900aedaSKishon Vijay Abraham I } 1106900aedaSKishon Vijay Abraham I 1116900aedaSKishon Vijay Abraham I static inline void ti_usb3_writel(void __iomem *base, u32 offset, u32 value) 1126900aedaSKishon Vijay Abraham I { 1136900aedaSKishon Vijay Abraham I writel(value, base + offset); 1146900aedaSKishon Vijay Abraham I } 1156900aedaSKishon Vijay Abraham I 1166900aedaSKishon Vijay Abraham I #ifndef CONFIG_AM43XX 1176900aedaSKishon Vijay Abraham I static struct usb3_dpll_params *ti_usb3_get_dpll_params(struct ti_usb_phy *phy) 1186900aedaSKishon Vijay Abraham I { 1196900aedaSKishon Vijay Abraham I unsigned long rate; 1206900aedaSKishon Vijay Abraham I struct usb3_dpll_map *dpll_map = phy->dpll_map; 1216900aedaSKishon Vijay Abraham I 1226900aedaSKishon Vijay Abraham I rate = get_sys_clk_freq(); 1236900aedaSKishon Vijay Abraham I 1246900aedaSKishon Vijay Abraham I for (; dpll_map->rate; dpll_map++) { 1256900aedaSKishon Vijay Abraham I if (rate == dpll_map->rate) 1266900aedaSKishon Vijay Abraham I return &dpll_map->params; 1276900aedaSKishon Vijay Abraham I } 1286900aedaSKishon Vijay Abraham I 1296900aedaSKishon Vijay Abraham I dev_err(phy->dev, "No DPLL configuration for %lu Hz SYS CLK\n", rate); 1306900aedaSKishon Vijay Abraham I 1316900aedaSKishon Vijay Abraham I return NULL; 1326900aedaSKishon Vijay Abraham I } 1336900aedaSKishon Vijay Abraham I 1346900aedaSKishon Vijay Abraham I static int ti_usb3_dpll_wait_lock(struct ti_usb_phy *phy) 1356900aedaSKishon Vijay Abraham I { 1366900aedaSKishon Vijay Abraham I u32 val; 1376900aedaSKishon Vijay Abraham I do { 1386900aedaSKishon Vijay Abraham I val = ti_usb3_readl(phy->pll_ctrl_base, PLL_STATUS); 1396900aedaSKishon Vijay Abraham I if (val & PLL_LOCK) 1406900aedaSKishon Vijay Abraham I break; 1416900aedaSKishon Vijay Abraham I } while (1); 1426900aedaSKishon Vijay Abraham I 1436900aedaSKishon Vijay Abraham I return 0; 1446900aedaSKishon Vijay Abraham I } 1456900aedaSKishon Vijay Abraham I 1466900aedaSKishon Vijay Abraham I static int ti_usb3_dpll_program(struct ti_usb_phy *phy) 1476900aedaSKishon Vijay Abraham I { 1486900aedaSKishon Vijay Abraham I u32 val; 1496900aedaSKishon Vijay Abraham I struct usb3_dpll_params *dpll_params; 1506900aedaSKishon Vijay Abraham I 1516900aedaSKishon Vijay Abraham I if (!phy->pll_ctrl_base) 1526900aedaSKishon Vijay Abraham I return -EINVAL; 1536900aedaSKishon Vijay Abraham I 1546900aedaSKishon Vijay Abraham I dpll_params = ti_usb3_get_dpll_params(phy); 1556900aedaSKishon Vijay Abraham I if (!dpll_params) 1566900aedaSKishon Vijay Abraham I return -EINVAL; 1576900aedaSKishon Vijay Abraham I 1586900aedaSKishon Vijay Abraham I val = ti_usb3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1); 1596900aedaSKishon Vijay Abraham I val &= ~PLL_REGN_MASK; 1606900aedaSKishon Vijay Abraham I val |= dpll_params->n << PLL_REGN_SHIFT; 1616900aedaSKishon Vijay Abraham I ti_usb3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val); 1626900aedaSKishon Vijay Abraham I 1636900aedaSKishon Vijay Abraham I val = ti_usb3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2); 1646900aedaSKishon Vijay Abraham I val &= ~PLL_SELFREQDCO_MASK; 1656900aedaSKishon Vijay Abraham I val |= dpll_params->freq << PLL_SELFREQDCO_SHIFT; 1666900aedaSKishon Vijay Abraham I ti_usb3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val); 1676900aedaSKishon Vijay Abraham I 1686900aedaSKishon Vijay Abraham I val = ti_usb3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1); 1696900aedaSKishon Vijay Abraham I val &= ~PLL_REGM_MASK; 1706900aedaSKishon Vijay Abraham I val |= dpll_params->m << PLL_REGM_SHIFT; 1716900aedaSKishon Vijay Abraham I ti_usb3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val); 1726900aedaSKishon Vijay Abraham I 1736900aedaSKishon Vijay Abraham I val = ti_usb3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION4); 1746900aedaSKishon Vijay Abraham I val &= ~PLL_REGM_F_MASK; 1756900aedaSKishon Vijay Abraham I val |= dpll_params->mf << PLL_REGM_F_SHIFT; 1766900aedaSKishon Vijay Abraham I ti_usb3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION4, val); 1776900aedaSKishon Vijay Abraham I 1786900aedaSKishon Vijay Abraham I val = ti_usb3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION3); 1796900aedaSKishon Vijay Abraham I val &= ~PLL_SD_MASK; 1806900aedaSKishon Vijay Abraham I val |= dpll_params->sd << PLL_SD_SHIFT; 1816900aedaSKishon Vijay Abraham I ti_usb3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION3, val); 1826900aedaSKishon Vijay Abraham I 1836900aedaSKishon Vijay Abraham I ti_usb3_writel(phy->pll_ctrl_base, PLL_GO, SET_PLL_GO); 1846900aedaSKishon Vijay Abraham I 1856900aedaSKishon Vijay Abraham I return ti_usb3_dpll_wait_lock(phy); 1866900aedaSKishon Vijay Abraham I } 1876900aedaSKishon Vijay Abraham I #endif 1886900aedaSKishon Vijay Abraham I 1896900aedaSKishon Vijay Abraham I void ti_usb2_phy_power(struct ti_usb_phy *phy, int on) 1906900aedaSKishon Vijay Abraham I { 1916900aedaSKishon Vijay Abraham I u32 val; 1926900aedaSKishon Vijay Abraham I 1936900aedaSKishon Vijay Abraham I val = readl(phy->usb2_phy_power); 1946900aedaSKishon Vijay Abraham I 1956900aedaSKishon Vijay Abraham I if (on) { 196*0a7ab045SKishon Vijay Abraham I #if defined(CONFIG_DRA7XX) || defined(CONFIG_AM57XX) 197*0a7ab045SKishon Vijay Abraham I if (phy->index == 1) 198*0a7ab045SKishon Vijay Abraham I val &= ~OMAP_CTRL_USB2_PHY_PD; 199*0a7ab045SKishon Vijay Abraham I else 2006900aedaSKishon Vijay Abraham I val &= ~OMAP_CTRL_DEV_PHY_PD; 2016900aedaSKishon Vijay Abraham I #elif defined(CONFIG_AM43XX) 2026900aedaSKishon Vijay Abraham I val &= ~(AM437X_CTRL_USB2_PHY_PD | 2036900aedaSKishon Vijay Abraham I AM437X_CTRL_USB2_OTG_PD); 2046900aedaSKishon Vijay Abraham I val |= (AM437X_CTRL_USB2_OTGVDET_EN | 2056900aedaSKishon Vijay Abraham I AM437X_CTRL_USB2_OTGSESSEND_EN); 2066900aedaSKishon Vijay Abraham I #endif 2076900aedaSKishon Vijay Abraham I } else { 208*0a7ab045SKishon Vijay Abraham I #if defined(CONFIG_DRA7XX) || defined(CONFIG_AM57XX) 209*0a7ab045SKishon Vijay Abraham I if (phy->index == 1) 210*0a7ab045SKishon Vijay Abraham I val |= OMAP_CTRL_USB2_PHY_PD; 211*0a7ab045SKishon Vijay Abraham I else 2126900aedaSKishon Vijay Abraham I val |= OMAP_CTRL_DEV_PHY_PD; 213*0a7ab045SKishon Vijay Abraham I 2146900aedaSKishon Vijay Abraham I #elif defined(CONFIG_AM43XX) 2156900aedaSKishon Vijay Abraham I val &= ~(AM437X_CTRL_USB2_OTGVDET_EN | 2166900aedaSKishon Vijay Abraham I AM437X_CTRL_USB2_OTGSESSEND_EN); 2176900aedaSKishon Vijay Abraham I val |= (AM437X_CTRL_USB2_PHY_PD | 2186900aedaSKishon Vijay Abraham I AM437X_CTRL_USB2_OTG_PD); 2196900aedaSKishon Vijay Abraham I #endif 2206900aedaSKishon Vijay Abraham I } 2216900aedaSKishon Vijay Abraham I writel(val, phy->usb2_phy_power); 2226900aedaSKishon Vijay Abraham I } 2236900aedaSKishon Vijay Abraham I 2246900aedaSKishon Vijay Abraham I #ifndef CONFIG_AM43XX 2256900aedaSKishon Vijay Abraham I void ti_usb3_phy_power(struct ti_usb_phy *phy, int on) 2266900aedaSKishon Vijay Abraham I { 2276900aedaSKishon Vijay Abraham I u32 val; 2286900aedaSKishon Vijay Abraham I u32 rate; 2296900aedaSKishon Vijay Abraham I rate = get_sys_clk_freq(); 2306900aedaSKishon Vijay Abraham I rate = rate/1000000; 2316900aedaSKishon Vijay Abraham I 2326900aedaSKishon Vijay Abraham I if (!phy->usb3_phy_power) 2336900aedaSKishon Vijay Abraham I return; 2346900aedaSKishon Vijay Abraham I 2356900aedaSKishon Vijay Abraham I val = readl(phy->usb3_phy_power); 2366900aedaSKishon Vijay Abraham I if (on) { 2376900aedaSKishon Vijay Abraham I val &= ~(OMAP_CTRL_USB3_PHY_PWRCTL_CLK_CMD_MASK | 2386900aedaSKishon Vijay Abraham I OMAP_CTRL_USB3_PHY_PWRCTL_CLK_FREQ_MASK); 2396900aedaSKishon Vijay Abraham I val |= (OMAP_CTRL_USB3_PHY_TX_RX_POWERON) << 2406900aedaSKishon Vijay Abraham I OMAP_CTRL_USB3_PHY_PWRCTL_CLK_CMD_SHIFT; 2416900aedaSKishon Vijay Abraham I val |= rate << 2426900aedaSKishon Vijay Abraham I OMAP_CTRL_USB3_PHY_PWRCTL_CLK_FREQ_SHIFT; 2436900aedaSKishon Vijay Abraham I } else { 2446900aedaSKishon Vijay Abraham I val &= ~OMAP_CTRL_USB3_PHY_PWRCTL_CLK_CMD_MASK; 2456900aedaSKishon Vijay Abraham I val |= OMAP_CTRL_USB3_PHY_TX_RX_POWEROFF << 2466900aedaSKishon Vijay Abraham I OMAP_CTRL_USB3_PHY_PWRCTL_CLK_CMD_SHIFT; 2476900aedaSKishon Vijay Abraham I } 2486900aedaSKishon Vijay Abraham I writel(val, phy->usb3_phy_power); 2496900aedaSKishon Vijay Abraham I } 2506900aedaSKishon Vijay Abraham I #endif 2516900aedaSKishon Vijay Abraham I 2526900aedaSKishon Vijay Abraham I /** 2536900aedaSKishon Vijay Abraham I * ti_usb_phy_uboot_init - usb phy uboot initialization code 2546900aedaSKishon Vijay Abraham I * @dev: struct ti_usb_phy_device containing initialization data 2556900aedaSKishon Vijay Abraham I * 2566900aedaSKishon Vijay Abraham I * Entry point for ti usb phy driver. This driver handles initialization 2576900aedaSKishon Vijay Abraham I * of both usb2 phy and usb3 phy. Pointer to ti_usb_phy_device should be 2586900aedaSKishon Vijay Abraham I * passed containing base address and other initialization data. 2596900aedaSKishon Vijay Abraham I * Returns '0' on success and a negative value on failure. 2606900aedaSKishon Vijay Abraham I * 2616900aedaSKishon Vijay Abraham I * Generally called from board_usb_init() implemented in board file. 2626900aedaSKishon Vijay Abraham I */ 2636900aedaSKishon Vijay Abraham I int ti_usb_phy_uboot_init(struct ti_usb_phy_device *dev) 2646900aedaSKishon Vijay Abraham I { 2656900aedaSKishon Vijay Abraham I struct ti_usb_phy *phy; 2666900aedaSKishon Vijay Abraham I 2676900aedaSKishon Vijay Abraham I phy = devm_kzalloc(NULL, sizeof(*phy), GFP_KERNEL); 2686900aedaSKishon Vijay Abraham I if (!phy) { 2696900aedaSKishon Vijay Abraham I dev_err(NULL, "unable to alloc mem for TI USB3 PHY\n"); 2706900aedaSKishon Vijay Abraham I return -ENOMEM; 2716900aedaSKishon Vijay Abraham I } 2726900aedaSKishon Vijay Abraham I 2736900aedaSKishon Vijay Abraham I phy->dpll_map = dpll_map_usb; 2746900aedaSKishon Vijay Abraham I phy->index = dev->index; 2756900aedaSKishon Vijay Abraham I phy->pll_ctrl_base = dev->pll_ctrl_base; 2766900aedaSKishon Vijay Abraham I phy->usb2_phy_power = dev->usb2_phy_power; 2776900aedaSKishon Vijay Abraham I phy->usb3_phy_power = dev->usb3_phy_power; 2786900aedaSKishon Vijay Abraham I 2796900aedaSKishon Vijay Abraham I #ifndef CONFIG_AM43XX 2806900aedaSKishon Vijay Abraham I ti_usb3_dpll_program(phy); 2816900aedaSKishon Vijay Abraham I ti_usb3_phy_power(phy, 1); 2826900aedaSKishon Vijay Abraham I #endif 2836900aedaSKishon Vijay Abraham I ti_usb2_phy_power(phy, 1); 2846900aedaSKishon Vijay Abraham I mdelay(150); 2856900aedaSKishon Vijay Abraham I list_add_tail(&phy->list, &ti_usb_phy_list); 2866900aedaSKishon Vijay Abraham I 2876900aedaSKishon Vijay Abraham I return 0; 2886900aedaSKishon Vijay Abraham I } 2896900aedaSKishon Vijay Abraham I 2906900aedaSKishon Vijay Abraham I /** 2916900aedaSKishon Vijay Abraham I * ti_usb_phy_uboot_exit - usb phy uboot cleanup code 2926900aedaSKishon Vijay Abraham I * @index: index of this controller 2936900aedaSKishon Vijay Abraham I * 2946900aedaSKishon Vijay Abraham I * Performs cleanup of memory allocated in ti_usb_phy_uboot_init. 2956900aedaSKishon Vijay Abraham I * index of _this_ controller should be passed and should match with 2966900aedaSKishon Vijay Abraham I * the index passed in ti_usb_phy_device during init. 2976900aedaSKishon Vijay Abraham I * 2986900aedaSKishon Vijay Abraham I * Generally called from board file. 2996900aedaSKishon Vijay Abraham I */ 3006900aedaSKishon Vijay Abraham I void ti_usb_phy_uboot_exit(int index) 3016900aedaSKishon Vijay Abraham I { 3026900aedaSKishon Vijay Abraham I struct ti_usb_phy *phy = NULL; 3036900aedaSKishon Vijay Abraham I 3046900aedaSKishon Vijay Abraham I list_for_each_entry(phy, &ti_usb_phy_list, list) { 3056900aedaSKishon Vijay Abraham I if (phy->index != index) 3066900aedaSKishon Vijay Abraham I continue; 3076900aedaSKishon Vijay Abraham I 3086900aedaSKishon Vijay Abraham I ti_usb2_phy_power(phy, 0); 3096900aedaSKishon Vijay Abraham I #ifndef CONFIG_AM43XX 3106900aedaSKishon Vijay Abraham I ti_usb3_phy_power(phy, 0); 3116900aedaSKishon Vijay Abraham I #endif 3126900aedaSKishon Vijay Abraham I list_del(&phy->list); 3136900aedaSKishon Vijay Abraham I kfree(phy); 3146900aedaSKishon Vijay Abraham I break; 3156900aedaSKishon Vijay Abraham I } 3166900aedaSKishon Vijay Abraham I } 317