diff options
Diffstat (limited to 'target/linux/brcm47xx/patches-2.6.28/270-ehci-ssb.patch')
-rw-r--r-- | target/linux/brcm47xx/patches-2.6.28/270-ehci-ssb.patch | 314 |
1 files changed, 0 insertions, 314 deletions
diff --git a/target/linux/brcm47xx/patches-2.6.28/270-ehci-ssb.patch b/target/linux/brcm47xx/patches-2.6.28/270-ehci-ssb.patch deleted file mode 100644 index 2af7b4945..000000000 --- a/target/linux/brcm47xx/patches-2.6.28/270-ehci-ssb.patch +++ /dev/null @@ -1,314 +0,0 @@ ---- - drivers/usb/host/Kconfig | 13 ++ - drivers/usb/host/ehci-hcd.c | 12 ++ - drivers/usb/host/ehci-ssb.c | 201 ++++++++++++++++++++++++++++++++++++++++++++ - drivers/usb/host/ohci-ssb.c | 23 +++++ - 4 files changed, 247 insertions(+), 2 deletions(-) - ---- a/drivers/usb/host/Kconfig -+++ b/drivers/usb/host/Kconfig -@@ -96,6 +96,19 @@ config USB_EHCI_HCD_PPC_OF - Enables support for the USB controller present on the PowerPC - OpenFirmware platform bus. - -+config USB_EHCI_HCD_SSB -+ bool "EHCI support for Broadcom SSB EHCI core" -+ depends on USB_EHCI_HCD && SSB && EXPERIMENTAL -+ default n -+ ---help--- -+ Support for the Sonics Silicon Backplane (SSB) attached -+ Broadcom USB EHCI core. -+ -+ This device is present in some embedded devices with -+ Broadcom based SSB bus. -+ -+ If unsure, say N. -+ - config USB_ISP116X_HCD - tristate "ISP116X HCD support" - depends on USB ---- a/drivers/usb/host/ehci-hcd.c -+++ b/drivers/usb/host/ehci-hcd.c -@@ -1036,8 +1036,16 @@ MODULE_LICENSE ("GPL"); - #define PLATFORM_DRIVER ixp4xx_ehci_driver - #endif - --#if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \ -- !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER) -+#ifdef CONFIG_USB_EHCI_HCD_SSB -+#include "ehci-ssb.c" -+#define SSB_EHCI_DRIVER ssb_ehci_driver -+#endif -+ -+#if !defined(PCI_DRIVER) && \ -+ !defined(PLATFORM_DRIVER) && \ -+ !defined(PS3_SYSTEM_BUS_DRIVER) && \ -+ !defined(OF_PLATFORM_DRIVER) && \ -+ !defined(SSB_EHCI_DRIVER) - #error "missing bus glue for ehci-hcd" - #endif - ---- /dev/null -+++ b/drivers/usb/host/ehci-ssb.c -@@ -0,0 +1,201 @@ -+/* -+ * Sonics Silicon Backplane -+ * Broadcom USB-core EHCI driver (SSB bus glue) -+ * -+ * Copyright 2007 Steven Brown <sbrown@cortland.com> -+ * -+ * Derived from the OHCI-SSB driver -+ * Copyright 2007 Michael Buesch <mb@bu3sch.de> -+ * -+ * Derived from the EHCI-PCI driver -+ * Copyright (c) 2000-2004 by David Brownell -+ * -+ * Derived from the OHCI-PCI driver -+ * Copyright 1999 Roman Weissgaerber -+ * Copyright 2000-2002 David Brownell -+ * Copyright 1999 Linus Torvalds -+ * Copyright 1999 Gregory P. Smith -+ * -+ * Derived from the USBcore related parts of Broadcom-SB -+ * Copyright 2005 Broadcom Corporation -+ * -+ * Licensed under the GNU/GPL. See COPYING for details. -+ */ -+#include <linux/ssb/ssb.h> -+ -+#define SSB_OHCI_TMSLOW_HOSTMODE (1 << 29) -+ -+struct ssb_ehci_device { -+ struct ehci_hcd ehci; /* _must_ be at the beginning. */ -+ -+ u32 enable_flags; -+}; -+ -+static inline -+struct ssb_ehci_device *hcd_to_ssb_ehci(struct usb_hcd *hcd) -+{ -+ return (struct ssb_ehci_device *)(hcd->hcd_priv); -+} -+ -+ -+static int ssb_ehci_reset(struct usb_hcd *hcd) -+{ -+ struct ehci_hcd *ehci = hcd_to_ehci(hcd); -+ int err; -+ -+ ehci->caps = hcd->regs; -+ ehci->regs = hcd->regs + -+ HC_LENGTH(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); -+ -+ err = ehci_halt(ehci); -+ -+ if (err) -+ return err; -+ -+ err = ehci_init(hcd); -+ -+ if (err) -+ return err; -+ -+ ehci_port_power(ehci, 0); -+ -+ return err; -+} -+ -+static int ssb_ehci_start(struct usb_hcd *hcd) -+{ -+ struct ehci_hcd *ehci = hcd_to_ehci(hcd); -+ int err; -+ -+ err = ehci_run(hcd); -+ if (err < 0) { -+ ehci_err(ehci, "can't start\n"); -+ ehci_stop(hcd); -+ } -+ -+ return err; -+} -+ -+#ifdef CONFIG_PM -+static int ssb_ehci_hcd_suspend(struct usb_hcd *hcd, pm_message_t message) -+{ -+ struct ssb_ehci_device *ehcidev = hcd_to_ssb_ehci(hcd); -+ struct ehci_hcd *ehci = &ehcidev->ehci; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&ehci->lock, flags); -+ -+ ehci_writel(ehci, EHCI_INTR_MIE, &ehci->regs->intrdisable); -+ ehci_readl(ehci, &ehci->regs->intrdisable); /* commit write */ -+ -+ /* make sure snapshot being resumed re-enumerates everything */ -+ if (message.event == PM_EVENT_PRETHAW) -+ ehci_usb_reset(ehci); -+ -+ clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); -+ -+ spin_unlock_irqrestore(&ehci->lock, flags); -+ return 0; -+} -+ -+static int ssb_ehci_hcd_resume(struct usb_hcd *hcd) -+{ -+ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); -+ usb_hcd_resume_root_hub(hcd); -+ return 0; -+} -+#endif /* CONFIG_PM */ -+ -+static const struct hc_driver ssb_ehci_hc_driver = { -+ .description = "ssb-usb-ehci", -+ .product_desc = "SSB EHCI Controller", -+ .hcd_priv_size = sizeof(struct ssb_ehci_device), -+ -+ .irq = ehci_irq, -+ .flags = HCD_MEMORY | HCD_USB2, -+ -+ .reset = ssb_ehci_reset, -+ .start = ssb_ehci_start, -+ .stop = ehci_stop, -+ .shutdown = ehci_shutdown, -+ -+#ifdef CONFIG_PM -+ .suspend = ssb_ehci_hcd_suspend, -+ .resume = ssb_ehci_hcd_resume, -+#endif -+ -+ .urb_enqueue = ehci_urb_enqueue, -+ .urb_dequeue = ehci_urb_dequeue, -+ .endpoint_disable = ehci_endpoint_disable, -+ -+ .get_frame_number = ehci_get_frame, -+ -+ .hub_status_data = ehci_hub_status_data, -+ .hub_control = ehci_hub_control, -+#ifdef CONFIG_PM -+ .bus_suspend = ehci_bus_suspend, -+ .bus_resume = ehci_bus_resume, -+#endif -+ -+}; -+ -+static void ssb_ehci_detach(struct ssb_device *dev, struct usb_hcd *hcd) -+{ -+ -+ usb_remove_hcd(hcd); -+ iounmap(hcd->regs); -+ usb_put_hcd(hcd); -+} -+EXPORT_SYMBOL_GPL(ssb_ehci_detach); -+ -+static int ssb_ehci_attach(struct ssb_device *dev, struct usb_hcd **ehci_hcd) -+{ -+ struct ssb_ehci_device *ehcidev; -+ struct usb_hcd *hcd; -+ int err = -ENOMEM; -+ u32 tmp, flags = 0; -+ -+ hcd = usb_create_hcd(&ssb_ehci_hc_driver, dev->dev, -+ dev->dev->bus_id); -+ if (!hcd) -+ goto err_dev_disable; -+ -+ ehcidev = hcd_to_ssb_ehci(hcd); -+ ehcidev->enable_flags = flags; -+ tmp = ssb_read32(dev, SSB_ADMATCH0); -+ hcd->rsrc_start = ssb_admatch_base(tmp) + 0x800; /* ehci core offset */ -+ hcd->rsrc_len = 0x100; /* ehci reg block size */ -+ /* -+ * start & size modified per sbutils.c -+ */ -+ hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); -+ if (!hcd->regs) -+ goto err_put_hcd; -+ err = usb_add_hcd(hcd, dev->irq, IRQF_SHARED | IRQF_DISABLED); -+ if (err) -+ goto err_iounmap; -+ -+ *ehci_hcd = hcd; -+ -+ return err; -+ -+err_iounmap: -+ iounmap(hcd->regs); -+err_put_hcd: -+ usb_put_hcd(hcd); -+err_dev_disable: -+ ssb_device_disable(dev, flags); -+ return err; -+} -+EXPORT_SYMBOL_GPL(ssb_ehci_attach); -+ -+static const struct ssb_device_id ssb_ehci_table[] = { -+ SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB20_HOST, SSB_ANY_REV), -+ SSB_DEVTABLE_END -+}; -+MODULE_DEVICE_TABLE(ssb, ssb_ehci_table); ---- a/drivers/usb/host/ohci-ssb.c -+++ b/drivers/usb/host/ohci-ssb.c -@@ -17,6 +17,8 @@ - */ - #include <linux/ssb/ssb.h> - -+extern int ssb_ehci_attach(struct ssb_device *dev, struct usb_hcd **hcd); -+extern void ssb_ehci_detach(struct ssb_device *dev, struct usb_hcd *hcd); - - #define SSB_OHCI_TMSLOW_HOSTMODE (1 << 29) - -@@ -24,6 +26,7 @@ struct ssb_ohci_device { - struct ohci_hcd ohci; /* _must_ be at the beginning. */ - - u32 enable_flags; -+ struct usb_hcd *ehci_hcd; - }; - - static inline -@@ -92,13 +95,25 @@ static const struct hc_driver ssb_ohci_h - static void ssb_ohci_detach(struct ssb_device *dev) - { - struct usb_hcd *hcd = ssb_get_drvdata(dev); -+#ifdef CONFIG_USB_EHCI_HCD_SSB -+ struct ssb_ohci_device *ohcidev = hcd_to_ssb_ohci(hcd); -+#endif - - usb_remove_hcd(hcd); - iounmap(hcd->regs); - usb_put_hcd(hcd); -+ -+#ifdef CONFIG_USB_EHCI_HCD_SSB -+ /* -+ * Also detach ehci function -+ */ -+ if (dev->id.coreid == SSB_DEV_USB20_HOST) -+ ssb_ehci_detach(dev, ohcidev->ehci_hcd); -+#endif - ssb_device_disable(dev, 0); - } - -+ - static int ssb_ohci_attach(struct ssb_device *dev) - { - struct ssb_ohci_device *ohcidev; -@@ -165,6 +180,14 @@ static int ssb_ohci_attach(struct ssb_de - - ssb_set_drvdata(dev, hcd); - -+#ifdef CONFIG_USB_EHCI_HCD_SSB -+ /* -+ * attach ehci function in this core -+ */ -+ if (dev->id.coreid == SSB_DEV_USB20_HOST) -+ err = ssb_ehci_attach(dev, &(ohcidev->ehci_hcd)); -+#endif -+ - return err; - - err_iounmap: |