xref: /rk3399_rockchip-uboot/drivers/usb/musb/davinci.c (revision 4ebe208097a374348689907680e002be3ee9e91c)
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