blob: ed0e85c3764f3a5f7cbd9a20a8924e76059219a0 [file] [log] [blame]
Felipe Balbi18cb7ac2009-03-23 18:34:06 -07001/*
2 * linux/arch/arm/mach-omap2/usb-musb.c
3 *
4 * This file will contain the board specific details for the
5 * MENTOR USB OTG controller on OMAP3430
6 *
7 * Copyright (C) 2007-2008 Texas Instruments
8 * Copyright (C) 2008 Nokia Corporation
9 * Author: Vikram Pandita
10 *
11 * Generalization by:
12 * Felipe Balbi <felipe.balbi@nokia.com>
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License version 2 as
16 * published by the Free Software Foundation.
17 */
18
19#include <linux/types.h>
20#include <linux/errno.h>
21#include <linux/delay.h>
22#include <linux/platform_device.h>
23#include <linux/clk.h>
24#include <linux/dma-mapping.h>
25#include <linux/io.h>
26
27#include <linux/usb/musb.h>
28
29#include <mach/hardware.h>
30#include <mach/irqs.h>
Ajay Kumar Gupta3a0d30b2010-10-19 10:08:11 +030031#include <mach/am35xx.h>
Tony Lindgrence491cf2009-10-20 09:40:47 -070032#include <plat/usb.h>
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070033
Felipe Balbi7c925542010-12-01 14:23:48 +020034#if defined(CONFIG_USB_MUSB_OMAP2PLUS) || defined (CONFIG_USB_MUSB_AM35X)
Peter 'p2' De Schrijver94a3ef62009-01-19 19:09:22 +020035
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070036static struct resource musb_resources[] = {
37 [0] = { /* start and end set dynamically */
38 .flags = IORESOURCE_MEM,
39 },
40 [1] = { /* general IRQ */
41 .start = INT_243X_HS_USB_MC,
42 .flags = IORESOURCE_IRQ,
Hema Kalliguddifcf173e2010-09-29 11:26:39 -050043 .name = "mc",
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070044 },
45 [2] = { /* DMA IRQ */
46 .start = INT_243X_HS_USB_DMA,
47 .flags = IORESOURCE_IRQ,
Hema Kalliguddifcf173e2010-09-29 11:26:39 -050048 .name = "dma",
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070049 },
50};
51
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070052static struct musb_hdrc_config musb_config = {
53 .multipoint = 1,
54 .dyn_fifo = 1,
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070055 .num_eps = 16,
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070056 .ram_bits = 12,
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070057};
58
59static struct musb_hdrc_platform_data musb_plat = {
60#ifdef CONFIG_USB_MUSB_OTG
61 .mode = MUSB_OTG,
62#elif defined(CONFIG_USB_MUSB_HDRC_HCD)
63 .mode = MUSB_HOST,
64#elif defined(CONFIG_USB_GADGET_MUSB_HDRC)
65 .mode = MUSB_PERIPHERAL,
66#endif
67 /* .clock is set dynamically */
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070068 .config = &musb_config,
69
70 /* REVISIT charge pump on TWL4030 can supply up to
71 * 100 mA ... but this value is board-specific, like
72 * "mode", and should be passed to usb_musb_init().
73 */
74 .power = 50, /* up to 100 mA */
75};
76
Yang Hongyange9304382009-04-13 14:40:14 -070077static u64 musb_dmamask = DMA_BIT_MASK(32);
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070078
79static struct platform_device musb_device = {
80 .name = "musb_hdrc",
81 .id = -1,
82 .dev = {
83 .dma_mask = &musb_dmamask,
Yang Hongyange9304382009-04-13 14:40:14 -070084 .coherent_dma_mask = DMA_BIT_MASK(32),
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070085 .platform_data = &musb_plat,
86 },
87 .num_resources = ARRAY_SIZE(musb_resources),
88 .resource = musb_resources,
89};
90
Maulik Mankad884b8362010-02-17 14:09:30 -080091void __init usb_musb_init(struct omap_musb_board_data *board_data)
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070092{
Maulik Mankadbce06682010-02-17 14:09:32 -080093 if (cpu_is_omap243x()) {
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070094 musb_resources[0].start = OMAP243X_HS_BASE;
Ajay Kumar Gupta3a0d30b2010-10-19 10:08:11 +030095 } else if (cpu_is_omap3517() || cpu_is_omap3505()) {
96 musb_resources[0].start = AM35XX_IPSS_USBOTGSS_BASE;
97 musb_resources[1].start = INT_35XX_USBOTG_IRQ;
Maulik Mankadbce06682010-02-17 14:09:32 -080098 } else if (cpu_is_omap34xx()) {
Felipe Balbi18cb7ac2009-03-23 18:34:06 -070099 musb_resources[0].start = OMAP34XX_HSUSB_OTG_BASE;
Maulik Mankadbce06682010-02-17 14:09:32 -0800100 } else if (cpu_is_omap44xx()) {
101 musb_resources[0].start = OMAP44XX_HSUSB_OTG_BASE;
Santosh Shilimkar5772ca72010-02-18 03:14:12 +0530102 musb_resources[1].start = OMAP44XX_IRQ_HS_USB_MC_N;
103 musb_resources[2].start = OMAP44XX_IRQ_HS_USB_DMA_N;
Maulik Mankadbce06682010-02-17 14:09:32 -0800104 }
Felipe Balbif9828552010-02-17 14:09:29 -0800105 musb_resources[0].end = musb_resources[0].start + SZ_4K - 1;
Felipe Balbi18cb7ac2009-03-23 18:34:06 -0700106
107 /*
108 * REVISIT: This line can be removed once all the platforms using
109 * musb_core.c have been converted to use use clkdev.
110 */
111 musb_plat.clock = "ick";
Maulik Mankad884b8362010-02-17 14:09:30 -0800112 musb_plat.board_data = board_data;
113 musb_plat.power = board_data->power >> 1;
114 musb_plat.mode = board_data->mode;
Ajay Kumar Gupta58815fa2010-03-25 13:25:27 +0200115 musb_plat.extvbus = board_data->extvbus;
Felipe Balbi18cb7ac2009-03-23 18:34:06 -0700116
Felipe Balbibdfa3512010-02-17 14:09:31 -0800117 if (platform_device_register(&musb_device) < 0)
Felipe Balbi18cb7ac2009-03-23 18:34:06 -0700118 printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n");
Felipe Balbi18cb7ac2009-03-23 18:34:06 -0700119}
Peter 'p2' De Schrijver94a3ef62009-01-19 19:09:22 +0200120
121#else
Maulik Mankad884b8362010-02-17 14:09:30 -0800122void __init usb_musb_init(struct omap_musb_board_data *board_data)
Peter 'p2' De Schrijver94a3ef62009-01-19 19:09:22 +0200123{
Peter 'p2' De Schrijver94a3ef62009-01-19 19:09:22 +0200124}
125#endif /* CONFIG_USB_MUSB_SOC */