rtc-rk_timer.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-12-06 GuEe-GUI first version
  9. */
  10. #include "rtc_dm.h"
  11. #define TIMER_LOAD_COUNT0 0x00
  12. #define TIMER_LOAD_COUNT1 0x04
  13. #define TIMER_CURRENT_VALUE0 0x08
  14. #define TIMER_CURRENT_VALUE1 0x0c
  15. #define TIMER_CONTROL_REG3288 0x10
  16. #define TIMER_INT_STATUS 0x18
  17. #define TIMER_ENABLE RT_BIT(0)
  18. #define TIMER_MODE_USER_DEFINED_COUNT RT_BIT(1)
  19. #define TIMER_INT_UNMASK RT_BIT(2)
  20. /* Forbid any alarms which would trigger inside the threshold */
  21. #define TIMER_ALARM_THRESHOLD_MS 10
  22. #define TIMER_COUNT_MAX ((rt_uint64_t)-1)
  23. struct rk_timer_rtc_data
  24. {
  25. int ctrl_reg_offset;
  26. };
  27. struct rk_timer_rtc
  28. {
  29. struct rt_device parent;
  30. int irq;
  31. void *base;
  32. struct rt_clk *clk;
  33. struct rt_clk *pclk;
  34. rt_uint32_t freq;
  35. rt_uint64_t timebase;
  36. rt_bool_t alarm_irq_enabled;
  37. struct rt_rtc_wkalarm wkalarm;
  38. const struct rk_timer_rtc_data *soc_data;
  39. };
  40. #define raw_to_rk_timer_rtc(raw) rt_container_of(raw, struct rk_timer_rtc, parent)
  41. rt_inline rt_uint64_t tick_to_sec(struct rk_timer_rtc *rk_rtc, rt_uint64_t tick)
  42. {
  43. rt_do_div(tick, rk_rtc->freq);
  44. return tick;
  45. }
  46. rt_inline rt_uint64_t ms_to_tick(struct rk_timer_rtc *rk_rtc, int ms)
  47. {
  48. return ms * rk_rtc->freq / 1000;
  49. }
  50. rt_inline rt_uint64_t tick_to_time64(struct rk_timer_rtc *rk_rtc, rt_uint64_t tick)
  51. {
  52. return tick_to_sec(rk_rtc, tick) + rk_rtc->timebase;
  53. }
  54. rt_inline rt_uint64_t time64_to_tick(struct rk_timer_rtc *rk_rtc, rt_uint64_t time)
  55. {
  56. return (time - rk_rtc->timebase) * rk_rtc->freq;
  57. }
  58. rt_inline void rk_timer_rtc_writel(struct rk_timer_rtc *rk_rtc, int offset, rt_uint32_t value)
  59. {
  60. HWREG32(rk_rtc->base + offset) = value;
  61. }
  62. rt_inline rt_uint32_t rk_timer_rtc_readl(struct rk_timer_rtc *rk_rtc, int offset)
  63. {
  64. return HWREG32(rk_rtc->base + offset);
  65. }
  66. rt_inline void rk_timer_rtc_writeq(struct rk_timer_rtc *rk_rtc, int offset, rt_uint64_t value)
  67. {
  68. HWREG32(rk_rtc->base + offset) = value;
  69. HWREG32(rk_rtc->base + offset + 4) = value >> 32;
  70. }
  71. rt_inline rt_uint64_t rk_timer_rtc_readq(struct rk_timer_rtc *rk_rtc, int offset)
  72. {
  73. rt_uint32_t val_lo, val_hi, tmp_hi;
  74. do {
  75. val_hi = HWREG32(rk_rtc->base + offset + 4);
  76. val_lo = HWREG32(rk_rtc->base + offset);
  77. tmp_hi = HWREG32(rk_rtc->base + offset + 4);
  78. } while (val_hi != tmp_hi);
  79. return ((rt_uint64_t) val_hi << 32) | val_lo;
  80. }
  81. rt_inline void rk_timer_rtc_irq_clear(struct rk_timer_rtc *rk_rtc)
  82. {
  83. return rk_timer_rtc_writel(rk_rtc->base, TIMER_INT_STATUS, 1);
  84. }
  85. rt_inline void rk_timer_rtc_irq_enable(struct rk_timer_rtc *rk_rtc, rt_bool_t enabled)
  86. {
  87. rt_uint32_t old_val;
  88. /* Clear any pending irq before enable it */
  89. if (enabled)
  90. {
  91. rk_timer_rtc_irq_clear(rk_rtc);
  92. }
  93. old_val = rk_timer_rtc_readl(rk_rtc, rk_rtc->soc_data->ctrl_reg_offset);
  94. old_val &= ~TIMER_INT_UNMASK;
  95. rk_timer_rtc_writel(rk_rtc, rk_rtc->soc_data->ctrl_reg_offset,
  96. old_val | (enabled ? TIMER_INT_UNMASK : 0));
  97. }
  98. static void rk_timer_rtc_reset(struct rk_timer_rtc *rk_rtc)
  99. {
  100. rk_timer_rtc_writel(rk_rtc, rk_rtc->soc_data->ctrl_reg_offset, 0);
  101. /* Init load count to UINT64_MAX to keep timer running */
  102. rk_timer_rtc_writeq(rk_rtc, TIMER_LOAD_COUNT0, TIMER_COUNT_MAX);
  103. /* Clear any pending irq before enable it */
  104. rk_timer_rtc_irq_clear(rk_rtc);
  105. /* Enable timer in user-defined count mode with irq unmasked */
  106. rk_timer_rtc_writel(rk_rtc, rk_rtc->soc_data->ctrl_reg_offset,
  107. TIMER_ENABLE | TIMER_MODE_USER_DEFINED_COUNT | TIMER_INT_UNMASK);
  108. }
  109. static void rk_timer_rtc_read_time(struct rk_timer_rtc *rk_rtc, time_t *sec)
  110. {
  111. rt_uint64_t tick;
  112. tick = rk_timer_rtc_readq(rk_rtc, TIMER_CURRENT_VALUE0);
  113. *sec = (time_t)tick_to_time64(rk_rtc, tick);
  114. }
  115. static void rk_timer_rtc_set_time(struct rk_timer_rtc *rk_rtc, time_t *sec)
  116. {
  117. rk_rtc->timebase = (rt_uint64_t)*sec;
  118. rk_timer_rtc_reset(rk_rtc);
  119. }
  120. static void rk_timer_rtc_read_alarm(struct rk_timer_rtc *rk_rtc,
  121. struct rt_rtc_wkalarm *alarm)
  122. {
  123. *alarm = rk_rtc->wkalarm;
  124. alarm->enable = rk_rtc->alarm_irq_enabled;
  125. }
  126. static rt_err_t rk_timer_rtc_set_alarm(struct rk_timer_rtc *rk_rtc,
  127. struct rt_rtc_wkalarm *alarm)
  128. {
  129. rt_uint64_t alarm_tick, alarm_threshold_tick, cur_tick, time;
  130. rk_rtc->alarm_irq_enabled = alarm->enable;
  131. time = alarm->tm_hour * 3600 + alarm->tm_min * 60 + alarm->tm_sec;
  132. alarm_tick = time64_to_tick(rk_rtc, time);
  133. cur_tick = rk_timer_rtc_readq(rk_rtc, TIMER_CURRENT_VALUE0);
  134. /* Don't set an alarm in the past or about to pass */
  135. alarm_threshold_tick = ms_to_tick(rk_rtc, TIMER_ALARM_THRESHOLD_MS);
  136. if (alarm_tick <= (cur_tick + alarm_threshold_tick))
  137. {
  138. return -RT_ERROR;
  139. }
  140. /*
  141. * When the current value counts up to the load count, the timer will
  142. * stop and generate an irq.
  143. */
  144. rk_timer_rtc_writeq(rk_rtc, TIMER_LOAD_COUNT0, alarm_tick);
  145. return RT_EOK;
  146. }
  147. static rt_err_t rk_timer_rtc_control(rt_device_t dev, int cmd, void *args)
  148. {
  149. rt_err_t err = RT_EOK;
  150. struct rk_timer_rtc *rk_rtc = raw_to_rk_timer_rtc(dev);
  151. if (!args)
  152. {
  153. return -RT_EINVAL;
  154. }
  155. switch (cmd)
  156. {
  157. case RT_DEVICE_CTRL_RTC_GET_TIME:
  158. rk_timer_rtc_read_time(rk_rtc, args);
  159. break;
  160. case RT_DEVICE_CTRL_RTC_SET_TIME:
  161. rk_timer_rtc_set_time(rk_rtc, args);
  162. break;
  163. case RT_DEVICE_CTRL_RTC_GET_TIMEVAL:
  164. rk_timer_rtc_read_time(rk_rtc, (time_t *)&((struct timeval *)args)->tv_sec);
  165. break;
  166. case RT_DEVICE_CTRL_RTC_SET_TIMEVAL:
  167. rk_timer_rtc_set_time(rk_rtc, (time_t *)&((struct timeval *)args)->tv_sec);
  168. break;
  169. case RT_DEVICE_CTRL_RTC_GET_ALARM:
  170. rk_timer_rtc_read_alarm(rk_rtc, args);
  171. break;
  172. case RT_DEVICE_CTRL_RTC_SET_ALARM:
  173. err = rk_timer_rtc_set_alarm(rk_rtc, args);
  174. break;
  175. default:
  176. err = -RT_EINVAL;
  177. break;
  178. }
  179. return err;
  180. }
  181. #ifdef RT_USING_DEVICE_OPS
  182. const static struct rt_device_ops rk_timer_rtc_ops =
  183. {
  184. .control = rk_timer_rtc_control,
  185. };
  186. #endif
  187. static void rk_timer_rtc_isr(int irqno, void *param)
  188. {
  189. struct rk_timer_rtc *rk_rtc = param;
  190. rk_timer_rtc_writeq(rk_rtc, TIMER_LOAD_COUNT0, TIMER_COUNT_MAX);
  191. rk_timer_rtc_writel(rk_rtc, TIMER_INT_STATUS, 1);
  192. if (rk_rtc->alarm_irq_enabled)
  193. {
  194. rt_alarm_update(&rk_rtc->parent, 1);
  195. }
  196. }
  197. static void rk_timer_rtc_free(struct rk_timer_rtc *rk_rtc)
  198. {
  199. if (rk_rtc->base)
  200. {
  201. rt_iounmap(rk_rtc->base);
  202. }
  203. if (!rt_is_err_or_null(rk_rtc->pclk))
  204. {
  205. rt_clk_disable_unprepare(rk_rtc->pclk);
  206. rt_clk_put(rk_rtc->pclk);
  207. }
  208. if (!rt_is_err_or_null(rk_rtc->clk))
  209. {
  210. rt_clk_disable_unprepare(rk_rtc->clk);
  211. rt_clk_put(rk_rtc->clk);
  212. }
  213. rt_free(rk_rtc);
  214. }
  215. static rt_err_t rk_timer_rtc_probe(struct rt_platform_device *pdev)
  216. {
  217. rt_err_t err;
  218. const char *dev_name;
  219. struct rt_device *dev = &pdev->parent;
  220. struct rk_timer_rtc *rk_rtc = rt_calloc(1, sizeof(*rk_rtc));
  221. if (!rk_rtc)
  222. {
  223. return -RT_ENOMEM;
  224. }
  225. rk_rtc->soc_data = pdev->id->data;
  226. rk_rtc->base = rt_dm_dev_iomap(dev, 0);
  227. if (!rk_rtc->base)
  228. {
  229. err = -RT_EIO;
  230. goto _fail;
  231. }
  232. rk_rtc->irq = rt_dm_dev_get_irq(dev, 0);
  233. if (rk_rtc->irq < 0)
  234. {
  235. err = rk_rtc->irq;
  236. goto _fail;
  237. }
  238. rk_rtc->pclk = rt_clk_get_by_name(dev, "pclk");
  239. if (rt_is_err(rk_rtc->pclk))
  240. {
  241. err = rt_ptr_err(rk_rtc->pclk);
  242. goto _fail;
  243. }
  244. if ((err = rt_clk_prepare_enable(rk_rtc->pclk)))
  245. {
  246. goto _fail;
  247. }
  248. rk_rtc->clk = rt_clk_get_by_name(dev, "timer");
  249. if (rt_is_err(rk_rtc->clk))
  250. {
  251. err = rt_ptr_err(rk_rtc->clk);
  252. goto _fail;
  253. }
  254. if ((err = rt_clk_prepare_enable(rk_rtc->clk)))
  255. {
  256. goto _fail;
  257. }
  258. rk_rtc->freq = rt_clk_get_rate(rk_rtc->clk);
  259. dev->user_data = rk_rtc;
  260. rk_rtc->parent.type = RT_Device_Class_RTC;
  261. #ifdef RT_USING_DEVICE_OPS
  262. rk_rtc->parent.ops = &rk_timer_rtc_ops;
  263. #else
  264. rk_rtc->parent.control = rk_timer_rtc_control;
  265. #endif
  266. rtc_dev_set_name(&rk_rtc->parent);
  267. dev_name = rt_dm_dev_get_name(&rk_rtc->parent);
  268. rt_device_register(&rk_rtc->parent, dev_name, RT_DEVICE_FLAG_RDWR);
  269. rt_hw_interrupt_install(rk_rtc->irq, rk_timer_rtc_isr, rk_rtc, "rtc-rockchip");
  270. rt_hw_interrupt_umask(rk_rtc->irq);
  271. return RT_EOK;
  272. _fail:
  273. rk_timer_rtc_free(rk_rtc);
  274. return err;
  275. }
  276. static rt_err_t rk_timer_rtc_remove(struct rt_platform_device *pdev)
  277. {
  278. struct rk_timer_rtc *rk_rtc = pdev->parent.user_data;
  279. rt_hw_interrupt_mask(rk_rtc->irq);
  280. rt_pic_detach_irq(rk_rtc->irq, rk_rtc);
  281. rt_device_unregister(&rk_rtc->parent);
  282. rk_timer_rtc_free(rk_rtc);
  283. return RT_EOK;
  284. }
  285. static const struct rk_timer_rtc_data rk3288_timer_rtc_data =
  286. {
  287. .ctrl_reg_offset = TIMER_CONTROL_REG3288,
  288. };
  289. static const struct rt_ofw_node_id rk_timer_rtc_ofw_ids[] =
  290. {
  291. { .compatible = "rockchip,rk3308-timer-rtc", .data = &rk3288_timer_rtc_data },
  292. { /* sentinel */ }
  293. };
  294. static struct rt_platform_driver rk_timer_rtc_driver =
  295. {
  296. .name = "rk-timer-rtc",
  297. .ids = rk_timer_rtc_ofw_ids,
  298. .probe = rk_timer_rtc_probe,
  299. .remove = rk_timer_rtc_remove,
  300. };
  301. RT_PLATFORM_DRIVER_EXPORT(rk_timer_rtc_driver);