brcm47xx: add support for kernel 3.3
[openwrt.git] / target / linux / brcm47xx / patches-3.3 / 185-USB-OHCI-remove-old-SSB-OHCI-driver.patch
diff --git a/target/linux/brcm47xx/patches-3.3/185-USB-OHCI-remove-old-SSB-OHCI-driver.patch b/target/linux/brcm47xx/patches-3.3/185-USB-OHCI-remove-old-SSB-OHCI-driver.patch
new file mode 100644 (file)
index 0000000..645d409
--- /dev/null
@@ -0,0 +1,340 @@
+--- a/drivers/usb/host/Kconfig
++++ b/drivers/usb/host/Kconfig
+@@ -361,10 +361,15 @@ config USB_OHCI_HCD_PCI
+         If unsure, say Y.
+ config USB_OHCI_HCD_SSB
+-      bool "OHCI support for Broadcom SSB OHCI core"
++      bool "OHCI support for Broadcom SSB OHCI core (DEPRECATED)"
+       depends on USB_OHCI_HCD && (SSB = y || SSB = USB_OHCI_HCD) && EXPERIMENTAL
++      select USB_HCD_SSB
++      select USB_OHCI_HCD_PLATFORM
+       default n
+       ---help---
++        This option is deprecated now and the driver was removed, use
++        USB_HCD_SSB and USB_OHCI_HCD_PLATFORM instead.
++
+         Support for the Sonics Silicon Backplane (SSB) attached
+         Broadcom USB OHCI core.
+--- a/drivers/usb/host/ohci-hcd.c
++++ b/drivers/usb/host/ohci-hcd.c
+@@ -1081,11 +1081,6 @@ MODULE_LICENSE ("GPL");
+ #define PS3_SYSTEM_BUS_DRIVER ps3_ohci_driver
+ #endif
+-#ifdef CONFIG_USB_OHCI_HCD_SSB
+-#include "ohci-ssb.c"
+-#define SSB_OHCI_DRIVER               ssb_ohci_driver
+-#endif
+-
+ #ifdef CONFIG_MFD_SM501
+ #include "ohci-sm501.c"
+ #define SM501_OHCI_DRIVER     ohci_hcd_sm501_driver
+@@ -1134,8 +1129,7 @@ MODULE_LICENSE ("GPL");
+       !defined(SA1111_DRIVER) &&      \
+       !defined(PS3_SYSTEM_BUS_DRIVER) && \
+       !defined(SM501_OHCI_DRIVER) && \
+-      !defined(TMIO_OHCI_DRIVER) && \
+-      !defined(SSB_OHCI_DRIVER)
++      !defined(TMIO_OHCI_DRIVER)
+ #error "missing bus glue for ohci-hcd"
+ #endif
+@@ -1201,12 +1195,6 @@ static int __init ohci_hcd_mod_init(void
+               goto error_pci;
+ #endif
+-#ifdef SSB_OHCI_DRIVER
+-      retval = ssb_driver_register(&SSB_OHCI_DRIVER);
+-      if (retval)
+-              goto error_ssb;
+-#endif
+-
+ #ifdef SM501_OHCI_DRIVER
+       retval = platform_driver_register(&SM501_OHCI_DRIVER);
+       if (retval < 0)
+@@ -1230,10 +1218,6 @@ static int __init ohci_hcd_mod_init(void
+       platform_driver_unregister(&SM501_OHCI_DRIVER);
+  error_sm501:
+ #endif
+-#ifdef SSB_OHCI_DRIVER
+-      ssb_driver_unregister(&SSB_OHCI_DRIVER);
+- error_ssb:
+-#endif
+ #ifdef PCI_DRIVER
+       pci_unregister_driver(&PCI_DRIVER);
+  error_pci:
+@@ -1281,9 +1265,6 @@ static void __exit ohci_hcd_mod_exit(voi
+ #ifdef SM501_OHCI_DRIVER
+       platform_driver_unregister(&SM501_OHCI_DRIVER);
+ #endif
+-#ifdef SSB_OHCI_DRIVER
+-      ssb_driver_unregister(&SSB_OHCI_DRIVER);
+-#endif
+ #ifdef PCI_DRIVER
+       pci_unregister_driver(&PCI_DRIVER);
+ #endif
+--- a/drivers/usb/host/ohci-ssb.c
++++ /dev/null
+@@ -1,260 +0,0 @@
+-/*
+- * Sonics Silicon Backplane
+- * Broadcom USB-core OHCI driver
+- *
+- * Copyright 2007 Michael Buesch <m@bues.ch>
+- *
+- * 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_ohci_device {
+-      struct ohci_hcd ohci; /* _must_ be at the beginning. */
+-
+-      u32 enable_flags;
+-};
+-
+-static inline
+-struct ssb_ohci_device *hcd_to_ssb_ohci(struct usb_hcd *hcd)
+-{
+-      return (struct ssb_ohci_device *)(hcd->hcd_priv);
+-}
+-
+-
+-static int ssb_ohci_reset(struct usb_hcd *hcd)
+-{
+-      struct ssb_ohci_device *ohcidev = hcd_to_ssb_ohci(hcd);
+-      struct ohci_hcd *ohci = &ohcidev->ohci;
+-      int err;
+-
+-      ohci_hcd_init(ohci);
+-      err = ohci_init(ohci);
+-
+-      return err;
+-}
+-
+-static int ssb_ohci_start(struct usb_hcd *hcd)
+-{
+-      struct ssb_ohci_device *ohcidev = hcd_to_ssb_ohci(hcd);
+-      struct ohci_hcd *ohci = &ohcidev->ohci;
+-      int err;
+-
+-      err = ohci_run(ohci);
+-      if (err < 0) {
+-              ohci_err(ohci, "can't start\n");
+-              ohci_stop(hcd);
+-      }
+-
+-      return err;
+-}
+-
+-static const struct hc_driver ssb_ohci_hc_driver = {
+-      .description            = "ssb-usb-ohci",
+-      .product_desc           = "SSB OHCI Controller",
+-      .hcd_priv_size          = sizeof(struct ssb_ohci_device),
+-
+-      .irq                    = ohci_irq,
+-      .flags                  = HCD_MEMORY | HCD_USB11,
+-
+-      .reset                  = ssb_ohci_reset,
+-      .start                  = ssb_ohci_start,
+-      .stop                   = ohci_stop,
+-      .shutdown               = ohci_shutdown,
+-
+-      .urb_enqueue            = ohci_urb_enqueue,
+-      .urb_dequeue            = ohci_urb_dequeue,
+-      .endpoint_disable       = ohci_endpoint_disable,
+-
+-      .get_frame_number       = ohci_get_frame,
+-
+-      .hub_status_data        = ohci_hub_status_data,
+-      .hub_control            = ohci_hub_control,
+-#ifdef        CONFIG_PM
+-      .bus_suspend            = ohci_bus_suspend,
+-      .bus_resume             = ohci_bus_resume,
+-#endif
+-
+-      .start_port_reset       = ohci_start_port_reset,
+-};
+-
+-static void ssb_ohci_detach(struct ssb_device *dev)
+-{
+-      struct usb_hcd *hcd = ssb_get_drvdata(dev);
+-
+-      if (hcd->driver->shutdown)
+-              hcd->driver->shutdown(hcd);
+-      usb_remove_hcd(hcd);
+-      iounmap(hcd->regs);
+-      release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
+-      usb_put_hcd(hcd);
+-      ssb_device_disable(dev, 0);
+-}
+-
+-static int ssb_ohci_attach(struct ssb_device *dev)
+-{
+-      struct ssb_ohci_device *ohcidev;
+-      struct usb_hcd *hcd;
+-      int err = -ENOMEM;
+-      u32 tmp, flags = 0;
+-
+-      if (dma_set_mask(dev->dma_dev, DMA_BIT_MASK(32)) ||
+-          dma_set_coherent_mask(dev->dma_dev, DMA_BIT_MASK(32)))
+-              return -EOPNOTSUPP;
+-
+-      if (dev->id.coreid == SSB_DEV_USB11_HOSTDEV) {
+-              /* Put the device into host-mode. */
+-              flags |= SSB_OHCI_TMSLOW_HOSTMODE;
+-              ssb_device_enable(dev, flags);
+-      } else if (dev->id.coreid == SSB_DEV_USB20_HOST) {
+-              /*
+-               * USB 2.0 special considerations:
+-               *
+-               * In addition to the standard SSB reset sequence, the Host
+-               * Control Register must be programmed to bring the USB core
+-               * and various phy components out of reset.
+-               */
+-              ssb_device_enable(dev, 0);
+-              ssb_write32(dev, 0x200, 0x7ff);
+-
+-              /* Change Flush control reg */
+-              tmp = ssb_read32(dev, 0x400);
+-              tmp &= ~8;
+-              ssb_write32(dev, 0x400, tmp);
+-              tmp = ssb_read32(dev, 0x400);
+-
+-              /* Change Shim control reg */
+-              tmp = ssb_read32(dev, 0x304);
+-              tmp &= ~0x100;
+-              ssb_write32(dev, 0x304, tmp);
+-              tmp = ssb_read32(dev, 0x304);
+-
+-              udelay(1);
+-
+-              /* Work around for 5354 failures */
+-              if (dev->id.revision == 2 && dev->bus->chip_id == 0x5354) {
+-                      /* Change syn01 reg */
+-                      tmp = 0x00fe00fe;
+-                      ssb_write32(dev, 0x894, tmp);
+-
+-                      /* Change syn03 reg */
+-                      tmp = ssb_read32(dev, 0x89c);
+-                      tmp |= 0x1;
+-                      ssb_write32(dev, 0x89c, tmp);
+-              }
+-      } else
+-              ssb_device_enable(dev, 0);
+-
+-      hcd = usb_create_hcd(&ssb_ohci_hc_driver, dev->dev,
+-                      dev_name(dev->dev));
+-      if (!hcd)
+-              goto err_dev_disable;
+-      ohcidev = hcd_to_ssb_ohci(hcd);
+-      ohcidev->enable_flags = flags;
+-
+-      tmp = ssb_read32(dev, SSB_ADMATCH0);
+-      hcd->rsrc_start = ssb_admatch_base(tmp);
+-      hcd->rsrc_len = ssb_admatch_size(tmp);
+-      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);
+-      if (err)
+-              goto err_iounmap;
+-
+-      ssb_set_drvdata(dev, 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;
+-}
+-
+-static int ssb_ohci_probe(struct ssb_device *dev,
+-              const struct ssb_device_id *id)
+-{
+-      int err;
+-      u16 chipid_top;
+-
+-      /* USBcores are only connected on embedded devices. */
+-      chipid_top = (dev->bus->chip_id & 0xFF00);
+-      if (chipid_top != 0x4700 && chipid_top != 0x5300)
+-              return -ENODEV;
+-
+-      /* TODO: Probably need checks here; is the core connected? */
+-
+-      if (usb_disabled())
+-              return -ENODEV;
+-
+-      /* We currently always attach SSB_DEV_USB11_HOSTDEV
+-       * as HOST OHCI. If we want to attach it as Client device,
+-       * we must branch here and call into the (yet to
+-       * be written) Client mode driver. Same for remove(). */
+-
+-      err = ssb_ohci_attach(dev);
+-
+-      return err;
+-}
+-
+-static void ssb_ohci_remove(struct ssb_device *dev)
+-{
+-      ssb_ohci_detach(dev);
+-}
+-
+-#ifdef CONFIG_PM
+-
+-static int ssb_ohci_suspend(struct ssb_device *dev, pm_message_t state)
+-{
+-      ssb_device_disable(dev, 0);
+-
+-      return 0;
+-}
+-
+-static int ssb_ohci_resume(struct ssb_device *dev)
+-{
+-      struct usb_hcd *hcd = ssb_get_drvdata(dev);
+-      struct ssb_ohci_device *ohcidev = hcd_to_ssb_ohci(hcd);
+-
+-      ssb_device_enable(dev, ohcidev->enable_flags);
+-
+-      ohci_finish_controller_resume(hcd);
+-      return 0;
+-}
+-
+-#else /* !CONFIG_PM */
+-#define ssb_ohci_suspend      NULL
+-#define ssb_ohci_resume       NULL
+-#endif /* CONFIG_PM */
+-
+-static const struct ssb_device_id ssb_ohci_table[] = {
+-      SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB11_HOSTDEV, SSB_ANY_REV),
+-      SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB11_HOST, SSB_ANY_REV),
+-      SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB20_HOST, SSB_ANY_REV),
+-      SSB_DEVTABLE_END
+-};
+-MODULE_DEVICE_TABLE(ssb, ssb_ohci_table);
+-
+-static struct ssb_driver ssb_ohci_driver = {
+-      .name           = KBUILD_MODNAME,
+-      .id_table       = ssb_ohci_table,
+-      .probe          = ssb_ohci_probe,
+-      .remove         = ssb_ohci_remove,
+-      .suspend        = ssb_ohci_suspend,
+-      .resume         = ssb_ohci_resume,
+-};