184-USB-bcma-add-bcm53xx-support.patch 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. From b65851f41c22b8c69b8fe9ca7782d19ed2155efc Mon Sep 17 00:00:00 2001
  2. From: Hauke Mehrtens <hauke@hauke-m.de>
  3. Date: Thu, 11 Jun 2015 22:57:39 +0200
  4. Subject: [PATCH] USB: bcma: add bcm53xx support
  5. The Broadcom ARM SoCs with this usb core need a different
  6. initialization and they have a different core id. This patch adds
  7. support for these USB 2.0 core.
  8. Signed-off-by: Felix Fietkau <nbd@nbd.name>
  9. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  10. ---
  11. drivers/usb/host/bcma-hcd.c | 81 +++++++++++++++++++++++++++++++++++++++++++--
  12. 1 file changed, 78 insertions(+), 3 deletions(-)
  13. --- a/drivers/usb/host/bcma-hcd.c
  14. +++ b/drivers/usb/host/bcma-hcd.c
  15. @@ -2,7 +2,8 @@
  16. * Broadcom specific Advanced Microcontroller Bus
  17. * Broadcom USB-core driver (BCMA bus glue)
  18. *
  19. - * Copyright 2011-2012 Hauke Mehrtens <hauke@hauke-m.de>
  20. + * Copyright 2011-2015 Hauke Mehrtens <hauke@hauke-m.de>
  21. + * Copyright 2015 Felix Fietkau <nbd@nbd.name>
  22. *
  23. * Based on ssb-ohci driver
  24. * Copyright 2007 Michael Buesch <m@bues.ch>
  25. @@ -88,7 +89,7 @@ static void bcma_hcd_4716wa(struct bcma_
  26. }
  27. /* based on arch/mips/brcm-boards/bcm947xx/pcibios.c */
  28. -static void bcma_hcd_init_chip(struct bcma_device *dev)
  29. +static void bcma_hcd_init_chip_mips(struct bcma_device *dev)
  30. {
  31. u32 tmp;
  32. @@ -159,6 +160,70 @@ static void bcma_hcd_init_chip(struct bc
  33. }
  34. }
  35. +static void bcma_hcd_init_chip_arm_phy(struct bcma_device *dev)
  36. +{
  37. + struct bcma_device *arm_core;
  38. + void __iomem *dmu;
  39. +
  40. + arm_core = bcma_find_core(dev->bus, BCMA_CORE_ARMCA9);
  41. + if (!arm_core) {
  42. + dev_err(&dev->dev, "can not find ARM Cortex A9 ihost core\n");
  43. + return;
  44. + }
  45. +
  46. + dmu = ioremap_nocache(arm_core->addr_s[0], 0x1000);
  47. + if (!dmu) {
  48. + dev_err(&dev->dev, "can not map ARM Cortex A9 ihost core\n");
  49. + return;
  50. + }
  51. +
  52. + /* Unlock DMU PLL settings */
  53. + iowrite32(0x0000ea68, dmu + 0x180);
  54. +
  55. + /* Write USB 2.0 PLL control setting */
  56. + iowrite32(0x00dd10c3, dmu + 0x164);
  57. +
  58. + /* Lock DMU PLL settings */
  59. + iowrite32(0x00000000, dmu + 0x180);
  60. +
  61. + iounmap(dmu);
  62. +}
  63. +
  64. +static void bcma_hcd_init_chip_arm_hc(struct bcma_device *dev)
  65. +{
  66. + u32 val;
  67. +
  68. + /*
  69. + * Delay after PHY initialized to ensure HC is ready to be configured
  70. + */
  71. + usleep_range(1000, 2000);
  72. +
  73. + /* Set packet buffer OUT threshold */
  74. + val = bcma_read32(dev, 0x94);
  75. + val &= 0xffff;
  76. + val |= 0x80 << 16;
  77. + bcma_write32(dev, 0x94, val);
  78. +
  79. + /* Enable break memory transfer */
  80. + val = bcma_read32(dev, 0x9c);
  81. + val |= 1;
  82. + bcma_write32(dev, 0x9c, val);
  83. +}
  84. +
  85. +static void bcma_hcd_init_chip_arm(struct bcma_device *dev)
  86. +{
  87. + bcma_core_enable(dev, 0);
  88. +
  89. + if (dev->bus->chipinfo.id == BCMA_CHIP_ID_BCM4707 ||
  90. + dev->bus->chipinfo.id == BCMA_CHIP_ID_BCM53018) {
  91. + if (dev->bus->chipinfo.pkg == BCMA_PKG_ID_BCM4707 ||
  92. + dev->bus->chipinfo.pkg == BCMA_PKG_ID_BCM4708)
  93. + bcma_hcd_init_chip_arm_phy(dev);
  94. +
  95. + bcma_hcd_init_chip_arm_hc(dev);
  96. + }
  97. +}
  98. +
  99. static const struct usb_ehci_pdata ehci_pdata = {
  100. };
  101. @@ -230,7 +295,16 @@ static int bcma_hcd_probe(struct bcma_de
  102. if (!usb_dev)
  103. return -ENOMEM;
  104. - bcma_hcd_init_chip(dev);
  105. + switch (dev->id.id) {
  106. + case BCMA_CORE_NS_USB20:
  107. + bcma_hcd_init_chip_arm(dev);
  108. + break;
  109. + case BCMA_CORE_USB20_HOST:
  110. + bcma_hcd_init_chip_mips(dev);
  111. + break;
  112. + default:
  113. + return -ENODEV;
  114. + }
  115. /* In AI chips EHCI is addrspace 0, OHCI is 1 */
  116. ohci_addr = dev->addr_s[0];
  117. @@ -299,6 +373,7 @@ static int bcma_hcd_resume(struct bcma_d
  118. static const struct bcma_device_id bcma_hcd_table[] = {
  119. BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_USB20_HOST, BCMA_ANY_REV, BCMA_ANY_CLASS),
  120. + BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_NS_USB20, BCMA_ANY_REV, BCMA_ANY_CLASS),
  121. {},
  122. };
  123. MODULE_DEVICE_TABLE(bcma, bcma_hcd_table);