timer.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. /*
  2. * Copyright (C) 2007-2013 Michal Simek <[email protected]>
  3. * Copyright (C) 2012-2013 Xilinx, Inc.
  4. * Copyright (C) 2007-2009 PetaLogix
  5. * Copyright (C) 2006 Atmark Techno, Inc.
  6. *
  7. * This file is subject to the terms and conditions of the GNU General Public
  8. * License. See the file "COPYING" in the main directory of this archive
  9. * for more details.
  10. */
  11. #include <linux/interrupt.h>
  12. #include <linux/delay.h>
  13. #include <linux/sched.h>
  14. #include <linux/sched/clock.h>
  15. #include <linux/sched_clock.h>
  16. #include <linux/clk.h>
  17. #include <linux/clockchips.h>
  18. #include <linux/of_address.h>
  19. #include <linux/of_irq.h>
  20. #include <linux/timecounter.h>
  21. #include <asm/cpuinfo.h>
  22. static void __iomem *timer_baseaddr;
  23. static unsigned int freq_div_hz;
  24. static unsigned int timer_clock_freq;
  25. #define TCSR0 (0x00)
  26. #define TLR0 (0x04)
  27. #define TCR0 (0x08)
  28. #define TCSR1 (0x10)
  29. #define TLR1 (0x14)
  30. #define TCR1 (0x18)
  31. #define TCSR_MDT (1<<0)
  32. #define TCSR_UDT (1<<1)
  33. #define TCSR_GENT (1<<2)
  34. #define TCSR_CAPT (1<<3)
  35. #define TCSR_ARHT (1<<4)
  36. #define TCSR_LOAD (1<<5)
  37. #define TCSR_ENIT (1<<6)
  38. #define TCSR_ENT (1<<7)
  39. #define TCSR_TINT (1<<8)
  40. #define TCSR_PWMA (1<<9)
  41. #define TCSR_ENALL (1<<10)
  42. static unsigned int (*read_fn)(void __iomem *);
  43. static void (*write_fn)(u32, void __iomem *);
  44. static void timer_write32(u32 val, void __iomem *addr)
  45. {
  46. iowrite32(val, addr);
  47. }
  48. static unsigned int timer_read32(void __iomem *addr)
  49. {
  50. return ioread32(addr);
  51. }
  52. static void timer_write32_be(u32 val, void __iomem *addr)
  53. {
  54. iowrite32be(val, addr);
  55. }
  56. static unsigned int timer_read32_be(void __iomem *addr)
  57. {
  58. return ioread32be(addr);
  59. }
  60. static inline void xilinx_timer0_stop(void)
  61. {
  62. write_fn(read_fn(timer_baseaddr + TCSR0) & ~TCSR_ENT,
  63. timer_baseaddr + TCSR0);
  64. }
  65. static inline void xilinx_timer0_start_periodic(unsigned long load_val)
  66. {
  67. if (!load_val)
  68. load_val = 1;
  69. /* loading value to timer reg */
  70. write_fn(load_val, timer_baseaddr + TLR0);
  71. /* load the initial value */
  72. write_fn(TCSR_LOAD, timer_baseaddr + TCSR0);
  73. /* see timer data sheet for detail
  74. * !ENALL - don't enable 'em all
  75. * !PWMA - disable pwm
  76. * TINT - clear interrupt status
  77. * ENT- enable timer itself
  78. * ENIT - enable interrupt
  79. * !LOAD - clear the bit to let go
  80. * ARHT - auto reload
  81. * !CAPT - no external trigger
  82. * !GENT - no external signal
  83. * UDT - set the timer as down counter
  84. * !MDT0 - generate mode
  85. */
  86. write_fn(TCSR_TINT|TCSR_ENIT|TCSR_ENT|TCSR_ARHT|TCSR_UDT,
  87. timer_baseaddr + TCSR0);
  88. }
  89. static inline void xilinx_timer0_start_oneshot(unsigned long load_val)
  90. {
  91. if (!load_val)
  92. load_val = 1;
  93. /* loading value to timer reg */
  94. write_fn(load_val, timer_baseaddr + TLR0);
  95. /* load the initial value */
  96. write_fn(TCSR_LOAD, timer_baseaddr + TCSR0);
  97. write_fn(TCSR_TINT|TCSR_ENIT|TCSR_ENT|TCSR_ARHT|TCSR_UDT,
  98. timer_baseaddr + TCSR0);
  99. }
  100. static int xilinx_timer_set_next_event(unsigned long delta,
  101. struct clock_event_device *dev)
  102. {
  103. pr_debug("%s: next event, delta %x\n", __func__, (u32)delta);
  104. xilinx_timer0_start_oneshot(delta);
  105. return 0;
  106. }
  107. static int xilinx_timer_shutdown(struct clock_event_device *evt)
  108. {
  109. pr_info("%s\n", __func__);
  110. xilinx_timer0_stop();
  111. return 0;
  112. }
  113. static int xilinx_timer_set_periodic(struct clock_event_device *evt)
  114. {
  115. pr_info("%s\n", __func__);
  116. xilinx_timer0_start_periodic(freq_div_hz);
  117. return 0;
  118. }
  119. static struct clock_event_device clockevent_xilinx_timer = {
  120. .name = "xilinx_clockevent",
  121. .features = CLOCK_EVT_FEAT_ONESHOT |
  122. CLOCK_EVT_FEAT_PERIODIC,
  123. .shift = 8,
  124. .rating = 300,
  125. .set_next_event = xilinx_timer_set_next_event,
  126. .set_state_shutdown = xilinx_timer_shutdown,
  127. .set_state_periodic = xilinx_timer_set_periodic,
  128. };
  129. static inline void timer_ack(void)
  130. {
  131. write_fn(read_fn(timer_baseaddr + TCSR0), timer_baseaddr + TCSR0);
  132. }
  133. static irqreturn_t timer_interrupt(int irq, void *dev_id)
  134. {
  135. struct clock_event_device *evt = &clockevent_xilinx_timer;
  136. timer_ack();
  137. evt->event_handler(evt);
  138. return IRQ_HANDLED;
  139. }
  140. static __init int xilinx_clockevent_init(void)
  141. {
  142. clockevent_xilinx_timer.mult =
  143. div_sc(timer_clock_freq, NSEC_PER_SEC,
  144. clockevent_xilinx_timer.shift);
  145. clockevent_xilinx_timer.max_delta_ns =
  146. clockevent_delta2ns((u32)~0, &clockevent_xilinx_timer);
  147. clockevent_xilinx_timer.max_delta_ticks = (u32)~0;
  148. clockevent_xilinx_timer.min_delta_ns =
  149. clockevent_delta2ns(1, &clockevent_xilinx_timer);
  150. clockevent_xilinx_timer.min_delta_ticks = 1;
  151. clockevent_xilinx_timer.cpumask = cpumask_of(0);
  152. clockevents_register_device(&clockevent_xilinx_timer);
  153. return 0;
  154. }
  155. static u64 xilinx_clock_read(void)
  156. {
  157. return read_fn(timer_baseaddr + TCR1);
  158. }
  159. static u64 xilinx_read(struct clocksource *cs)
  160. {
  161. /* reading actual value of timer 1 */
  162. return (u64)xilinx_clock_read();
  163. }
  164. static struct timecounter xilinx_tc = {
  165. .cc = NULL,
  166. };
  167. static u64 xilinx_cc_read(const struct cyclecounter *cc)
  168. {
  169. return xilinx_read(NULL);
  170. }
  171. static struct cyclecounter xilinx_cc = {
  172. .read = xilinx_cc_read,
  173. .mask = CLOCKSOURCE_MASK(32),
  174. .shift = 8,
  175. };
  176. static int __init init_xilinx_timecounter(void)
  177. {
  178. xilinx_cc.mult = div_sc(timer_clock_freq, NSEC_PER_SEC,
  179. xilinx_cc.shift);
  180. timecounter_init(&xilinx_tc, &xilinx_cc, sched_clock());
  181. return 0;
  182. }
  183. static struct clocksource clocksource_microblaze = {
  184. .name = "xilinx_clocksource",
  185. .rating = 300,
  186. .read = xilinx_read,
  187. .mask = CLOCKSOURCE_MASK(32),
  188. .flags = CLOCK_SOURCE_IS_CONTINUOUS,
  189. };
  190. static int __init xilinx_clocksource_init(void)
  191. {
  192. int ret;
  193. ret = clocksource_register_hz(&clocksource_microblaze,
  194. timer_clock_freq);
  195. if (ret) {
  196. pr_err("failed to register clocksource");
  197. return ret;
  198. }
  199. /* stop timer1 */
  200. write_fn(read_fn(timer_baseaddr + TCSR1) & ~TCSR_ENT,
  201. timer_baseaddr + TCSR1);
  202. /* start timer1 - up counting without interrupt */
  203. write_fn(TCSR_TINT|TCSR_ENT|TCSR_ARHT, timer_baseaddr + TCSR1);
  204. /* register timecounter - for ftrace support */
  205. return init_xilinx_timecounter();
  206. }
  207. static int __init xilinx_timer_init(struct device_node *timer)
  208. {
  209. struct clk *clk;
  210. static int initialized;
  211. u32 irq;
  212. u32 timer_num = 1;
  213. int ret;
  214. /* If this property is present, the device is a PWM and not a timer */
  215. if (of_property_read_bool(timer, "#pwm-cells"))
  216. return 0;
  217. if (initialized)
  218. return -EINVAL;
  219. initialized = 1;
  220. timer_baseaddr = of_iomap(timer, 0);
  221. if (!timer_baseaddr) {
  222. pr_err("ERROR: invalid timer base address\n");
  223. return -ENXIO;
  224. }
  225. write_fn = timer_write32;
  226. read_fn = timer_read32;
  227. write_fn(TCSR_MDT, timer_baseaddr + TCSR0);
  228. if (!(read_fn(timer_baseaddr + TCSR0) & TCSR_MDT)) {
  229. write_fn = timer_write32_be;
  230. read_fn = timer_read32_be;
  231. }
  232. irq = irq_of_parse_and_map(timer, 0);
  233. if (irq <= 0) {
  234. pr_err("Failed to parse and map irq");
  235. return -EINVAL;
  236. }
  237. of_property_read_u32(timer, "xlnx,one-timer-only", &timer_num);
  238. if (timer_num) {
  239. pr_err("Please enable two timers in HW\n");
  240. return -EINVAL;
  241. }
  242. pr_info("%pOF: irq=%d\n", timer, irq);
  243. clk = of_clk_get(timer, 0);
  244. if (IS_ERR(clk)) {
  245. pr_err("ERROR: timer CCF input clock not found\n");
  246. /* If there is clock-frequency property than use it */
  247. of_property_read_u32(timer, "clock-frequency",
  248. &timer_clock_freq);
  249. } else {
  250. timer_clock_freq = clk_get_rate(clk);
  251. }
  252. if (!timer_clock_freq) {
  253. pr_err("ERROR: Using CPU clock frequency\n");
  254. timer_clock_freq = cpuinfo.cpu_clock_freq;
  255. }
  256. freq_div_hz = timer_clock_freq / HZ;
  257. ret = request_irq(irq, timer_interrupt, IRQF_TIMER, "timer",
  258. &clockevent_xilinx_timer);
  259. if (ret) {
  260. pr_err("Failed to setup IRQ");
  261. return ret;
  262. }
  263. ret = xilinx_clocksource_init();
  264. if (ret)
  265. return ret;
  266. ret = xilinx_clockevent_init();
  267. if (ret)
  268. return ret;
  269. sched_clock_register(xilinx_clock_read, 32, timer_clock_freq);
  270. return 0;
  271. }
  272. TIMER_OF_DECLARE(xilinx_timer, "xlnx,xps-timer-1.00.a",
  273. xilinx_timer_init);