12731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 22731b9a8SJean-Christophe PLAGNIOL-VILLARD * TI's Davinci platform specific USB wrapper functions. 32731b9a8SJean-Christophe PLAGNIOL-VILLARD * 42731b9a8SJean-Christophe PLAGNIOL-VILLARD * Copyright (c) 2008 Texas Instruments 52731b9a8SJean-Christophe PLAGNIOL-VILLARD * 62731b9a8SJean-Christophe PLAGNIOL-VILLARD * This program is free software; you can redistribute it and/or 72731b9a8SJean-Christophe PLAGNIOL-VILLARD * modify it under the terms of the GNU General Public License as 82731b9a8SJean-Christophe PLAGNIOL-VILLARD * published by the Free Software Foundation; either version 2 of 92731b9a8SJean-Christophe PLAGNIOL-VILLARD * the License, or (at your option) any later version. 102731b9a8SJean-Christophe PLAGNIOL-VILLARD * 112731b9a8SJean-Christophe PLAGNIOL-VILLARD * This program is distributed in the hope that it will be useful, 122731b9a8SJean-Christophe PLAGNIOL-VILLARD * but WITHOUT ANY WARRANTY; without even the implied warranty of 132731b9a8SJean-Christophe PLAGNIOL-VILLARD * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 142731b9a8SJean-Christophe PLAGNIOL-VILLARD * GNU General Public License for more details. 152731b9a8SJean-Christophe PLAGNIOL-VILLARD * 162731b9a8SJean-Christophe PLAGNIOL-VILLARD * You should have received a copy of the GNU General Public License 172731b9a8SJean-Christophe PLAGNIOL-VILLARD * along with this program; if not, write to the Free Software 182731b9a8SJean-Christophe PLAGNIOL-VILLARD * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 192731b9a8SJean-Christophe PLAGNIOL-VILLARD * MA 02111-1307 USA 202731b9a8SJean-Christophe PLAGNIOL-VILLARD * 212731b9a8SJean-Christophe PLAGNIOL-VILLARD * Author: Thomas Abraham t-abraham@ti.com, Texas Instruments 222731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 232731b9a8SJean-Christophe PLAGNIOL-VILLARD 242731b9a8SJean-Christophe PLAGNIOL-VILLARD #include <common.h> 252731b9a8SJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h> 262731b9a8SJean-Christophe PLAGNIOL-VILLARD #include "davinci.h" 276e20e64fSPrathap Srinivas #include <asm/arch/hardware.h> 282731b9a8SJean-Christophe PLAGNIOL-VILLARD 292731b9a8SJean-Christophe PLAGNIOL-VILLARD /* MUSB platform configuration */ 302731b9a8SJean-Christophe PLAGNIOL-VILLARD struct musb_config musb_cfg = { 31bbf4c01eSAjay Kumar Gupta .regs = (struct musb_regs *)MENTOR_USB0_BASE, 32bbf4c01eSAjay Kumar Gupta .timeout = DAVINCI_USB_TIMEOUT, 33bbf4c01eSAjay Kumar Gupta .musb_speed = 0, 342731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 352731b9a8SJean-Christophe PLAGNIOL-VILLARD 362731b9a8SJean-Christophe PLAGNIOL-VILLARD /* MUSB module register overlay */ 372731b9a8SJean-Christophe PLAGNIOL-VILLARD struct davinci_usb_regs *dregs; 382731b9a8SJean-Christophe PLAGNIOL-VILLARD 392731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 402731b9a8SJean-Christophe PLAGNIOL-VILLARD * Enable the USB phy 412731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 422731b9a8SJean-Christophe PLAGNIOL-VILLARD static u8 phy_on(void) 432731b9a8SJean-Christophe PLAGNIOL-VILLARD { 442731b9a8SJean-Christophe PLAGNIOL-VILLARD u32 timeout; 456e20e64fSPrathap Srinivas #ifdef DAVINCI_DM365EVM 466e20e64fSPrathap Srinivas u32 val; 476e20e64fSPrathap Srinivas #endif 482731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Wait until the USB phy is turned on */ 496e20e64fSPrathap Srinivas #ifdef DAVINCI_DM365EVM 506e20e64fSPrathap Srinivas writel(USBPHY_PHY24MHZ | USBPHY_SESNDEN | 516e20e64fSPrathap Srinivas USBPHY_VBDTCTEN, USBPHY_CTL_PADDR); 526e20e64fSPrathap Srinivas #else 532731b9a8SJean-Christophe PLAGNIOL-VILLARD writel(USBPHY_SESNDEN | USBPHY_VBDTCTEN, USBPHY_CTL_PADDR); 546e20e64fSPrathap Srinivas #endif 552731b9a8SJean-Christophe PLAGNIOL-VILLARD timeout = musb_cfg.timeout; 566e20e64fSPrathap Srinivas 576e20e64fSPrathap Srinivas #ifdef DAVINCI_DM365EVM 586e20e64fSPrathap Srinivas /* Set the ownership of GIO33 to USB */ 596e20e64fSPrathap Srinivas val = readl(PINMUX4); 606e20e64fSPrathap Srinivas val &= ~(PINMUX4_USBDRVBUS_BITCLEAR); 616e20e64fSPrathap Srinivas val |= PINMUX4_USBDRVBUS_BITSET; 626e20e64fSPrathap Srinivas writel(val, PINMUX4); 636e20e64fSPrathap Srinivas #endif 642731b9a8SJean-Christophe PLAGNIOL-VILLARD while (timeout--) 652731b9a8SJean-Christophe PLAGNIOL-VILLARD if (readl(USBPHY_CTL_PADDR) & USBPHY_PHYCLKGD) 662731b9a8SJean-Christophe PLAGNIOL-VILLARD return 1; 672731b9a8SJean-Christophe PLAGNIOL-VILLARD 682731b9a8SJean-Christophe PLAGNIOL-VILLARD /* USB phy was not turned on */ 692731b9a8SJean-Christophe PLAGNIOL-VILLARD return 0; 702731b9a8SJean-Christophe PLAGNIOL-VILLARD } 712731b9a8SJean-Christophe PLAGNIOL-VILLARD 722731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 732731b9a8SJean-Christophe PLAGNIOL-VILLARD * Disable the USB phy 742731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 752731b9a8SJean-Christophe PLAGNIOL-VILLARD static void phy_off(void) 762731b9a8SJean-Christophe PLAGNIOL-VILLARD { 772731b9a8SJean-Christophe PLAGNIOL-VILLARD /* powerdown the on-chip PHY and its oscillator */ 782731b9a8SJean-Christophe PLAGNIOL-VILLARD writel(USBPHY_OSCPDWN | USBPHY_PHYPDWN, USBPHY_CTL_PADDR); 792731b9a8SJean-Christophe PLAGNIOL-VILLARD } 802731b9a8SJean-Christophe PLAGNIOL-VILLARD 81*4ebe2080SHeiko Schocher void __enable_vbus(void) 82*4ebe2080SHeiko Schocher { 83*4ebe2080SHeiko Schocher /* 84*4ebe2080SHeiko Schocher * nothing to do, vbus is handled through the cpu. 85*4ebe2080SHeiko Schocher * Define this function in board code, if it is 86*4ebe2080SHeiko Schocher * different on your board. 87*4ebe2080SHeiko Schocher */ 88*4ebe2080SHeiko Schocher } 89*4ebe2080SHeiko Schocher void enable_vbus(void) 90*4ebe2080SHeiko Schocher __attribute__((weak, alias("__enable_vbus"))); 91*4ebe2080SHeiko Schocher 922731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 932731b9a8SJean-Christophe PLAGNIOL-VILLARD * This function performs Davinci platform specific initialization for usb0. 942731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 952731b9a8SJean-Christophe PLAGNIOL-VILLARD int musb_platform_init(void) 962731b9a8SJean-Christophe PLAGNIOL-VILLARD { 972731b9a8SJean-Christophe PLAGNIOL-VILLARD u32 revision; 982731b9a8SJean-Christophe PLAGNIOL-VILLARD 992731b9a8SJean-Christophe PLAGNIOL-VILLARD /* enable USB VBUS */ 1002731b9a8SJean-Christophe PLAGNIOL-VILLARD enable_vbus(); 101*4ebe2080SHeiko Schocher 1022731b9a8SJean-Christophe PLAGNIOL-VILLARD /* start the on-chip USB phy and its pll */ 1032731b9a8SJean-Christophe PLAGNIOL-VILLARD if (!phy_on()) 1042731b9a8SJean-Christophe PLAGNIOL-VILLARD return -1; 1052731b9a8SJean-Christophe PLAGNIOL-VILLARD 1062731b9a8SJean-Christophe PLAGNIOL-VILLARD /* reset the controller */ 1072731b9a8SJean-Christophe PLAGNIOL-VILLARD dregs = (struct davinci_usb_regs *)DAVINCI_USB0_BASE; 1082731b9a8SJean-Christophe PLAGNIOL-VILLARD writel(1, &dregs->ctrlr); 1092731b9a8SJean-Christophe PLAGNIOL-VILLARD udelay(5000); 1102731b9a8SJean-Christophe PLAGNIOL-VILLARD 1112731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Returns zero if e.g. not clocked */ 1122731b9a8SJean-Christophe PLAGNIOL-VILLARD revision = readl(&dregs->version); 1132731b9a8SJean-Christophe PLAGNIOL-VILLARD if (!revision) 1142731b9a8SJean-Christophe PLAGNIOL-VILLARD return -1; 1152731b9a8SJean-Christophe PLAGNIOL-VILLARD 1162731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Disable all interrupts */ 1172731b9a8SJean-Christophe PLAGNIOL-VILLARD writel(DAVINCI_USB_USBINT_MASK | DAVINCI_USB_RXINT_MASK | 1182731b9a8SJean-Christophe PLAGNIOL-VILLARD DAVINCI_USB_TXINT_MASK , &dregs->intmsksetr); 1192731b9a8SJean-Christophe PLAGNIOL-VILLARD return 0; 1202731b9a8SJean-Christophe PLAGNIOL-VILLARD } 1212731b9a8SJean-Christophe PLAGNIOL-VILLARD 1222731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 1232731b9a8SJean-Christophe PLAGNIOL-VILLARD * This function performs Davinci platform specific deinitialization for usb0. 1242731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 1252731b9a8SJean-Christophe PLAGNIOL-VILLARD void musb_platform_deinit(void) 1262731b9a8SJean-Christophe PLAGNIOL-VILLARD { 1272731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Turn of the phy */ 1282731b9a8SJean-Christophe PLAGNIOL-VILLARD phy_off(); 1292731b9a8SJean-Christophe PLAGNIOL-VILLARD 1302731b9a8SJean-Christophe PLAGNIOL-VILLARD /* flush any interrupts */ 1312731b9a8SJean-Christophe PLAGNIOL-VILLARD writel(DAVINCI_USB_USBINT_MASK | DAVINCI_USB_TXINT_MASK | 1322731b9a8SJean-Christophe PLAGNIOL-VILLARD DAVINCI_USB_RXINT_MASK , &dregs->intclrr); 1332731b9a8SJean-Christophe PLAGNIOL-VILLARD } 134