1*6900aedaSKishon Vijay Abraham I /** 2*6900aedaSKishon Vijay Abraham I * ti_usb_phy.c - USB3 and USB3 PHY programming for dwc3 3*6900aedaSKishon Vijay Abraham I * 4*6900aedaSKishon Vijay Abraham I * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com 5*6900aedaSKishon Vijay Abraham I * 6*6900aedaSKishon Vijay Abraham I * Author: Kishon Vijay Abraham I <kishon@ti.com> 7*6900aedaSKishon Vijay Abraham I * 8*6900aedaSKishon Vijay Abraham I * Taken from Linux Kernel v3.16 (drivers/phy/phy-ti-pipe3.c and 9*6900aedaSKishon Vijay Abraham I * drivers/phy/phy-omap-usb2.c) and ported to uboot. 10*6900aedaSKishon Vijay Abraham I * 11*6900aedaSKishon Vijay Abraham I * "commit 56042e : phy: ti-pipe3: Fix suspend/resume and module reload" for 12*6900aedaSKishon Vijay Abraham I * phy-ti-pipe3.c 13*6900aedaSKishon Vijay Abraham I * 14*6900aedaSKishon Vijay Abraham I * "commit eb82a3 : phy: omap-usb2: Balance pm_runtime_enable() on probe failure 15*6900aedaSKishon Vijay Abraham I * and remove" for phy-omap-usb2.c 16*6900aedaSKishon Vijay Abraham I * 17*6900aedaSKishon Vijay Abraham I * SPDX-License-Identifier: GPL-2.0+ 18*6900aedaSKishon Vijay Abraham I */ 19*6900aedaSKishon Vijay Abraham I 20*6900aedaSKishon Vijay Abraham I #include <common.h> 21*6900aedaSKishon Vijay Abraham I #include <malloc.h> 22*6900aedaSKishon Vijay Abraham I #include <ti-usb-phy-uboot.h> 23*6900aedaSKishon Vijay Abraham I #include <usb/lin_gadget_compat.h> 24*6900aedaSKishon Vijay Abraham I #include <linux/ioport.h> 25*6900aedaSKishon Vijay Abraham I #include <asm/io.h> 26*6900aedaSKishon Vijay Abraham I #include <asm/arch/sys_proto.h> 27*6900aedaSKishon Vijay Abraham I 28*6900aedaSKishon Vijay Abraham I #include "linux-compat.h" 29*6900aedaSKishon Vijay Abraham I 30*6900aedaSKishon Vijay Abraham I #define PLL_STATUS 0x00000004 31*6900aedaSKishon Vijay Abraham I #define PLL_GO 0x00000008 32*6900aedaSKishon Vijay Abraham I #define PLL_CONFIGURATION1 0x0000000C 33*6900aedaSKishon Vijay Abraham I #define PLL_CONFIGURATION2 0x00000010 34*6900aedaSKishon Vijay Abraham I #define PLL_CONFIGURATION3 0x00000014 35*6900aedaSKishon Vijay Abraham I #define PLL_CONFIGURATION4 0x00000020 36*6900aedaSKishon Vijay Abraham I 37*6900aedaSKishon Vijay Abraham I #define PLL_REGM_MASK 0x001FFE00 38*6900aedaSKishon Vijay Abraham I #define PLL_REGM_SHIFT 0x9 39*6900aedaSKishon Vijay Abraham I #define PLL_REGM_F_MASK 0x0003FFFF 40*6900aedaSKishon Vijay Abraham I #define PLL_REGM_F_SHIFT 0x0 41*6900aedaSKishon Vijay Abraham I #define PLL_REGN_MASK 0x000001FE 42*6900aedaSKishon Vijay Abraham I #define PLL_REGN_SHIFT 0x1 43*6900aedaSKishon Vijay Abraham I #define PLL_SELFREQDCO_MASK 0x0000000E 44*6900aedaSKishon Vijay Abraham I #define PLL_SELFREQDCO_SHIFT 0x1 45*6900aedaSKishon Vijay Abraham I #define PLL_SD_MASK 0x0003FC00 46*6900aedaSKishon Vijay Abraham I #define PLL_SD_SHIFT 10 47*6900aedaSKishon Vijay Abraham I #define SET_PLL_GO 0x1 48*6900aedaSKishon Vijay Abraham I #define PLL_LDOPWDN BIT(15) 49*6900aedaSKishon Vijay Abraham I #define PLL_TICOPWDN BIT(16) 50*6900aedaSKishon Vijay Abraham I #define PLL_LOCK 0x2 51*6900aedaSKishon Vijay Abraham I #define PLL_IDLE 0x1 52*6900aedaSKishon Vijay Abraham I 53*6900aedaSKishon Vijay Abraham I #define OMAP_CTRL_DEV_PHY_PD BIT(0) 54*6900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB3_PHY_PWRCTL_CLK_CMD_MASK 0x003FC000 55*6900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB3_PHY_PWRCTL_CLK_CMD_SHIFT 0xE 56*6900aedaSKishon Vijay Abraham I 57*6900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB3_PHY_PWRCTL_CLK_FREQ_MASK 0xFFC00000 58*6900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB3_PHY_PWRCTL_CLK_FREQ_SHIFT 0x16 59*6900aedaSKishon Vijay Abraham I 60*6900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB3_PHY_TX_RX_POWERON 0x3 61*6900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB3_PHY_TX_RX_POWEROFF 0x0 62*6900aedaSKishon Vijay Abraham I 63*6900aedaSKishon Vijay Abraham I #define OMAP_CTRL_USB2_PHY_PD BIT(28) 64*6900aedaSKishon Vijay Abraham I 65*6900aedaSKishon Vijay Abraham I #define AM437X_CTRL_USB2_PHY_PD BIT(0) 66*6900aedaSKishon Vijay Abraham I #define AM437X_CTRL_USB2_OTG_PD BIT(1) 67*6900aedaSKishon Vijay Abraham I #define AM437X_CTRL_USB2_OTGVDET_EN BIT(19) 68*6900aedaSKishon Vijay Abraham I #define AM437X_CTRL_USB2_OTGSESSEND_EN BIT(20) 69*6900aedaSKishon Vijay Abraham I 70*6900aedaSKishon Vijay Abraham I static LIST_HEAD(ti_usb_phy_list); 71*6900aedaSKishon Vijay Abraham I typedef unsigned int u32; 72*6900aedaSKishon Vijay Abraham I 73*6900aedaSKishon Vijay Abraham I struct usb3_dpll_params { 74*6900aedaSKishon Vijay Abraham I u16 m; 75*6900aedaSKishon Vijay Abraham I u8 n; 76*6900aedaSKishon Vijay Abraham I u8 freq:3; 77*6900aedaSKishon Vijay Abraham I u8 sd; 78*6900aedaSKishon Vijay Abraham I u32 mf; 79*6900aedaSKishon Vijay Abraham I }; 80*6900aedaSKishon Vijay Abraham I 81*6900aedaSKishon Vijay Abraham I struct usb3_dpll_map { 82*6900aedaSKishon Vijay Abraham I unsigned long rate; 83*6900aedaSKishon Vijay Abraham I struct usb3_dpll_params params; 84*6900aedaSKishon Vijay Abraham I struct usb3_dpll_map *dpll_map; 85*6900aedaSKishon Vijay Abraham I }; 86*6900aedaSKishon Vijay Abraham I 87*6900aedaSKishon Vijay Abraham I struct ti_usb_phy { 88*6900aedaSKishon Vijay Abraham I void __iomem *pll_ctrl_base; 89*6900aedaSKishon Vijay Abraham I void __iomem *usb2_phy_power; 90*6900aedaSKishon Vijay Abraham I void __iomem *usb3_phy_power; 91*6900aedaSKishon Vijay Abraham I struct usb3_dpll_map *dpll_map; 92*6900aedaSKishon Vijay Abraham I struct list_head list; 93*6900aedaSKishon Vijay Abraham I int index; 94*6900aedaSKishon Vijay Abraham I }; 95*6900aedaSKishon Vijay Abraham I 96*6900aedaSKishon Vijay Abraham I static struct usb3_dpll_map dpll_map_usb[] = { 97*6900aedaSKishon Vijay Abraham I {12000000, {1250, 5, 4, 20, 0} }, /* 12 MHz */ 98*6900aedaSKishon Vijay Abraham I {16800000, {3125, 20, 4, 20, 0} }, /* 16.8 MHz */ 99*6900aedaSKishon Vijay Abraham I {19200000, {1172, 8, 4, 20, 65537} }, /* 19.2 MHz */ 100*6900aedaSKishon Vijay Abraham I {20000000, {1000, 7, 4, 10, 0} }, /* 20 MHz */ 101*6900aedaSKishon Vijay Abraham I {26000000, {1250, 12, 4, 20, 0} }, /* 26 MHz */ 102*6900aedaSKishon Vijay Abraham I {38400000, {3125, 47, 4, 20, 92843} }, /* 38.4 MHz */ 103*6900aedaSKishon Vijay Abraham I { }, /* Terminator */ 104*6900aedaSKishon Vijay Abraham I }; 105*6900aedaSKishon Vijay Abraham I 106*6900aedaSKishon Vijay Abraham I static inline unsigned int ti_usb3_readl(void __iomem *base, u32 offset) 107*6900aedaSKishon Vijay Abraham I { 108*6900aedaSKishon Vijay Abraham I return readl(base + offset); 109*6900aedaSKishon Vijay Abraham I } 110*6900aedaSKishon Vijay Abraham I 111*6900aedaSKishon Vijay Abraham I static inline void ti_usb3_writel(void __iomem *base, u32 offset, u32 value) 112*6900aedaSKishon Vijay Abraham I { 113*6900aedaSKishon Vijay Abraham I writel(value, base + offset); 114*6900aedaSKishon Vijay Abraham I } 115*6900aedaSKishon Vijay Abraham I 116*6900aedaSKishon Vijay Abraham I #ifndef CONFIG_AM43XX 117*6900aedaSKishon Vijay Abraham I static struct usb3_dpll_params *ti_usb3_get_dpll_params(struct ti_usb_phy *phy) 118*6900aedaSKishon Vijay Abraham I { 119*6900aedaSKishon Vijay Abraham I unsigned long rate; 120*6900aedaSKishon Vijay Abraham I struct usb3_dpll_map *dpll_map = phy->dpll_map; 121*6900aedaSKishon Vijay Abraham I 122*6900aedaSKishon Vijay Abraham I rate = get_sys_clk_freq(); 123*6900aedaSKishon Vijay Abraham I 124*6900aedaSKishon Vijay Abraham I for (; dpll_map->rate; dpll_map++) { 125*6900aedaSKishon Vijay Abraham I if (rate == dpll_map->rate) 126*6900aedaSKishon Vijay Abraham I return &dpll_map->params; 127*6900aedaSKishon Vijay Abraham I } 128*6900aedaSKishon Vijay Abraham I 129*6900aedaSKishon Vijay Abraham I dev_err(phy->dev, "No DPLL configuration for %lu Hz SYS CLK\n", rate); 130*6900aedaSKishon Vijay Abraham I 131*6900aedaSKishon Vijay Abraham I return NULL; 132*6900aedaSKishon Vijay Abraham I } 133*6900aedaSKishon Vijay Abraham I 134*6900aedaSKishon Vijay Abraham I static int ti_usb3_dpll_wait_lock(struct ti_usb_phy *phy) 135*6900aedaSKishon Vijay Abraham I { 136*6900aedaSKishon Vijay Abraham I u32 val; 137*6900aedaSKishon Vijay Abraham I do { 138*6900aedaSKishon Vijay Abraham I val = ti_usb3_readl(phy->pll_ctrl_base, PLL_STATUS); 139*6900aedaSKishon Vijay Abraham I if (val & PLL_LOCK) 140*6900aedaSKishon Vijay Abraham I break; 141*6900aedaSKishon Vijay Abraham I } while (1); 142*6900aedaSKishon Vijay Abraham I 143*6900aedaSKishon Vijay Abraham I return 0; 144*6900aedaSKishon Vijay Abraham I } 145*6900aedaSKishon Vijay Abraham I 146*6900aedaSKishon Vijay Abraham I static int ti_usb3_dpll_program(struct ti_usb_phy *phy) 147*6900aedaSKishon Vijay Abraham I { 148*6900aedaSKishon Vijay Abraham I u32 val; 149*6900aedaSKishon Vijay Abraham I struct usb3_dpll_params *dpll_params; 150*6900aedaSKishon Vijay Abraham I 151*6900aedaSKishon Vijay Abraham I if (!phy->pll_ctrl_base) 152*6900aedaSKishon Vijay Abraham I return -EINVAL; 153*6900aedaSKishon Vijay Abraham I 154*6900aedaSKishon Vijay Abraham I dpll_params = ti_usb3_get_dpll_params(phy); 155*6900aedaSKishon Vijay Abraham I if (!dpll_params) 156*6900aedaSKishon Vijay Abraham I return -EINVAL; 157*6900aedaSKishon Vijay Abraham I 158*6900aedaSKishon Vijay Abraham I val = ti_usb3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1); 159*6900aedaSKishon Vijay Abraham I val &= ~PLL_REGN_MASK; 160*6900aedaSKishon Vijay Abraham I val |= dpll_params->n << PLL_REGN_SHIFT; 161*6900aedaSKishon Vijay Abraham I ti_usb3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val); 162*6900aedaSKishon Vijay Abraham I 163*6900aedaSKishon Vijay Abraham I val = ti_usb3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2); 164*6900aedaSKishon Vijay Abraham I val &= ~PLL_SELFREQDCO_MASK; 165*6900aedaSKishon Vijay Abraham I val |= dpll_params->freq << PLL_SELFREQDCO_SHIFT; 166*6900aedaSKishon Vijay Abraham I ti_usb3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val); 167*6900aedaSKishon Vijay Abraham I 168*6900aedaSKishon Vijay Abraham I val = ti_usb3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1); 169*6900aedaSKishon Vijay Abraham I val &= ~PLL_REGM_MASK; 170*6900aedaSKishon Vijay Abraham I val |= dpll_params->m << PLL_REGM_SHIFT; 171*6900aedaSKishon Vijay Abraham I ti_usb3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val); 172*6900aedaSKishon Vijay Abraham I 173*6900aedaSKishon Vijay Abraham I val = ti_usb3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION4); 174*6900aedaSKishon Vijay Abraham I val &= ~PLL_REGM_F_MASK; 175*6900aedaSKishon Vijay Abraham I val |= dpll_params->mf << PLL_REGM_F_SHIFT; 176*6900aedaSKishon Vijay Abraham I ti_usb3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION4, val); 177*6900aedaSKishon Vijay Abraham I 178*6900aedaSKishon Vijay Abraham I val = ti_usb3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION3); 179*6900aedaSKishon Vijay Abraham I val &= ~PLL_SD_MASK; 180*6900aedaSKishon Vijay Abraham I val |= dpll_params->sd << PLL_SD_SHIFT; 181*6900aedaSKishon Vijay Abraham I ti_usb3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION3, val); 182*6900aedaSKishon Vijay Abraham I 183*6900aedaSKishon Vijay Abraham I ti_usb3_writel(phy->pll_ctrl_base, PLL_GO, SET_PLL_GO); 184*6900aedaSKishon Vijay Abraham I 185*6900aedaSKishon Vijay Abraham I return ti_usb3_dpll_wait_lock(phy); 186*6900aedaSKishon Vijay Abraham I } 187*6900aedaSKishon Vijay Abraham I #endif 188*6900aedaSKishon Vijay Abraham I 189*6900aedaSKishon Vijay Abraham I void ti_usb2_phy_power(struct ti_usb_phy *phy, int on) 190*6900aedaSKishon Vijay Abraham I { 191*6900aedaSKishon Vijay Abraham I u32 val; 192*6900aedaSKishon Vijay Abraham I 193*6900aedaSKishon Vijay Abraham I val = readl(phy->usb2_phy_power); 194*6900aedaSKishon Vijay Abraham I 195*6900aedaSKishon Vijay Abraham I if (on) { 196*6900aedaSKishon Vijay Abraham I #ifdef CONFIG_DRA7XX 197*6900aedaSKishon Vijay Abraham I val &= ~OMAP_CTRL_DEV_PHY_PD; 198*6900aedaSKishon Vijay Abraham I #elif defined(CONFIG_AM43XX) 199*6900aedaSKishon Vijay Abraham I val &= ~(AM437X_CTRL_USB2_PHY_PD | 200*6900aedaSKishon Vijay Abraham I AM437X_CTRL_USB2_OTG_PD); 201*6900aedaSKishon Vijay Abraham I val |= (AM437X_CTRL_USB2_OTGVDET_EN | 202*6900aedaSKishon Vijay Abraham I AM437X_CTRL_USB2_OTGSESSEND_EN); 203*6900aedaSKishon Vijay Abraham I #endif 204*6900aedaSKishon Vijay Abraham I } else { 205*6900aedaSKishon Vijay Abraham I #ifdef CONFIG_DRA7XX 206*6900aedaSKishon Vijay Abraham I val |= OMAP_CTRL_DEV_PHY_PD; 207*6900aedaSKishon Vijay Abraham I #elif defined(CONFIG_AM43XX) 208*6900aedaSKishon Vijay Abraham I val &= ~(AM437X_CTRL_USB2_OTGVDET_EN | 209*6900aedaSKishon Vijay Abraham I AM437X_CTRL_USB2_OTGSESSEND_EN); 210*6900aedaSKishon Vijay Abraham I val |= (AM437X_CTRL_USB2_PHY_PD | 211*6900aedaSKishon Vijay Abraham I AM437X_CTRL_USB2_OTG_PD); 212*6900aedaSKishon Vijay Abraham I #endif 213*6900aedaSKishon Vijay Abraham I } 214*6900aedaSKishon Vijay Abraham I writel(val, phy->usb2_phy_power); 215*6900aedaSKishon Vijay Abraham I } 216*6900aedaSKishon Vijay Abraham I 217*6900aedaSKishon Vijay Abraham I #ifndef CONFIG_AM43XX 218*6900aedaSKishon Vijay Abraham I void ti_usb3_phy_power(struct ti_usb_phy *phy, int on) 219*6900aedaSKishon Vijay Abraham I { 220*6900aedaSKishon Vijay Abraham I u32 val; 221*6900aedaSKishon Vijay Abraham I u32 rate; 222*6900aedaSKishon Vijay Abraham I rate = get_sys_clk_freq(); 223*6900aedaSKishon Vijay Abraham I rate = rate/1000000; 224*6900aedaSKishon Vijay Abraham I 225*6900aedaSKishon Vijay Abraham I if (!phy->usb3_phy_power) 226*6900aedaSKishon Vijay Abraham I return; 227*6900aedaSKishon Vijay Abraham I 228*6900aedaSKishon Vijay Abraham I val = readl(phy->usb3_phy_power); 229*6900aedaSKishon Vijay Abraham I if (on) { 230*6900aedaSKishon Vijay Abraham I val &= ~(OMAP_CTRL_USB3_PHY_PWRCTL_CLK_CMD_MASK | 231*6900aedaSKishon Vijay Abraham I OMAP_CTRL_USB3_PHY_PWRCTL_CLK_FREQ_MASK); 232*6900aedaSKishon Vijay Abraham I val |= (OMAP_CTRL_USB3_PHY_TX_RX_POWERON) << 233*6900aedaSKishon Vijay Abraham I OMAP_CTRL_USB3_PHY_PWRCTL_CLK_CMD_SHIFT; 234*6900aedaSKishon Vijay Abraham I val |= rate << 235*6900aedaSKishon Vijay Abraham I OMAP_CTRL_USB3_PHY_PWRCTL_CLK_FREQ_SHIFT; 236*6900aedaSKishon Vijay Abraham I } else { 237*6900aedaSKishon Vijay Abraham I val &= ~OMAP_CTRL_USB3_PHY_PWRCTL_CLK_CMD_MASK; 238*6900aedaSKishon Vijay Abraham I val |= OMAP_CTRL_USB3_PHY_TX_RX_POWEROFF << 239*6900aedaSKishon Vijay Abraham I OMAP_CTRL_USB3_PHY_PWRCTL_CLK_CMD_SHIFT; 240*6900aedaSKishon Vijay Abraham I } 241*6900aedaSKishon Vijay Abraham I writel(val, phy->usb3_phy_power); 242*6900aedaSKishon Vijay Abraham I } 243*6900aedaSKishon Vijay Abraham I #endif 244*6900aedaSKishon Vijay Abraham I 245*6900aedaSKishon Vijay Abraham I /** 246*6900aedaSKishon Vijay Abraham I * ti_usb_phy_uboot_init - usb phy uboot initialization code 247*6900aedaSKishon Vijay Abraham I * @dev: struct ti_usb_phy_device containing initialization data 248*6900aedaSKishon Vijay Abraham I * 249*6900aedaSKishon Vijay Abraham I * Entry point for ti usb phy driver. This driver handles initialization 250*6900aedaSKishon Vijay Abraham I * of both usb2 phy and usb3 phy. Pointer to ti_usb_phy_device should be 251*6900aedaSKishon Vijay Abraham I * passed containing base address and other initialization data. 252*6900aedaSKishon Vijay Abraham I * Returns '0' on success and a negative value on failure. 253*6900aedaSKishon Vijay Abraham I * 254*6900aedaSKishon Vijay Abraham I * Generally called from board_usb_init() implemented in board file. 255*6900aedaSKishon Vijay Abraham I */ 256*6900aedaSKishon Vijay Abraham I int ti_usb_phy_uboot_init(struct ti_usb_phy_device *dev) 257*6900aedaSKishon Vijay Abraham I { 258*6900aedaSKishon Vijay Abraham I struct ti_usb_phy *phy; 259*6900aedaSKishon Vijay Abraham I 260*6900aedaSKishon Vijay Abraham I phy = devm_kzalloc(NULL, sizeof(*phy), GFP_KERNEL); 261*6900aedaSKishon Vijay Abraham I if (!phy) { 262*6900aedaSKishon Vijay Abraham I dev_err(NULL, "unable to alloc mem for TI USB3 PHY\n"); 263*6900aedaSKishon Vijay Abraham I return -ENOMEM; 264*6900aedaSKishon Vijay Abraham I } 265*6900aedaSKishon Vijay Abraham I 266*6900aedaSKishon Vijay Abraham I phy->dpll_map = dpll_map_usb; 267*6900aedaSKishon Vijay Abraham I phy->index = dev->index; 268*6900aedaSKishon Vijay Abraham I phy->pll_ctrl_base = dev->pll_ctrl_base; 269*6900aedaSKishon Vijay Abraham I phy->usb2_phy_power = dev->usb2_phy_power; 270*6900aedaSKishon Vijay Abraham I phy->usb3_phy_power = dev->usb3_phy_power; 271*6900aedaSKishon Vijay Abraham I 272*6900aedaSKishon Vijay Abraham I #ifndef CONFIG_AM43XX 273*6900aedaSKishon Vijay Abraham I ti_usb3_dpll_program(phy); 274*6900aedaSKishon Vijay Abraham I ti_usb3_phy_power(phy, 1); 275*6900aedaSKishon Vijay Abraham I #endif 276*6900aedaSKishon Vijay Abraham I ti_usb2_phy_power(phy, 1); 277*6900aedaSKishon Vijay Abraham I mdelay(150); 278*6900aedaSKishon Vijay Abraham I list_add_tail(&phy->list, &ti_usb_phy_list); 279*6900aedaSKishon Vijay Abraham I 280*6900aedaSKishon Vijay Abraham I return 0; 281*6900aedaSKishon Vijay Abraham I } 282*6900aedaSKishon Vijay Abraham I 283*6900aedaSKishon Vijay Abraham I /** 284*6900aedaSKishon Vijay Abraham I * ti_usb_phy_uboot_exit - usb phy uboot cleanup code 285*6900aedaSKishon Vijay Abraham I * @index: index of this controller 286*6900aedaSKishon Vijay Abraham I * 287*6900aedaSKishon Vijay Abraham I * Performs cleanup of memory allocated in ti_usb_phy_uboot_init. 288*6900aedaSKishon Vijay Abraham I * index of _this_ controller should be passed and should match with 289*6900aedaSKishon Vijay Abraham I * the index passed in ti_usb_phy_device during init. 290*6900aedaSKishon Vijay Abraham I * 291*6900aedaSKishon Vijay Abraham I * Generally called from board file. 292*6900aedaSKishon Vijay Abraham I */ 293*6900aedaSKishon Vijay Abraham I void ti_usb_phy_uboot_exit(int index) 294*6900aedaSKishon Vijay Abraham I { 295*6900aedaSKishon Vijay Abraham I struct ti_usb_phy *phy = NULL; 296*6900aedaSKishon Vijay Abraham I 297*6900aedaSKishon Vijay Abraham I list_for_each_entry(phy, &ti_usb_phy_list, list) { 298*6900aedaSKishon Vijay Abraham I if (phy->index != index) 299*6900aedaSKishon Vijay Abraham I continue; 300*6900aedaSKishon Vijay Abraham I 301*6900aedaSKishon Vijay Abraham I ti_usb2_phy_power(phy, 0); 302*6900aedaSKishon Vijay Abraham I #ifndef CONFIG_AM43XX 303*6900aedaSKishon Vijay Abraham I ti_usb3_phy_power(phy, 0); 304*6900aedaSKishon Vijay Abraham I #endif 305*6900aedaSKishon Vijay Abraham I list_del(&phy->list); 306*6900aedaSKishon Vijay Abraham I kfree(phy); 307*6900aedaSKishon Vijay Abraham I break; 308*6900aedaSKishon Vijay Abraham I } 309*6900aedaSKishon Vijay Abraham I } 310