30
30
#include <mach/irqs.h>
31
31
#include <mach/am35xx.h>
32
32
#include <plat/usb.h>
33
#include <plat/omap_device.h>
35
36
#if defined(CONFIG_USB_MUSB_OMAP2PLUS) || defined (CONFIG_USB_MUSB_AM35X)
37
static void am35x_musb_reset(void)
41
/* Reset the musb interface */
42
regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
44
regval |= AM35XX_USBOTGSS_SW_RST;
45
omap_ctrl_writel(regval, AM35XX_CONTROL_IP_SW_RESET);
47
regval &= ~AM35XX_USBOTGSS_SW_RST;
48
omap_ctrl_writel(regval, AM35XX_CONTROL_IP_SW_RESET);
50
regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
53
static void am35x_musb_phy_power(u8 on)
55
unsigned long timeout = jiffies + msecs_to_jiffies(100);
60
* Start the on-chip PHY and its PLL.
62
devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2);
64
devconf2 &= ~(CONF2_RESET | CONF2_PHYPWRDN | CONF2_OTGPWRDN);
65
devconf2 |= CONF2_PHY_PLLON;
67
omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2);
69
pr_info(KERN_INFO "Waiting for PHY clock good...\n");
70
while (!(omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2)
74
if (time_after(jiffies, timeout)) {
75
pr_err(KERN_ERR "musb PHY clock good timed out\n");
81
* Power down the on-chip PHY.
83
devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2);
85
devconf2 &= ~CONF2_PHY_PLLON;
86
devconf2 |= CONF2_PHYPWRDN | CONF2_OTGPWRDN;
87
omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2);
91
static void am35x_musb_clear_irq(void)
95
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
96
regval |= AM35XX_USBOTGSS_INT_CLR;
97
omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);
98
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
101
static void am35x_musb_set_mode(u8 musb_mode)
103
u32 devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2);
105
devconf2 &= ~CONF2_OTGMODE;
107
#ifdef CONFIG_USB_MUSB_HDRC_HCD
108
case MUSB_HOST: /* Force VBUS valid, ID = 0 */
109
devconf2 |= CONF2_FORCE_HOST;
112
#ifdef CONFIG_USB_GADGET_MUSB_HDRC
113
case MUSB_PERIPHERAL: /* Force VBUS valid, ID = 1 */
114
devconf2 |= CONF2_FORCE_DEVICE;
117
#ifdef CONFIG_USB_MUSB_OTG
118
case MUSB_OTG: /* Don't override the VBUS/ID comparators */
119
devconf2 |= CONF2_NO_OVERRIDE;
123
pr_info(KERN_INFO "Unsupported mode %u\n", musb_mode);
126
omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2);
129
static struct resource musb_resources[] = {
130
[0] = { /* start and end set dynamically */
131
.flags = IORESOURCE_MEM,
133
[1] = { /* general IRQ */
134
.start = INT_243X_HS_USB_MC,
135
.flags = IORESOURCE_IRQ,
138
[2] = { /* DMA IRQ */
139
.start = INT_243X_HS_USB_DMA,
140
.flags = IORESOURCE_IRQ,
145
38
static struct musb_hdrc_config musb_config = {
170
63
static u64 musb_dmamask = DMA_BIT_MASK(32);
172
static struct platform_device musb_device = {
173
.name = "musb-omap2430",
176
.dma_mask = &musb_dmamask,
177
.coherent_dma_mask = DMA_BIT_MASK(32),
178
.platform_data = &musb_plat,
65
static struct omap_device_pm_latency omap_musb_latency[] = {
67
.deactivate_func = omap_device_idle_hwmods,
68
.activate_func = omap_device_enable_hwmods,
69
.flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST,
180
.num_resources = ARRAY_SIZE(musb_resources),
181
.resource = musb_resources,
73
static void usb_musb_mux_init(struct omap_musb_board_data *board_data)
75
switch (board_data->interface_type) {
76
case MUSB_INTERFACE_UTMI:
77
omap_mux_init_signal("usba0_otg_dp", OMAP_PIN_INPUT);
78
omap_mux_init_signal("usba0_otg_dm", OMAP_PIN_INPUT);
80
case MUSB_INTERFACE_ULPI:
81
omap_mux_init_signal("usba0_ulpiphy_clk",
82
OMAP_PIN_INPUT_PULLDOWN);
83
omap_mux_init_signal("usba0_ulpiphy_stp",
84
OMAP_PIN_INPUT_PULLDOWN);
85
omap_mux_init_signal("usba0_ulpiphy_dir",
86
OMAP_PIN_INPUT_PULLDOWN);
87
omap_mux_init_signal("usba0_ulpiphy_nxt",
88
OMAP_PIN_INPUT_PULLDOWN);
89
omap_mux_init_signal("usba0_ulpiphy_dat0",
90
OMAP_PIN_INPUT_PULLDOWN);
91
omap_mux_init_signal("usba0_ulpiphy_dat1",
92
OMAP_PIN_INPUT_PULLDOWN);
93
omap_mux_init_signal("usba0_ulpiphy_dat2",
94
OMAP_PIN_INPUT_PULLDOWN);
95
omap_mux_init_signal("usba0_ulpiphy_dat3",
96
OMAP_PIN_INPUT_PULLDOWN);
97
omap_mux_init_signal("usba0_ulpiphy_dat4",
98
OMAP_PIN_INPUT_PULLDOWN);
99
omap_mux_init_signal("usba0_ulpiphy_dat5",
100
OMAP_PIN_INPUT_PULLDOWN);
101
omap_mux_init_signal("usba0_ulpiphy_dat6",
102
OMAP_PIN_INPUT_PULLDOWN);
103
omap_mux_init_signal("usba0_ulpiphy_dat7",
104
OMAP_PIN_INPUT_PULLDOWN);
184
111
void __init usb_musb_init(struct omap_musb_board_data *board_data)
186
if (cpu_is_omap243x()) {
187
musb_resources[0].start = OMAP243X_HS_BASE;
188
} else if (cpu_is_omap3517() || cpu_is_omap3505()) {
189
musb_device.name = "musb-am35x";
190
musb_resources[0].start = AM35XX_IPSS_USBOTGSS_BASE;
191
musb_resources[1].start = INT_35XX_USBOTG_IRQ;
192
board_data->set_phy_power = am35x_musb_phy_power;
193
board_data->clear_irq = am35x_musb_clear_irq;
194
board_data->set_mode = am35x_musb_set_mode;
195
board_data->reset = am35x_musb_reset;
196
} else if (cpu_is_omap34xx()) {
197
musb_resources[0].start = OMAP34XX_HSUSB_OTG_BASE;
113
struct omap_hwmod *oh;
114
struct omap_device *od;
115
struct platform_device *pdev;
118
const char *oh_name, *name;
120
if (cpu_is_omap3517() || cpu_is_omap3505()) {
198
121
} else if (cpu_is_omap44xx()) {
199
musb_resources[0].start = OMAP44XX_HSUSB_OTG_BASE;
200
musb_resources[1].start = OMAP44XX_IRQ_HS_USB_MC_N;
201
musb_resources[2].start = OMAP44XX_IRQ_HS_USB_DMA_N;
122
usb_musb_mux_init(board_data);
203
musb_resources[0].end = musb_resources[0].start + SZ_4K - 1;
206
126
* REVISIT: This line can be removed once all the platforms using
212
132
musb_plat.mode = board_data->mode;
213
133
musb_plat.extvbus = board_data->extvbus;
215
if (platform_device_register(&musb_device) < 0)
216
printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n");
135
if (cpu_is_omap44xx())
136
omap4430_phy_init(dev);
138
if (cpu_is_omap3517() || cpu_is_omap3505()) {
139
oh_name = "am35x_otg_hs";
142
oh_name = "usb_otg_hs";
143
name = "musb-omap2430";
146
oh = omap_hwmod_lookup(oh_name);
148
pr_err("Could not look up %s\n", oh_name);
152
od = omap_device_build(name, bus_id, oh, &musb_plat,
153
sizeof(musb_plat), omap_musb_latency,
154
ARRAY_SIZE(omap_musb_latency), false);
156
pr_err("Could not build omap_device for %s %s\n",
164
dev->dma_mask = &musb_dmamask;
165
dev->coherent_dma_mask = musb_dmamask;