mtk_rtc_common.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841
  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. /*****************************************************************************
  16. *
  17. * Filename:
  18. * ---------
  19. * rtc_common.c
  20. *
  21. * Project:
  22. * --------
  23. * Android_Software
  24. *
  25. * Description:
  26. * ------------
  27. * This Module defines functions of rtc basic operation.
  28. *
  29. * Author:
  30. * -------
  31. * Owen Chen
  32. *
  33. ****************************************************************************/
  34. #if defined(CONFIG_MTK_RTC)
  35. #ifdef pr_fmt
  36. #undef pr_fmt
  37. #endif
  38. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  39. #include <linux/delay.h>
  40. #include <linux/init.h>
  41. #include <linux/module.h>
  42. #include <linux/kernel.h>
  43. #include <linux/rtc.h>
  44. #include <linux/spinlock.h>
  45. #include <linux/interrupt.h>
  46. #include <linux/platform_device.h>
  47. #include <linux/delay.h>
  48. #include <linux/pm_wakeup.h>
  49. #include <linux/sched.h>
  50. #include <linux/types.h>
  51. #include <asm/div64.h>
  52. /* #include <mach/mt6577_boot.h> */
  53. /* #include <mach/mt6577_reg_base.h> */
  54. #include <mtk_rtc.h>
  55. #include <mtk_rtc_hal_common.h>
  56. #include <mach/mtk_rtc_hal.h>
  57. /* #include <mach/pmic_mt6320_sw.h> */
  58. #include <upmu_common.h>
  59. /* #include <mach/upmu_hw.h> */
  60. #include <mt_pmic_wrap.h>
  61. #if defined CONFIG_MTK_KERNEL_POWER_OFF_CHARGING
  62. #include <mt_boot.h>
  63. #include <mt-plat/mt_boot_common.h>
  64. #endif
  65. /* #include <linux/printk.h> */
  66. #include <mt_reboot.h>
  67. #include <mt-plat/charging.h>
  68. #define RTC_NAME "mt-rtc"
  69. #define RTC_RELPWR_WHEN_XRST 1 /* BBPU = 0 when xreset_rstb goes low */
  70. /* we map HW YEA 0 (2000) to 1968 not 1970 because 2000 is the leap year */
  71. #define RTC_MIN_YEAR 1968
  72. #define RTC_NUM_YEARS 128
  73. /* #define RTC_MAX_YEAR (RTC_MIN_YEAR + RTC_NUM_YEARS - 1) */
  74. /*
  75. * Reset to default date if RTC time is over 2038/1/19 3:14:7
  76. * Year (YEA) : 1970 ~ 2037
  77. * Month (MTH) : 1 ~ 12
  78. * Day of Month (DOM): 1 ~ 31
  79. */
  80. #define RTC_OVER_TIME_RESET 1
  81. #define RTC_DEFAULT_YEA 2010
  82. #define RTC_DEFAULT_MTH 1
  83. #define RTC_DEFAULT_DOM 1
  84. #define RTC_MIN_YEAR_OFFSET (RTC_MIN_YEAR - 1900)
  85. #define AUTOBOOT_ON 0
  86. #define AUTOBOOT_OFF 1
  87. /*
  88. * RTC_PDN1:
  89. * bit 0 - 3 : Android bits
  90. * bit 4 - 5 : Recovery bits (0x10: factory data reset)
  91. * bit 6 : Bypass PWRKEY bit
  92. * bit 7 : Power-On Time bit
  93. * bit 8 : RTC_GPIO_USER_WIFI bit
  94. * bit 9 : RTC_GPIO_USER_GPS bit
  95. * bit 10 : RTC_GPIO_USER_BT bit
  96. * bit 11 : RTC_GPIO_USER_FM bit
  97. * bit 12 : RTC_GPIO_USER_PMIC bit
  98. * bit 13 : Fast Boot
  99. * bit 14 : Kernel Power Off Charging
  100. * bit 15 : Debug bit
  101. */
  102. /*
  103. * RTC_PDN2:
  104. * bit 0 - 3 : MTH in power-on time
  105. * bit 4 : Power-On Alarm bit
  106. * bit 5 - 6 : UART bits
  107. * bit 7 : POWER DROP AUTO BOOT bit
  108. * bit 8 - 14: YEA in power-on time
  109. * bit 15 : Power-On Logo bit
  110. */
  111. /*
  112. * RTC_SPAR0:
  113. * bit 0 - 5 : SEC in power-on time
  114. * bit 6 : 32K less bit. True:with 32K, False:Without 32K
  115. * bit 7 : Low power detected in preloader
  116. * bit 8 - 15: reserved bits
  117. */
  118. /*
  119. * RTC_SPAR1:
  120. * bit 0 - 5 : MIN in power-on time
  121. * bit 6 - 10 : HOU in power-on time
  122. * bit 11 - 15: DOM in power-on time
  123. */
  124. /*
  125. * RTC_NEW_SPARE0: RTC_AL_HOU bit8~15
  126. * bit 8 ~ 14 : Fuel Gauge
  127. * bit 15 : reserved bits
  128. */
  129. /*
  130. * RTC_NEW_SPARE1: RTC_AL_DOM bit8~15
  131. * bit 8 ~ 15 : reserved bits
  132. */
  133. /*
  134. * RTC_NEW_SPARE2: RTC_AL_DOW bit8~15
  135. * bit 8 ~ 15 : reserved bits
  136. */
  137. /*
  138. * RTC_NEW_SPARE3: RTC_AL_MTH bit8~15
  139. * bit 8 ~ 15 : reserved bits
  140. */
  141. #define rtc_xinfo(fmt, args...) \
  142. pr_notice(fmt, ##args)
  143. #define rtc_xerror(fmt, args...) \
  144. pr_err(fmt, ##args)
  145. #define rtc_xfatal(fmt, args...) \
  146. pr_emerg(fmt, ##args)
  147. static struct rtc_device *rtc;
  148. static DEFINE_SPINLOCK(rtc_lock);
  149. static int rtc_show_time;
  150. static int rtc_show_alarm = 1;
  151. #if 1
  152. unsigned long rtc_read_hw_time(void)
  153. {
  154. unsigned long time, flags;
  155. struct rtc_time tm;
  156. spin_lock_irqsave(&rtc_lock, flags);
  157. /* rtc_ctrl_func(HAL_RTC_CMD_RELOAD, NULL); */
  158. /* rtc_ctrl_func(HAL_RTC_CMD_GET_TIME, &tm); */
  159. hal_rtc_get_tick_time(&tm);
  160. spin_unlock_irqrestore(&rtc_lock, flags);
  161. tm.tm_year += RTC_MIN_YEAR_OFFSET;
  162. tm.tm_mon--;
  163. rtc_tm_to_time(&tm, &time);
  164. tm.tm_wday = (time / 86400 + 4) % 7; /* 1970/01/01 is Thursday */
  165. return time;
  166. }
  167. EXPORT_SYMBOL(rtc_read_hw_time);
  168. #endif
  169. int get_rtc_spare_fg_value(void)
  170. {
  171. /* RTC_AL_HOU bit8~14 */
  172. u16 temp;
  173. unsigned long flags;
  174. spin_lock_irqsave(&rtc_lock, flags);
  175. temp = hal_rtc_get_spare_register(RTC_FGSOC);
  176. spin_unlock_irqrestore(&rtc_lock, flags);
  177. return temp;
  178. }
  179. int set_rtc_spare_fg_value(int val)
  180. {
  181. /* RTC_AL_HOU bit8~14 */
  182. unsigned long flags;
  183. if (val > 100)
  184. return 1;
  185. spin_lock_irqsave(&rtc_lock, flags);
  186. hal_rtc_set_spare_register(RTC_FGSOC, val);
  187. spin_unlock_irqrestore(&rtc_lock, flags);
  188. return 0;
  189. }
  190. bool crystal_exist_status(void)
  191. {
  192. unsigned long flags;
  193. u16 ret;
  194. spin_lock_irqsave(&rtc_lock, flags);
  195. ret = hal_rtc_get_spare_register(RTC_32K_LESS);
  196. spin_unlock_irqrestore(&rtc_lock, flags);
  197. if (ret)
  198. return true;
  199. else
  200. return false;
  201. }
  202. EXPORT_SYMBOL(crystal_exist_status);
  203. /*
  204. * Only for GPS to check the status.
  205. * Others do not use this API
  206. * This low power detected API is read clear.
  207. */
  208. bool rtc_low_power_detected(void)
  209. {
  210. unsigned long flags;
  211. u16 ret;
  212. spin_lock_irqsave(&rtc_lock, flags);
  213. ret = hal_rtc_get_spare_register(RTC_LP_DET);
  214. spin_unlock_irqrestore(&rtc_lock, flags);
  215. if (ret)
  216. return true;
  217. else
  218. return false;
  219. }
  220. EXPORT_SYMBOL(rtc_low_power_detected);
  221. void rtc_gpio_enable_32k(rtc_gpio_user_t user)
  222. {
  223. unsigned long flags;
  224. if (user < RTC_GPIO_USER_WIFI || user > RTC_GPIO_USER_PMIC)
  225. return;
  226. spin_lock_irqsave(&rtc_lock, flags);
  227. hal_rtc_set_gpio_32k_status(user, true);
  228. spin_unlock_irqrestore(&rtc_lock, flags);
  229. }
  230. EXPORT_SYMBOL(rtc_gpio_enable_32k);
  231. void rtc_gpio_disable_32k(rtc_gpio_user_t user)
  232. {
  233. unsigned long flags;
  234. if (user < RTC_GPIO_USER_WIFI || user > RTC_GPIO_USER_PMIC)
  235. return;
  236. spin_lock_irqsave(&rtc_lock, flags);
  237. hal_rtc_set_gpio_32k_status(user, false);
  238. spin_unlock_irqrestore(&rtc_lock, flags);
  239. }
  240. EXPORT_SYMBOL(rtc_gpio_disable_32k);
  241. bool rtc_gpio_32k_status(void)
  242. {
  243. unsigned long flags;
  244. u16 ret;
  245. spin_lock_irqsave(&rtc_lock, flags);
  246. ret = hal_rtc_get_gpio_32k_status();
  247. spin_unlock_irqrestore(&rtc_lock, flags);
  248. if (ret)
  249. return true;
  250. else
  251. return false;
  252. }
  253. EXPORT_SYMBOL(rtc_gpio_32k_status);
  254. void rtc_enable_abb_32k(void)
  255. {
  256. unsigned long flags;
  257. spin_lock_irqsave(&rtc_lock, flags);
  258. hal_rtc_set_abb_32k(1);
  259. spin_unlock_irqrestore(&rtc_lock, flags);
  260. }
  261. void rtc_disable_abb_32k(void)
  262. {
  263. unsigned long flags;
  264. spin_lock_irqsave(&rtc_lock, flags);
  265. hal_rtc_set_abb_32k(0);
  266. spin_unlock_irqrestore(&rtc_lock, flags);
  267. }
  268. void rtc_enable_writeif(void)
  269. {
  270. unsigned long flags;
  271. spin_lock_irqsave(&rtc_lock, flags);
  272. rtc_set_writeif(true);
  273. spin_unlock_irqrestore(&rtc_lock, flags);
  274. }
  275. void rtc_disable_writeif(void)
  276. {
  277. unsigned long flags;
  278. spin_lock_irqsave(&rtc_lock, flags);
  279. rtc_set_writeif(false);
  280. spin_unlock_irqrestore(&rtc_lock, flags);
  281. }
  282. void rtc_mark_recovery(void)
  283. {
  284. unsigned long flags;
  285. rtc_xinfo("rtc_mark_recovery\n");
  286. spin_lock_irqsave(&rtc_lock, flags);
  287. hal_rtc_set_spare_register(RTC_FAC_RESET, 0x1);
  288. spin_unlock_irqrestore(&rtc_lock, flags);
  289. }
  290. #if defined(CONFIG_MTK_KERNEL_POWER_OFF_CHARGING)
  291. void rtc_mark_kpoc(void)
  292. {
  293. unsigned long flags;
  294. spin_lock_irqsave(&rtc_lock, flags);
  295. hal_rtc_set_spare_register(RTC_KPOC, 0x1);
  296. spin_unlock_irqrestore(&rtc_lock, flags);
  297. }
  298. #endif
  299. void rtc_mark_fast(void)
  300. {
  301. unsigned long flags;
  302. rtc_xinfo("rtc_mark_fast\n");
  303. spin_lock_irqsave(&rtc_lock, flags);
  304. hal_rtc_set_spare_register(RTC_FAST_BOOT, 0x1);
  305. spin_unlock_irqrestore(&rtc_lock, flags);
  306. }
  307. u16 rtc_rdwr_uart_bits(u16 *val)
  308. {
  309. u16 ret = 0;
  310. unsigned long flags;
  311. spin_lock_irqsave(&rtc_lock, flags);
  312. hal_rtc_set_spare_register(RTC_UART, *val);
  313. spin_unlock_irqrestore(&rtc_lock, flags);
  314. return ret;
  315. }
  316. void rtc_bbpu_power_down(void)
  317. {
  318. unsigned long flags;
  319. spin_lock_irqsave(&rtc_lock, flags);
  320. hal_rtc_bbpu_pwdn();
  321. spin_unlock_irqrestore(&rtc_lock, flags);
  322. }
  323. void mt_power_off(void)
  324. {
  325. #if !defined(CONFIG_POWER_EXT)
  326. int count = 0;
  327. #endif
  328. rtc_xinfo("mt_power_off\n");
  329. /* pull PWRBB low */
  330. rtc_bbpu_power_down();
  331. while (1) {
  332. #if defined(CONFIG_POWER_EXT)
  333. /* EVB */
  334. rtc_xinfo("EVB without charger\n");
  335. #else
  336. /* Phone */
  337. mdelay(100);
  338. rtc_xinfo("Phone with charger\n");
  339. if (pmic_chrdet_status() == KAL_TRUE || count > 10)
  340. arch_reset(0, "charger");
  341. count++;
  342. #endif
  343. }
  344. }
  345. void rtc_read_pwron_alarm(struct rtc_wkalrm *alm)
  346. {
  347. unsigned long flags;
  348. struct rtc_time *tm;
  349. if (alm == NULL)
  350. return;
  351. tm = &alm->time;
  352. spin_lock_irqsave(&rtc_lock, flags);
  353. hal_rtc_get_pwron_alarm(tm, alm);
  354. spin_unlock_irqrestore(&rtc_lock, flags);
  355. tm->tm_year += RTC_MIN_YEAR_OFFSET;
  356. tm->tm_mon -= 1;
  357. if (rtc_show_alarm) {
  358. rtc_xinfo("power-on = %04d/%02d/%02d %02d:%02d:%02d (%d)(%d)\n",
  359. tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
  360. tm->tm_hour, tm->tm_min, tm->tm_sec, alm->enabled, alm->pending);
  361. }
  362. }
  363. /* static void rtc_tasklet_handler(unsigned long data) */
  364. static void rtc_handler(void)
  365. {
  366. bool pwron_alm = false, isLowPowerIrq = false, pwron_alarm = false;
  367. struct rtc_time nowtm;
  368. struct rtc_time tm;
  369. rtc_xinfo("rtc_tasklet_handler start\n");
  370. spin_lock(&rtc_lock);
  371. isLowPowerIrq = hal_rtc_is_lp_irq();
  372. if (isLowPowerIrq) {
  373. spin_unlock(&rtc_lock);
  374. return;
  375. }
  376. #if RTC_RELPWR_WHEN_XRST
  377. /* set AUTO bit because AUTO = 0 when PWREN = 1 and alarm occurs */
  378. hal_rtc_reload_power();
  379. #endif
  380. pwron_alarm = hal_rtc_is_pwron_alarm(&nowtm, &tm);
  381. nowtm.tm_year += RTC_MIN_YEAR;
  382. tm.tm_year += RTC_MIN_YEAR;
  383. if (pwron_alarm) {
  384. unsigned long now_time, time;
  385. now_time =
  386. mktime(nowtm.tm_year, nowtm.tm_mon, nowtm.tm_mday, nowtm.tm_hour, nowtm.tm_min,
  387. nowtm.tm_sec);
  388. time = mktime(tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
  389. if (now_time >= time - 1 && now_time <= time + 4) { /* power on */
  390. #if defined(CONFIG_MTK_KERNEL_POWER_OFF_CHARGING)
  391. if (get_boot_mode() == KERNEL_POWER_OFF_CHARGING_BOOT
  392. || get_boot_mode() == LOW_POWER_OFF_CHARGING_BOOT) {
  393. time += 1;
  394. rtc_time_to_tm(time, &tm);
  395. tm.tm_year -= RTC_MIN_YEAR_OFFSET;
  396. tm.tm_mon += 1;
  397. /* tm.tm_sec += 1; */
  398. hal_rtc_set_alarm(&tm);
  399. spin_unlock(&rtc_lock);
  400. arch_reset(0, "kpoc");
  401. } else {
  402. hal_rtc_save_pwron_alarm();
  403. pwron_alm = true;
  404. }
  405. #else
  406. hal_rtc_save_pwron_alarm();
  407. pwron_alm = true;
  408. #endif
  409. } else if (now_time < time) { /* set power-on alarm */
  410. if (tm.tm_sec == 0) {
  411. tm.tm_sec = 59;
  412. tm.tm_min -= 1;
  413. } else {
  414. tm.tm_sec -= 1;
  415. }
  416. hal_rtc_set_alarm(&tm);
  417. }
  418. }
  419. spin_unlock(&rtc_lock);
  420. if (rtc != NULL)
  421. rtc_update_irq(rtc, 1, RTC_IRQF | RTC_AF);
  422. if (rtc_show_alarm)
  423. rtc_xinfo("%s time is up\n", pwron_alm ? "power-on" : "alarm");
  424. }
  425. /* static DECLARE_TASKLET(rtc_tasklet, rtc_tasklet_handler, 0); */
  426. /* static irqreturn_t rtc_irq_handler(int irq, void *dev_id) */
  427. void rtc_irq_handler(void)
  428. {
  429. /* rtc_xinfo("rtc_irq_handler start\n"); */
  430. rtc_handler();
  431. /* tasklet_schedule(&rtc_tasklet); */
  432. }
  433. #if RTC_OVER_TIME_RESET
  434. static void rtc_reset_to_deftime(struct rtc_time *tm)
  435. {
  436. unsigned long flags;
  437. struct rtc_time defaulttm;
  438. tm->tm_year = RTC_DEFAULT_YEA - 1900;
  439. tm->tm_mon = RTC_DEFAULT_MTH - 1;
  440. tm->tm_mday = RTC_DEFAULT_DOM;
  441. tm->tm_wday = 1;
  442. tm->tm_hour = 0;
  443. tm->tm_min = 0;
  444. tm->tm_sec = 0;
  445. /* set default alarm time */
  446. defaulttm.tm_year = RTC_DEFAULT_YEA - RTC_MIN_YEAR;
  447. defaulttm.tm_mon = RTC_DEFAULT_MTH;
  448. defaulttm.tm_mday = RTC_DEFAULT_DOM;
  449. defaulttm.tm_wday = 1;
  450. defaulttm.tm_hour = 0;
  451. defaulttm.tm_min = 0;
  452. defaulttm.tm_sec = 0;
  453. spin_lock_irqsave(&rtc_lock, flags);
  454. hal_rtc_set_alarm(&defaulttm);
  455. spin_unlock_irqrestore(&rtc_lock, flags);
  456. rtc_xerror("reset to default date %04d/%02d/%02d\n",
  457. RTC_DEFAULT_YEA, RTC_DEFAULT_MTH, RTC_DEFAULT_DOM);
  458. }
  459. #endif
  460. static int rtc_ops_read_time(struct device *dev, struct rtc_time *tm)
  461. {
  462. unsigned long time, flags;
  463. spin_lock_irqsave(&rtc_lock, flags);
  464. hal_rtc_get_tick_time(tm);
  465. spin_unlock_irqrestore(&rtc_lock, flags);
  466. tm->tm_year += RTC_MIN_YEAR_OFFSET;
  467. tm->tm_mon--;
  468. rtc_tm_to_time(tm, &time);
  469. #if RTC_OVER_TIME_RESET
  470. if (unlikely(time > (unsigned long)LONG_MAX)) {
  471. rtc_reset_to_deftime(tm);
  472. rtc_tm_to_time(tm, &time);
  473. }
  474. #endif
  475. tm->tm_wday = (time / 86400 + 4) % 7; /* 1970/01/01 is Thursday */
  476. if (rtc_show_time) {
  477. rtc_xinfo("read tc time = %04d/%02d/%02d (%d) %02d:%02d:%02d\n",
  478. tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
  479. tm->tm_wday, tm->tm_hour, tm->tm_min, tm->tm_sec);
  480. }
  481. return 0;
  482. }
  483. static int rtc_ops_set_time(struct device *dev, struct rtc_time *tm)
  484. {
  485. unsigned long time, flags;
  486. rtc_tm_to_time(tm, &time);
  487. if (time > (unsigned long)LONG_MAX)
  488. return -EINVAL;
  489. tm->tm_year -= RTC_MIN_YEAR_OFFSET;
  490. tm->tm_mon++;
  491. rtc_xinfo("set tc time = %04d/%02d/%02d %02d:%02d:%02d\n",
  492. tm->tm_year + RTC_MIN_YEAR, tm->tm_mon, tm->tm_mday,
  493. tm->tm_hour, tm->tm_min, tm->tm_sec);
  494. spin_lock_irqsave(&rtc_lock, flags);
  495. hal_rtc_set_tick_time(tm);
  496. spin_unlock_irqrestore(&rtc_lock, flags);
  497. return 0;
  498. }
  499. static int rtc_ops_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
  500. {
  501. unsigned long flags;
  502. struct rtc_time *tm = &alm->time;
  503. spin_lock_irqsave(&rtc_lock, flags);
  504. hal_rtc_get_alarm(tm, alm);
  505. spin_unlock_irqrestore(&rtc_lock, flags);
  506. tm->tm_year += RTC_MIN_YEAR_OFFSET;
  507. tm->tm_mon--;
  508. rtc_xinfo("read al time = %04d/%02d/%02d %02d:%02d:%02d (%d)\n",
  509. tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
  510. tm->tm_hour, tm->tm_min, tm->tm_sec, alm->enabled);
  511. return 0;
  512. }
  513. static void rtc_save_pwron_time(bool enable, struct rtc_time *tm, bool logo)
  514. {
  515. hal_rtc_save_pwron_time(enable, tm, logo);
  516. }
  517. static int rtc_ops_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
  518. {
  519. unsigned long time, flags;
  520. struct rtc_time *tm = &alm->time;
  521. rtc_tm_to_time(tm, &time);
  522. if (time > (unsigned long)LONG_MAX)
  523. return -EINVAL;
  524. tm->tm_year -= RTC_MIN_YEAR_OFFSET;
  525. tm->tm_mon++;
  526. rtc_xinfo("set al time = %04d/%02d/%02d %02d:%02d:%02d (%d)\n",
  527. tm->tm_year + RTC_MIN_YEAR, tm->tm_mon, tm->tm_mday,
  528. tm->tm_hour, tm->tm_min, tm->tm_sec, alm->enabled);
  529. spin_lock_irqsave(&rtc_lock, flags);
  530. if (alm->enabled == 2) { /* enable power-on alarm */
  531. rtc_save_pwron_time(true, tm, false);
  532. } else if (alm->enabled == 3) { /* enable power-on alarm with logo */
  533. rtc_save_pwron_time(true, tm, true);
  534. } else if (alm->enabled == 4) { /* disable power-on alarm */
  535. /* alm->enabled = 0; */
  536. rtc_save_pwron_time(false, tm, false);
  537. }
  538. /* disable alarm and clear Power-On Alarm bit */
  539. hal_rtc_clear_alarm(tm);
  540. if (alm->enabled)
  541. hal_rtc_set_alarm(tm);
  542. spin_unlock_irqrestore(&rtc_lock, flags);
  543. return 0;
  544. }
  545. void rtc_pwm_enable_check(void)
  546. {
  547. #ifdef VRTC_PWM_ENABLE
  548. U64 time;
  549. rtc_xinfo("rtc_pwm_enable_check()\n");
  550. time = sched_clock();
  551. do_div(time, 1000000000);
  552. if (time > RTC_PWM_ENABLE_POLLING_TIMER) {
  553. hal_rtc_pwm_enable();
  554. } else {
  555. rtc_xinfo("time=%lld, less than %d, don't enable rtc pwm\n", time,
  556. RTC_PWM_ENABLE_POLLING_TIMER);
  557. }
  558. #endif
  559. }
  560. static int rtc_ops_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
  561. {
  562. /* dump_stack(); */
  563. rtc_xinfo("rtc_ops_ioctl cmd=%d\n", cmd);
  564. switch (cmd) {
  565. case RTC_AUTOBOOT_ON:
  566. {
  567. hal_rtc_set_spare_register(RTC_AUTOBOOT, AUTOBOOT_ON);
  568. rtc_xinfo("rtc_ops_ioctl cmd=RTC_AUTOBOOT_ON\n");
  569. return 0;
  570. }
  571. case RTC_AUTOBOOT_OFF: /* IPO shutdown */
  572. {
  573. hal_rtc_set_spare_register(RTC_AUTOBOOT, AUTOBOOT_OFF);
  574. rtc_xinfo("rtc_ops_ioctl cmd=RTC_AUTOBOOT_OFF\n");
  575. return 0;
  576. }
  577. default:
  578. break;
  579. }
  580. return -ENOIOCTLCMD;
  581. }
  582. static struct rtc_class_ops rtc_ops = {
  583. .read_time = rtc_ops_read_time,
  584. .set_time = rtc_ops_set_time,
  585. .read_alarm = rtc_ops_read_alarm,
  586. .set_alarm = rtc_ops_set_alarm,
  587. .ioctl = rtc_ops_ioctl,
  588. };
  589. static int rtc_pdrv_probe(struct platform_device *pdev)
  590. {
  591. unsigned long flags;
  592. /* only enable LPD interrupt in engineering build */
  593. spin_lock_irqsave(&rtc_lock, flags);
  594. hal_rtc_set_lp_irq();
  595. spin_unlock_irqrestore(&rtc_lock, flags);
  596. device_init_wakeup(&pdev->dev, 1);
  597. /* register rtc device (/dev/rtc0) */
  598. rtc = rtc_device_register(RTC_NAME, &pdev->dev, &rtc_ops, THIS_MODULE);
  599. if (IS_ERR(rtc)) {
  600. rtc_xerror("register rtc device failed (%ld)\n", PTR_ERR(rtc));
  601. return PTR_ERR(rtc);
  602. }
  603. #ifdef PMIC_REGISTER_INTERRUPT_ENABLE
  604. pmic_register_interrupt_callback(RTC_INTERRUPT_NUM, rtc_irq_handler);
  605. pmic_enable_interrupt(RTC_INTERRUPT_NUM, 1, "RTC");
  606. #endif
  607. return 0;
  608. }
  609. /* should never be called */
  610. static int rtc_pdrv_remove(struct platform_device *pdev)
  611. {
  612. return 0;
  613. }
  614. static struct platform_driver rtc_pdrv = {
  615. .probe = rtc_pdrv_probe,
  616. .remove = rtc_pdrv_remove,
  617. .driver = {
  618. .name = RTC_NAME,
  619. .owner = THIS_MODULE,
  620. },
  621. };
  622. static struct platform_device rtc_pdev = {
  623. .name = RTC_NAME,
  624. .id = -1,
  625. };
  626. static int __init rtc_device_init(void)
  627. {
  628. int r;
  629. rtc_xinfo("rtc_init");
  630. r = platform_device_register(&rtc_pdev);
  631. if (r) {
  632. rtc_xerror("register device failed (%d)\n", r);
  633. return r;
  634. }
  635. r = platform_driver_register(&rtc_pdrv);
  636. if (r) {
  637. rtc_xerror("register driver failed (%d)\n", r);
  638. platform_device_unregister(&rtc_pdev);
  639. return r;
  640. }
  641. #if (defined(MTK_GPS_MT3332))
  642. hal_rtc_set_gpio_32k_status(0, true);
  643. #endif
  644. return 0;
  645. }
  646. /*static int __init rtc_mod_init(void)
  647. {
  648. int r;
  649. rtc_xinfo("rtc_mod_init");
  650. r = platform_device_register(&rtc_pdev);
  651. if (r) {
  652. rtc_xerror("register device failed (%d)\n", r);
  653. return r;
  654. }
  655. r = platform_driver_register(&rtc_pdrv);
  656. if (r) {
  657. rtc_xerror("register driver failed (%d)\n", r);
  658. platform_device_unregister(&rtc_pdev);
  659. return r;
  660. }
  661. return 0;
  662. }*/
  663. /* should never be called */
  664. /*static void __exit rtc_mod_exit(void)
  665. {
  666. }*/
  667. static int __init rtc_late_init(void)
  668. {
  669. unsigned long flags;
  670. spin_lock_irqsave(&rtc_lock, flags);
  671. hal_rtc_read_rg();
  672. spin_unlock_irqrestore(&rtc_lock, flags);
  673. if (crystal_exist_status() == true)
  674. rtc_xinfo("There is Crystal\n");
  675. else
  676. rtc_xinfo("There is no Crystal\n");
  677. rtc_writeif_unlock();
  678. #if (defined(MTK_GPS_MT3332))
  679. hal_rtc_set_gpio_32k_status(0, true);
  680. #endif
  681. return 0;
  682. }
  683. /* module_init(rtc_mod_init); */
  684. /* module_exit(rtc_mod_exit); */
  685. late_initcall(rtc_late_init);
  686. device_initcall(rtc_device_init);
  687. module_param(rtc_show_time, int, 0644);
  688. module_param(rtc_show_alarm, int, 0644);
  689. MODULE_LICENSE("GPL");
  690. #endif /*#if defined(CONFIG_MTK_RTC)*/