diff options
author | Felix Fietkau <nbd@openwrt.org> | 2015-04-15 16:06:14 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2015-04-15 16:06:14 +0000 |
commit | 83e31eb7e74809d95742dab4f02a18f11bb153bc (patch) | |
tree | 6ad0bebaf793c53371d10393d100b7041a1ee535 /target/linux/bcm53xx/patches-3.18 | |
parent | f1119373f2eead74abfca50510e83e0b1c41a49e (diff) | |
download | mtk-20170518-83e31eb7e74809d95742dab4f02a18f11bb153bc.zip mtk-20170518-83e31eb7e74809d95742dab4f02a18f11bb153bc.tar.gz mtk-20170518-83e31eb7e74809d95742dab4f02a18f11bb153bc.tar.bz2 |
bcm53xx: add USB 2.0 support
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
SVN-Revision: 45450
Diffstat (limited to 'target/linux/bcm53xx/patches-3.18')
-rw-r--r-- | target/linux/bcm53xx/patches-3.18/190-bcma_hcd_add_bcm5301x_support.patch | 122 | ||||
-rw-r--r-- | target/linux/bcm53xx/patches-3.18/191-bcma_hcd_add_gpio_power_control.patch | 62 |
2 files changed, 184 insertions, 0 deletions
diff --git a/target/linux/bcm53xx/patches-3.18/190-bcma_hcd_add_bcm5301x_support.patch b/target/linux/bcm53xx/patches-3.18/190-bcma_hcd_add_bcm5301x_support.patch new file mode 100644 index 0000000..2e528b6 --- /dev/null +++ b/target/linux/bcm53xx/patches-3.18/190-bcma_hcd_add_bcm5301x_support.patch @@ -0,0 +1,122 @@ +Subject: [PATCH] bcma-hcd: add BCM5301x platform support + +Signed-off-by: Felix Fietkau <nbd@openwrt.org> +--- +--- a/drivers/usb/host/bcma-hcd.c ++++ b/drivers/usb/host/bcma-hcd.c +@@ -88,7 +88,7 @@ static void bcma_hcd_4716wa(struct bcma_ + } + + /* based on arch/mips/brcm-boards/bcm947xx/pcibios.c */ +-static void bcma_hcd_init_chip(struct bcma_device *dev) ++static void bcma_hcd_init_chip_mips(struct bcma_device *dev) + { + u32 tmp; + +@@ -159,6 +159,52 @@ static void bcma_hcd_init_chip(struct bc + } + } + ++static void bcma_hcd_init_chip_arm(struct bcma_device *dev) ++{ ++ struct bcma_device *arm_core; ++ void __iomem *dmu; ++ u32 val; ++ ++ bcma_core_disable(dev, 0); ++ bcma_core_enable(dev, 0); ++ ++ msleep(1); ++ ++ /* Set packet buffer OUT threshold */ ++ val = bcma_read32(dev, 0x94); ++ val &= 0xffff; ++ val |= 0x80 << 16; ++ bcma_write32(dev, 0x94, val); ++ ++ /* Enable break memory transfer */ ++ val = bcma_read32(dev, 0x9c); ++ val |= 1; ++ bcma_write32(dev, 0x9c, val); ++ ++ if (dev->bus->chipinfo.pkg != BCMA_PKG_ID_BCM4707 && ++ dev->bus->chipinfo.pkg != BCMA_PKG_ID_BCM4708) ++ return; ++ ++ arm_core = bcma_find_core(dev->bus, BCMA_CORE_ARMCA9); ++ if (!arm_core) ++ return; ++ ++ dmu = ioremap_nocache(arm_core->addr_s[0], 0x1000); ++ if (!dmu) ++ return; ++ ++ /* Unlock DMU PLL settings */ ++ iowrite32(0x0000ea68, dmu + 0x180); ++ ++ /* Write USB 2.0 PLL control setting */ ++ iowrite32(0x00dd10c3, dmu + 0x164); ++ ++ /* Lock DMU PLL settings */ ++ iowrite32(0x00000000, dmu + 0x180); ++ ++ iounmap(dmu); ++} ++ + static const struct usb_ehci_pdata ehci_pdata = { + }; + +@@ -222,7 +268,8 @@ static int bcma_hcd_probe(struct bcma_de + chipinfo = &dev->bus->chipinfo; + /* USBcores are only connected on embedded devices. */ + chipid_top = (chipinfo->id & 0xFF00); +- if (chipid_top != 0x4700 && chipid_top != 0x5300) ++ if (chipid_top != 0x4700 && chipid_top != 0x5300 && ++ chipinfo->id != BCMA_CHIP_ID_BCM4707) + return -ENODEV; + + /* TODO: Probably need checks here; is the core connected? */ +@@ -234,18 +281,23 @@ static int bcma_hcd_probe(struct bcma_de + if (!usb_dev) + return -ENOMEM; + +- bcma_hcd_init_chip(dev); +- +- /* In AI chips EHCI is addrspace 0, OHCI is 1 */ +- ohci_addr = dev->addr_s[0]; +- if ((chipinfo->id == 0x5357 || chipinfo->id == 0x4749) +- && chipinfo->rev == 0) +- ohci_addr = 0x18009000; +- +- usb_dev->ohci_dev = bcma_hcd_create_pdev(dev, true, ohci_addr); +- if (IS_ERR(usb_dev->ohci_dev)) { +- err = PTR_ERR(usb_dev->ohci_dev); +- goto err_free_usb_dev; ++ if (IS_BUILTIN(CONFIG_ARCH_BCM_5301X) && ++ chipinfo->id == BCMA_CHIP_ID_BCM4707) { ++ bcma_hcd_init_chip_arm(dev); ++ } else if(IS_BUILTIN(CONFIG_BCM47XX)) { ++ bcma_hcd_init_chip_mips(dev); ++ ++ /* In AI chips EHCI is addrspace 0, OHCI is 1 */ ++ ohci_addr = dev->addr_s[0]; ++ if ((chipinfo->id == 0x5357 || chipinfo->id == 0x4749) ++ && chipinfo->rev == 0) ++ ohci_addr = 0x18009000; ++ ++ usb_dev->ohci_dev = bcma_hcd_create_pdev(dev, true, ohci_addr); ++ if (IS_ERR(usb_dev->ohci_dev)) { ++ err = PTR_ERR(usb_dev->ohci_dev); ++ goto err_free_usb_dev; ++ } + } + + usb_dev->ehci_dev = bcma_hcd_create_pdev(dev, false, dev->addr); +@@ -306,6 +358,7 @@ static int bcma_hcd_resume(struct bcma_d + + static const struct bcma_device_id bcma_hcd_table[] = { + BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_USB20_HOST, BCMA_ANY_REV, BCMA_ANY_CLASS), ++ BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_NS_USB20, BCMA_ANY_REV, BCMA_ANY_CLASS), + BCMA_CORETABLE_END + }; + MODULE_DEVICE_TABLE(bcma, bcma_hcd_table); diff --git a/target/linux/bcm53xx/patches-3.18/191-bcma_hcd_add_gpio_power_control.patch b/target/linux/bcm53xx/patches-3.18/191-bcma_hcd_add_gpio_power_control.patch new file mode 100644 index 0000000..9c45556 --- /dev/null +++ b/target/linux/bcm53xx/patches-3.18/191-bcma_hcd_add_gpio_power_control.patch @@ -0,0 +1,62 @@ +Subject: [PATCH] bcma-hcd: add support for controlling bus power through GPIO + +Signed-off-by: Felix Fietkau <nbd@openwrt.org> +--- +--- a/drivers/usb/host/bcma-hcd.c ++++ b/drivers/usb/host/bcma-hcd.c +@@ -23,6 +23,8 @@ + #include <linux/platform_device.h> + #include <linux/module.h> + #include <linux/slab.h> ++#include <linux/of.h> ++#include <linux/of_gpio.h> + #include <linux/usb/ehci_pdriver.h> + #include <linux/usb/ohci_pdriver.h> + +@@ -205,7 +207,38 @@ static void bcma_hcd_init_chip_arm(struc + iounmap(dmu); + } + ++static void bcma_hci_platform_power_gpio(struct platform_device *dev, bool val) ++{ ++ int gpio; ++ ++ gpio = of_get_named_gpio(dev->dev.of_node, "vcc-gpio", 0); ++ if (!gpio_is_valid(gpio)) ++ return; ++ ++ if (val) { ++ gpio_request(gpio, "bcma-hcd-gpio"); ++ gpio_set_value(gpio, 1); ++ } else { ++ gpio_set_value(gpio, 0); ++ gpio_free(gpio); ++ } ++} ++ ++static int bcma_hci_platform_power_on(struct platform_device *dev) ++{ ++ bcma_hci_platform_power_gpio(dev, true); ++ return 0; ++} ++ ++static void bcma_hci_platform_power_off(struct platform_device *dev) ++{ ++ bcma_hci_platform_power_gpio(dev, false); ++} ++ + static const struct usb_ehci_pdata ehci_pdata = { ++ .power_on = bcma_hci_platform_power_on, ++ .power_suspend = bcma_hci_platform_power_off, ++ .power_off = bcma_hci_platform_power_off, + }; + + static const struct usb_ohci_pdata ohci_pdata = { +@@ -233,6 +266,7 @@ static struct platform_device *bcma_hcd_ + + hci_dev->dev.parent = &dev->dev; + hci_dev->dev.dma_mask = &hci_dev->dev.coherent_dma_mask; ++ hci_dev->dev.of_node = dev->dev.of_node; + + ret = platform_device_add_resources(hci_dev, hci_res, + ARRAY_SIZE(hci_res)); |