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