@ -17,6 +17,7 @@
# include <common.h>
# include <malloc.h>
# include <asm/io.h>
# include <dwc3-omap-uboot.h>
# include <linux/usb/dwc3-omap.h>
# include <linux/ioport.h>
@ -120,6 +121,8 @@ struct dwc3_omap {
u32 dma_status : 1 ;
} ;
struct dwc3_omap * omap ;
static inline u32 dwc3_omap_readl ( void __iomem * base , u32 offset )
{
return readl ( base + offset ) ;
@ -278,15 +281,6 @@ static irqreturn_t dwc3_omap_interrupt(int irq, void *_omap)
return IRQ_HANDLED ;
}
static int dwc3_omap_remove_core ( struct device * dev , void * c )
{
struct platform_device * pdev = to_platform_device ( dev ) ;
of_device_unregister ( pdev ) ;
return 0 ;
}
static void dwc3_omap_enable_irqs ( struct dwc3_omap * omap )
{
u32 reg ;
@ -315,12 +309,8 @@ static void dwc3_omap_disable_irqs(struct dwc3_omap *omap)
dwc3_omap_write_irq0_set ( omap , 0x00 ) ;
}
static u64 dwc3_omap_dma_mask = DMA_BIT_MASK ( 32 ) ;
static void dwc3_omap_map_offset ( struct dwc3_omap * omap )
{
struct device_node * node = omap - > dev - > of_node ;
/*
* Differentiate between OMAP5 and AM437x .
*
@ -329,25 +319,21 @@ static void dwc3_omap_map_offset(struct dwc3_omap *omap)
*
* Using dt compatible to differentiate AM437x .
*/
if ( of_device_is_compatible ( node , " ti,am437x-dwc3 " ) ) {
omap - > irq_eoi_offset = USBOTGSS_EOI_OFFSET ;
omap - > irq0_offset = USBOTGSS_IRQ0_OFFSET ;
omap - > irqmisc_offset = USBOTGSS_IRQMISC_OFFSET ;
omap - > utmi_otg_offset = USBOTGSS_UTMI_OTG_OFFSET ;
omap - > debug_offset = USBOTGSS_DEBUG_OFFSET ;
}
# ifdef CONFIG_AM43XX
omap - > irq_eoi_offset = USBOTGSS_EOI_OFFSET ;
omap - > irq0_offset = USBOTGSS_IRQ0_OFFSET ;
omap - > irqmisc_offset = USBOTGSS_IRQMISC_OFFSET ;
omap - > utmi_otg_offset = USBOTGSS_UTMI_OTG_OFFSET ;
omap - > debug_offset = USBOTGSS_DEBUG_OFFSET ;
# endif
}
static void dwc3_omap_set_utmi_mode ( struct dwc3_omap * omap )
static void dwc3_omap_set_utmi_mode ( struct dwc3_omap * omap , int utmi_mode )
{
u32 reg ;
struct device_node * node = omap - > dev - > of_node ;
int utmi_mode = 0 ;
reg = dwc3_omap_read_utmi_status ( omap ) ;
of_property_read_u32 ( node , " utmi-mode " , & utmi_mode ) ;
switch ( utmi_mode ) {
case DWC3_OMAP_UTMI_MODE_SW :
reg | = USBOTGSS_UTMI_OTG_STATUS_SW_MODE ;
@ -362,95 +348,59 @@ static void dwc3_omap_set_utmi_mode(struct dwc3_omap *omap)
dwc3_omap_write_utmi_status ( omap , reg ) ;
}
static int dwc3_omap_probe ( struct platform_device * pdev )
/**
* dwc3_omap_uboot_init - dwc3 omap uboot initialization code
* @ dev : struct dwc3_omap_device containing initialization data
*
* Entry point for dwc3 omap driver ( equivalent to dwc3_omap_probe in linux
* kernel driver ) . Pointer to dwc3_omap_device should be passed containing
* base address and other initialization data . Returns ' 0 ' on success and
* a negative value on failure .
*
* Generally called from board_usb_init ( ) implemented in board file .
*/
int dwc3_omap_uboot_init ( struct dwc3_omap_device * omap_dev )
{
struct device_node * node = pdev - > dev . of_node ;
struct dwc3_omap * omap ;
struct resource * res ;
struct device * dev = & pdev - > dev ;
int ret ;
u32 reg ;
void __iomem * base ;
if ( ! node ) {
dev_err ( dev , " device node not found \n " ) ;
return - EINVAL ;
}
struct device * dev ;
omap = devm_kzalloc ( dev , sizeof ( * omap ) , GFP_KERNEL ) ;
if ( ! omap )
return - ENOMEM ;
platform_set_drvdata ( pdev , omap ) ;
res = platform_get_resource ( pdev , IORESOURCE_MEM , 0 ) ;
base = devm_ioremap_resource ( dev , res ) ;
if ( IS_ERR ( base ) )
return PTR_ERR ( base ) ;
omap - > dev = dev ;
omap - > base = base ;
dev - > dma_mask = & dwc3_omap_dma_mask ;
omap - > base = omap_dev - > base ;
dwc3_omap_map_offset ( omap ) ;
dwc3_omap_set_utmi_mode ( omap ) ;
dwc3_omap_set_utmi_mode ( omap , omap_dev - > utmi_mode ) ;
/* check the DMA Status */
reg = dwc3_omap_readl ( omap - > base , USBOTGSS_SYSCONFIG ) ;
omap - > dma_status = ! ! ( reg & USBOTGSS_SYSCONFIG_DMADISABLE ) ;
dwc3_omap_enable_irqs ( omap ) ;
dwc3_omap_set_mailbox ( omap , omap_dev - > vbus_id_status ) ;
ret = of_platform_populate ( node , NULL , NULL , dev ) ;
if ( ret ) {
dev_err ( & pdev - > dev , " failed to create dwc3 core \n " ) ;
goto err1 ;
}
dwc3_omap_enable_irqs ( omap ) ;
return 0 ;
err1 :
dwc3_omap_disable_irqs ( omap ) ;
err0 :
return ret ;
}
static int dwc3_omap_remove ( struct platform_device * pdev )
/**
* dwc3_omap_uboot_exit - dwc3 omap uboot cleanup code
* @ index : index of this controller
*
* Performs cleanup of memory allocated in dwc3_omap_uboot_init
* ( equivalent to dwc3_omap_remove in linux ) .
*
* Generally called from board file .
*/
void dwc3_omap_uboot_exit ( void )
{
struct dwc3_omap * omap = platform_get_drvdata ( pdev ) ;
dwc3_omap_disable_irqs ( omap ) ;
device_for_each_child ( & pdev - > dev , NULL , dwc3_omap_remove_core ) ;
kfree ( omap ) ;
return 0 ;
}
static const struct of_device_id of_dwc3_match [ ] = {
{
. compatible = " ti,dwc3 "
} ,
{
. compatible = " ti,am437x-dwc3 "
} ,
{ } ,
} ;
MODULE_DEVICE_TABLE ( of , of_dwc3_match ) ;
static struct platform_driver dwc3_omap_driver = {
. probe = dwc3_omap_probe ,
. remove = dwc3_omap_remove ,
. driver = {
. name = " omap-dwc3 " ,
. of_match_table = of_dwc3_match ,
} ,
} ;
module_platform_driver ( dwc3_omap_driver ) ;
MODULE_ALIAS ( " platform:omap-dwc3 " ) ;
MODULE_AUTHOR ( " Felipe Balbi <balbi@ti.com> " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;