power.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. /*
  2. * Copyright (C) 2012 Samsung Electronics
  3. * Donghwa Lee <dh09.lee@samsung.com>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <asm/io.h>
  9. #include <asm/arch/power.h>
  10. static void exynos4_mipi_phy_control(unsigned int dev_index,
  11. unsigned int enable)
  12. {
  13. struct exynos4_power *pmu =
  14. (struct exynos4_power *)samsung_get_base_power();
  15. unsigned int addr, cfg = 0;
  16. if (dev_index == 0)
  17. addr = (unsigned int)&pmu->mipi_phy0_control;
  18. else
  19. addr = (unsigned int)&pmu->mipi_phy1_control;
  20. cfg = readl(addr);
  21. if (enable)
  22. cfg |= (EXYNOS_MIPI_PHY_MRESETN | EXYNOS_MIPI_PHY_ENABLE);
  23. else
  24. cfg &= ~(EXYNOS_MIPI_PHY_MRESETN | EXYNOS_MIPI_PHY_ENABLE);
  25. writel(cfg, addr);
  26. }
  27. void set_mipi_phy_ctrl(unsigned int dev_index, unsigned int enable)
  28. {
  29. if (cpu_is_exynos4())
  30. exynos4_mipi_phy_control(dev_index, enable);
  31. }
  32. void exynos5_set_usbhost_phy_ctrl(unsigned int enable)
  33. {
  34. struct exynos5_power *power =
  35. (struct exynos5_power *)samsung_get_base_power();
  36. if (enable) {
  37. /* Enabling USBHOST_PHY */
  38. setbits_le32(&power->usbhost_phy_control,
  39. POWER_USB_HOST_PHY_CTRL_EN);
  40. } else {
  41. /* Disabling USBHOST_PHY */
  42. clrbits_le32(&power->usbhost_phy_control,
  43. POWER_USB_HOST_PHY_CTRL_EN);
  44. }
  45. }
  46. void exynos4412_set_usbhost_phy_ctrl(unsigned int enable)
  47. {
  48. struct exynos4412_power *power =
  49. (struct exynos4412_power *)samsung_get_base_power();
  50. if (enable) {
  51. /* Enabling USBHOST_PHY */
  52. setbits_le32(&power->usbhost_phy_control,
  53. POWER_USB_HOST_PHY_CTRL_EN);
  54. setbits_le32(&power->hsic1_phy_control,
  55. POWER_USB_HOST_PHY_CTRL_EN);
  56. setbits_le32(&power->hsic2_phy_control,
  57. POWER_USB_HOST_PHY_CTRL_EN);
  58. } else {
  59. /* Disabling USBHOST_PHY */
  60. clrbits_le32(&power->usbhost_phy_control,
  61. POWER_USB_HOST_PHY_CTRL_EN);
  62. clrbits_le32(&power->hsic1_phy_control,
  63. POWER_USB_HOST_PHY_CTRL_EN);
  64. clrbits_le32(&power->hsic2_phy_control,
  65. POWER_USB_HOST_PHY_CTRL_EN);
  66. }
  67. }
  68. void set_usbhost_phy_ctrl(unsigned int enable)
  69. {
  70. if (cpu_is_exynos5())
  71. exynos5_set_usbhost_phy_ctrl(enable);
  72. else if (cpu_is_exynos4())
  73. if (proid_is_exynos4412())
  74. exynos4412_set_usbhost_phy_ctrl(enable);
  75. }
  76. static void exynos5_set_usbdrd_phy_ctrl(unsigned int enable)
  77. {
  78. struct exynos5_power *power =
  79. (struct exynos5_power *)samsung_get_base_power();
  80. if (enable) {
  81. /* Enabling USBDRD_PHY */
  82. setbits_le32(&power->usbdrd_phy_control,
  83. POWER_USB_DRD_PHY_CTRL_EN);
  84. } else {
  85. /* Disabling USBDRD_PHY */
  86. clrbits_le32(&power->usbdrd_phy_control,
  87. POWER_USB_DRD_PHY_CTRL_EN);
  88. }
  89. }
  90. static void exynos5420_set_usbdev_phy_ctrl(unsigned int enable)
  91. {
  92. struct exynos5420_power *power =
  93. (struct exynos5420_power *)samsung_get_base_power();
  94. if (enable) {
  95. /* Enabling USBDEV_PHY */
  96. setbits_le32(&power->usbdev_phy_control,
  97. POWER_USB_DRD_PHY_CTRL_EN);
  98. setbits_le32(&power->usbdev1_phy_control,
  99. POWER_USB_DRD_PHY_CTRL_EN);
  100. } else {
  101. /* Disabling USBDEV_PHY */
  102. clrbits_le32(&power->usbdev_phy_control,
  103. POWER_USB_DRD_PHY_CTRL_EN);
  104. clrbits_le32(&power->usbdev1_phy_control,
  105. POWER_USB_DRD_PHY_CTRL_EN);
  106. }
  107. }
  108. void set_usbdrd_phy_ctrl(unsigned int enable)
  109. {
  110. if (cpu_is_exynos5()) {
  111. if (proid_is_exynos5420() || proid_is_exynos5422())
  112. exynos5420_set_usbdev_phy_ctrl(enable);
  113. else
  114. exynos5_set_usbdrd_phy_ctrl(enable);
  115. }
  116. }
  117. static void exynos5_dp_phy_control(unsigned int enable)
  118. {
  119. unsigned int cfg;
  120. struct exynos5_power *power =
  121. (struct exynos5_power *)samsung_get_base_power();
  122. cfg = readl(&power->dptx_phy_control);
  123. if (enable)
  124. cfg |= EXYNOS_DP_PHY_ENABLE;
  125. else
  126. cfg &= ~EXYNOS_DP_PHY_ENABLE;
  127. writel(cfg, &power->dptx_phy_control);
  128. }
  129. void exynos_dp_phy_ctrl(unsigned int enable)
  130. {
  131. if (cpu_is_exynos5())
  132. exynos5_dp_phy_control(enable);
  133. }
  134. static void exynos5_set_ps_hold_ctrl(void)
  135. {
  136. struct exynos5_power *power =
  137. (struct exynos5_power *)samsung_get_base_power();
  138. /* Set PS-Hold high */
  139. setbits_le32(&power->ps_hold_control,
  140. EXYNOS_PS_HOLD_CONTROL_DATA_HIGH);
  141. }
  142. /*
  143. * Set ps_hold data driving value high
  144. * This enables the machine to stay powered on
  145. * after the initial power-on condition goes away
  146. * (e.g. power button).
  147. */
  148. void set_ps_hold_ctrl(void)
  149. {
  150. if (cpu_is_exynos5())
  151. exynos5_set_ps_hold_ctrl();
  152. }
  153. static void exynos5_set_xclkout(void)
  154. {
  155. struct exynos5_power *power =
  156. (struct exynos5_power *)samsung_get_base_power();
  157. /* use xxti for xclk out */
  158. clrsetbits_le32(&power->pmu_debug, PMU_DEBUG_CLKOUT_SEL_MASK,
  159. PMU_DEBUG_XXTI);
  160. }
  161. void set_xclkout(void)
  162. {
  163. if (cpu_is_exynos5())
  164. exynos5_set_xclkout();
  165. }
  166. /* Enables hardware tripping to power off the system when TMU fails */
  167. void set_hw_thermal_trip(void)
  168. {
  169. if (cpu_is_exynos5()) {
  170. struct exynos5_power *power =
  171. (struct exynos5_power *)samsung_get_base_power();
  172. /* PS_HOLD_CONTROL register ENABLE_HW_TRIP bit*/
  173. setbits_le32(&power->ps_hold_control, POWER_ENABLE_HW_TRIP);
  174. }
  175. }
  176. static uint32_t exynos5_get_reset_status(void)
  177. {
  178. struct exynos5_power *power =
  179. (struct exynos5_power *)samsung_get_base_power();
  180. return power->inform1;
  181. }
  182. static uint32_t exynos4_get_reset_status(void)
  183. {
  184. struct exynos4_power *power =
  185. (struct exynos4_power *)samsung_get_base_power();
  186. return power->inform1;
  187. }
  188. uint32_t get_reset_status(void)
  189. {
  190. if (cpu_is_exynos5())
  191. return exynos5_get_reset_status();
  192. else
  193. return exynos4_get_reset_status();
  194. }
  195. static void exynos5_power_exit_wakeup(void)
  196. {
  197. struct exynos5_power *power =
  198. (struct exynos5_power *)samsung_get_base_power();
  199. typedef void (*resume_func)(void);
  200. ((resume_func)power->inform0)();
  201. }
  202. static void exynos4_power_exit_wakeup(void)
  203. {
  204. struct exynos4_power *power =
  205. (struct exynos4_power *)samsung_get_base_power();
  206. typedef void (*resume_func)(void);
  207. ((resume_func)power->inform0)();
  208. }
  209. void power_exit_wakeup(void)
  210. {
  211. if (cpu_is_exynos5())
  212. exynos5_power_exit_wakeup();
  213. else
  214. exynos4_power_exit_wakeup();
  215. }
  216. unsigned int get_boot_mode(void)
  217. {
  218. unsigned int om_pin = samsung_get_base_power();
  219. return readl(om_pin) & OM_PIN_MASK;
  220. }