board-rx51-sdram.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. * SDRC register values for RX51
  3. *
  4. * Copyright (C) 2008 Nokia Corporation
  5. *
  6. * Lauri Leukkunen <lauri.leukkunen@nokia.com>
  7. *
  8. * Original code by Juha Yrjola <juha.yrjola@solidboot.com>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License version 2 as
  12. * published by the Free Software Foundation.
  13. */
  14. #include <linux/kernel.h>
  15. #include <linux/clk.h>
  16. #include <linux/err.h>
  17. #include <linux/io.h>
  18. #include <plat/io.h>
  19. #include <plat/common.h>
  20. #include <plat/clock.h>
  21. #include <plat/sdrc.h>
  22. /* In picoseconds, except for tREF (ns), tXP, tCKE, tWTR (clks) */
  23. struct sdram_timings {
  24. u32 casl;
  25. u32 tDAL;
  26. u32 tDPL;
  27. u32 tRRD;
  28. u32 tRCD;
  29. u32 tRP;
  30. u32 tRAS;
  31. u32 tRC;
  32. u32 tRFC;
  33. u32 tXSR;
  34. u32 tREF; /* in ns */
  35. u32 tXP;
  36. u32 tCKE;
  37. u32 tWTR;
  38. };
  39. struct omap_sdrc_params rx51_sdrc_params[4];
  40. static const struct sdram_timings rx51_timings[] = {
  41. {
  42. .casl = 3,
  43. .tDAL = 33000,
  44. .tDPL = 15000,
  45. .tRRD = 12000,
  46. .tRCD = 22500,
  47. .tRP = 18000,
  48. .tRAS = 42000,
  49. .tRC = 66000,
  50. .tRFC = 138000,
  51. .tXSR = 200000,
  52. .tREF = 7800,
  53. .tXP = 2,
  54. .tCKE = 2,
  55. .tWTR = 2
  56. },
  57. };
  58. static unsigned long sdrc_get_fclk_period(long rate)
  59. {
  60. /* In picoseconds */
  61. return 1000000000 / rate;
  62. }
  63. static unsigned int sdrc_ps_to_ticks(unsigned int time_ps, long rate)
  64. {
  65. unsigned long tick_ps;
  66. /* Calculate in picosecs to yield more exact results */
  67. tick_ps = sdrc_get_fclk_period(rate);
  68. return (time_ps + tick_ps - 1) / tick_ps;
  69. }
  70. #undef DEBUG
  71. #ifdef DEBUG
  72. static int set_sdrc_timing_regval(u32 *regval, int st_bit, int end_bit,
  73. int ticks, long rate, const char *name)
  74. #else
  75. static int set_sdrc_timing_regval(u32 *regval, int st_bit, int end_bit,
  76. int ticks)
  77. #endif
  78. {
  79. int mask, nr_bits;
  80. nr_bits = end_bit - st_bit + 1;
  81. if (ticks >= 1 << nr_bits)
  82. return -1;
  83. mask = (1 << nr_bits) - 1;
  84. *regval &= ~(mask << st_bit);
  85. *regval |= ticks << st_bit;
  86. #ifdef DEBUG
  87. printk(KERN_INFO "SDRC %s: %i ticks %i ns\n", name, ticks,
  88. (unsigned int)sdrc_get_fclk_period(rate) * ticks /
  89. 1000);
  90. #endif
  91. return 0;
  92. }
  93. #ifdef DEBUG
  94. #define SDRC_SET_ONE(reg, st, end, field, rate) \
  95. if (set_sdrc_timing_regval((reg), (st), (end), \
  96. rx51_timings->field, (rate), #field) < 0) \
  97. err = -1;
  98. #else
  99. #define SDRC_SET_ONE(reg, st, end, field, rate) \
  100. if (set_sdrc_timing_regval((reg), (st), (end), \
  101. rx51_timings->field) < 0) \
  102. err = -1;
  103. #endif
  104. #ifdef DEBUG
  105. static int set_sdrc_timing_regval_ps(u32 *regval, int st_bit, int end_bit,
  106. int time, long rate, const char *name)
  107. #else
  108. static int set_sdrc_timing_regval_ps(u32 *regval, int st_bit, int end_bit,
  109. int time, long rate)
  110. #endif
  111. {
  112. int ticks, ret;
  113. ret = 0;
  114. if (time == 0)
  115. ticks = 0;
  116. else
  117. ticks = sdrc_ps_to_ticks(time, rate);
  118. #ifdef DEBUG
  119. ret = set_sdrc_timing_regval(regval, st_bit, end_bit, ticks,
  120. rate, name);
  121. #else
  122. ret = set_sdrc_timing_regval(regval, st_bit, end_bit, ticks);
  123. #endif
  124. return ret;
  125. }
  126. #ifdef DEBUG
  127. #define SDRC_SET_ONE_PS(reg, st, end, field, rate) \
  128. if (set_sdrc_timing_regval_ps((reg), (st), (end), \
  129. rx51_timings->field, \
  130. (rate), #field) < 0) \
  131. err = -1;
  132. #else
  133. #define SDRC_SET_ONE_PS(reg, st, end, field, rate) \
  134. if (set_sdrc_timing_regval_ps((reg), (st), (end), \
  135. rx51_timings->field, (rate)) < 0) \
  136. err = -1;
  137. #endif
  138. static int sdrc_timings(int id, long rate)
  139. {
  140. u32 ticks_per_ms;
  141. u32 rfr, l;
  142. u32 actim_ctrla = 0, actim_ctrlb = 0;
  143. u32 rfr_ctrl;
  144. int err = 0;
  145. long l3_rate = rate / 1000;
  146. SDRC_SET_ONE_PS(&actim_ctrla, 0, 4, tDAL, l3_rate);
  147. SDRC_SET_ONE_PS(&actim_ctrla, 6, 8, tDPL, l3_rate);
  148. SDRC_SET_ONE_PS(&actim_ctrla, 9, 11, tRRD, l3_rate);
  149. SDRC_SET_ONE_PS(&actim_ctrla, 12, 14, tRCD, l3_rate);
  150. SDRC_SET_ONE_PS(&actim_ctrla, 15, 17, tRP, l3_rate);
  151. SDRC_SET_ONE_PS(&actim_ctrla, 18, 21, tRAS, l3_rate);
  152. SDRC_SET_ONE_PS(&actim_ctrla, 22, 26, tRC, l3_rate);
  153. SDRC_SET_ONE_PS(&actim_ctrla, 27, 31, tRFC, l3_rate);
  154. SDRC_SET_ONE_PS(&actim_ctrlb, 0, 7, tXSR, l3_rate);
  155. SDRC_SET_ONE(&actim_ctrlb, 8, 10, tXP, l3_rate);
  156. SDRC_SET_ONE(&actim_ctrlb, 12, 14, tCKE, l3_rate);
  157. SDRC_SET_ONE(&actim_ctrlb, 16, 17, tWTR, l3_rate);
  158. ticks_per_ms = l3_rate;
  159. rfr = rx51_timings[0].tREF * ticks_per_ms / 1000000;
  160. if (rfr > 65535 + 50)
  161. rfr = 65535;
  162. else
  163. rfr -= 50;
  164. #ifdef DEBUG
  165. printk(KERN_INFO "SDRC tREF: %i ticks\n", rfr);
  166. #endif
  167. l = rfr << 8;
  168. rfr_ctrl = l | 0x1; /* autorefresh, reload counter with 1xARCV */
  169. rx51_sdrc_params[id].rate = rate;
  170. rx51_sdrc_params[id].actim_ctrla = actim_ctrla;
  171. rx51_sdrc_params[id].actim_ctrlb = actim_ctrlb;
  172. rx51_sdrc_params[id].rfr_ctrl = rfr_ctrl;
  173. rx51_sdrc_params[id].mr = 0x32;
  174. rx51_sdrc_params[id + 1].rate = 0;
  175. return err;
  176. }
  177. struct omap_sdrc_params *rx51_get_sdram_timings(void)
  178. {
  179. int err;
  180. err = sdrc_timings(0, 41500000);
  181. err |= sdrc_timings(1, 83000000);
  182. err |= sdrc_timings(2, 166000000);
  183. return &rx51_sdrc_params[0];
  184. }