core.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*
  2. * Broadcom specific AMBA
  3. * Core ops
  4. *
  5. * Licensed under the GNU/GPL. See COPYING for details.
  6. */
  7. #include "bcma_private.h"
  8. #include <linux/export.h>
  9. #include <linux/bcma/bcma.h>
  10. bool bcma_core_is_enabled(struct bcma_device *core)
  11. {
  12. if ((bcma_aread32(core, BCMA_IOCTL) & (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC))
  13. != BCMA_IOCTL_CLK)
  14. return false;
  15. if (bcma_aread32(core, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
  16. return false;
  17. return true;
  18. }
  19. EXPORT_SYMBOL_GPL(bcma_core_is_enabled);
  20. void bcma_core_disable(struct bcma_device *core, u32 flags)
  21. {
  22. if (bcma_aread32(core, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
  23. return;
  24. bcma_awrite32(core, BCMA_IOCTL, flags);
  25. bcma_aread32(core, BCMA_IOCTL);
  26. udelay(10);
  27. bcma_awrite32(core, BCMA_RESET_CTL, BCMA_RESET_CTL_RESET);
  28. bcma_aread32(core, BCMA_RESET_CTL);
  29. udelay(1);
  30. }
  31. EXPORT_SYMBOL_GPL(bcma_core_disable);
  32. int bcma_core_enable(struct bcma_device *core, u32 flags)
  33. {
  34. bcma_core_disable(core, flags);
  35. bcma_awrite32(core, BCMA_IOCTL, (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC | flags));
  36. bcma_aread32(core, BCMA_IOCTL);
  37. bcma_awrite32(core, BCMA_RESET_CTL, 0);
  38. udelay(1);
  39. bcma_awrite32(core, BCMA_IOCTL, (BCMA_IOCTL_CLK | flags));
  40. bcma_aread32(core, BCMA_IOCTL);
  41. udelay(1);
  42. return 0;
  43. }
  44. EXPORT_SYMBOL_GPL(bcma_core_enable);
  45. void bcma_core_set_clockmode(struct bcma_device *core,
  46. enum bcma_clkmode clkmode)
  47. {
  48. u16 i;
  49. WARN_ON(core->id.id != BCMA_CORE_CHIPCOMMON &&
  50. core->id.id != BCMA_CORE_PCIE &&
  51. core->id.id != BCMA_CORE_80211);
  52. switch (clkmode) {
  53. case BCMA_CLKMODE_FAST:
  54. bcma_set32(core, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT);
  55. usleep_range(64, 300);
  56. for (i = 0; i < 1500; i++) {
  57. if (bcma_read32(core, BCMA_CLKCTLST) &
  58. BCMA_CLKCTLST_HAVEHT) {
  59. i = 0;
  60. break;
  61. }
  62. udelay(10);
  63. }
  64. if (i)
  65. bcma_err(core->bus, "HT force timeout\n");
  66. break;
  67. case BCMA_CLKMODE_DYNAMIC:
  68. bcma_set32(core, BCMA_CLKCTLST, ~BCMA_CLKCTLST_FORCEHT);
  69. break;
  70. }
  71. }
  72. EXPORT_SYMBOL_GPL(bcma_core_set_clockmode);
  73. void bcma_core_pll_ctl(struct bcma_device *core, u32 req, u32 status, bool on)
  74. {
  75. u16 i;
  76. WARN_ON(req & ~BCMA_CLKCTLST_EXTRESREQ);
  77. WARN_ON(status & ~BCMA_CLKCTLST_EXTRESST);
  78. if (on) {
  79. bcma_set32(core, BCMA_CLKCTLST, req);
  80. for (i = 0; i < 10000; i++) {
  81. if ((bcma_read32(core, BCMA_CLKCTLST) & status) ==
  82. status) {
  83. i = 0;
  84. break;
  85. }
  86. udelay(10);
  87. }
  88. if (i)
  89. bcma_err(core->bus, "PLL enable timeout\n");
  90. } else {
  91. bcma_warn(core->bus, "Disabling PLL not supported yet!\n");
  92. }
  93. }
  94. EXPORT_SYMBOL_GPL(bcma_core_pll_ctl);
  95. u32 bcma_core_dma_translation(struct bcma_device *core)
  96. {
  97. switch (core->bus->hosttype) {
  98. case BCMA_HOSTTYPE_SOC:
  99. return 0;
  100. case BCMA_HOSTTYPE_PCI:
  101. if (bcma_aread32(core, BCMA_IOST) & BCMA_IOST_DMA64)
  102. return BCMA_DMA_TRANSLATION_DMA64_CMT;
  103. else
  104. return BCMA_DMA_TRANSLATION_DMA32_CMT;
  105. default:
  106. bcma_err(core->bus, "DMA translation unknown for host %d\n",
  107. core->bus->hosttype);
  108. }
  109. return BCMA_DMA_TRANSLATION_NONE;
  110. }
  111. EXPORT_SYMBOL(bcma_core_dma_translation);