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