Signed-off-by: Gabor Juhos <juhosg@openwrt.org> SVN-Revision: 34843master
parent
c0e1a6f342
commit
b81667cb23
@ -1,20 +0,0 @@ |
|||||||
/*
|
|
||||||
* Platform data definition for built-in EHCI controller of the |
|
||||||
* Ralink RT3662/RT3883 SoCs |
|
||||||
* |
|
||||||
* Copyright (C) 2011-2012 Gabor Juhos <juhosg@openwrt.org> |
|
||||||
* |
|
||||||
* 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. |
|
||||||
*/ |
|
||||||
|
|
||||||
#ifndef _RT3883_EHCI_PLATFORM_H |
|
||||||
#define _RT3883_EHCI_PLATFORM_H |
|
||||||
|
|
||||||
struct rt3883_ehci_platform_data { |
|
||||||
void (*start_hw)(void); |
|
||||||
void (*stop_hw)(void); |
|
||||||
}; |
|
||||||
|
|
||||||
#endif /* _RT3883_EHCI_PLATFORM_H */ |
|
@ -1,20 +0,0 @@ |
|||||||
/*
|
|
||||||
* Platform data definition for built-in OHCI controller of the |
|
||||||
* Ralink RT3662/RT3883 SoCs |
|
||||||
* |
|
||||||
* Copyright (C) 2011-2012 Gabor Juhos <juhosg@openwrt.org> |
|
||||||
* |
|
||||||
* 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. |
|
||||||
*/ |
|
||||||
|
|
||||||
#ifndef _RT3883_OHCI_PLATFORM_H |
|
||||||
#define _RT3883_OHCI_PLATFORM_H |
|
||||||
|
|
||||||
struct rt3883_ohci_platform_data { |
|
||||||
void (*start_hw)(void); |
|
||||||
void (*stop_hw)(void); |
|
||||||
}; |
|
||||||
|
|
||||||
#endif /* _RT3883_OHCI_PLATFORM_H */ |
|
@ -1,162 +0,0 @@ |
|||||||
/*
|
|
||||||
* Bus Glue for the built-in EHCI controller of the Ralink RT3662/RT3883 SoCs |
|
||||||
* |
|
||||||
* Copyright (C) 2011-2012 Gabor Juhos <juhosg@openwrt.org> |
|
||||||
* |
|
||||||
* Parts of this file are based on Ralink's 2.6.21 BSP |
|
||||||
* |
|
||||||
* 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> |
|
||||||
#include <asm/mach-ralink/rt3883.h> |
|
||||||
#include <asm/mach-ralink/rt3883_ehci_platform.h> |
|
||||||
|
|
||||||
static int ehci_rt3883_init(struct usb_hcd *hcd) |
|
||||||
{ |
|
||||||
struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
|
||||||
int ret; |
|
||||||
|
|
||||||
ehci->caps = hcd->regs; |
|
||||||
ehci->regs = hcd->regs + |
|
||||||
HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
|
||||||
dbg_hcs_params(ehci, "reset"); |
|
||||||
dbg_hcc_params(ehci, "reset"); |
|
||||||
|
|
||||||
ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
|
||||||
ehci->sbrn = 0x20; |
|
||||||
|
|
||||||
ehci_reset(ehci); |
|
||||||
|
|
||||||
ret = ehci_init(hcd); |
|
||||||
if (ret) |
|
||||||
return ret; |
|
||||||
|
|
||||||
ehci_port_power(ehci, 0); |
|
||||||
|
|
||||||
return 0; |
|
||||||
} |
|
||||||
|
|
||||||
static const struct hc_driver ehci_rt3883_hc_driver = { |
|
||||||
.description = hcd_name, |
|
||||||
.product_desc = "Ralink RT3883 built-in EHCI controller", |
|
||||||
.hcd_priv_size = sizeof(struct ehci_hcd), |
|
||||||
.irq = ehci_irq, |
|
||||||
.flags = HCD_MEMORY | HCD_USB2, |
|
||||||
|
|
||||||
.reset = ehci_rt3883_init, |
|
||||||
.start = ehci_run, |
|
||||||
.stop = ehci_stop, |
|
||||||
.shutdown = ehci_shutdown, |
|
||||||
|
|
||||||
.urb_enqueue = ehci_urb_enqueue, |
|
||||||
.urb_dequeue = ehci_urb_dequeue, |
|
||||||
.endpoint_disable = ehci_endpoint_disable, |
|
||||||
.endpoint_reset = ehci_endpoint_reset, |
|
||||||
|
|
||||||
.get_frame_number = ehci_get_frame, |
|
||||||
|
|
||||||
.hub_status_data = ehci_hub_status_data, |
|
||||||
.hub_control = ehci_hub_control, |
|
||||||
.relinquish_port = ehci_relinquish_port, |
|
||||||
.port_handed_over = ehci_port_handed_over, |
|
||||||
|
|
||||||
.clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, |
|
||||||
}; |
|
||||||
|
|
||||||
static int ehci_rt3883_probe(struct platform_device *pdev) |
|
||||||
{ |
|
||||||
struct rt3883_ehci_platform_data *pdata; |
|
||||||
struct usb_hcd *hcd; |
|
||||||
struct resource *res; |
|
||||||
int irq; |
|
||||||
int ret; |
|
||||||
|
|
||||||
if (usb_disabled()) |
|
||||||
return -ENODEV; |
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
|
||||||
if (!res) { |
|
||||||
dev_dbg(&pdev->dev, "no IRQ specified for %s\n", |
|
||||||
dev_name(&pdev->dev)); |
|
||||||
return -ENODEV; |
|
||||||
} |
|
||||||
irq = res->start; |
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|
||||||
if (!res) { |
|
||||||
dev_dbg(&pdev->dev, "no base address specified for %s\n", |
|
||||||
dev_name(&pdev->dev)); |
|
||||||
return -ENODEV; |
|
||||||
} |
|
||||||
|
|
||||||
hcd = usb_create_hcd(&ehci_rt3883_hc_driver, &pdev->dev, |
|
||||||
dev_name(&pdev->dev)); |
|
||||||
if (!hcd) |
|
||||||
return -ENOMEM; |
|
||||||
|
|
||||||
hcd->rsrc_start = res->start; |
|
||||||
hcd->rsrc_len = res->end - res->start + 1; |
|
||||||
|
|
||||||
if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { |
|
||||||
dev_dbg(&pdev->dev, "controller already in use\n"); |
|
||||||
ret = -EBUSY; |
|
||||||
goto err_put_hcd; |
|
||||||
} |
|
||||||
|
|
||||||
hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); |
|
||||||
if (!hcd->regs) { |
|
||||||
dev_dbg(&pdev->dev, "error mapping memory\n"); |
|
||||||
ret = -EFAULT; |
|
||||||
goto err_release_region; |
|
||||||
} |
|
||||||
|
|
||||||
pdata = pdev->dev.platform_data; |
|
||||||
if (pdata && pdata->start_hw) |
|
||||||
pdata->start_hw(); |
|
||||||
|
|
||||||
ret = usb_add_hcd(hcd, irq, IRQF_SHARED); |
|
||||||
if (ret) |
|
||||||
goto err_iounmap; |
|
||||||
|
|
||||||
return 0; |
|
||||||
|
|
||||||
err_iounmap: |
|
||||||
iounmap(hcd->regs); |
|
||||||
|
|
||||||
err_release_region: |
|
||||||
release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
|
||||||
err_put_hcd: |
|
||||||
usb_put_hcd(hcd); |
|
||||||
return ret; |
|
||||||
} |
|
||||||
|
|
||||||
static int ehci_rt3883_remove(struct platform_device *pdev) |
|
||||||
{ |
|
||||||
struct usb_hcd *hcd = platform_get_drvdata(pdev); |
|
||||||
struct rt3883_ehci_platform_data *pdata; |
|
||||||
|
|
||||||
usb_remove_hcd(hcd); |
|
||||||
iounmap(hcd->regs); |
|
||||||
release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
|
||||||
usb_put_hcd(hcd); |
|
||||||
|
|
||||||
pdata = pdev->dev.platform_data; |
|
||||||
if (pdata && pdata->stop_hw) |
|
||||||
pdata->stop_hw(); |
|
||||||
|
|
||||||
return 0; |
|
||||||
} |
|
||||||
|
|
||||||
static struct platform_driver ehci_rt3883_driver = { |
|
||||||
.probe = ehci_rt3883_probe, |
|
||||||
.remove = ehci_rt3883_remove, |
|
||||||
.driver = { |
|
||||||
.owner = THIS_MODULE, |
|
||||||
.name = "rt3883-ehci", |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
MODULE_ALIAS("platform:rt3883-ehci"); |
|
@ -1,161 +0,0 @@ |
|||||||
/*
|
|
||||||
* Bus Glue for the built-in OHCI controller of the Ralink RT3662/RT3883 SoCs |
|
||||||
* |
|
||||||
* Copyright (C) 2011-2012 Gabor Juhos <juhosg@openwrt.org> |
|
||||||
* |
|
||||||
* Parts of this file are based on Ralink's 2.6.21 BSP |
|
||||||
* |
|
||||||
* 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> |
|
||||||
#include <asm/mach-ralink/rt3883.h> |
|
||||||
#include <asm/mach-ralink/rt3883_ohci_platform.h> |
|
||||||
|
|
||||||
static int __devinit ohci_rt3883_start(struct usb_hcd *hcd) |
|
||||||
{ |
|
||||||
struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
|
||||||
int ret; |
|
||||||
|
|
||||||
ret = ohci_init(ohci); |
|
||||||
if (ret < 0) |
|
||||||
return ret; |
|
||||||
|
|
||||||
ret = ohci_run(ohci); |
|
||||||
if (ret < 0) |
|
||||||
goto err; |
|
||||||
|
|
||||||
return 0; |
|
||||||
|
|
||||||
err: |
|
||||||
ohci_stop(hcd); |
|
||||||
return ret; |
|
||||||
} |
|
||||||
|
|
||||||
static const struct hc_driver ohci_rt3883_hc_driver = { |
|
||||||
.description = hcd_name, |
|
||||||
.product_desc = "Ralink RT3883 built-in OHCI controller", |
|
||||||
.hcd_priv_size = sizeof(struct ohci_hcd), |
|
||||||
|
|
||||||
.irq = ohci_irq, |
|
||||||
.flags = HCD_USB11 | HCD_MEMORY, |
|
||||||
|
|
||||||
.start = ohci_rt3883_start, |
|
||||||
.stop = ohci_stop, |
|
||||||
.shutdown = ohci_shutdown, |
|
||||||
|
|
||||||
.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, |
|
||||||
.start_port_reset = ohci_start_port_reset, |
|
||||||
}; |
|
||||||
|
|
||||||
static int ohci_rt3883_probe(struct platform_device *pdev) |
|
||||||
{ |
|
||||||
struct rt3883_ohci_platform_data *pdata; |
|
||||||
struct usb_hcd *hcd; |
|
||||||
struct resource *res; |
|
||||||
int irq; |
|
||||||
int ret; |
|
||||||
|
|
||||||
if (usb_disabled()) |
|
||||||
return -ENODEV; |
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
|
||||||
if (!res) { |
|
||||||
dev_dbg(&pdev->dev, "no IRQ specified for %s\n", |
|
||||||
dev_name(&pdev->dev)); |
|
||||||
return -ENODEV; |
|
||||||
} |
|
||||||
irq = res->start; |
|
||||||
|
|
||||||
hcd = usb_create_hcd(&ohci_rt3883_hc_driver, |
|
||||||
&pdev->dev, dev_name(&pdev->dev)); |
|
||||||
if (!hcd) |
|
||||||
return -ENOMEM; |
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|
||||||
if (!res) { |
|
||||||
dev_dbg(&pdev->dev, "no base address specified for %s\n", |
|
||||||
dev_name(&pdev->dev)); |
|
||||||
ret = -ENODEV; |
|
||||||
goto err_put_hcd; |
|
||||||
} |
|
||||||
hcd->rsrc_start = res->start; |
|
||||||
hcd->rsrc_len = res->end - res->start + 1; |
|
||||||
|
|
||||||
if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { |
|
||||||
dev_dbg(&pdev->dev, "controller already in use\n"); |
|
||||||
ret = -EBUSY; |
|
||||||
goto err_put_hcd; |
|
||||||
} |
|
||||||
|
|
||||||
hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); |
|
||||||
if (!hcd->regs) { |
|
||||||
dev_dbg(&pdev->dev, "error mapping memory\n"); |
|
||||||
ret = -EFAULT; |
|
||||||
goto err_release_region; |
|
||||||
} |
|
||||||
|
|
||||||
pdata = pdev->dev.platform_data; |
|
||||||
if (pdata && pdata->start_hw) |
|
||||||
pdata->start_hw(); |
|
||||||
|
|
||||||
ohci_hcd_init(hcd_to_ohci(hcd)); |
|
||||||
|
|
||||||
ret = usb_add_hcd(hcd, irq, IRQF_SHARED); |
|
||||||
if (ret) |
|
||||||
goto err_stop_hcd; |
|
||||||
|
|
||||||
return 0; |
|
||||||
|
|
||||||
err_stop_hcd: |
|
||||||
iounmap(hcd->regs); |
|
||||||
err_release_region: |
|
||||||
release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
|
||||||
err_put_hcd: |
|
||||||
usb_put_hcd(hcd); |
|
||||||
return ret; |
|
||||||
} |
|
||||||
|
|
||||||
static int ohci_rt3883_remove(struct platform_device *pdev) |
|
||||||
{ |
|
||||||
struct usb_hcd *hcd = platform_get_drvdata(pdev); |
|
||||||
struct rt3883_ohci_platform_data *pdata; |
|
||||||
|
|
||||||
usb_remove_hcd(hcd); |
|
||||||
iounmap(hcd->regs); |
|
||||||
release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
|
||||||
usb_put_hcd(hcd); |
|
||||||
|
|
||||||
pdata = pdev->dev.platform_data; |
|
||||||
if (pdata && pdata->stop_hw) |
|
||||||
pdata->stop_hw(); |
|
||||||
|
|
||||||
return 0; |
|
||||||
} |
|
||||||
|
|
||||||
static struct platform_driver ohci_rt3883_driver = { |
|
||||||
.probe = ohci_rt3883_probe, |
|
||||||
.remove = ohci_rt3883_remove, |
|
||||||
.shutdown = usb_hcd_platform_shutdown, |
|
||||||
.driver = { |
|
||||||
.name = "rt3883-ohci", |
|
||||||
.owner = THIS_MODULE, |
|
||||||
}, |
|
||||||
}; |
|
||||||
|
|
||||||
MODULE_ALIAS("platform:rt3883-ohci"); |
|
@ -1,32 +0,0 @@ |
|||||||
--- a/drivers/usb/host/Kconfig
|
|
||||||
+++ b/drivers/usb/host/Kconfig
|
|
||||||
@@ -235,6 +235,15 @@ config USB_EHCI_ATH79
|
|
||||||
Enables support for the built-in EHCI controller present
|
|
||||||
on the Atheros AR7XXX/AR9XXX SoCs.
|
|
||||||
|
|
||||||
+config USB_EHCI_RT3883
|
|
||||||
+ bool "EHCI support for Ralink RT3662/RT3883 SoCs"
|
|
||||||
+ depends on USB_EHCI_HCD && ( SOC_RT3883 || SOC_RT305X )
|
|
||||||
+ select USB_EHCI_ROOT_HUB_TT
|
|
||||||
+ default y
|
|
||||||
+ ---help---
|
|
||||||
+ Enables support for the built-in EHCI controller present
|
|
||||||
+ on the Ralink RT3883 SoC.
|
|
||||||
+
|
|
||||||
config USB_OXU210HP_HCD
|
|
||||||
tristate "OXU210HP HCD support"
|
|
||||||
depends on USB
|
|
||||||
--- a/drivers/usb/host/ehci-hcd.c
|
|
||||||
+++ b/drivers/usb/host/ehci-hcd.c
|
|
||||||
@@ -1339,6 +1339,11 @@ MODULE_LICENSE ("GPL");
|
|
||||||
#define PLATFORM_DRIVER ehci_platform_driver
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+#ifdef CONFIG_USB_EHCI_RT3883
|
|
||||||
+#include "ehci-rt3883.c"
|
|
||||||
+#define PLATFORM_DRIVER ehci_rt3883_driver
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
#if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \
|
|
||||||
!defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER) && \
|
|
||||||
!defined(XILINX_OF_PLATFORM_DRIVER)
|
|
@ -1,31 +0,0 @@ |
|||||||
--- a/drivers/usb/host/Kconfig
|
|
||||||
+++ b/drivers/usb/host/Kconfig
|
|
||||||
@@ -342,6 +342,14 @@ config USB_OHCI_ATH79
|
|
||||||
Enables support for the built-in OHCI controller present on the
|
|
||||||
Atheros AR71XX/AR7240 SoCs.
|
|
||||||
|
|
||||||
+config USB_OHCI_RT3883
|
|
||||||
+ bool "USB OHCI support for the Ralink RT3883 SoCs"
|
|
||||||
+ depends on USB_OHCI_HCD && ( SOC_RT3883 || SOC_RT305X )
|
|
||||||
+ default y
|
|
||||||
+ help
|
|
||||||
+ Enables support for the built-in OHCI controller present on the
|
|
||||||
+ Ralink RT3883 SoC.
|
|
||||||
+
|
|
||||||
config USB_OHCI_HCD_PPC_SOC
|
|
||||||
bool "OHCI support for on-chip PPC USB controller"
|
|
||||||
depends on USB_OHCI_HCD && (STB03xxx || PPC_MPC52xx)
|
|
||||||
--- a/drivers/usb/host/ohci-hcd.c
|
|
||||||
+++ b/drivers/usb/host/ohci-hcd.c
|
|
||||||
@@ -1120,6 +1120,11 @@ MODULE_LICENSE ("GPL");
|
|
||||||
#define PLATFORM_DRIVER ohci_platform_driver
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+#ifdef CONFIG_USB_OHCI_RT3883
|
|
||||||
+#include "ohci-rt3883.c"
|
|
||||||
+#define PLATFORM_DRIVER ohci_rt3883_driver
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
#if !defined(PCI_DRIVER) && \
|
|
||||||
!defined(PLATFORM_DRIVER) && \
|
|
||||||
!defined(OMAP1_PLATFORM_DRIVER) && \
|
|
Loading…
Reference in new issue