2008-01-11 22:56:15 +09:00
/*
* OHCI HCD ( Host Controller Driver ) for USB .
*
* Copyright ( C ) 2008 Renesas Solutions Corp .
*
2011-07-07 09:58:56 +09:00
* Author : Yoshihiro Shimoda < yoshihiro . shimoda . uh @ renesas . com >
2008-01-11 22:56:15 +09:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; version 2 of the License .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*
*/
# include <linux/platform_device.h>
static int ohci_sh_start ( struct usb_hcd * hcd )
{
struct ohci_hcd * ohci = hcd_to_ohci ( hcd ) ;
ohci_hcd_init ( ohci ) ;
ohci_init ( ohci ) ;
ohci_run ( ohci ) ;
return 0 ;
}
static const struct hc_driver ohci_sh_hc_driver = {
. description = hcd_name ,
. product_desc = " SuperH OHCI " ,
. hcd_priv_size = sizeof ( struct ohci_hcd ) ,
/*
* generic hardware linkage
*/
. irq = ohci_irq ,
. flags = HCD_USB11 | HCD_MEMORY ,
/*
* basic lifecycle operations
*/
. start = ohci_sh_start ,
. stop = ohci_stop ,
. shutdown = ohci_shutdown ,
/*
* managing i / o requests and associated device resources
*/
. urb_enqueue = ohci_urb_enqueue ,
. urb_dequeue = ohci_urb_dequeue ,
. endpoint_disable = ohci_endpoint_disable ,
/*
* scheduling support
*/
. get_frame_number = ohci_get_frame ,
/*
* root hub support
*/
. hub_status_data = ohci_hub_status_data ,
. hub_control = ohci_hub_control ,
# ifdef CONFIG_PM
. bus_suspend = ohci_bus_suspend ,
. bus_resume = ohci_bus_resume ,
# endif
. start_port_reset = ohci_start_port_reset ,
} ;
/*-------------------------------------------------------------------------*/
static int ohci_hcd_sh_probe ( struct platform_device * pdev )
{
struct resource * res = NULL ;
struct usb_hcd * hcd = NULL ;
int irq = - 1 ;
int ret ;
if ( usb_disabled ( ) )
return - ENODEV ;
res = platform_get_resource ( pdev , IORESOURCE_MEM , 0 ) ;
if ( ! res ) {
err ( " platform_get_resource error. " ) ;
return - ENODEV ;
}
irq = platform_get_irq ( pdev , 0 ) ;
if ( irq < 0 ) {
err ( " platform_get_irq error. " ) ;
return - ENODEV ;
}
/* initialize hcd */
hcd = usb_create_hcd ( & ohci_sh_hc_driver , & pdev - > dev , ( char * ) hcd_name ) ;
if ( ! hcd ) {
err ( " Failed to create hcd " ) ;
return - ENOMEM ;
}
hcd - > regs = ( void __iomem * ) res - > start ;
hcd - > rsrc_start = res - > start ;
2010-10-15 13:29:24 +08:00
hcd - > rsrc_len = resource_size ( res ) ;
2011-09-07 16:10:52 +08:00
ret = usb_add_hcd ( hcd , irq , IRQF_SHARED ) ;
2008-01-11 22:56:15 +09:00
if ( ret ! = 0 ) {
err ( " Failed to add hcd " ) ;
usb_put_hcd ( hcd ) ;
return ret ;
}
return ret ;
}
static int ohci_hcd_sh_remove ( struct platform_device * pdev )
{
struct usb_hcd * hcd = platform_get_drvdata ( pdev ) ;
usb_remove_hcd ( hcd ) ;
usb_put_hcd ( hcd ) ;
return 0 ;
}
static struct platform_driver ohci_hcd_sh_driver = {
. probe = ohci_hcd_sh_probe ,
. remove = ohci_hcd_sh_remove ,
. shutdown = usb_hcd_platform_shutdown ,
. driver = {
. name = " sh_ohci " ,
. owner = THIS_MODULE ,
} ,
} ;
2008-04-10 21:29:22 -07:00
MODULE_ALIAS ( " platform:sh_ohci " ) ;