|
|
|
@ -1,12 +1,17 @@ |
|
|
|
|
/*
|
|
|
|
|
* OHCI HCD (Host Controller Driver) for USB. |
|
|
|
|
* OHCI HCD (Host Controller Driver) for USB. |
|
|
|
|
* |
|
|
|
|
* Copyright (C) 2007 Atheros Communications, Inc. |
|
|
|
|
* Copyright (C) 2008 Gabor Juhos <juhosg@openwrt.org> |
|
|
|
|
* Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> |
|
|
|
|
* Bus Glue for Atheros AR71xx built-in OHCI controller. |
|
|
|
|
* |
|
|
|
|
* Bus Glue for Atheros AR71xx built-in OHCI controller |
|
|
|
|
* Copyright (C) 2008 Gabor Juhos <juhosg@openwrt.org> |
|
|
|
|
* Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> |
|
|
|
|
* |
|
|
|
|
* Parts of this file are based on Atheros' 2.6.15 BSP |
|
|
|
|
* Copyright (C) 2007 Atheros Communications, Inc. |
|
|
|
|
* |
|
|
|
|
* 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/platform_device.h> |
|
|
|
@ -14,19 +19,8 @@ |
|
|
|
|
|
|
|
|
|
extern int usb_disabled(void); |
|
|
|
|
|
|
|
|
|
static void ar71xx_start_ohci(struct platform_device *pdev) |
|
|
|
|
{ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void ar71xx_stop_ohci(struct platform_device *pdev) |
|
|
|
|
{ |
|
|
|
|
/*
|
|
|
|
|
* TODO: implement |
|
|
|
|
*/ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int usb_hcd_ar71xx_probe(const struct hc_driver *driver, |
|
|
|
|
struct platform_device *pdev) |
|
|
|
|
static int usb_hcd_ar71xx_probe(const struct hc_driver *driver, |
|
|
|
|
struct platform_device *pdev) |
|
|
|
|
{ |
|
|
|
|
struct usb_hcd *hcd; |
|
|
|
|
struct resource *res; |
|
|
|
@ -68,7 +62,6 @@ int usb_hcd_ar71xx_probe(const struct hc_driver *driver, |
|
|
|
|
goto err_release_region; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ar71xx_start_ohci(pdev); |
|
|
|
|
ohci_hcd_init(hcd_to_ohci(hcd)); |
|
|
|
|
|
|
|
|
|
ret = usb_add_hcd(hcd, irq, IRQF_DISABLED); |
|
|
|
@ -77,34 +70,18 @@ int usb_hcd_ar71xx_probe(const struct hc_driver *driver, |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
err_stop_hcd: |
|
|
|
|
ar71xx_stop_ohci(pdev); |
|
|
|
|
err_stop_hcd: |
|
|
|
|
iounmap(hcd->regs); |
|
|
|
|
err_release_region: |
|
|
|
|
err_release_region: |
|
|
|
|
release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
|
|
|
|
err_put_hcd: |
|
|
|
|
err_put_hcd: |
|
|
|
|
usb_put_hcd(hcd); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* may be called without controller electrically present */ |
|
|
|
|
/* may be called with controller, bus, and devices active */ |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* usb_hcd_ar71xx_remove - shutdown processing for AR71xx HCDs |
|
|
|
|
* @dev: USB Host Controller being removed |
|
|
|
|
* Context: !in_interrupt() |
|
|
|
|
* |
|
|
|
|
* Reverses the effect of usb_hcd_ar71xx_probe(), first invoking |
|
|
|
|
* the HCD's stop() method. It is always called from a thread |
|
|
|
|
* context, normally "rmmod", "apmd", or something similar. |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
void usb_hcd_ar71xx_remove(struct usb_hcd *hcd, struct platform_device *pdev) |
|
|
|
|
{ |
|
|
|
|
usb_remove_hcd(hcd); |
|
|
|
|
ar71xx_stop_ohci(pdev); |
|
|
|
|
iounmap(hcd->regs); |
|
|
|
|
release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
|
|
|
|
usb_put_hcd(hcd); |
|
|
|
@ -125,32 +102,23 @@ static int __devinit ohci_ar71xx_start(struct usb_hcd *hcd) |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
err: |
|
|
|
|
err: |
|
|
|
|
ohci_stop(hcd); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static const struct hc_driver ohci_ar71xx_hc_driver = { |
|
|
|
|
.description = hcd_name, |
|
|
|
|
.product_desc = "Atheros AR71xx built-in OHCI controller", |
|
|
|
|
.hcd_priv_size = sizeof(struct ohci_hcd), |
|
|
|
|
.description = hcd_name, |
|
|
|
|
.product_desc = "Atheros AR71xx built-in OHCI controller", |
|
|
|
|
.hcd_priv_size = sizeof(struct ohci_hcd), |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* generic hardware linkage |
|
|
|
|
*/ |
|
|
|
|
.irq = ohci_irq, |
|
|
|
|
.flags = HCD_USB11 | HCD_MEMORY, |
|
|
|
|
.irq = ohci_irq, |
|
|
|
|
.flags = HCD_USB11 | HCD_MEMORY, |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* basic lifecycle operations |
|
|
|
|
*/ |
|
|
|
|
.start = ohci_ar71xx_start, |
|
|
|
|
.stop = ohci_stop, |
|
|
|
|
.shutdown = ohci_shutdown, |
|
|
|
|
.start = ohci_ar71xx_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, |
|
|
|
@ -170,13 +138,10 @@ static const struct hc_driver ohci_ar71xx_hc_driver = { |
|
|
|
|
|
|
|
|
|
static int ohci_hcd_ar71xx_drv_probe(struct platform_device *pdev) |
|
|
|
|
{ |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
ret = -ENODEV; |
|
|
|
|
if (!usb_disabled()) |
|
|
|
|
ret = usb_hcd_ar71xx_probe(&ohci_ar71xx_hc_driver, pdev); |
|
|
|
|
if (usb_disabled()) |
|
|
|
|
return -ENODEV; |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
return usb_hcd_ar71xx_probe(&ohci_ar71xx_hc_driver, pdev); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int ohci_hcd_ar71xx_drv_remove(struct platform_device *pdev) |
|
|
|
@ -187,6 +152,8 @@ static int ohci_hcd_ar71xx_drv_remove(struct platform_device *pdev) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
MODULE_ALIAS("platform:ar71xx-ohci"); |
|
|
|
|
|
|
|
|
|
static struct platform_driver ohci_hcd_ar71xx_driver = { |
|
|
|
|
.probe = ohci_hcd_ar71xx_drv_probe, |
|
|
|
|
.remove = ohci_hcd_ar71xx_drv_remove, |
|
|
|
@ -196,5 +163,3 @@ static struct platform_driver ohci_hcd_ar71xx_driver = { |
|
|
|
|
.owner = THIS_MODULE, |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
MODULE_ALIAS("ar71xx-ohci"); |
|
|
|
|