1/* 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> 31#include <plat/usb.h> 32 33#ifdef CONFIG_USB_MUSB_SOC 34 35static struct resource musb_resources[] = { 36 [0] = { /* start and end set dynamically */ 37 .flags = IORESOURCE_MEM, 38 }, 39 [1] = { /* general IRQ */ 40 .start = INT_243X_HS_USB_MC, 41 .flags = IORESOURCE_IRQ, 42 }, 43 [2] = { /* DMA IRQ */ 44 .start = INT_243X_HS_USB_DMA, 45 .flags = IORESOURCE_IRQ, 46 }, 47}; 48 49static struct musb_hdrc_config musb_config = { 50 .multipoint = 1, 51 .dyn_fifo = 1, 52 .num_eps = 16, 53 .ram_bits = 12, 54}; 55 56static struct musb_hdrc_platform_data musb_plat = { 57#ifdef CONFIG_USB_MUSB_OTG 58 .mode = MUSB_OTG, 59#elif defined(CONFIG_USB_MUSB_HDRC_HCD) 60 .mode = MUSB_HOST, 61#elif defined(CONFIG_USB_GADGET_MUSB_HDRC) 62 .mode = MUSB_PERIPHERAL, 63#endif 64 /* .clock is set dynamically */ 65 .config = &musb_config, 66 67 /* REVISIT charge pump on TWL4030 can supply up to 68 * 100 mA ... but this value is board-specific, like 69 * "mode", and should be passed to usb_musb_init(). 70 */ 71 .power = 50, /* up to 100 mA */ 72}; 73 74static u64 musb_dmamask = DMA_BIT_MASK(32); 75 76static struct platform_device musb_device = { 77 .name = "musb_hdrc", 78 .id = -1, 79 .dev = { 80 .dma_mask = &musb_dmamask, 81 .coherent_dma_mask = DMA_BIT_MASK(32), 82 .platform_data = &musb_plat, 83 }, 84 .num_resources = ARRAY_SIZE(musb_resources), 85 .resource = musb_resources, 86}; 87 88void __init usb_musb_init(struct omap_musb_board_data *board_data) 89{ 90 if (cpu_is_omap243x()) { 91 musb_resources[0].start = OMAP243X_HS_BASE; 92 } else if (cpu_is_omap34xx()) { 93 musb_resources[0].start = OMAP34XX_HSUSB_OTG_BASE; 94 } else if (cpu_is_omap44xx()) { 95 musb_resources[0].start = OMAP44XX_HSUSB_OTG_BASE; 96 musb_resources[1].start = OMAP44XX_IRQ_HS_USB_MC_N; 97 musb_resources[2].start = OMAP44XX_IRQ_HS_USB_DMA_N; 98 } 99 musb_resources[0].end = musb_resources[0].start + SZ_4K - 1; 100 101 /* 102 * REVISIT: This line can be removed once all the platforms using 103 * musb_core.c have been converted to use use clkdev. 104 */ 105 musb_plat.clock = "ick"; 106 musb_plat.board_data = board_data; 107 musb_plat.power = board_data->power >> 1; 108 musb_plat.mode = board_data->mode; 109 musb_plat.extvbus = board_data->extvbus; 110 111 if (platform_device_register(&musb_device) < 0) 112 printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n"); 113} 114 115#else 116void __init usb_musb_init(struct omap_musb_board_data *board_data) 117{ 118} 119#endif /* CONFIG_USB_MUSB_SOC */ 120