hwtimer-rockchip_timer.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  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 <rthw.h>
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #define TIMER_LOAD_COUNT0 0x00
  14. #define TIMER_LOAD_COUNT1 0x04
  15. #define TIMER_CURRENT_VALUE0 0x08
  16. #define TIMER_CURRENT_VALUE1 0x0c
  17. #define TIMER_CONTROL_REG3288 0x10
  18. #define TIMER_CONTROL_REG3399 0x1c
  19. #define TIMER_INT_STATUS 0x18
  20. #define TIMER_DISABLE 0x0
  21. #define TIMER_ENABLE 0x1
  22. #define TIMER_MODE_FREE_RUNNING (0 << 1)
  23. #define TIMER_MODE_USER_DEFINED_COUNT (1 << 1)
  24. #define TIMER_INT_UNMASK (1 << 2)
  25. #define HZ 100
  26. struct rk_timer
  27. {
  28. struct rt_hwtimer_device parent;
  29. void *base;
  30. void *ctrl;
  31. struct rt_clk *clk;
  32. struct rt_clk *pclk;
  33. int irq;
  34. rt_uint32_t freq;
  35. rt_uint32_t cycle;
  36. rt_bool_t status;
  37. struct rt_hwtimer_info info;
  38. };
  39. #define raw_to_rk_timer(raw) rt_container_of(raw, struct rk_timer, parent)
  40. struct rk_timer_data
  41. {
  42. rt_uint32_t ctrl_reg;
  43. };
  44. rt_inline void rk_timer_disable(struct rk_timer *timer)
  45. {
  46. HWREG32(timer->ctrl) = TIMER_DISABLE;
  47. }
  48. rt_inline void rk_timer_enable(struct rk_timer *timer, rt_uint32_t flags)
  49. {
  50. HWREG32(timer->ctrl) = TIMER_ENABLE | flags;
  51. }
  52. rt_inline rt_uint32_t rk_timer_current_value(struct rk_timer *timer)
  53. {
  54. return HWREG32(timer->base + TIMER_CURRENT_VALUE0);
  55. }
  56. static void rk_timer_update_counter(unsigned long cycles, struct rk_timer *timer)
  57. {
  58. HWREG32(timer->base + TIMER_LOAD_COUNT0) = cycles;
  59. HWREG32(timer->base + TIMER_LOAD_COUNT1) = 0;
  60. }
  61. static void rk_timer_interrupt_clear(struct rk_timer *timer)
  62. {
  63. HWREG32(timer->base + TIMER_INT_STATUS) = 1;
  64. }
  65. static void rk_timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state)
  66. {
  67. }
  68. static rt_err_t rk_timer_start(struct rt_hwtimer_device *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode)
  69. {
  70. rt_err_t err = RT_EOK;
  71. struct rk_timer *rk_timer = raw_to_rk_timer(timer);
  72. switch (mode)
  73. {
  74. case HWTIMER_MODE_ONESHOT:
  75. rk_timer_disable(rk_timer);
  76. rk_timer_update_counter(cnt, rk_timer);
  77. rk_timer_enable(rk_timer, TIMER_MODE_USER_DEFINED_COUNT | TIMER_INT_UNMASK);
  78. break;
  79. case HWTIMER_MODE_PERIOD:
  80. rk_timer_disable(rk_timer);
  81. rk_timer_update_counter(rk_timer->freq / HZ - 1, rk_timer);
  82. rk_timer_enable(rk_timer, TIMER_MODE_FREE_RUNNING | TIMER_INT_UNMASK);
  83. break;
  84. default:
  85. err = -RT_EINVAL;
  86. break;
  87. }
  88. if (!err)
  89. {
  90. rk_timer->cycle = cnt;
  91. rk_timer->status = RT_TRUE;
  92. }
  93. return err;
  94. }
  95. static void rk_timer_stop(struct rt_hwtimer_device *timer)
  96. {
  97. struct rk_timer *rk_timer = raw_to_rk_timer(timer);
  98. rk_timer->status = RT_FALSE;
  99. rk_timer_disable(rk_timer);
  100. }
  101. static rt_uint32_t rk_timer_count_get(struct rt_hwtimer_device *timer)
  102. {
  103. struct rk_timer *rk_timer = raw_to_rk_timer(timer);
  104. return rk_timer_current_value(rk_timer);
  105. }
  106. static rt_err_t rk_timer_ctrl(struct rt_hwtimer_device *timer, rt_uint32_t cmd, void *args)
  107. {
  108. rt_err_t err = RT_EOK;
  109. struct rk_timer *rk_timer = raw_to_rk_timer(timer);
  110. switch (cmd)
  111. {
  112. case HWTIMER_CTRL_FREQ_SET:
  113. err = -RT_ENOSYS;
  114. break;
  115. case HWTIMER_CTRL_STOP:
  116. rk_timer_stop(timer);
  117. break;
  118. case HWTIMER_CTRL_INFO_GET:
  119. if (args)
  120. {
  121. rt_memcpy(args, &rk_timer->info, sizeof(rk_timer->info));
  122. }
  123. else
  124. {
  125. err = -RT_ERROR;
  126. }
  127. break;
  128. case HWTIMER_CTRL_MODE_SET:
  129. err = rk_timer_start(timer, rk_timer->cycle, (rt_hwtimer_mode_t)args);
  130. break;
  131. default:
  132. err = -RT_EINVAL;
  133. break;
  134. }
  135. return err;
  136. }
  137. const static struct rt_hwtimer_ops rk_timer_ops =
  138. {
  139. .init = rk_timer_init,
  140. .start = rk_timer_start,
  141. .stop = rk_timer_stop,
  142. .count_get = rk_timer_count_get,
  143. .control = rk_timer_ctrl,
  144. };
  145. static void rk_timer_isr(int irqno, void *param)
  146. {
  147. struct rk_timer *rk_timer = (struct rk_timer *)param;
  148. rk_timer_interrupt_clear(rk_timer);
  149. if (rk_timer->status)
  150. {
  151. rt_device_hwtimer_isr(&rk_timer->parent);
  152. }
  153. }
  154. static void rk_timer_free(struct rk_timer *timer)
  155. {
  156. if (timer->base)
  157. {
  158. rt_iounmap(timer->base);
  159. }
  160. if (!rt_is_err_or_null(timer->pclk))
  161. {
  162. rt_clk_put(timer->pclk);
  163. }
  164. if (!rt_is_err_or_null(timer->clk))
  165. {
  166. rt_clk_put(timer->clk);
  167. }
  168. rt_free(timer);
  169. }
  170. static rt_err_t rk_timer_probe(struct rt_platform_device *pdev)
  171. {
  172. rt_err_t err = RT_EOK;
  173. const char *dev_name;
  174. struct rt_device *dev = &pdev->parent;
  175. struct rk_timer *timer = rt_calloc(1, sizeof(*timer));
  176. const struct rk_timer_data *timer_data = pdev->id->data;
  177. if (!timer)
  178. {
  179. return -RT_ENOMEM;
  180. }
  181. if (rt_is_err(timer->pclk = rt_clk_get_by_name(dev, "pclk")))
  182. {
  183. err = rt_ptr_err(timer->pclk);
  184. goto _fail;
  185. }
  186. if (rt_is_err(timer->clk = rt_clk_get_by_name(dev, "timer")))
  187. {
  188. err = rt_ptr_err(timer->clk);
  189. goto _fail;
  190. }
  191. timer->base = rt_dm_dev_iomap(dev, 0);
  192. if (!timer->base)
  193. {
  194. err = -RT_EIO;
  195. goto _fail;
  196. }
  197. dev->user_data = timer;
  198. timer->ctrl = timer->base + timer_data->ctrl_reg;
  199. rt_clk_enable(timer->pclk);
  200. rt_clk_enable(timer->clk);
  201. timer->freq = rt_clk_get_rate(timer->clk);
  202. timer->irq = rt_dm_dev_get_irq(dev, 0);
  203. rk_timer_interrupt_clear(timer);
  204. rk_timer_disable(timer);
  205. timer->parent.ops = &rk_timer_ops;
  206. timer->parent.info = &timer->info;
  207. timer->info.maxfreq = timer->freq;
  208. timer->info.minfreq = timer->freq;
  209. timer->info.maxcnt = 0xffffffff;
  210. timer->info.cntmode = HWTIMER_CNTMODE_UP;
  211. rt_dm_dev_set_name_auto(&timer->parent.parent, "timer");
  212. dev_name = rt_dm_dev_get_name(&timer->parent.parent);
  213. rt_device_hwtimer_register(&timer->parent, dev_name, RT_NULL);
  214. rt_hw_interrupt_install(timer->irq, rk_timer_isr, timer, dev_name);
  215. rt_hw_interrupt_umask(timer->irq);
  216. return RT_EOK;
  217. _fail:
  218. rk_timer_free(timer);
  219. return err;
  220. }
  221. static rt_err_t rk_timer_remove(struct rt_platform_device *pdev)
  222. {
  223. struct rk_timer *timer = pdev->parent.user_data;
  224. rt_hw_interrupt_mask(timer->irq);
  225. rt_pic_detach_irq(timer->irq, timer);
  226. rk_timer_stop(&timer->parent);
  227. rt_device_unregister(&timer->parent.parent);
  228. rk_timer_free(timer);
  229. return RT_EOK;
  230. }
  231. static const struct rk_timer_data rk3288_timer_data =
  232. {
  233. .ctrl_reg = TIMER_CONTROL_REG3288,
  234. };
  235. static const struct rk_timer_data rk3399_timer_data =
  236. {
  237. .ctrl_reg = TIMER_CONTROL_REG3399,
  238. };
  239. static const struct rt_ofw_node_id rk_timer_ofw_ids[] =
  240. {
  241. { .compatible = "rockchip,rk3288-timer", .data = &rk3288_timer_data },
  242. { .compatible = "rockchip,rk3399-timer", .data = &rk3399_timer_data },
  243. { /* sentinel */ }
  244. };
  245. static struct rt_platform_driver rk_timer_driver =
  246. {
  247. .name = "hwtimer-rockchip",
  248. .ids = rk_timer_ofw_ids,
  249. .probe = rk_timer_probe,
  250. .remove = rk_timer_remove,
  251. };
  252. RT_PLATFORM_DRIVER_EXPORT(rk_timer_driver);