]> git.ipfire.org Git - people/ms/u-boot.git/blame - drivers/usb/musb/davinci.c
Add GPL-2.0+ SPDX-License-Identifier to source files
[people/ms/u-boot.git] / drivers / usb / musb / davinci.c
CommitLineData
e142e9f3
TA
1/*
2 * TI's Davinci platform specific USB wrapper functions.
3 *
4 * Copyright (c) 2008 Texas Instruments
5 *
1a459660 6 * SPDX-License-Identifier: GPL-2.0+
e142e9f3
TA
7 *
8 * Author: Thomas Abraham t-abraham@ti.com, Texas Instruments
9 */
10
11#include <common.h>
12#include <asm/io.h>
2731b9a8 13#include "davinci.h"
6e20e64f 14#include <asm/arch/hardware.h>
e142e9f3 15
1fa892c6
HS
16#if !defined(CONFIG_DV_USBPHY_CTL)
17#define CONFIG_DV_USBPHY_CTL (USBPHY_SESNDEN | USBPHY_VBDTCTEN)
18#endif
19
e142e9f3
TA
20/* MUSB platform configuration */
21struct musb_config musb_cfg = {
bbf4c01e
AKG
22 .regs = (struct musb_regs *)MENTOR_USB0_BASE,
23 .timeout = DAVINCI_USB_TIMEOUT,
24 .musb_speed = 0,
e142e9f3
TA
25};
26
27/* MUSB module register overlay */
28struct davinci_usb_regs *dregs;
29
30/*
31 * Enable the USB phy
32 */
33static u8 phy_on(void)
34{
35 u32 timeout;
6e20e64f
PS
36#ifdef DAVINCI_DM365EVM
37 u32 val;
38#endif
e142e9f3 39 /* Wait until the USB phy is turned on */
6e20e64f
PS
40#ifdef DAVINCI_DM365EVM
41 writel(USBPHY_PHY24MHZ | USBPHY_SESNDEN |
42 USBPHY_VBDTCTEN, USBPHY_CTL_PADDR);
43#else
1fa892c6 44 writel(CONFIG_DV_USBPHY_CTL, USBPHY_CTL_PADDR);
6e20e64f 45#endif
e142e9f3 46 timeout = musb_cfg.timeout;
6e20e64f
PS
47
48#ifdef DAVINCI_DM365EVM
49 /* Set the ownership of GIO33 to USB */
50 val = readl(PINMUX4);
51 val &= ~(PINMUX4_USBDRVBUS_BITCLEAR);
52 val |= PINMUX4_USBDRVBUS_BITSET;
53 writel(val, PINMUX4);
54#endif
e142e9f3
TA
55 while (timeout--)
56 if (readl(USBPHY_CTL_PADDR) & USBPHY_PHYCLKGD)
57 return 1;
58
59 /* USB phy was not turned on */
60 return 0;
61}
62
63/*
64 * Disable the USB phy
65 */
66static void phy_off(void)
67{
68 /* powerdown the on-chip PHY and its oscillator */
69 writel(USBPHY_OSCPDWN | USBPHY_PHYPDWN, USBPHY_CTL_PADDR);
70}
71
4ebe2080
HS
72void __enable_vbus(void)
73{
74 /*
75 * nothing to do, vbus is handled through the cpu.
76 * Define this function in board code, if it is
77 * different on your board.
78 */
79}
80void enable_vbus(void)
81 __attribute__((weak, alias("__enable_vbus")));
82
e142e9f3
TA
83/*
84 * This function performs Davinci platform specific initialization for usb0.
85 */
86int musb_platform_init(void)
87{
88 u32 revision;
89
90 /* enable USB VBUS */
91 enable_vbus();
4ebe2080 92
e142e9f3
TA
93 /* start the on-chip USB phy and its pll */
94 if (!phy_on())
95 return -1;
96
97 /* reset the controller */
98 dregs = (struct davinci_usb_regs *)DAVINCI_USB0_BASE;
99 writel(1, &dregs->ctrlr);
100 udelay(5000);
101
102 /* Returns zero if e.g. not clocked */
103 revision = readl(&dregs->version);
104 if (!revision)
105 return -1;
106
107 /* Disable all interrupts */
108 writel(DAVINCI_USB_USBINT_MASK | DAVINCI_USB_RXINT_MASK |
109 DAVINCI_USB_TXINT_MASK , &dregs->intmsksetr);
110 return 0;
111}
112
113/*
114 * This function performs Davinci platform specific deinitialization for usb0.
115 */
116void musb_platform_deinit(void)
117{
118 /* Turn of the phy */
119 phy_off();
120
121 /* flush any interrupts */
122 writel(DAVINCI_USB_USBINT_MASK | DAVINCI_USB_TXINT_MASK |
123 DAVINCI_USB_RXINT_MASK , &dregs->intclrr);
124}