2009-06-13 09:14:28 +08:00
/*
* linux / driver / usb / host / ehci - w90x900 . c
*
* Copyright ( c ) 2008 Nuvoton technology corporation .
*
* Wan ZongShun < mcuos . com @ gmail . com >
*
* 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 .
*
*/
2013-09-21 16:44:42 +05:30
# include <linux/dma-mapping.h>
# include <linux/io.h>
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/of.h>
2009-06-13 09:14:28 +08:00
# include <linux/platform_device.h>
2013-09-21 16:44:42 +05:30
# include <linux/usb.h>
# include <linux/usb/hcd.h>
# include "ehci.h"
2009-06-13 09:14:28 +08:00
2012-10-23 07:45:01 -07:00
/* enable phy0 and phy1 for w90p910 */
2009-06-13 09:14:28 +08:00
# define ENPHY (0x01<<8)
# define PHY0_CTR (0xA4)
# define PHY1_CTR (0xA8)
2013-09-21 16:44:42 +05:30
# define DRIVER_DESC "EHCI w90x900 driver"
static const char hcd_name [ ] = " ehci-w90x900 " ;
static struct hc_driver __read_mostly ehci_w90x900_hc_driver ;
2016-11-24 21:42:44 +00:00
static int ehci_w90x900_probe ( struct platform_device * pdev )
2009-06-13 09:14:28 +08:00
{
struct usb_hcd * hcd ;
struct ehci_hcd * ehci ;
struct resource * res ;
int retval = 0 , irq ;
unsigned long val ;
2016-11-24 21:42:44 +00:00
hcd = usb_create_hcd ( & ehci_w90x900_hc_driver ,
& pdev - > dev , " w90x900 EHCI " ) ;
2009-06-13 09:14:28 +08:00
if ( ! hcd ) {
retval = - ENOMEM ;
goto err1 ;
}
2014-11-04 07:51:11 +05:30
res = platform_get_resource ( pdev , IORESOURCE_MEM , 0 ) ;
2013-12-11 16:20:35 +09:00
hcd - > regs = devm_ioremap_resource ( & pdev - > dev , res ) ;
if ( IS_ERR ( hcd - > regs ) ) {
retval = PTR_ERR ( hcd - > regs ) ;
2009-06-13 09:14:28 +08:00
goto err2 ;
}
2014-11-04 07:51:11 +05:30
hcd - > rsrc_start = res - > start ;
hcd - > rsrc_len = resource_size ( res ) ;
2009-06-13 09:14:28 +08:00
ehci = hcd_to_ehci ( hcd ) ;
ehci - > caps = hcd - > regs ;
ehci - > regs = hcd - > regs +
2011-05-03 20:11:57 +02:00
HC_LENGTH ( ehci , ehci_readl ( ehci , & ehci - > caps - > hc_capbase ) ) ;
2009-06-13 09:14:28 +08:00
/* enable PHY 0,1,the regs only apply to w90p910
2016-11-24 21:42:44 +00:00
* 0xA4 , 0xA8 were offsets of PHY0 and PHY1 controller of
* w90p910 IC relative to ehci - > regs .
*/
2009-06-13 09:14:28 +08:00
val = __raw_readl ( ehci - > regs + PHY0_CTR ) ;
val | = ENPHY ;
__raw_writel ( val , ehci - > regs + PHY0_CTR ) ;
val = __raw_readl ( ehci - > regs + PHY1_CTR ) ;
val | = ENPHY ;
__raw_writel ( val , ehci - > regs + PHY1_CTR ) ;
irq = platform_get_irq ( pdev , 0 ) ;
2014-11-20 18:34:01 +01:00
if ( irq < 0 ) {
retval = irq ;
2013-12-11 16:20:35 +09:00
goto err2 ;
2014-11-20 18:34:01 +01:00
}
2009-06-13 09:14:28 +08:00
retval = usb_add_hcd ( hcd , irq , IRQF_SHARED ) ;
if ( retval ! = 0 )
2013-12-11 16:20:35 +09:00
goto err2 ;
2009-06-13 09:14:28 +08:00
2013-11-05 10:46:02 +08:00
device_wakeup_enable ( hcd - > self . controller ) ;
2009-06-13 09:14:28 +08:00
return retval ;
err2 :
usb_put_hcd ( hcd ) ;
err1 :
return retval ;
}
2012-11-19 13:26:20 -05:00
static int ehci_w90x900_remove ( struct platform_device * pdev )
2009-06-13 09:14:28 +08:00
{
struct usb_hcd * hcd = platform_get_drvdata ( pdev ) ;
2016-11-24 21:42:44 +00:00
usb_remove_hcd ( hcd ) ;
usb_put_hcd ( hcd ) ;
2009-06-13 09:14:28 +08:00
return 0 ;
}
static struct platform_driver ehci_hcd_w90x900_driver = {
. probe = ehci_w90x900_probe ,
2012-11-19 13:21:08 -05:00
. remove = ehci_w90x900_remove ,
2009-06-13 09:14:28 +08:00
. driver = {
. name = " w90x900-ehci " ,
} ,
} ;
2013-09-21 16:44:42 +05:30
static int __init ehci_w90X900_init ( void )
{
if ( usb_disabled ( ) )
return - ENODEV ;
pr_info ( " %s: " DRIVER_DESC " \n " , hcd_name ) ;
ehci_init_driver ( & ehci_w90x900_hc_driver , NULL ) ;
return platform_driver_register ( & ehci_hcd_w90x900_driver ) ;
}
module_init ( ehci_w90X900_init ) ;
static void __exit ehci_w90X900_cleanup ( void )
{
platform_driver_unregister ( & ehci_hcd_w90x900_driver ) ;
}
module_exit ( ehci_w90X900_cleanup ) ;
MODULE_DESCRIPTION ( DRIVER_DESC ) ;
2009-06-13 09:14:28 +08:00
MODULE_AUTHOR ( " Wan ZongShun <mcuos.com@gmail.com> " ) ;
MODULE_ALIAS ( " platform:w90p910-ehci " ) ;
2013-09-21 16:44:42 +05:30
MODULE_LICENSE ( " GPL v2 " ) ;