clk-pll.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. * Copyright (c) 2013 Samsung Electronics Co., Ltd.
  3. * Copyright (c) 2013 Linaro Ltd.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. *
  9. * Common Clock Framework support for all PLL's in Samsung platforms
  10. */
  11. #ifndef __SAMSUNG_CLK_PLL_H
  12. #define __SAMSUNG_CLK_PLL_H
  13. enum samsung_pll_type {
  14. pll_2126,
  15. pll_3000,
  16. pll_35xx,
  17. pll_36xx,
  18. pll_2550,
  19. pll_2650,
  20. pll_4500,
  21. pll_4502,
  22. pll_4508,
  23. pll_4600,
  24. pll_4650,
  25. pll_4650c,
  26. pll_6552,
  27. pll_6552_s3c2416,
  28. pll_6553,
  29. pll_s3c2410_mpll,
  30. pll_s3c2410_upll,
  31. pll_s3c2440_mpll,
  32. pll_2550x,
  33. pll_2550xx,
  34. pll_2650x,
  35. pll_2650xx,
  36. pll_1450x,
  37. pll_1451x,
  38. pll_1452x,
  39. pll_1460x,
  40. };
  41. #define PLL_RATE(_fin, _m, _p, _s, _k, _ks) \
  42. ((u64)(_fin) * (BIT(_ks) * (_m) + (_k)) / BIT(_ks) / ((_p) << (_s)))
  43. #define PLL_VALID_RATE(_fin, _fout, _m, _p, _s, _k, _ks) ((_fout) + \
  44. BUILD_BUG_ON_ZERO(PLL_RATE(_fin, _m, _p, _s, _k, _ks) != (_fout)))
  45. #define PLL_35XX_RATE(_fin, _rate, _m, _p, _s) \
  46. { \
  47. .rate = PLL_VALID_RATE(_fin, _rate, \
  48. _m, _p, _s, 0, 16), \
  49. .mdiv = (_m), \
  50. .pdiv = (_p), \
  51. .sdiv = (_s), \
  52. }
  53. #define PLL_S3C2410_MPLL_RATE(_fin, _rate, _m, _p, _s) \
  54. { \
  55. .rate = PLL_VALID_RATE(_fin, _rate, \
  56. _m + 8, _p + 2, _s, 0, 16), \
  57. .mdiv = (_m), \
  58. .pdiv = (_p), \
  59. .sdiv = (_s), \
  60. }
  61. #define PLL_S3C2440_MPLL_RATE(_fin, _rate, _m, _p, _s) \
  62. { \
  63. .rate = PLL_VALID_RATE(_fin, _rate, \
  64. 2 * (_m + 8), _p + 2, _s, 0, 16), \
  65. .mdiv = (_m), \
  66. .pdiv = (_p), \
  67. .sdiv = (_s), \
  68. }
  69. #define PLL_36XX_RATE(_fin, _rate, _m, _p, _s, _k) \
  70. { \
  71. .rate = PLL_VALID_RATE(_fin, _rate, \
  72. _m, _p, _s, _k, 16), \
  73. .mdiv = (_m), \
  74. .pdiv = (_p), \
  75. .sdiv = (_s), \
  76. .kdiv = (_k), \
  77. }
  78. #define PLL_4508_RATE(_fin, _rate, _m, _p, _s, _afc) \
  79. { \
  80. .rate = PLL_VALID_RATE(_fin, _rate, \
  81. _m, _p, _s - 1, 0, 16), \
  82. .mdiv = (_m), \
  83. .pdiv = (_p), \
  84. .sdiv = (_s), \
  85. .afc = (_afc), \
  86. }
  87. #define PLL_4600_RATE(_fin, _rate, _m, _p, _s, _k, _vsel) \
  88. { \
  89. .rate = PLL_VALID_RATE(_fin, _rate, \
  90. _m, _p, _s, _k, 16), \
  91. .mdiv = (_m), \
  92. .pdiv = (_p), \
  93. .sdiv = (_s), \
  94. .kdiv = (_k), \
  95. .vsel = (_vsel), \
  96. }
  97. #define PLL_4650_RATE(_fin, _rate, _m, _p, _s, _k, _mfr, _mrr, _vsel) \
  98. { \
  99. .rate = PLL_VALID_RATE(_fin, _rate, \
  100. _m, _p, _s, _k, 10), \
  101. .mdiv = (_m), \
  102. .pdiv = (_p), \
  103. .sdiv = (_s), \
  104. .kdiv = (_k), \
  105. .mfr = (_mfr), \
  106. .mrr = (_mrr), \
  107. .vsel = (_vsel), \
  108. }
  109. /* NOTE: Rate table should be kept sorted in descending order. */
  110. struct samsung_pll_rate_table {
  111. unsigned int rate;
  112. unsigned int pdiv;
  113. unsigned int mdiv;
  114. unsigned int sdiv;
  115. unsigned int kdiv;
  116. unsigned int afc;
  117. unsigned int mfr;
  118. unsigned int mrr;
  119. unsigned int vsel;
  120. };
  121. #endif /* __SAMSUNG_CLK_PLL_H */