timer-rockchip.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Rockchip timer support
  4. *
  5. * Copyright (C) Daniel Lezcano <[email protected]>
  6. */
  7. #include <linux/clk.h>
  8. #include <linux/clockchips.h>
  9. #include <linux/init.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/sched_clock.h>
  12. #include <linux/slab.h>
  13. #include <linux/of.h>
  14. #include <linux/of_address.h>
  15. #include <linux/of_irq.h>
  16. #define TIMER_NAME "rk_timer"
  17. #define TIMER_LOAD_COUNT0 0x00
  18. #define TIMER_LOAD_COUNT1 0x04
  19. #define TIMER_CURRENT_VALUE0 0x08
  20. #define TIMER_CURRENT_VALUE1 0x0C
  21. #define TIMER_CONTROL_REG3288 0x10
  22. #define TIMER_CONTROL_REG3399 0x1c
  23. #define TIMER_INT_STATUS 0x18
  24. #define TIMER_DISABLE 0x0
  25. #define TIMER_ENABLE 0x1
  26. #define TIMER_MODE_FREE_RUNNING (0 << 1)
  27. #define TIMER_MODE_USER_DEFINED_COUNT (1 << 1)
  28. #define TIMER_INT_UNMASK (1 << 2)
  29. struct rk_timer {
  30. void __iomem *base;
  31. void __iomem *ctrl;
  32. struct clk *clk;
  33. struct clk *pclk;
  34. u32 freq;
  35. int irq;
  36. };
  37. struct rk_clkevt {
  38. struct clock_event_device ce;
  39. struct rk_timer timer;
  40. };
  41. static struct rk_clkevt *rk_clkevt;
  42. static struct rk_timer *rk_clksrc;
  43. static inline struct rk_timer *rk_timer(struct clock_event_device *ce)
  44. {
  45. return &container_of(ce, struct rk_clkevt, ce)->timer;
  46. }
  47. static inline void rk_timer_disable(struct rk_timer *timer)
  48. {
  49. writel_relaxed(TIMER_DISABLE, timer->ctrl);
  50. }
  51. static inline void rk_timer_enable(struct rk_timer *timer, u32 flags)
  52. {
  53. writel_relaxed(TIMER_ENABLE | flags, timer->ctrl);
  54. }
  55. static void rk_timer_update_counter(unsigned long cycles,
  56. struct rk_timer *timer)
  57. {
  58. writel_relaxed(cycles, timer->base + TIMER_LOAD_COUNT0);
  59. writel_relaxed(0, timer->base + TIMER_LOAD_COUNT1);
  60. }
  61. static void rk_timer_interrupt_clear(struct rk_timer *timer)
  62. {
  63. writel_relaxed(1, timer->base + TIMER_INT_STATUS);
  64. }
  65. static inline int rk_timer_set_next_event(unsigned long cycles,
  66. struct clock_event_device *ce)
  67. {
  68. struct rk_timer *timer = rk_timer(ce);
  69. rk_timer_disable(timer);
  70. rk_timer_update_counter(cycles, timer);
  71. rk_timer_enable(timer, TIMER_MODE_USER_DEFINED_COUNT |
  72. TIMER_INT_UNMASK);
  73. return 0;
  74. }
  75. static int rk_timer_shutdown(struct clock_event_device *ce)
  76. {
  77. struct rk_timer *timer = rk_timer(ce);
  78. rk_timer_disable(timer);
  79. return 0;
  80. }
  81. static int rk_timer_set_periodic(struct clock_event_device *ce)
  82. {
  83. struct rk_timer *timer = rk_timer(ce);
  84. rk_timer_disable(timer);
  85. rk_timer_update_counter(timer->freq / HZ - 1, timer);
  86. rk_timer_enable(timer, TIMER_MODE_FREE_RUNNING | TIMER_INT_UNMASK);
  87. return 0;
  88. }
  89. static irqreturn_t rk_timer_interrupt(int irq, void *dev_id)
  90. {
  91. struct clock_event_device *ce = dev_id;
  92. struct rk_timer *timer = rk_timer(ce);
  93. rk_timer_interrupt_clear(timer);
  94. if (clockevent_state_oneshot(ce))
  95. rk_timer_disable(timer);
  96. ce->event_handler(ce);
  97. return IRQ_HANDLED;
  98. }
  99. static u64 notrace rk_timer_sched_read(void)
  100. {
  101. return ~readl_relaxed(rk_clksrc->base + TIMER_CURRENT_VALUE0);
  102. }
  103. static int __init
  104. rk_timer_probe(struct rk_timer *timer, struct device_node *np)
  105. {
  106. struct clk *timer_clk;
  107. struct clk *pclk;
  108. int ret = -EINVAL, irq;
  109. u32 ctrl_reg = TIMER_CONTROL_REG3288;
  110. timer->base = of_iomap(np, 0);
  111. if (!timer->base) {
  112. pr_err("Failed to get base address for '%s'\n", TIMER_NAME);
  113. return -ENXIO;
  114. }
  115. if (of_device_is_compatible(np, "rockchip,rk3399-timer"))
  116. ctrl_reg = TIMER_CONTROL_REG3399;
  117. timer->ctrl = timer->base + ctrl_reg;
  118. pclk = of_clk_get_by_name(np, "pclk");
  119. if (IS_ERR(pclk)) {
  120. ret = PTR_ERR(pclk);
  121. pr_err("Failed to get pclk for '%s'\n", TIMER_NAME);
  122. goto out_unmap;
  123. }
  124. ret = clk_prepare_enable(pclk);
  125. if (ret) {
  126. pr_err("Failed to enable pclk for '%s'\n", TIMER_NAME);
  127. goto out_unmap;
  128. }
  129. timer->pclk = pclk;
  130. timer_clk = of_clk_get_by_name(np, "timer");
  131. if (IS_ERR(timer_clk)) {
  132. ret = PTR_ERR(timer_clk);
  133. pr_err("Failed to get timer clock for '%s'\n", TIMER_NAME);
  134. goto out_timer_clk;
  135. }
  136. ret = clk_prepare_enable(timer_clk);
  137. if (ret) {
  138. pr_err("Failed to enable timer clock\n");
  139. goto out_timer_clk;
  140. }
  141. timer->clk = timer_clk;
  142. timer->freq = clk_get_rate(timer_clk);
  143. irq = irq_of_parse_and_map(np, 0);
  144. if (!irq) {
  145. ret = -EINVAL;
  146. pr_err("Failed to map interrupts for '%s'\n", TIMER_NAME);
  147. goto out_irq;
  148. }
  149. timer->irq = irq;
  150. rk_timer_interrupt_clear(timer);
  151. rk_timer_disable(timer);
  152. return 0;
  153. out_irq:
  154. clk_disable_unprepare(timer_clk);
  155. out_timer_clk:
  156. clk_disable_unprepare(pclk);
  157. out_unmap:
  158. iounmap(timer->base);
  159. return ret;
  160. }
  161. static void __init rk_timer_cleanup(struct rk_timer *timer)
  162. {
  163. clk_disable_unprepare(timer->clk);
  164. clk_disable_unprepare(timer->pclk);
  165. iounmap(timer->base);
  166. }
  167. static int __init rk_clkevt_init(struct device_node *np)
  168. {
  169. struct clock_event_device *ce;
  170. int ret = -EINVAL;
  171. rk_clkevt = kzalloc(sizeof(struct rk_clkevt), GFP_KERNEL);
  172. if (!rk_clkevt) {
  173. ret = -ENOMEM;
  174. goto out;
  175. }
  176. ret = rk_timer_probe(&rk_clkevt->timer, np);
  177. if (ret)
  178. goto out_probe;
  179. ce = &rk_clkevt->ce;
  180. ce->name = TIMER_NAME;
  181. ce->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT |
  182. CLOCK_EVT_FEAT_DYNIRQ;
  183. ce->set_next_event = rk_timer_set_next_event;
  184. ce->set_state_shutdown = rk_timer_shutdown;
  185. ce->set_state_periodic = rk_timer_set_periodic;
  186. ce->irq = rk_clkevt->timer.irq;
  187. ce->cpumask = cpu_possible_mask;
  188. ce->rating = 250;
  189. ret = request_irq(rk_clkevt->timer.irq, rk_timer_interrupt, IRQF_TIMER,
  190. TIMER_NAME, ce);
  191. if (ret) {
  192. pr_err("Failed to initialize '%s': %d\n",
  193. TIMER_NAME, ret);
  194. goto out_irq;
  195. }
  196. clockevents_config_and_register(&rk_clkevt->ce,
  197. rk_clkevt->timer.freq, 1, UINT_MAX);
  198. return 0;
  199. out_irq:
  200. rk_timer_cleanup(&rk_clkevt->timer);
  201. out_probe:
  202. kfree(rk_clkevt);
  203. out:
  204. /* Leave rk_clkevt not NULL to prevent future init */
  205. rk_clkevt = ERR_PTR(ret);
  206. return ret;
  207. }
  208. static int __init rk_clksrc_init(struct device_node *np)
  209. {
  210. int ret = -EINVAL;
  211. rk_clksrc = kzalloc(sizeof(struct rk_timer), GFP_KERNEL);
  212. if (!rk_clksrc) {
  213. ret = -ENOMEM;
  214. goto out;
  215. }
  216. ret = rk_timer_probe(rk_clksrc, np);
  217. if (ret)
  218. goto out_probe;
  219. rk_timer_update_counter(UINT_MAX, rk_clksrc);
  220. rk_timer_enable(rk_clksrc, 0);
  221. ret = clocksource_mmio_init(rk_clksrc->base + TIMER_CURRENT_VALUE0,
  222. TIMER_NAME, rk_clksrc->freq, 250, 32,
  223. clocksource_mmio_readl_down);
  224. if (ret) {
  225. pr_err("Failed to register clocksource\n");
  226. goto out_clocksource;
  227. }
  228. sched_clock_register(rk_timer_sched_read, 32, rk_clksrc->freq);
  229. return 0;
  230. out_clocksource:
  231. rk_timer_cleanup(rk_clksrc);
  232. out_probe:
  233. kfree(rk_clksrc);
  234. out:
  235. /* Leave rk_clksrc not NULL to prevent future init */
  236. rk_clksrc = ERR_PTR(ret);
  237. return ret;
  238. }
  239. static int __init rk_timer_init(struct device_node *np)
  240. {
  241. if (!rk_clkevt)
  242. return rk_clkevt_init(np);
  243. if (!rk_clksrc)
  244. return rk_clksrc_init(np);
  245. pr_err("Too many timer definitions for '%s'\n", TIMER_NAME);
  246. return -EINVAL;
  247. }
  248. TIMER_OF_DECLARE(rk3288_timer, "rockchip,rk3288-timer", rk_timer_init);
  249. TIMER_OF_DECLARE(rk3399_timer, "rockchip,rk3399-timer", rk_timer_init);