timer-keystone.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /*
  2. * Keystone broadcast clock-event
  3. *
  4. * Copyright 2013 Texas Instruments, Inc.
  5. *
  6. * Author: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. *
  12. */
  13. #include <linux/clk.h>
  14. #include <linux/clockchips.h>
  15. #include <linux/clocksource.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/of_address.h>
  18. #include <linux/of_irq.h>
  19. #define TIMER_NAME "timer-keystone"
  20. /* Timer register offsets */
  21. #define TIM12 0x10
  22. #define TIM34 0x14
  23. #define PRD12 0x18
  24. #define PRD34 0x1c
  25. #define TCR 0x20
  26. #define TGCR 0x24
  27. #define INTCTLSTAT 0x44
  28. /* Timer register bitfields */
  29. #define TCR_ENAMODE_MASK 0xC0
  30. #define TCR_ENAMODE_ONESHOT_MASK 0x40
  31. #define TCR_ENAMODE_PERIODIC_MASK 0x80
  32. #define TGCR_TIM_UNRESET_MASK 0x03
  33. #define INTCTLSTAT_ENINT_MASK 0x01
  34. /**
  35. * struct keystone_timer: holds timer's data
  36. * @base: timer memory base address
  37. * @hz_period: cycles per HZ period
  38. * @event_dev: event device based on timer
  39. */
  40. static struct keystone_timer {
  41. void __iomem *base;
  42. unsigned long hz_period;
  43. struct clock_event_device event_dev;
  44. } timer;
  45. static inline u32 keystone_timer_readl(unsigned long rg)
  46. {
  47. return readl_relaxed(timer.base + rg);
  48. }
  49. static inline void keystone_timer_writel(u32 val, unsigned long rg)
  50. {
  51. writel_relaxed(val, timer.base + rg);
  52. }
  53. /**
  54. * keystone_timer_barrier: write memory barrier
  55. * use explicit barrier to avoid using readl/writel non relaxed function
  56. * variants, because in our case non relaxed variants hide the true places
  57. * where barrier is needed.
  58. */
  59. static inline void keystone_timer_barrier(void)
  60. {
  61. __iowmb();
  62. }
  63. /**
  64. * keystone_timer_config: configures timer to work in oneshot/periodic modes.
  65. * @ mode: mode to configure
  66. * @ period: cycles number to configure for
  67. */
  68. static int keystone_timer_config(u64 period, enum clock_event_mode mode)
  69. {
  70. u32 tcr;
  71. u32 off;
  72. tcr = keystone_timer_readl(TCR);
  73. off = tcr & ~(TCR_ENAMODE_MASK);
  74. /* set enable mode */
  75. switch (mode) {
  76. case CLOCK_EVT_MODE_ONESHOT:
  77. tcr |= TCR_ENAMODE_ONESHOT_MASK;
  78. break;
  79. case CLOCK_EVT_MODE_PERIODIC:
  80. tcr |= TCR_ENAMODE_PERIODIC_MASK;
  81. break;
  82. default:
  83. return -1;
  84. }
  85. /* disable timer */
  86. keystone_timer_writel(off, TCR);
  87. /* here we have to be sure the timer has been disabled */
  88. keystone_timer_barrier();
  89. /* reset counter to zero, set new period */
  90. keystone_timer_writel(0, TIM12);
  91. keystone_timer_writel(0, TIM34);
  92. keystone_timer_writel(period & 0xffffffff, PRD12);
  93. keystone_timer_writel(period >> 32, PRD34);
  94. /*
  95. * enable timer
  96. * here we have to be sure that CNTLO, CNTHI, PRDLO, PRDHI registers
  97. * have been written.
  98. */
  99. keystone_timer_barrier();
  100. keystone_timer_writel(tcr, TCR);
  101. return 0;
  102. }
  103. static void keystone_timer_disable(void)
  104. {
  105. u32 tcr;
  106. tcr = keystone_timer_readl(TCR);
  107. /* disable timer */
  108. tcr &= ~(TCR_ENAMODE_MASK);
  109. keystone_timer_writel(tcr, TCR);
  110. }
  111. static irqreturn_t keystone_timer_interrupt(int irq, void *dev_id)
  112. {
  113. struct clock_event_device *evt = dev_id;
  114. evt->event_handler(evt);
  115. return IRQ_HANDLED;
  116. }
  117. static int keystone_set_next_event(unsigned long cycles,
  118. struct clock_event_device *evt)
  119. {
  120. return keystone_timer_config(cycles, evt->mode);
  121. }
  122. static void keystone_set_mode(enum clock_event_mode mode,
  123. struct clock_event_device *evt)
  124. {
  125. switch (mode) {
  126. case CLOCK_EVT_MODE_PERIODIC:
  127. keystone_timer_config(timer.hz_period, CLOCK_EVT_MODE_PERIODIC);
  128. break;
  129. case CLOCK_EVT_MODE_UNUSED:
  130. case CLOCK_EVT_MODE_SHUTDOWN:
  131. case CLOCK_EVT_MODE_ONESHOT:
  132. keystone_timer_disable();
  133. break;
  134. default:
  135. break;
  136. }
  137. }
  138. static void __init keystone_timer_init(struct device_node *np)
  139. {
  140. struct clock_event_device *event_dev = &timer.event_dev;
  141. unsigned long rate;
  142. struct clk *clk;
  143. int irq, error;
  144. irq = irq_of_parse_and_map(np, 0);
  145. if (irq == NO_IRQ) {
  146. pr_err("%s: failed to map interrupts\n", __func__);
  147. return;
  148. }
  149. timer.base = of_iomap(np, 0);
  150. if (!timer.base) {
  151. pr_err("%s: failed to map registers\n", __func__);
  152. return;
  153. }
  154. clk = of_clk_get(np, 0);
  155. if (IS_ERR(clk)) {
  156. pr_err("%s: failed to get clock\n", __func__);
  157. iounmap(timer.base);
  158. return;
  159. }
  160. error = clk_prepare_enable(clk);
  161. if (error) {
  162. pr_err("%s: failed to enable clock\n", __func__);
  163. goto err;
  164. }
  165. rate = clk_get_rate(clk);
  166. /* disable, use internal clock source */
  167. keystone_timer_writel(0, TCR);
  168. /* here we have to be sure the timer has been disabled */
  169. keystone_timer_barrier();
  170. /* reset timer as 64-bit, no pre-scaler, plus features are disabled */
  171. keystone_timer_writel(0, TGCR);
  172. /* unreset timer */
  173. keystone_timer_writel(TGCR_TIM_UNRESET_MASK, TGCR);
  174. /* init counter to zero */
  175. keystone_timer_writel(0, TIM12);
  176. keystone_timer_writel(0, TIM34);
  177. timer.hz_period = DIV_ROUND_UP(rate, HZ);
  178. /* enable timer interrupts */
  179. keystone_timer_writel(INTCTLSTAT_ENINT_MASK, INTCTLSTAT);
  180. error = request_irq(irq, keystone_timer_interrupt, IRQF_TIMER,
  181. TIMER_NAME, event_dev);
  182. if (error) {
  183. pr_err("%s: failed to setup irq\n", __func__);
  184. goto err;
  185. }
  186. /* setup clockevent */
  187. event_dev->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
  188. event_dev->set_next_event = keystone_set_next_event;
  189. event_dev->set_mode = keystone_set_mode;
  190. event_dev->cpumask = cpu_all_mask;
  191. event_dev->owner = THIS_MODULE;
  192. event_dev->name = TIMER_NAME;
  193. event_dev->irq = irq;
  194. clockevents_config_and_register(event_dev, rate, 1, ULONG_MAX);
  195. pr_info("keystone timer clock @%lu Hz\n", rate);
  196. return;
  197. err:
  198. clk_put(clk);
  199. iounmap(timer.base);
  200. }
  201. CLOCKSOURCE_OF_DECLARE(keystone_timer, "ti,keystone-timer",
  202. keystone_timer_init);