rtc-rzn1.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Renesas RZ/N1 Real Time Clock interface for Linux
  4. *
  5. * Copyright:
  6. * - 2014 Renesas Electronics Europe Limited
  7. * - 2022 Schneider Electric
  8. *
  9. * Authors:
  10. * - Michel Pollet <[email protected]>, <[email protected]>
  11. * - Miquel Raynal <[email protected]>
  12. */
  13. #include <linux/bcd.h>
  14. #include <linux/init.h>
  15. #include <linux/iopoll.h>
  16. #include <linux/module.h>
  17. #include <linux/of_device.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/pm_runtime.h>
  20. #include <linux/rtc.h>
  21. #define RZN1_RTC_CTL0 0x00
  22. #define RZN1_RTC_CTL0_SLSB_SUBU 0
  23. #define RZN1_RTC_CTL0_SLSB_SCMP BIT(4)
  24. #define RZN1_RTC_CTL0_AMPM BIT(5)
  25. #define RZN1_RTC_CTL0_CE BIT(7)
  26. #define RZN1_RTC_CTL1 0x04
  27. #define RZN1_RTC_CTL1_ALME BIT(4)
  28. #define RZN1_RTC_CTL2 0x08
  29. #define RZN1_RTC_CTL2_WAIT BIT(0)
  30. #define RZN1_RTC_CTL2_WST BIT(1)
  31. #define RZN1_RTC_CTL2_WUST BIT(5)
  32. #define RZN1_RTC_CTL2_STOPPED (RZN1_RTC_CTL2_WAIT | RZN1_RTC_CTL2_WST)
  33. #define RZN1_RTC_SEC 0x14
  34. #define RZN1_RTC_MIN 0x18
  35. #define RZN1_RTC_HOUR 0x1c
  36. #define RZN1_RTC_WEEK 0x20
  37. #define RZN1_RTC_DAY 0x24
  38. #define RZN1_RTC_MONTH 0x28
  39. #define RZN1_RTC_YEAR 0x2c
  40. #define RZN1_RTC_SUBU 0x38
  41. #define RZN1_RTC_SUBU_DEV BIT(7)
  42. #define RZN1_RTC_SUBU_DECR BIT(6)
  43. #define RZN1_RTC_ALM 0x40
  44. #define RZN1_RTC_ALH 0x44
  45. #define RZN1_RTC_ALW 0x48
  46. #define RZN1_RTC_SECC 0x4c
  47. #define RZN1_RTC_MINC 0x50
  48. #define RZN1_RTC_HOURC 0x54
  49. #define RZN1_RTC_WEEKC 0x58
  50. #define RZN1_RTC_DAYC 0x5c
  51. #define RZN1_RTC_MONTHC 0x60
  52. #define RZN1_RTC_YEARC 0x64
  53. struct rzn1_rtc {
  54. struct rtc_device *rtcdev;
  55. void __iomem *base;
  56. };
  57. static void rzn1_rtc_get_time_snapshot(struct rzn1_rtc *rtc, struct rtc_time *tm)
  58. {
  59. tm->tm_sec = readl(rtc->base + RZN1_RTC_SECC);
  60. tm->tm_min = readl(rtc->base + RZN1_RTC_MINC);
  61. tm->tm_hour = readl(rtc->base + RZN1_RTC_HOURC);
  62. tm->tm_wday = readl(rtc->base + RZN1_RTC_WEEKC);
  63. tm->tm_mday = readl(rtc->base + RZN1_RTC_DAYC);
  64. tm->tm_mon = readl(rtc->base + RZN1_RTC_MONTHC);
  65. tm->tm_year = readl(rtc->base + RZN1_RTC_YEARC);
  66. }
  67. static unsigned int rzn1_rtc_tm_to_wday(struct rtc_time *tm)
  68. {
  69. time64_t time;
  70. unsigned int days;
  71. u32 secs;
  72. time = rtc_tm_to_time64(tm);
  73. days = div_s64_rem(time, 86400, &secs);
  74. /* day of the week, 1970-01-01 was a Thursday */
  75. return (days + 4) % 7;
  76. }
  77. static int rzn1_rtc_read_time(struct device *dev, struct rtc_time *tm)
  78. {
  79. struct rzn1_rtc *rtc = dev_get_drvdata(dev);
  80. u32 val, secs;
  81. /*
  82. * The RTC was not started or is stopped and thus does not carry the
  83. * proper time/date.
  84. */
  85. val = readl(rtc->base + RZN1_RTC_CTL2);
  86. if (val & RZN1_RTC_CTL2_STOPPED)
  87. return -EINVAL;
  88. rzn1_rtc_get_time_snapshot(rtc, tm);
  89. secs = readl(rtc->base + RZN1_RTC_SECC);
  90. if (tm->tm_sec != secs)
  91. rzn1_rtc_get_time_snapshot(rtc, tm);
  92. tm->tm_sec = bcd2bin(tm->tm_sec);
  93. tm->tm_min = bcd2bin(tm->tm_min);
  94. tm->tm_hour = bcd2bin(tm->tm_hour);
  95. tm->tm_wday = bcd2bin(tm->tm_wday);
  96. tm->tm_mday = bcd2bin(tm->tm_mday);
  97. tm->tm_mon = bcd2bin(tm->tm_mon);
  98. tm->tm_year = bcd2bin(tm->tm_year);
  99. return 0;
  100. }
  101. static int rzn1_rtc_set_time(struct device *dev, struct rtc_time *tm)
  102. {
  103. struct rzn1_rtc *rtc = dev_get_drvdata(dev);
  104. u32 val;
  105. int ret;
  106. tm->tm_sec = bin2bcd(tm->tm_sec);
  107. tm->tm_min = bin2bcd(tm->tm_min);
  108. tm->tm_hour = bin2bcd(tm->tm_hour);
  109. tm->tm_wday = bin2bcd(rzn1_rtc_tm_to_wday(tm));
  110. tm->tm_mday = bin2bcd(tm->tm_mday);
  111. tm->tm_mon = bin2bcd(tm->tm_mon);
  112. tm->tm_year = bin2bcd(tm->tm_year);
  113. val = readl(rtc->base + RZN1_RTC_CTL2);
  114. if (!(val & RZN1_RTC_CTL2_STOPPED)) {
  115. /* Hold the counter if it was counting up */
  116. writel(RZN1_RTC_CTL2_WAIT, rtc->base + RZN1_RTC_CTL2);
  117. /* Wait for the counter to stop: two 32k clock cycles */
  118. usleep_range(61, 100);
  119. ret = readl_poll_timeout(rtc->base + RZN1_RTC_CTL2, val,
  120. val & RZN1_RTC_CTL2_WST, 0, 100);
  121. if (ret)
  122. return ret;
  123. }
  124. writel(tm->tm_sec, rtc->base + RZN1_RTC_SEC);
  125. writel(tm->tm_min, rtc->base + RZN1_RTC_MIN);
  126. writel(tm->tm_hour, rtc->base + RZN1_RTC_HOUR);
  127. writel(tm->tm_wday, rtc->base + RZN1_RTC_WEEK);
  128. writel(tm->tm_mday, rtc->base + RZN1_RTC_DAY);
  129. writel(tm->tm_mon, rtc->base + RZN1_RTC_MONTH);
  130. writel(tm->tm_year, rtc->base + RZN1_RTC_YEAR);
  131. writel(0, rtc->base + RZN1_RTC_CTL2);
  132. return 0;
  133. }
  134. static irqreturn_t rzn1_rtc_alarm_irq(int irq, void *dev_id)
  135. {
  136. struct rzn1_rtc *rtc = dev_id;
  137. rtc_update_irq(rtc->rtcdev, 1, RTC_AF | RTC_IRQF);
  138. return IRQ_HANDLED;
  139. }
  140. static int rzn1_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
  141. {
  142. struct rzn1_rtc *rtc = dev_get_drvdata(dev);
  143. u32 ctl1 = readl(rtc->base + RZN1_RTC_CTL1);
  144. if (enable)
  145. ctl1 |= RZN1_RTC_CTL1_ALME;
  146. else
  147. ctl1 &= ~RZN1_RTC_CTL1_ALME;
  148. writel(ctl1, rtc->base + RZN1_RTC_CTL1);
  149. return 0;
  150. }
  151. static int rzn1_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
  152. {
  153. struct rzn1_rtc *rtc = dev_get_drvdata(dev);
  154. struct rtc_time *tm = &alrm->time;
  155. unsigned int min, hour, wday, delta_days;
  156. time64_t alarm;
  157. u32 ctl1;
  158. int ret;
  159. ret = rzn1_rtc_read_time(dev, tm);
  160. if (ret)
  161. return ret;
  162. min = readl(rtc->base + RZN1_RTC_ALM);
  163. hour = readl(rtc->base + RZN1_RTC_ALH);
  164. wday = readl(rtc->base + RZN1_RTC_ALW);
  165. tm->tm_sec = 0;
  166. tm->tm_min = bcd2bin(min);
  167. tm->tm_hour = bcd2bin(hour);
  168. delta_days = ((fls(wday) - 1) - tm->tm_wday + 7) % 7;
  169. tm->tm_wday = fls(wday) - 1;
  170. if (delta_days) {
  171. alarm = rtc_tm_to_time64(tm) + (delta_days * 86400);
  172. rtc_time64_to_tm(alarm, tm);
  173. }
  174. ctl1 = readl(rtc->base + RZN1_RTC_CTL1);
  175. alrm->enabled = !!(ctl1 & RZN1_RTC_CTL1_ALME);
  176. return 0;
  177. }
  178. static int rzn1_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
  179. {
  180. struct rzn1_rtc *rtc = dev_get_drvdata(dev);
  181. struct rtc_time *tm = &alrm->time, tm_now;
  182. unsigned long alarm, farest;
  183. unsigned int days_ahead, wday;
  184. int ret;
  185. ret = rzn1_rtc_read_time(dev, &tm_now);
  186. if (ret)
  187. return ret;
  188. /* We cannot set alarms more than one week ahead */
  189. farest = rtc_tm_to_time64(&tm_now) + (7 * 86400);
  190. alarm = rtc_tm_to_time64(tm);
  191. if (time_after(alarm, farest))
  192. return -ERANGE;
  193. /* Convert alarm day into week day */
  194. days_ahead = tm->tm_mday - tm_now.tm_mday;
  195. wday = (tm_now.tm_wday + days_ahead) % 7;
  196. writel(bin2bcd(tm->tm_min), rtc->base + RZN1_RTC_ALM);
  197. writel(bin2bcd(tm->tm_hour), rtc->base + RZN1_RTC_ALH);
  198. writel(BIT(wday), rtc->base + RZN1_RTC_ALW);
  199. rzn1_rtc_alarm_irq_enable(dev, alrm->enabled);
  200. return 0;
  201. }
  202. static int rzn1_rtc_read_offset(struct device *dev, long *offset)
  203. {
  204. struct rzn1_rtc *rtc = dev_get_drvdata(dev);
  205. unsigned int ppb_per_step;
  206. bool subtract;
  207. u32 val;
  208. val = readl(rtc->base + RZN1_RTC_SUBU);
  209. ppb_per_step = val & RZN1_RTC_SUBU_DEV ? 1017 : 3051;
  210. subtract = val & RZN1_RTC_SUBU_DECR;
  211. val &= 0x3F;
  212. if (!val)
  213. *offset = 0;
  214. else if (subtract)
  215. *offset = -(((~val) & 0x3F) + 1) * ppb_per_step;
  216. else
  217. *offset = (val - 1) * ppb_per_step;
  218. return 0;
  219. }
  220. static int rzn1_rtc_set_offset(struct device *dev, long offset)
  221. {
  222. struct rzn1_rtc *rtc = dev_get_drvdata(dev);
  223. int stepsh, stepsl, steps;
  224. u32 subu = 0, ctl2;
  225. int ret;
  226. /*
  227. * Check which resolution mode (every 20 or 60s) can be used.
  228. * Between 2 and 124 clock pulses can be added or substracted.
  229. *
  230. * In 20s mode, the minimum resolution is 2 / (32768 * 20) which is
  231. * close to 3051 ppb. In 60s mode, the resolution is closer to 1017.
  232. */
  233. stepsh = DIV_ROUND_CLOSEST(offset, 1017);
  234. stepsl = DIV_ROUND_CLOSEST(offset, 3051);
  235. if (stepsh >= -0x3E && stepsh <= 0x3E) {
  236. /* 1017 ppb per step */
  237. steps = stepsh;
  238. subu |= RZN1_RTC_SUBU_DEV;
  239. } else if (stepsl >= -0x3E && stepsl <= 0x3E) {
  240. /* 3051 ppb per step */
  241. steps = stepsl;
  242. } else {
  243. return -ERANGE;
  244. }
  245. if (!steps)
  246. return 0;
  247. if (steps > 0) {
  248. subu |= steps + 1;
  249. } else {
  250. subu |= RZN1_RTC_SUBU_DECR;
  251. subu |= (~(-steps - 1)) & 0x3F;
  252. }
  253. ret = readl_poll_timeout(rtc->base + RZN1_RTC_CTL2, ctl2,
  254. !(ctl2 & RZN1_RTC_CTL2_WUST), 100, 2000000);
  255. if (ret)
  256. return ret;
  257. writel(subu, rtc->base + RZN1_RTC_SUBU);
  258. return 0;
  259. }
  260. static const struct rtc_class_ops rzn1_rtc_ops = {
  261. .read_time = rzn1_rtc_read_time,
  262. .set_time = rzn1_rtc_set_time,
  263. .read_alarm = rzn1_rtc_read_alarm,
  264. .set_alarm = rzn1_rtc_set_alarm,
  265. .alarm_irq_enable = rzn1_rtc_alarm_irq_enable,
  266. .read_offset = rzn1_rtc_read_offset,
  267. .set_offset = rzn1_rtc_set_offset,
  268. };
  269. static int rzn1_rtc_probe(struct platform_device *pdev)
  270. {
  271. struct rzn1_rtc *rtc;
  272. int alarm_irq;
  273. int ret;
  274. rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
  275. if (!rtc)
  276. return -ENOMEM;
  277. platform_set_drvdata(pdev, rtc);
  278. rtc->base = devm_platform_ioremap_resource(pdev, 0);
  279. if (IS_ERR(rtc->base))
  280. return dev_err_probe(&pdev->dev, PTR_ERR(rtc->base), "Missing reg\n");
  281. alarm_irq = platform_get_irq(pdev, 0);
  282. if (alarm_irq < 0)
  283. return alarm_irq;
  284. rtc->rtcdev = devm_rtc_allocate_device(&pdev->dev);
  285. if (IS_ERR(rtc->rtcdev))
  286. return PTR_ERR(rtc->rtcdev);
  287. rtc->rtcdev->range_min = RTC_TIMESTAMP_BEGIN_2000;
  288. rtc->rtcdev->range_max = RTC_TIMESTAMP_END_2099;
  289. rtc->rtcdev->ops = &rzn1_rtc_ops;
  290. set_bit(RTC_FEATURE_ALARM_RES_MINUTE, rtc->rtcdev->features);
  291. clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, rtc->rtcdev->features);
  292. ret = devm_pm_runtime_enable(&pdev->dev);
  293. if (ret < 0)
  294. return ret;
  295. ret = pm_runtime_resume_and_get(&pdev->dev);
  296. if (ret < 0)
  297. return ret;
  298. /*
  299. * Ensure the clock counter is enabled.
  300. * Set 24-hour mode and possible oscillator offset compensation in SUBU mode.
  301. */
  302. writel(RZN1_RTC_CTL0_CE | RZN1_RTC_CTL0_AMPM | RZN1_RTC_CTL0_SLSB_SUBU,
  303. rtc->base + RZN1_RTC_CTL0);
  304. /* Disable all interrupts */
  305. writel(0, rtc->base + RZN1_RTC_CTL1);
  306. ret = devm_request_irq(&pdev->dev, alarm_irq, rzn1_rtc_alarm_irq, 0,
  307. dev_name(&pdev->dev), rtc);
  308. if (ret) {
  309. dev_err(&pdev->dev, "RTC timer interrupt not available\n");
  310. goto dis_runtime_pm;
  311. }
  312. ret = devm_rtc_register_device(rtc->rtcdev);
  313. if (ret)
  314. goto dis_runtime_pm;
  315. return 0;
  316. dis_runtime_pm:
  317. pm_runtime_put(&pdev->dev);
  318. return ret;
  319. }
  320. static int rzn1_rtc_remove(struct platform_device *pdev)
  321. {
  322. pm_runtime_put(&pdev->dev);
  323. return 0;
  324. }
  325. static const struct of_device_id rzn1_rtc_of_match[] = {
  326. { .compatible = "renesas,rzn1-rtc" },
  327. {},
  328. };
  329. MODULE_DEVICE_TABLE(of, rzn1_rtc_of_match);
  330. static struct platform_driver rzn1_rtc_driver = {
  331. .probe = rzn1_rtc_probe,
  332. .remove = rzn1_rtc_remove,
  333. .driver = {
  334. .name = "rzn1-rtc",
  335. .of_match_table = rzn1_rtc_of_match,
  336. },
  337. };
  338. module_platform_driver(rzn1_rtc_driver);
  339. MODULE_AUTHOR("Michel Pollet <[email protected]");
  340. MODULE_AUTHOR("Miquel Raynal <[email protected]");
  341. MODULE_DESCRIPTION("RZ/N1 RTC driver");
  342. MODULE_LICENSE("GPL");