xref: /rk3399_rockchip-uboot/drivers/usb/dwc3/ti_usb_phy.c (revision 1a4f6af8bfd44c8ae6e87a81ff125eed47042cc5)
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