xref: /rk3399_rockchip-uboot/drivers/usb/musb/davinci.c (revision 326ea986ac150acdc7656d57fca647db80b50158)
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  *
6*1a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
72731b9a8SJean-Christophe PLAGNIOL-VILLARD  *
82731b9a8SJean-Christophe PLAGNIOL-VILLARD  * Author: Thomas Abraham t-abraham@ti.com, Texas Instruments
92731b9a8SJean-Christophe PLAGNIOL-VILLARD  */
102731b9a8SJean-Christophe PLAGNIOL-VILLARD 
112731b9a8SJean-Christophe PLAGNIOL-VILLARD #include <common.h>
122731b9a8SJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h>
132731b9a8SJean-Christophe PLAGNIOL-VILLARD #include "davinci.h"
146e20e64fSPrathap Srinivas #include <asm/arch/hardware.h>
152731b9a8SJean-Christophe PLAGNIOL-VILLARD 
161fa892c6SHeiko Schocher #if !defined(CONFIG_DV_USBPHY_CTL)
171fa892c6SHeiko Schocher #define CONFIG_DV_USBPHY_CTL (USBPHY_SESNDEN | USBPHY_VBDTCTEN)
181fa892c6SHeiko Schocher #endif
191fa892c6SHeiko Schocher 
202731b9a8SJean-Christophe PLAGNIOL-VILLARD /* MUSB platform configuration */
212731b9a8SJean-Christophe PLAGNIOL-VILLARD struct musb_config musb_cfg = {
22bbf4c01eSAjay Kumar Gupta 	.regs		= (struct musb_regs *)MENTOR_USB0_BASE,
23bbf4c01eSAjay Kumar Gupta 	.timeout	= DAVINCI_USB_TIMEOUT,
24bbf4c01eSAjay Kumar Gupta 	.musb_speed	= 0,
252731b9a8SJean-Christophe PLAGNIOL-VILLARD };
262731b9a8SJean-Christophe PLAGNIOL-VILLARD 
272731b9a8SJean-Christophe PLAGNIOL-VILLARD /* MUSB module register overlay */
282731b9a8SJean-Christophe PLAGNIOL-VILLARD struct davinci_usb_regs *dregs;
292731b9a8SJean-Christophe PLAGNIOL-VILLARD 
302731b9a8SJean-Christophe PLAGNIOL-VILLARD /*
312731b9a8SJean-Christophe PLAGNIOL-VILLARD  * Enable the USB phy
322731b9a8SJean-Christophe PLAGNIOL-VILLARD  */
phy_on(void)332731b9a8SJean-Christophe PLAGNIOL-VILLARD static u8 phy_on(void)
342731b9a8SJean-Christophe PLAGNIOL-VILLARD {
352731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u32 timeout;
366e20e64fSPrathap Srinivas #ifdef DAVINCI_DM365EVM
376e20e64fSPrathap Srinivas 	u32 val;
386e20e64fSPrathap Srinivas #endif
392731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* Wait until the USB phy is turned on */
406e20e64fSPrathap Srinivas #ifdef DAVINCI_DM365EVM
416e20e64fSPrathap Srinivas 	writel(USBPHY_PHY24MHZ | USBPHY_SESNDEN |
426e20e64fSPrathap Srinivas 			USBPHY_VBDTCTEN, USBPHY_CTL_PADDR);
436e20e64fSPrathap Srinivas #else
441fa892c6SHeiko Schocher 	writel(CONFIG_DV_USBPHY_CTL, USBPHY_CTL_PADDR);
456e20e64fSPrathap Srinivas #endif
462731b9a8SJean-Christophe PLAGNIOL-VILLARD 	timeout = musb_cfg.timeout;
476e20e64fSPrathap Srinivas 
486e20e64fSPrathap Srinivas #ifdef DAVINCI_DM365EVM
496e20e64fSPrathap Srinivas 	/* Set the ownership of GIO33 to USB */
506e20e64fSPrathap Srinivas 	val = readl(PINMUX4);
516e20e64fSPrathap Srinivas 	val &= ~(PINMUX4_USBDRVBUS_BITCLEAR);
526e20e64fSPrathap Srinivas 	val |= PINMUX4_USBDRVBUS_BITSET;
536e20e64fSPrathap Srinivas 	writel(val, PINMUX4);
546e20e64fSPrathap Srinivas #endif
552731b9a8SJean-Christophe PLAGNIOL-VILLARD 	while (timeout--)
562731b9a8SJean-Christophe PLAGNIOL-VILLARD 		if (readl(USBPHY_CTL_PADDR) & USBPHY_PHYCLKGD)
572731b9a8SJean-Christophe PLAGNIOL-VILLARD 			return 1;
582731b9a8SJean-Christophe PLAGNIOL-VILLARD 
592731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* USB phy was not turned on */
602731b9a8SJean-Christophe PLAGNIOL-VILLARD 	return 0;
612731b9a8SJean-Christophe PLAGNIOL-VILLARD }
622731b9a8SJean-Christophe PLAGNIOL-VILLARD 
632731b9a8SJean-Christophe PLAGNIOL-VILLARD /*
642731b9a8SJean-Christophe PLAGNIOL-VILLARD  * Disable the USB phy
652731b9a8SJean-Christophe PLAGNIOL-VILLARD  */
phy_off(void)662731b9a8SJean-Christophe PLAGNIOL-VILLARD static void phy_off(void)
672731b9a8SJean-Christophe PLAGNIOL-VILLARD {
682731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* powerdown the on-chip PHY and its oscillator */
692731b9a8SJean-Christophe PLAGNIOL-VILLARD 	writel(USBPHY_OSCPDWN | USBPHY_PHYPDWN, USBPHY_CTL_PADDR);
702731b9a8SJean-Christophe PLAGNIOL-VILLARD }
712731b9a8SJean-Christophe PLAGNIOL-VILLARD 
__enable_vbus(void)724ebe2080SHeiko Schocher void __enable_vbus(void)
734ebe2080SHeiko Schocher {
744ebe2080SHeiko Schocher 	/*
754ebe2080SHeiko Schocher 	 *  nothing to do, vbus is handled through the cpu.
764ebe2080SHeiko Schocher 	 *  Define this function in board code, if it is
774ebe2080SHeiko Schocher 	 *  different on your board.
784ebe2080SHeiko Schocher 	 */
794ebe2080SHeiko Schocher }
804ebe2080SHeiko Schocher void  enable_vbus(void)
814ebe2080SHeiko Schocher 	__attribute__((weak, alias("__enable_vbus")));
824ebe2080SHeiko Schocher 
832731b9a8SJean-Christophe PLAGNIOL-VILLARD /*
842731b9a8SJean-Christophe PLAGNIOL-VILLARD  * This function performs Davinci platform specific initialization for usb0.
852731b9a8SJean-Christophe PLAGNIOL-VILLARD  */
musb_platform_init(void)862731b9a8SJean-Christophe PLAGNIOL-VILLARD int musb_platform_init(void)
872731b9a8SJean-Christophe PLAGNIOL-VILLARD {
882731b9a8SJean-Christophe PLAGNIOL-VILLARD 	u32  revision;
892731b9a8SJean-Christophe PLAGNIOL-VILLARD 
902731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* enable USB VBUS */
912731b9a8SJean-Christophe PLAGNIOL-VILLARD 	enable_vbus();
924ebe2080SHeiko Schocher 
932731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* start the on-chip USB phy and its pll */
942731b9a8SJean-Christophe PLAGNIOL-VILLARD 	if (!phy_on())
952731b9a8SJean-Christophe PLAGNIOL-VILLARD 		return -1;
962731b9a8SJean-Christophe PLAGNIOL-VILLARD 
972731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* reset the controller */
982731b9a8SJean-Christophe PLAGNIOL-VILLARD 	dregs = (struct davinci_usb_regs *)DAVINCI_USB0_BASE;
992731b9a8SJean-Christophe PLAGNIOL-VILLARD 	writel(1, &dregs->ctrlr);
1002731b9a8SJean-Christophe PLAGNIOL-VILLARD 	udelay(5000);
1012731b9a8SJean-Christophe PLAGNIOL-VILLARD 
1022731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* Returns zero if e.g. not clocked */
1032731b9a8SJean-Christophe PLAGNIOL-VILLARD 	revision = readl(&dregs->version);
1042731b9a8SJean-Christophe PLAGNIOL-VILLARD 	if (!revision)
1052731b9a8SJean-Christophe PLAGNIOL-VILLARD 		return -1;
1062731b9a8SJean-Christophe PLAGNIOL-VILLARD 
1072731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* Disable all interrupts */
1082731b9a8SJean-Christophe PLAGNIOL-VILLARD 	writel(DAVINCI_USB_USBINT_MASK | DAVINCI_USB_RXINT_MASK |
1092731b9a8SJean-Christophe PLAGNIOL-VILLARD 			DAVINCI_USB_TXINT_MASK , &dregs->intmsksetr);
1102731b9a8SJean-Christophe PLAGNIOL-VILLARD 	return 0;
1112731b9a8SJean-Christophe PLAGNIOL-VILLARD }
1122731b9a8SJean-Christophe PLAGNIOL-VILLARD 
1132731b9a8SJean-Christophe PLAGNIOL-VILLARD /*
1142731b9a8SJean-Christophe PLAGNIOL-VILLARD  * This function performs Davinci platform specific deinitialization for usb0.
1152731b9a8SJean-Christophe PLAGNIOL-VILLARD  */
musb_platform_deinit(void)1162731b9a8SJean-Christophe PLAGNIOL-VILLARD void musb_platform_deinit(void)
1172731b9a8SJean-Christophe PLAGNIOL-VILLARD {
1182731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* Turn of the phy */
1192731b9a8SJean-Christophe PLAGNIOL-VILLARD 	phy_off();
1202731b9a8SJean-Christophe PLAGNIOL-VILLARD 
1212731b9a8SJean-Christophe PLAGNIOL-VILLARD 	/* flush any interrupts */
1222731b9a8SJean-Christophe PLAGNIOL-VILLARD 	writel(DAVINCI_USB_USBINT_MASK | DAVINCI_USB_TXINT_MASK |
1232731b9a8SJean-Christophe PLAGNIOL-VILLARD 			DAVINCI_USB_RXINT_MASK , &dregs->intclrr);
1242731b9a8SJean-Christophe PLAGNIOL-VILLARD }
125