clocks-init.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * arch/blackfin/mach-common/clocks-init.c - reprogram clocks / memory
  3. *
  4. * Copyright 2004-2008 Analog Devices Inc.
  5. *
  6. * Licensed under the GPL-2 or later.
  7. */
  8. #include <linux/linkage.h>
  9. #include <linux/init.h>
  10. #include <asm/blackfin.h>
  11. #include <asm/dma.h>
  12. #include <asm/clocks.h>
  13. #include <asm/mem_init.h>
  14. #include <asm/dpmc.h>
  15. #ifdef CONFIG_BF60x
  16. #define CGU_CTL_VAL ((CONFIG_VCO_MULT << 8) | CLKIN_HALF)
  17. #define CGU_DIV_VAL \
  18. ((CONFIG_CCLK_DIV << CSEL_OFFSET) | \
  19. (CONFIG_SCLK_DIV << SYSSEL_OFFSET) | \
  20. (CONFIG_SCLK0_DIV << S0SEL_OFFSET) | \
  21. (CONFIG_SCLK1_DIV << S1SEL_OFFSET) | \
  22. (CONFIG_DCLK_DIV << DSEL_OFFSET))
  23. #define CONFIG_BFIN_DCLK (((CONFIG_CLKIN_HZ * CONFIG_VCO_MULT) / CONFIG_DCLK_DIV) / 1000000)
  24. #if ((CONFIG_BFIN_DCLK != 125) && \
  25. (CONFIG_BFIN_DCLK != 133) && (CONFIG_BFIN_DCLK != 150) && \
  26. (CONFIG_BFIN_DCLK != 166) && (CONFIG_BFIN_DCLK != 200) && \
  27. (CONFIG_BFIN_DCLK != 225) && (CONFIG_BFIN_DCLK != 250))
  28. #error "DCLK must be in (125, 133, 150, 166, 200, 225, 250)MHz"
  29. #endif
  30. #else
  31. #define SDGCTL_WIDTH (1 << 31) /* SDRAM external data path width */
  32. #define PLL_CTL_VAL \
  33. (((CONFIG_VCO_MULT & 63) << 9) | CLKIN_HALF | \
  34. (PLL_BYPASS << 8) | (ANOMALY_05000305 ? 0 : 0x8000))
  35. #endif
  36. __attribute__((l1_text))
  37. static void do_sync(void)
  38. {
  39. __builtin_bfin_ssync();
  40. }
  41. __attribute__((l1_text))
  42. void init_clocks(void)
  43. {
  44. /* Kill any active DMAs as they may trigger external memory accesses
  45. * in the middle of reprogramming things, and that'll screw us up.
  46. * For example, any automatic DMAs left by U-Boot for splash screens.
  47. */
  48. #ifdef CONFIG_BF60x
  49. init_cgu(CGU_DIV_VAL, CGU_CTL_VAL);
  50. init_dmc(CONFIG_BFIN_DCLK);
  51. #else
  52. size_t i;
  53. for (i = 0; i < MAX_DMA_CHANNELS; ++i) {
  54. struct dma_register *dma = dma_io_base_addr[i];
  55. dma->cfg = 0;
  56. }
  57. do_sync();
  58. #ifdef SIC_IWR0
  59. bfin_write_SIC_IWR0(IWR_ENABLE(0));
  60. # ifdef SIC_IWR1
  61. /* BF52x system reset does not properly reset SIC_IWR1 which
  62. * will screw up the bootrom as it relies on MDMA0/1 waking it
  63. * up from IDLE instructions. See this report for more info:
  64. * http://blackfin.uclinux.org/gf/tracker/4323
  65. */
  66. if (ANOMALY_05000435)
  67. bfin_write_SIC_IWR1(IWR_ENABLE(10) | IWR_ENABLE(11));
  68. else
  69. bfin_write_SIC_IWR1(IWR_DISABLE_ALL);
  70. # endif
  71. # ifdef SIC_IWR2
  72. bfin_write_SIC_IWR2(IWR_DISABLE_ALL);
  73. # endif
  74. #else
  75. bfin_write_SIC_IWR(IWR_ENABLE(0));
  76. #endif
  77. do_sync();
  78. #ifdef EBIU_SDGCTL
  79. bfin_write_EBIU_SDGCTL(bfin_read_EBIU_SDGCTL() | SRFS);
  80. do_sync();
  81. #endif
  82. #ifdef CLKBUFOE
  83. bfin_write16(VR_CTL, bfin_read_VR_CTL() | CLKBUFOE);
  84. do_sync();
  85. __asm__ __volatile__("IDLE;");
  86. #endif
  87. bfin_write_PLL_LOCKCNT(0x300);
  88. do_sync();
  89. /* We always write PLL_CTL thus avoiding Anomaly 05000242 */
  90. bfin_write16(PLL_CTL, PLL_CTL_VAL);
  91. __asm__ __volatile__("IDLE;");
  92. bfin_write_PLL_DIV(CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
  93. #ifdef EBIU_SDGCTL
  94. bfin_write_EBIU_SDRRC(mem_SDRRC);
  95. bfin_write_EBIU_SDGCTL((bfin_read_EBIU_SDGCTL() & SDGCTL_WIDTH) | mem_SDGCTL);
  96. #else
  97. bfin_write_EBIU_RSTCTL(bfin_read_EBIU_RSTCTL() & ~(SRREQ));
  98. do_sync();
  99. bfin_write_EBIU_RSTCTL(bfin_read_EBIU_RSTCTL() | 0x1);
  100. bfin_write_EBIU_DDRCTL0(mem_DDRCTL0);
  101. bfin_write_EBIU_DDRCTL1(mem_DDRCTL1);
  102. bfin_write_EBIU_DDRCTL2(mem_DDRCTL2);
  103. #ifdef CONFIG_MEM_EBIU_DDRQUE
  104. bfin_write_EBIU_DDRQUE(CONFIG_MEM_EBIU_DDRQUE);
  105. #endif
  106. #endif
  107. #endif
  108. do_sync();
  109. bfin_read16(0);
  110. }