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 <linux/ioport.h>
246900aedaSKishon Vijay Abraham I #include <asm/io.h>
256900aedaSKishon Vijay Abraham I #include <asm/arch/sys_proto.h>
26*b6985a21SMugunthan V N #include <dm.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
ti_usb3_readl(void __iomem * base,u32 offset)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
ti_usb3_writel(void __iomem * base,u32 offset,u32 value)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
ti_usb3_get_dpll_params(struct ti_usb_phy * phy)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
ti_usb3_dpll_wait_lock(struct ti_usb_phy * phy)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
ti_usb3_dpll_program(struct ti_usb_phy * phy)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
ti_usb2_phy_power(struct ti_usb_phy * phy,int on)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) {
1963891a54fSNishanth Menon #if defined(CONFIG_DRA7XX)
1970a7ab045SKishon Vijay Abraham I if (phy->index == 1)
1980a7ab045SKishon Vijay Abraham I val &= ~OMAP_CTRL_USB2_PHY_PD;
1990a7ab045SKishon 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 {
2083891a54fSNishanth Menon #if defined(CONFIG_DRA7XX)
2090a7ab045SKishon Vijay Abraham I if (phy->index == 1)
2100a7ab045SKishon Vijay Abraham I val |= OMAP_CTRL_USB2_PHY_PD;
2110a7ab045SKishon Vijay Abraham I else
2126900aedaSKishon Vijay Abraham I val |= OMAP_CTRL_DEV_PHY_PD;
2130a7ab045SKishon 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
ti_usb3_phy_power(struct ti_usb_phy * phy,int on)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 */
ti_usb_phy_uboot_init(struct ti_usb_phy_device * dev)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 */
ti_usb_phy_uboot_exit(int index)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