2009-03-24 04:34:06 +03:00
/*
* linux / arch / arm / mach - omap2 / usb - musb . c
*
* This file will contain the board specific details for the
* MENTOR USB OTG controller on OMAP3430
*
* Copyright ( C ) 2007 - 2008 Texas Instruments
* Copyright ( C ) 2008 Nokia Corporation
* Author : Vikram Pandita
*
* Generalization by :
* Felipe Balbi < felipe . balbi @ nokia . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/types.h>
# include <linux/errno.h>
# include <linux/delay.h>
# include <linux/platform_device.h>
# include <linux/clk.h>
# include <linux/dma-mapping.h>
# include <linux/io.h>
# include <linux/usb/musb.h>
# include <mach/hardware.h>
# include <mach/irqs.h>
2009-10-20 20:40:47 +04:00
# include <plat/mux.h>
# include <plat/usb.h>
2009-03-24 04:34:06 +03:00
2009-01-19 20:09:22 +03:00
# ifdef CONFIG_USB_MUSB_SOC
2009-03-24 04:34:06 +03:00
static struct resource musb_resources [ ] = {
[ 0 ] = { /* start and end set dynamically */
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = { /* general IRQ */
. start = INT_243X_HS_USB_MC ,
. flags = IORESOURCE_IRQ ,
} ,
[ 2 ] = { /* DMA IRQ */
. start = INT_243X_HS_USB_DMA ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct musb_hdrc_config musb_config = {
. multipoint = 1 ,
. dyn_fifo = 1 ,
. num_eps = 16 ,
. ram_bits = 12 ,
} ;
static struct musb_hdrc_platform_data musb_plat = {
# ifdef CONFIG_USB_MUSB_OTG
. mode = MUSB_OTG ,
# elif defined(CONFIG_USB_MUSB_HDRC_HCD)
. mode = MUSB_HOST ,
# elif defined(CONFIG_USB_GADGET_MUSB_HDRC)
. mode = MUSB_PERIPHERAL ,
# endif
/* .clock is set dynamically */
. config = & musb_config ,
/* REVISIT charge pump on TWL4030 can supply up to
* 100 mA . . . but this value is board - specific , like
* " mode " , and should be passed to usb_musb_init ( ) .
*/
. power = 50 , /* up to 100 mA */
} ;
2009-04-14 01:40:14 +04:00
static u64 musb_dmamask = DMA_BIT_MASK ( 32 ) ;
2009-03-24 04:34:06 +03:00
static struct platform_device musb_device = {
. name = " musb_hdrc " ,
. id = - 1 ,
. dev = {
. dma_mask = & musb_dmamask ,
2009-04-14 01:40:14 +04:00
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
2009-03-24 04:34:06 +03:00
. platform_data = & musb_plat ,
} ,
. num_resources = ARRAY_SIZE ( musb_resources ) ,
. resource = musb_resources ,
} ;
2010-02-18 01:09:30 +03:00
void __init usb_musb_init ( struct omap_musb_board_data * board_data )
2009-03-24 04:34:06 +03:00
{
if ( cpu_is_omap243x ( ) )
musb_resources [ 0 ] . start = OMAP243X_HS_BASE ;
else
musb_resources [ 0 ] . start = OMAP34XX_HSUSB_OTG_BASE ;
2010-02-18 01:09:29 +03:00
musb_resources [ 0 ] . end = musb_resources [ 0 ] . start + SZ_4K - 1 ;
2009-03-24 04:34:06 +03:00
/*
* REVISIT : This line can be removed once all the platforms using
* musb_core . c have been converted to use use clkdev .
*/
musb_plat . clock = " ick " ;
2010-02-18 01:09:30 +03:00
musb_plat . board_data = board_data ;
musb_plat . power = board_data - > power > > 1 ;
musb_plat . mode = board_data - > mode ;
2009-03-24 04:34:06 +03:00
2010-02-18 01:09:31 +03:00
if ( platform_device_register ( & musb_device ) < 0 )
2009-03-24 04:34:06 +03:00
printk ( KERN_ERR " Unable to register HS-USB (MUSB) device \n " ) ;
2009-01-19 20:09:22 +03:00
}
# else
2010-02-18 01:09:30 +03:00
void __init usb_musb_init ( struct omap_musb_board_data * board_data )
2009-01-19 20:09:22 +03:00
{
2009-03-24 04:34:06 +03:00
}
2009-01-19 20:09:22 +03:00
# endif /* CONFIG_USB_MUSB_SOC */