rtc-rk808.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. /*
  2. * RTC driver for Rockchip RK808
  3. *
  4. * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
  5. *
  6. * Author: Chris Zhong <zyw@rock-chips.com>
  7. * Author: Zhang Qing <zhangqing@rock-chips.com>
  8. *
  9. * This program is free software; you can redistribute it and/or modify it
  10. * under the terms and conditions of the GNU General Public License,
  11. * version 2, as published by the Free Software Foundation.
  12. *
  13. * This program is distributed in the hope it will be useful, but WITHOUT
  14. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  15. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  16. * more details.
  17. */
  18. #include <linux/module.h>
  19. #include <linux/kernel.h>
  20. #include <linux/rtc.h>
  21. #include <linux/bcd.h>
  22. #include <linux/mfd/rk808.h>
  23. #include <linux/platform_device.h>
  24. #include <linux/i2c.h>
  25. /* RTC_CTRL_REG bitfields */
  26. #define BIT_RTC_CTRL_REG_STOP_RTC_M BIT(0)
  27. /* RK808 has a shadowed register for saving a "frozen" RTC time.
  28. * When user setting "GET_TIME" to 1, the time will save in this shadowed
  29. * register. If set "READSEL" to 1, user read rtc time register, actually
  30. * get the time of that moment. If we need the real time, clr this bit.
  31. */
  32. #define BIT_RTC_CTRL_REG_RTC_GET_TIME BIT(6)
  33. #define BIT_RTC_CTRL_REG_RTC_READSEL_M BIT(7)
  34. #define BIT_RTC_INTERRUPTS_REG_IT_ALARM_M BIT(3)
  35. #define RTC_STATUS_MASK 0xFE
  36. #define SECONDS_REG_MSK 0x7F
  37. #define MINUTES_REG_MAK 0x7F
  38. #define HOURS_REG_MSK 0x3F
  39. #define DAYS_REG_MSK 0x3F
  40. #define MONTHS_REG_MSK 0x1F
  41. #define YEARS_REG_MSK 0xFF
  42. #define WEEKS_REG_MSK 0x7
  43. /* REG_SECONDS_REG through REG_YEARS_REG is how many registers? */
  44. #define NUM_TIME_REGS (RK808_WEEKS_REG - RK808_SECONDS_REG + 1)
  45. #define NUM_ALARM_REGS (RK808_ALARM_YEARS_REG - RK808_ALARM_SECONDS_REG + 1)
  46. struct rk808_rtc {
  47. struct rk808 *rk808;
  48. struct rtc_device *rtc;
  49. int irq;
  50. };
  51. /* Read current time and date in RTC */
  52. static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm)
  53. {
  54. struct rk808_rtc *rk808_rtc = dev_get_drvdata(dev);
  55. struct rk808 *rk808 = rk808_rtc->rk808;
  56. u8 rtc_data[NUM_TIME_REGS];
  57. int ret;
  58. /* Force an update of the shadowed registers right now */
  59. ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG,
  60. BIT_RTC_CTRL_REG_RTC_GET_TIME,
  61. 0);
  62. if (ret) {
  63. dev_err(dev, "Failed to update bits rtc_ctrl: %d\n", ret);
  64. return ret;
  65. }
  66. ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG,
  67. BIT_RTC_CTRL_REG_RTC_GET_TIME,
  68. BIT_RTC_CTRL_REG_RTC_GET_TIME);
  69. if (ret) {
  70. dev_err(dev, "Failed to update bits rtc_ctrl: %d\n", ret);
  71. return ret;
  72. }
  73. ret = regmap_bulk_read(rk808->regmap, RK808_SECONDS_REG,
  74. rtc_data, NUM_TIME_REGS);
  75. if (ret) {
  76. dev_err(dev, "Failed to bulk read rtc_data: %d\n", ret);
  77. return ret;
  78. }
  79. tm->tm_sec = bcd2bin(rtc_data[0] & SECONDS_REG_MSK);
  80. tm->tm_min = bcd2bin(rtc_data[1] & MINUTES_REG_MAK);
  81. tm->tm_hour = bcd2bin(rtc_data[2] & HOURS_REG_MSK);
  82. tm->tm_mday = bcd2bin(rtc_data[3] & DAYS_REG_MSK);
  83. tm->tm_mon = (bcd2bin(rtc_data[4] & MONTHS_REG_MSK)) - 1;
  84. tm->tm_year = (bcd2bin(rtc_data[5] & YEARS_REG_MSK)) + 100;
  85. tm->tm_wday = bcd2bin(rtc_data[6] & WEEKS_REG_MSK);
  86. dev_dbg(dev, "RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
  87. 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday,
  88. tm->tm_wday, tm->tm_hour , tm->tm_min, tm->tm_sec);
  89. return ret;
  90. }
  91. /* Set current time and date in RTC */
  92. static int rk808_rtc_set_time(struct device *dev, struct rtc_time *tm)
  93. {
  94. struct rk808_rtc *rk808_rtc = dev_get_drvdata(dev);
  95. struct rk808 *rk808 = rk808_rtc->rk808;
  96. u8 rtc_data[NUM_TIME_REGS];
  97. int ret;
  98. rtc_data[0] = bin2bcd(tm->tm_sec);
  99. rtc_data[1] = bin2bcd(tm->tm_min);
  100. rtc_data[2] = bin2bcd(tm->tm_hour);
  101. rtc_data[3] = bin2bcd(tm->tm_mday);
  102. rtc_data[4] = bin2bcd(tm->tm_mon + 1);
  103. rtc_data[5] = bin2bcd(tm->tm_year - 100);
  104. rtc_data[6] = bin2bcd(tm->tm_wday);
  105. dev_dbg(dev, "set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
  106. 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday,
  107. tm->tm_wday, tm->tm_hour , tm->tm_min, tm->tm_sec);
  108. /* Stop RTC while updating the RTC registers */
  109. ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG,
  110. BIT_RTC_CTRL_REG_STOP_RTC_M,
  111. BIT_RTC_CTRL_REG_STOP_RTC_M);
  112. if (ret) {
  113. dev_err(dev, "Failed to update RTC control: %d\n", ret);
  114. return ret;
  115. }
  116. ret = regmap_bulk_write(rk808->regmap, RK808_SECONDS_REG,
  117. rtc_data, NUM_TIME_REGS);
  118. if (ret) {
  119. dev_err(dev, "Failed to bull write rtc_data: %d\n", ret);
  120. return ret;
  121. }
  122. /* Start RTC again */
  123. ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG,
  124. BIT_RTC_CTRL_REG_STOP_RTC_M, 0);
  125. if (ret) {
  126. dev_err(dev, "Failed to update RTC control: %d\n", ret);
  127. return ret;
  128. }
  129. return 0;
  130. }
  131. /* Read alarm time and date in RTC */
  132. static int rk808_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
  133. {
  134. struct rk808_rtc *rk808_rtc = dev_get_drvdata(dev);
  135. struct rk808 *rk808 = rk808_rtc->rk808;
  136. u8 alrm_data[NUM_ALARM_REGS];
  137. uint32_t int_reg;
  138. int ret;
  139. ret = regmap_bulk_read(rk808->regmap, RK808_ALARM_SECONDS_REG,
  140. alrm_data, NUM_ALARM_REGS);
  141. alrm->time.tm_sec = bcd2bin(alrm_data[0] & SECONDS_REG_MSK);
  142. alrm->time.tm_min = bcd2bin(alrm_data[1] & MINUTES_REG_MAK);
  143. alrm->time.tm_hour = bcd2bin(alrm_data[2] & HOURS_REG_MSK);
  144. alrm->time.tm_mday = bcd2bin(alrm_data[3] & DAYS_REG_MSK);
  145. alrm->time.tm_mon = (bcd2bin(alrm_data[4] & MONTHS_REG_MSK)) - 1;
  146. alrm->time.tm_year = (bcd2bin(alrm_data[5] & YEARS_REG_MSK)) + 100;
  147. ret = regmap_read(rk808->regmap, RK808_RTC_INT_REG, &int_reg);
  148. if (ret) {
  149. dev_err(dev, "Failed to read RTC INT REG: %d\n", ret);
  150. return ret;
  151. }
  152. dev_dbg(dev, "alrm read RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
  153. 1900 + alrm->time.tm_year, alrm->time.tm_mon + 1,
  154. alrm->time.tm_mday, alrm->time.tm_wday, alrm->time.tm_hour,
  155. alrm->time.tm_min, alrm->time.tm_sec);
  156. alrm->enabled = (int_reg & BIT_RTC_INTERRUPTS_REG_IT_ALARM_M) ? 1 : 0;
  157. return 0;
  158. }
  159. static int rk808_rtc_stop_alarm(struct rk808_rtc *rk808_rtc)
  160. {
  161. struct rk808 *rk808 = rk808_rtc->rk808;
  162. int ret;
  163. ret = regmap_update_bits(rk808->regmap, RK808_RTC_INT_REG,
  164. BIT_RTC_INTERRUPTS_REG_IT_ALARM_M, 0);
  165. return ret;
  166. }
  167. static int rk808_rtc_start_alarm(struct rk808_rtc *rk808_rtc)
  168. {
  169. struct rk808 *rk808 = rk808_rtc->rk808;
  170. int ret;
  171. ret = regmap_update_bits(rk808->regmap, RK808_RTC_INT_REG,
  172. BIT_RTC_INTERRUPTS_REG_IT_ALARM_M,
  173. BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
  174. return ret;
  175. }
  176. static int rk808_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
  177. {
  178. struct rk808_rtc *rk808_rtc = dev_get_drvdata(dev);
  179. struct rk808 *rk808 = rk808_rtc->rk808;
  180. u8 alrm_data[NUM_ALARM_REGS];
  181. int ret;
  182. ret = rk808_rtc_stop_alarm(rk808_rtc);
  183. if (ret) {
  184. dev_err(dev, "Failed to stop alarm: %d\n", ret);
  185. return ret;
  186. }
  187. dev_dbg(dev, "alrm set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
  188. 1900 + alrm->time.tm_year, alrm->time.tm_mon + 1,
  189. alrm->time.tm_mday, alrm->time.tm_wday, alrm->time.tm_hour,
  190. alrm->time.tm_min, alrm->time.tm_sec);
  191. alrm_data[0] = bin2bcd(alrm->time.tm_sec);
  192. alrm_data[1] = bin2bcd(alrm->time.tm_min);
  193. alrm_data[2] = bin2bcd(alrm->time.tm_hour);
  194. alrm_data[3] = bin2bcd(alrm->time.tm_mday);
  195. alrm_data[4] = bin2bcd(alrm->time.tm_mon + 1);
  196. alrm_data[5] = bin2bcd(alrm->time.tm_year - 100);
  197. ret = regmap_bulk_write(rk808->regmap, RK808_ALARM_SECONDS_REG,
  198. alrm_data, NUM_ALARM_REGS);
  199. if (ret) {
  200. dev_err(dev, "Failed to bulk write: %d\n", ret);
  201. return ret;
  202. }
  203. if (alrm->enabled) {
  204. ret = rk808_rtc_start_alarm(rk808_rtc);
  205. if (ret) {
  206. dev_err(dev, "Failed to start alarm: %d\n", ret);
  207. return ret;
  208. }
  209. }
  210. return 0;
  211. }
  212. static int rk808_rtc_alarm_irq_enable(struct device *dev,
  213. unsigned int enabled)
  214. {
  215. struct rk808_rtc *rk808_rtc = dev_get_drvdata(dev);
  216. if (enabled)
  217. return rk808_rtc_start_alarm(rk808_rtc);
  218. return rk808_rtc_stop_alarm(rk808_rtc);
  219. }
  220. /*
  221. * We will just handle setting the frequency and make use the framework for
  222. * reading the periodic interupts.
  223. *
  224. * @freq: Current periodic IRQ freq:
  225. * bit 0: every second
  226. * bit 1: every minute
  227. * bit 2: every hour
  228. * bit 3: every day
  229. */
  230. static irqreturn_t rk808_alarm_irq(int irq, void *data)
  231. {
  232. struct rk808_rtc *rk808_rtc = data;
  233. struct rk808 *rk808 = rk808_rtc->rk808;
  234. struct i2c_client *client = rk808->i2c;
  235. int ret;
  236. ret = regmap_write(rk808->regmap, RK808_RTC_STATUS_REG,
  237. RTC_STATUS_MASK);
  238. if (ret) {
  239. dev_err(&client->dev,
  240. "%s:Failed to update RTC status: %d\n", __func__, ret);
  241. return ret;
  242. }
  243. rtc_update_irq(rk808_rtc->rtc, 1, RTC_IRQF | RTC_AF);
  244. dev_dbg(&client->dev,
  245. "%s:irq=%d\n", __func__, irq);
  246. return IRQ_HANDLED;
  247. }
  248. static const struct rtc_class_ops rk808_rtc_ops = {
  249. .read_time = rk808_rtc_readtime,
  250. .set_time = rk808_rtc_set_time,
  251. .read_alarm = rk808_rtc_readalarm,
  252. .set_alarm = rk808_rtc_setalarm,
  253. .alarm_irq_enable = rk808_rtc_alarm_irq_enable,
  254. };
  255. #ifdef CONFIG_PM_SLEEP
  256. /* Turn off the alarm if it should not be a wake source. */
  257. static int rk808_rtc_suspend(struct device *dev)
  258. {
  259. struct platform_device *pdev = to_platform_device(dev);
  260. struct rk808_rtc *rk808_rtc = dev_get_drvdata(&pdev->dev);
  261. if (device_may_wakeup(dev))
  262. enable_irq_wake(rk808_rtc->irq);
  263. return 0;
  264. }
  265. /* Enable the alarm if it should be enabled (in case it was disabled to
  266. * prevent use as a wake source).
  267. */
  268. static int rk808_rtc_resume(struct device *dev)
  269. {
  270. struct platform_device *pdev = to_platform_device(dev);
  271. struct rk808_rtc *rk808_rtc = dev_get_drvdata(&pdev->dev);
  272. if (device_may_wakeup(dev))
  273. disable_irq_wake(rk808_rtc->irq);
  274. return 0;
  275. }
  276. #endif
  277. static SIMPLE_DEV_PM_OPS(rk808_rtc_pm_ops,
  278. rk808_rtc_suspend, rk808_rtc_resume);
  279. static int rk808_rtc_probe(struct platform_device *pdev)
  280. {
  281. struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);
  282. struct rk808_rtc *rk808_rtc;
  283. struct rtc_time tm;
  284. int ret;
  285. rk808_rtc = devm_kzalloc(&pdev->dev, sizeof(*rk808_rtc), GFP_KERNEL);
  286. if (rk808_rtc == NULL)
  287. return -ENOMEM;
  288. platform_set_drvdata(pdev, rk808_rtc);
  289. rk808_rtc->rk808 = rk808;
  290. /* start rtc running by default, and use shadowed timer. */
  291. ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG,
  292. BIT_RTC_CTRL_REG_STOP_RTC_M |
  293. BIT_RTC_CTRL_REG_RTC_READSEL_M,
  294. BIT_RTC_CTRL_REG_RTC_READSEL_M);
  295. if (ret) {
  296. dev_err(&pdev->dev,
  297. "Failed to update RTC control: %d\n", ret);
  298. return ret;
  299. }
  300. ret = regmap_write(rk808->regmap, RK808_RTC_STATUS_REG,
  301. RTC_STATUS_MASK);
  302. if (ret) {
  303. dev_err(&pdev->dev,
  304. "Failed to write RTC status: %d\n", ret);
  305. return ret;
  306. }
  307. /* set init time */
  308. ret = rk808_rtc_readtime(&pdev->dev, &tm);
  309. if (ret) {
  310. dev_err(&pdev->dev, "Failed to read RTC time\n");
  311. return ret;
  312. }
  313. ret = rtc_valid_tm(&tm);
  314. if (ret)
  315. dev_warn(&pdev->dev, "invalid date/time\n");
  316. device_init_wakeup(&pdev->dev, 1);
  317. rk808_rtc->rtc = devm_rtc_device_register(&pdev->dev, "rk808-rtc",
  318. &rk808_rtc_ops, THIS_MODULE);
  319. if (IS_ERR(rk808_rtc->rtc)) {
  320. ret = PTR_ERR(rk808_rtc->rtc);
  321. return ret;
  322. }
  323. rk808_rtc->irq = platform_get_irq(pdev, 0);
  324. if (rk808_rtc->irq < 0) {
  325. if (rk808_rtc->irq != -EPROBE_DEFER)
  326. dev_err(&pdev->dev, "Wake up is not possible as irq = %d\n",
  327. rk808_rtc->irq);
  328. return rk808_rtc->irq;
  329. }
  330. /* request alarm irq of rk808 */
  331. ret = devm_request_threaded_irq(&pdev->dev, rk808_rtc->irq, NULL,
  332. rk808_alarm_irq, 0,
  333. "RTC alarm", rk808_rtc);
  334. if (ret) {
  335. dev_err(&pdev->dev, "Failed to request alarm IRQ %d: %d\n",
  336. rk808_rtc->irq, ret);
  337. }
  338. return ret;
  339. }
  340. static struct platform_driver rk808_rtc_driver = {
  341. .probe = rk808_rtc_probe,
  342. .driver = {
  343. .name = "rk808-rtc",
  344. .pm = &rk808_rtc_pm_ops,
  345. },
  346. };
  347. module_platform_driver(rk808_rtc_driver);
  348. MODULE_DESCRIPTION("RTC driver for the rk808 series PMICs");
  349. MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
  350. MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
  351. MODULE_LICENSE("GPL");
  352. MODULE_ALIAS("platform:rk808-rtc");