mtk_rtc_hal.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. /*
  2. * Copyright (C) 2010 MediaTek, Inc.
  3. *
  4. *
  5. * This software is licensed under the terms of the GNU General Public
  6. * License version 2, as published by the Free Software Foundation, and
  7. * may be copied, distributed, and modified under those terms.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. */
  15. #ifdef pr_fmt
  16. #undef pr_fmt
  17. #endif
  18. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  19. #include <linux/delay.h>
  20. #include <linux/init.h>
  21. #include <linux/module.h>
  22. #include <linux/kernel.h>
  23. #include <linux/rtc.h>
  24. #include <mach/upmu_hw.h>
  25. #include <linux/spinlock.h>
  26. #include <linux/interrupt.h>
  27. #include <linux/platform_device.h>
  28. #include <linux/delay.h>
  29. #include <linux/types.h>
  30. #include <mach/irqs.h>
  31. #include <mach/mtk_rtc_hal.h>
  32. #include <mtk_rtc_hal_common.h>
  33. #include <mach/mt_rtc_hw.h>
  34. #include <mt_pmic_wrap.h>
  35. #if defined CONFIG_MTK_KERNEL_POWER_OFF_CHARGING
  36. #include <mt_boot.h>
  37. #endif
  38. #include <mt_gpio.h>
  39. #define hal_rtc_xinfo(fmt, args...) \
  40. pr_notice(fmt, ##args)
  41. #define hal_rtc_xerror(fmt, args...) \
  42. pr_err(fmt, ##args)
  43. #define hal_rtc_xfatal(fmt, args...) \
  44. pr_emerg(fmt, ##args)
  45. /*
  46. RTC_FGSOC = 0,
  47. RTC_ANDROID,
  48. RTC_RECOVERY,
  49. RTC_FAC_RESET,
  50. RTC_BYPASS_PWR,
  51. RTC_PWRON_TIME,
  52. RTC_FAST_BOOT,
  53. RTC_KPOC,
  54. RTC_DEBUG,
  55. RTC_PWRON_AL,
  56. RTC_UART,
  57. RTC_AUTOBOOT,
  58. RTC_PWRON_LOGO,
  59. RTC_32K_LESS,
  60. RTC_LP_DET,
  61. RTC_SPAR_NUM
  62. */
  63. /*
  64. * RTC_PDN1:
  65. * bit 0 - 3 : Android bits
  66. * bit 4 - 5 : Recovery bits (0x10: factory data reset)
  67. * bit 6 : Bypass PWRKEY bit
  68. * bit 7 : Power-On Time bit
  69. * bit 8 : RTC_GPIO_USER_WIFI bit
  70. * bit 9 : RTC_GPIO_USER_GPS bit
  71. * bit 10 : RTC_GPIO_USER_BT bit
  72. * bit 11 : RTC_GPIO_USER_FM bit
  73. * bit 12 : RTC_GPIO_USER_PMIC bit
  74. * bit 13 : Fast Boot
  75. * bit 14 : Kernel Power Off Charging
  76. * bit 15 : Debug bit
  77. */
  78. /*
  79. * RTC_PDN2:
  80. * bit 0 - 3 : MTH in power-on time
  81. * bit 4 : Power-On Alarm bit
  82. * bit 5 - 6 : UART bits
  83. * bit 7 : autoboot bit
  84. * bit 8 - 14: YEA in power-on time
  85. * bit 15 : Power-On Logo bit
  86. */
  87. /*
  88. * RTC_SPAR0:
  89. * bit 0 - 5 : SEC in power-on time
  90. * bit 6 : 32K less bit. True:with 32K, False:Without 32K
  91. * bit 7 - 15: reserved bits
  92. */
  93. u16 rtc_spare_reg[][3] = {
  94. {RTC_AL_HOU, 0x7f, 8},
  95. {RTC_PDN1, 0xf, 0},
  96. {RTC_PDN1, 0x3, 4},
  97. {RTC_PDN1, 0x1, 6},
  98. {RTC_PDN1, 0x1, 7},
  99. {RTC_PDN1, 0x1, 13},
  100. {RTC_PDN1, 0x1, 14},
  101. {RTC_PDN1, 0x1, 15},
  102. {RTC_PDN2, 0x1, 4},
  103. {RTC_PDN2, 0x3, 5},
  104. {RTC_PDN2, 0x1, 7},
  105. {RTC_PDN2, 0x1, 15},
  106. {RTC_SPAR0, 0x1, 6},
  107. {RTC_SPAR0, 0x1, 7}
  108. };
  109. void hal_rtc_set_abb_32k(u16 enable)
  110. {
  111. hal_rtc_xinfo("ABB 32k not support\n");
  112. }
  113. u16 hal_rtc_get_gpio_32k_status(void)
  114. {
  115. u16 con;
  116. con = rtc_read(RTC_CON);
  117. hal_rtc_xinfo("RTC_GPIO 32k status(RTC_CON=0x%x)\n", con);
  118. if (con & RTC_CON_F32KOB)
  119. return 0;
  120. else
  121. return 1;
  122. }
  123. void hal_rtc_set_gpio_32k_status(u16 user, bool enable)
  124. {
  125. u16 con, pdn1;
  126. if (enable) {
  127. pdn1 = rtc_read(RTC_PDN1);
  128. } else {
  129. pdn1 = rtc_read(RTC_PDN1) & ~(1U << user);
  130. rtc_write(RTC_PDN1, pdn1);
  131. rtc_write_trigger();
  132. }
  133. con = rtc_read(RTC_CON);
  134. if (enable) {
  135. con &= ~RTC_CON_F32KOB;
  136. } else {
  137. if (!(pdn1 & RTC_GPIO_USER_MASK)) { /* no users */
  138. con |= RTC_CON_F32KOB;
  139. }
  140. }
  141. rtc_write(RTC_CON, con);
  142. rtc_write_trigger();
  143. if (enable) {
  144. pdn1 |= (1U << user);
  145. rtc_write(RTC_PDN1, pdn1);
  146. rtc_write_trigger();
  147. }
  148. hal_rtc_xinfo("RTC_GPIO user %d enable = %d 32k (0x%x)\n", user, enable, pdn1);
  149. }
  150. void hal_rtc_bbpu_pwdn(void)
  151. {
  152. u16 con;
  153. /* disable 32K export if there are no RTC_GPIO users */
  154. if (!(rtc_read(RTC_PDN1) & RTC_GPIO_USER_MASK)) {
  155. con = rtc_read(RTC_CON) | RTC_CON_F32KOB;
  156. rtc_write(RTC_CON, con);
  157. rtc_write_trigger();
  158. }
  159. rtc_bbpu_pwrdown(true);
  160. }
  161. void hal_rtc_get_pwron_alarm(struct rtc_time *tm, struct rtc_wkalrm *alm)
  162. {
  163. u16 pdn1, pdn2;
  164. pdn1 = rtc_read(RTC_PDN1);
  165. pdn2 = rtc_read(RTC_PDN2);
  166. alm->enabled = (pdn1 & RTC_PDN1_PWRON_TIME ? (pdn2 & RTC_PDN2_PWRON_LOGO ? 3 : 2) : 0);
  167. alm->pending = !!(pdn2 & RTC_PDN2_PWRON_ALARM); /* return Power-On Alarm bit */
  168. hal_rtc_get_alarm_time(tm);
  169. }
  170. bool hal_rtc_is_lp_irq(void)
  171. {
  172. u16 irqsta;
  173. irqsta = rtc_read(RTC_IRQ_STA); /* read clear */
  174. if (unlikely(!(irqsta & RTC_IRQ_STA_AL))) {
  175. #ifndef USER_BUILD_KERNEL
  176. if (irqsta & RTC_IRQ_STA_LP)
  177. rtc_lp_exception();
  178. #endif
  179. return true;
  180. }
  181. return false;
  182. }
  183. bool hal_rtc_is_pwron_alarm(struct rtc_time *nowtm, struct rtc_time *tm)
  184. {
  185. u16 pdn1;
  186. pdn1 = rtc_read(RTC_PDN1);
  187. hal_rtc_xinfo("pdn1 = 0x%4x\n", pdn1);
  188. if (pdn1 & RTC_PDN1_PWRON_TIME) { /* power-on time is available */
  189. hal_rtc_xinfo("pdn1 = 0x%4x\n", pdn1);
  190. hal_rtc_get_tick_time(nowtm);
  191. hal_rtc_xinfo("pdn1 = 0x%4x\n", pdn1);
  192. if (rtc_read(RTC_TC_SEC) < nowtm->tm_sec) { /* SEC has carried */
  193. hal_rtc_get_tick_time(nowtm);
  194. }
  195. hal_rtc_get_pwron_alarm_time(tm);
  196. return true;
  197. }
  198. return false;
  199. }
  200. void hal_rtc_get_alarm(struct rtc_time *tm, struct rtc_wkalrm *alm)
  201. {
  202. u16 irqen, pdn2;
  203. irqen = rtc_read(RTC_IRQ_EN);
  204. hal_rtc_get_alarm_time(tm);
  205. pdn2 = rtc_read(RTC_PDN2);
  206. alm->enabled = !!(irqen & RTC_IRQ_EN_AL);
  207. alm->pending = !!(pdn2 & RTC_PDN2_PWRON_ALARM); /* return Power-On Alarm bit */
  208. }
  209. void hal_rtc_set_alarm(struct rtc_time *tm)
  210. {
  211. u16 irqen;
  212. hal_rtc_set_alarm_time(tm);
  213. irqen = rtc_read(RTC_IRQ_EN) | RTC_IRQ_EN_ONESHOT_AL;
  214. rtc_write(RTC_IRQ_EN, irqen);
  215. rtc_write_trigger();
  216. }
  217. void hal_rtc_clear_alarm(struct rtc_time *tm)
  218. {
  219. u16 irqsta, irqen, pdn2;
  220. irqen = rtc_read(RTC_IRQ_EN) & ~RTC_IRQ_EN_AL;
  221. pdn2 = rtc_read(RTC_PDN2) & ~RTC_PDN2_PWRON_ALARM;
  222. rtc_write(RTC_IRQ_EN, irqen);
  223. rtc_write(RTC_PDN2, pdn2);
  224. rtc_write_trigger();
  225. irqsta = rtc_read(RTC_IRQ_STA); /* read clear */
  226. hal_rtc_set_alarm_time(tm);
  227. }
  228. void hal_rtc_set_lp_irq(void)
  229. {
  230. u16 irqen;
  231. #ifndef USER_BUILD_KERNEL
  232. irqen = rtc_read(RTC_IRQ_EN) | RTC_IRQ_EN_LP;
  233. #else
  234. irqen = rtc_read(RTC_IRQ_EN) & ~RTC_IRQ_EN_LP;
  235. #endif
  236. rtc_write(RTC_IRQ_EN, irqen);
  237. rtc_write_trigger();
  238. }
  239. void hal_rtc_save_pwron_time(bool enable, struct rtc_time *tm, bool logo)
  240. {
  241. u16 pdn1, pdn2;
  242. hal_rtc_set_pwron_alarm_time(tm);
  243. if (logo)
  244. pdn2 = rtc_read(RTC_PDN2) | RTC_PDN2_PWRON_LOGO;
  245. else
  246. pdn2 = rtc_read(RTC_PDN2) & ~RTC_PDN2_PWRON_LOGO;
  247. rtc_write(RTC_PDN2, pdn2);
  248. if (enable)
  249. pdn1 = rtc_read(RTC_PDN1) | RTC_PDN1_PWRON_TIME;
  250. else
  251. pdn1 = rtc_read(RTC_PDN1) & ~RTC_PDN1_PWRON_TIME;
  252. rtc_write(RTC_PDN1, pdn1);
  253. rtc_write_trigger();
  254. }