timer-imx-gpt.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. // SPDX-License-Identifier: GPL-2.0+
  2. //
  3. // Copyright (C) 2000-2001 Deep Blue Solutions
  4. // Copyright (C) 2002 Shane Nay (shane@minirl.com)
  5. // Copyright (C) 2006-2007 Pavel Pisa (ppisa@pikron.com)
  6. // Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
  7. #include <linux/interrupt.h>
  8. #include <linux/irq.h>
  9. #include <linux/clockchips.h>
  10. #include <linux/clk.h>
  11. #include <linux/delay.h>
  12. #include <linux/err.h>
  13. #include <linux/sched_clock.h>
  14. #include <linux/slab.h>
  15. #include <linux/of.h>
  16. #include <linux/of_address.h>
  17. #include <linux/of_irq.h>
  18. #include <soc/imx/timer.h>
  19. /*
  20. * There are 4 versions of the timer hardware on Freescale MXC hardware.
  21. * - MX1/MXL
  22. * - MX21, MX27.
  23. * - MX25, MX31, MX35, MX37, MX51, MX6Q(rev1.0)
  24. * - MX6DL, MX6SX, MX6Q(rev1.1+)
  25. */
  26. /* defines common for all i.MX */
  27. #define MXC_TCTL 0x00
  28. #define MXC_TCTL_TEN (1 << 0) /* Enable module */
  29. #define MXC_TPRER 0x04
  30. /* MX1, MX21, MX27 */
  31. #define MX1_2_TCTL_CLK_PCLK1 (1 << 1)
  32. #define MX1_2_TCTL_IRQEN (1 << 4)
  33. #define MX1_2_TCTL_FRR (1 << 8)
  34. #define MX1_2_TCMP 0x08
  35. #define MX1_2_TCN 0x10
  36. #define MX1_2_TSTAT 0x14
  37. /* MX21, MX27 */
  38. #define MX2_TSTAT_CAPT (1 << 1)
  39. #define MX2_TSTAT_COMP (1 << 0)
  40. /* MX31, MX35, MX25, MX5, MX6 */
  41. #define V2_TCTL_WAITEN (1 << 3) /* Wait enable mode */
  42. #define V2_TCTL_CLK_IPG (1 << 6)
  43. #define V2_TCTL_CLK_PER (2 << 6)
  44. #define V2_TCTL_CLK_OSC_DIV8 (5 << 6)
  45. #define V2_TCTL_FRR (1 << 9)
  46. #define V2_TCTL_24MEN (1 << 10)
  47. #define V2_TPRER_PRE24M 12
  48. #define V2_IR 0x0c
  49. #define V2_TSTAT 0x08
  50. #define V2_TSTAT_OF1 (1 << 0)
  51. #define V2_TCN 0x24
  52. #define V2_TCMP 0x10
  53. #define V2_TIMER_RATE_OSC_DIV8 3000000
  54. struct imx_timer {
  55. enum imx_gpt_type type;
  56. void __iomem *base;
  57. int irq;
  58. struct clk *clk_per;
  59. struct clk *clk_ipg;
  60. const struct imx_gpt_data *gpt;
  61. struct clock_event_device ced;
  62. struct irqaction act;
  63. };
  64. struct imx_gpt_data {
  65. int reg_tstat;
  66. int reg_tcn;
  67. int reg_tcmp;
  68. void (*gpt_setup_tctl)(struct imx_timer *imxtm);
  69. void (*gpt_irq_enable)(struct imx_timer *imxtm);
  70. void (*gpt_irq_disable)(struct imx_timer *imxtm);
  71. void (*gpt_irq_acknowledge)(struct imx_timer *imxtm);
  72. int (*set_next_event)(unsigned long evt,
  73. struct clock_event_device *ced);
  74. };
  75. static inline struct imx_timer *to_imx_timer(struct clock_event_device *ced)
  76. {
  77. return container_of(ced, struct imx_timer, ced);
  78. }
  79. static void imx1_gpt_irq_disable(struct imx_timer *imxtm)
  80. {
  81. unsigned int tmp;
  82. tmp = readl_relaxed(imxtm->base + MXC_TCTL);
  83. writel_relaxed(tmp & ~MX1_2_TCTL_IRQEN, imxtm->base + MXC_TCTL);
  84. }
  85. #define imx21_gpt_irq_disable imx1_gpt_irq_disable
  86. static void imx31_gpt_irq_disable(struct imx_timer *imxtm)
  87. {
  88. writel_relaxed(0, imxtm->base + V2_IR);
  89. }
  90. #define imx6dl_gpt_irq_disable imx31_gpt_irq_disable
  91. static void imx1_gpt_irq_enable(struct imx_timer *imxtm)
  92. {
  93. unsigned int tmp;
  94. tmp = readl_relaxed(imxtm->base + MXC_TCTL);
  95. writel_relaxed(tmp | MX1_2_TCTL_IRQEN, imxtm->base + MXC_TCTL);
  96. }
  97. #define imx21_gpt_irq_enable imx1_gpt_irq_enable
  98. static void imx31_gpt_irq_enable(struct imx_timer *imxtm)
  99. {
  100. writel_relaxed(1<<0, imxtm->base + V2_IR);
  101. }
  102. #define imx6dl_gpt_irq_enable imx31_gpt_irq_enable
  103. static void imx1_gpt_irq_acknowledge(struct imx_timer *imxtm)
  104. {
  105. writel_relaxed(0, imxtm->base + MX1_2_TSTAT);
  106. }
  107. static void imx21_gpt_irq_acknowledge(struct imx_timer *imxtm)
  108. {
  109. writel_relaxed(MX2_TSTAT_CAPT | MX2_TSTAT_COMP,
  110. imxtm->base + MX1_2_TSTAT);
  111. }
  112. static void imx31_gpt_irq_acknowledge(struct imx_timer *imxtm)
  113. {
  114. writel_relaxed(V2_TSTAT_OF1, imxtm->base + V2_TSTAT);
  115. }
  116. #define imx6dl_gpt_irq_acknowledge imx31_gpt_irq_acknowledge
  117. static void __iomem *sched_clock_reg;
  118. static u64 notrace mxc_read_sched_clock(void)
  119. {
  120. return sched_clock_reg ? readl_relaxed(sched_clock_reg) : 0;
  121. }
  122. static struct delay_timer imx_delay_timer;
  123. static unsigned long imx_read_current_timer(void)
  124. {
  125. return readl_relaxed(sched_clock_reg);
  126. }
  127. static int __init mxc_clocksource_init(struct imx_timer *imxtm)
  128. {
  129. unsigned int c = clk_get_rate(imxtm->clk_per);
  130. void __iomem *reg = imxtm->base + imxtm->gpt->reg_tcn;
  131. imx_delay_timer.read_current_timer = &imx_read_current_timer;
  132. imx_delay_timer.freq = c;
  133. register_current_timer_delay(&imx_delay_timer);
  134. sched_clock_reg = reg;
  135. sched_clock_register(mxc_read_sched_clock, 32, c);
  136. return clocksource_mmio_init(reg, "mxc_timer1", c, 200, 32,
  137. clocksource_mmio_readl_up);
  138. }
  139. /* clock event */
  140. static int mx1_2_set_next_event(unsigned long evt,
  141. struct clock_event_device *ced)
  142. {
  143. struct imx_timer *imxtm = to_imx_timer(ced);
  144. unsigned long tcmp;
  145. tcmp = readl_relaxed(imxtm->base + MX1_2_TCN) + evt;
  146. writel_relaxed(tcmp, imxtm->base + MX1_2_TCMP);
  147. return (int)(tcmp - readl_relaxed(imxtm->base + MX1_2_TCN)) < 0 ?
  148. -ETIME : 0;
  149. }
  150. static int v2_set_next_event(unsigned long evt,
  151. struct clock_event_device *ced)
  152. {
  153. struct imx_timer *imxtm = to_imx_timer(ced);
  154. unsigned long tcmp;
  155. tcmp = readl_relaxed(imxtm->base + V2_TCN) + evt;
  156. writel_relaxed(tcmp, imxtm->base + V2_TCMP);
  157. return evt < 0x7fffffff &&
  158. (int)(tcmp - readl_relaxed(imxtm->base + V2_TCN)) < 0 ?
  159. -ETIME : 0;
  160. }
  161. static int mxc_shutdown(struct clock_event_device *ced)
  162. {
  163. struct imx_timer *imxtm = to_imx_timer(ced);
  164. unsigned long flags;
  165. u32 tcn;
  166. /*
  167. * The timer interrupt generation is disabled at least
  168. * for enough time to call mxc_set_next_event()
  169. */
  170. local_irq_save(flags);
  171. /* Disable interrupt in GPT module */
  172. imxtm->gpt->gpt_irq_disable(imxtm);
  173. tcn = readl_relaxed(imxtm->base + imxtm->gpt->reg_tcn);
  174. /* Set event time into far-far future */
  175. writel_relaxed(tcn - 3, imxtm->base + imxtm->gpt->reg_tcmp);
  176. /* Clear pending interrupt */
  177. imxtm->gpt->gpt_irq_acknowledge(imxtm);
  178. #ifdef DEBUG
  179. printk(KERN_INFO "%s: changing mode\n", __func__);
  180. #endif /* DEBUG */
  181. local_irq_restore(flags);
  182. return 0;
  183. }
  184. static int mxc_set_oneshot(struct clock_event_device *ced)
  185. {
  186. struct imx_timer *imxtm = to_imx_timer(ced);
  187. unsigned long flags;
  188. /*
  189. * The timer interrupt generation is disabled at least
  190. * for enough time to call mxc_set_next_event()
  191. */
  192. local_irq_save(flags);
  193. /* Disable interrupt in GPT module */
  194. imxtm->gpt->gpt_irq_disable(imxtm);
  195. if (!clockevent_state_oneshot(ced)) {
  196. u32 tcn = readl_relaxed(imxtm->base + imxtm->gpt->reg_tcn);
  197. /* Set event time into far-far future */
  198. writel_relaxed(tcn - 3, imxtm->base + imxtm->gpt->reg_tcmp);
  199. /* Clear pending interrupt */
  200. imxtm->gpt->gpt_irq_acknowledge(imxtm);
  201. }
  202. #ifdef DEBUG
  203. printk(KERN_INFO "%s: changing mode\n", __func__);
  204. #endif /* DEBUG */
  205. /*
  206. * Do not put overhead of interrupt enable/disable into
  207. * mxc_set_next_event(), the core has about 4 minutes
  208. * to call mxc_set_next_event() or shutdown clock after
  209. * mode switching
  210. */
  211. imxtm->gpt->gpt_irq_enable(imxtm);
  212. local_irq_restore(flags);
  213. return 0;
  214. }
  215. /*
  216. * IRQ handler for the timer
  217. */
  218. static irqreturn_t mxc_timer_interrupt(int irq, void *dev_id)
  219. {
  220. struct clock_event_device *ced = dev_id;
  221. struct imx_timer *imxtm = to_imx_timer(ced);
  222. uint32_t tstat;
  223. tstat = readl_relaxed(imxtm->base + imxtm->gpt->reg_tstat);
  224. imxtm->gpt->gpt_irq_acknowledge(imxtm);
  225. ced->event_handler(ced);
  226. return IRQ_HANDLED;
  227. }
  228. static int __init mxc_clockevent_init(struct imx_timer *imxtm)
  229. {
  230. struct clock_event_device *ced = &imxtm->ced;
  231. struct irqaction *act = &imxtm->act;
  232. ced->name = "mxc_timer1";
  233. ced->features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_DYNIRQ;
  234. ced->set_state_shutdown = mxc_shutdown;
  235. ced->set_state_oneshot = mxc_set_oneshot;
  236. ced->tick_resume = mxc_shutdown;
  237. ced->set_next_event = imxtm->gpt->set_next_event;
  238. ced->rating = 200;
  239. ced->cpumask = cpumask_of(0);
  240. ced->irq = imxtm->irq;
  241. clockevents_config_and_register(ced, clk_get_rate(imxtm->clk_per),
  242. 0xff, 0xfffffffe);
  243. act->name = "i.MX Timer Tick";
  244. act->flags = IRQF_TIMER | IRQF_IRQPOLL;
  245. act->handler = mxc_timer_interrupt;
  246. act->dev_id = ced;
  247. return setup_irq(imxtm->irq, act);
  248. }
  249. static void imx1_gpt_setup_tctl(struct imx_timer *imxtm)
  250. {
  251. u32 tctl_val;
  252. tctl_val = MX1_2_TCTL_FRR | MX1_2_TCTL_CLK_PCLK1 | MXC_TCTL_TEN;
  253. writel_relaxed(tctl_val, imxtm->base + MXC_TCTL);
  254. }
  255. #define imx21_gpt_setup_tctl imx1_gpt_setup_tctl
  256. static void imx31_gpt_setup_tctl(struct imx_timer *imxtm)
  257. {
  258. u32 tctl_val;
  259. tctl_val = V2_TCTL_FRR | V2_TCTL_WAITEN | MXC_TCTL_TEN;
  260. if (clk_get_rate(imxtm->clk_per) == V2_TIMER_RATE_OSC_DIV8)
  261. tctl_val |= V2_TCTL_CLK_OSC_DIV8;
  262. else
  263. tctl_val |= V2_TCTL_CLK_PER;
  264. writel_relaxed(tctl_val, imxtm->base + MXC_TCTL);
  265. }
  266. static void imx6dl_gpt_setup_tctl(struct imx_timer *imxtm)
  267. {
  268. u32 tctl_val;
  269. tctl_val = V2_TCTL_FRR | V2_TCTL_WAITEN | MXC_TCTL_TEN;
  270. if (clk_get_rate(imxtm->clk_per) == V2_TIMER_RATE_OSC_DIV8) {
  271. tctl_val |= V2_TCTL_CLK_OSC_DIV8;
  272. /* 24 / 8 = 3 MHz */
  273. writel_relaxed(7 << V2_TPRER_PRE24M, imxtm->base + MXC_TPRER);
  274. tctl_val |= V2_TCTL_24MEN;
  275. } else {
  276. tctl_val |= V2_TCTL_CLK_PER;
  277. }
  278. writel_relaxed(tctl_val, imxtm->base + MXC_TCTL);
  279. }
  280. static const struct imx_gpt_data imx1_gpt_data = {
  281. .reg_tstat = MX1_2_TSTAT,
  282. .reg_tcn = MX1_2_TCN,
  283. .reg_tcmp = MX1_2_TCMP,
  284. .gpt_irq_enable = imx1_gpt_irq_enable,
  285. .gpt_irq_disable = imx1_gpt_irq_disable,
  286. .gpt_irq_acknowledge = imx1_gpt_irq_acknowledge,
  287. .gpt_setup_tctl = imx1_gpt_setup_tctl,
  288. .set_next_event = mx1_2_set_next_event,
  289. };
  290. static const struct imx_gpt_data imx21_gpt_data = {
  291. .reg_tstat = MX1_2_TSTAT,
  292. .reg_tcn = MX1_2_TCN,
  293. .reg_tcmp = MX1_2_TCMP,
  294. .gpt_irq_enable = imx21_gpt_irq_enable,
  295. .gpt_irq_disable = imx21_gpt_irq_disable,
  296. .gpt_irq_acknowledge = imx21_gpt_irq_acknowledge,
  297. .gpt_setup_tctl = imx21_gpt_setup_tctl,
  298. .set_next_event = mx1_2_set_next_event,
  299. };
  300. static const struct imx_gpt_data imx31_gpt_data = {
  301. .reg_tstat = V2_TSTAT,
  302. .reg_tcn = V2_TCN,
  303. .reg_tcmp = V2_TCMP,
  304. .gpt_irq_enable = imx31_gpt_irq_enable,
  305. .gpt_irq_disable = imx31_gpt_irq_disable,
  306. .gpt_irq_acknowledge = imx31_gpt_irq_acknowledge,
  307. .gpt_setup_tctl = imx31_gpt_setup_tctl,
  308. .set_next_event = v2_set_next_event,
  309. };
  310. static const struct imx_gpt_data imx6dl_gpt_data = {
  311. .reg_tstat = V2_TSTAT,
  312. .reg_tcn = V2_TCN,
  313. .reg_tcmp = V2_TCMP,
  314. .gpt_irq_enable = imx6dl_gpt_irq_enable,
  315. .gpt_irq_disable = imx6dl_gpt_irq_disable,
  316. .gpt_irq_acknowledge = imx6dl_gpt_irq_acknowledge,
  317. .gpt_setup_tctl = imx6dl_gpt_setup_tctl,
  318. .set_next_event = v2_set_next_event,
  319. };
  320. static int __init _mxc_timer_init(struct imx_timer *imxtm)
  321. {
  322. int ret;
  323. switch (imxtm->type) {
  324. case GPT_TYPE_IMX1:
  325. imxtm->gpt = &imx1_gpt_data;
  326. break;
  327. case GPT_TYPE_IMX21:
  328. imxtm->gpt = &imx21_gpt_data;
  329. break;
  330. case GPT_TYPE_IMX31:
  331. imxtm->gpt = &imx31_gpt_data;
  332. break;
  333. case GPT_TYPE_IMX6DL:
  334. imxtm->gpt = &imx6dl_gpt_data;
  335. break;
  336. default:
  337. return -EINVAL;
  338. }
  339. if (IS_ERR(imxtm->clk_per)) {
  340. pr_err("i.MX timer: unable to get clk\n");
  341. return PTR_ERR(imxtm->clk_per);
  342. }
  343. if (!IS_ERR(imxtm->clk_ipg))
  344. clk_prepare_enable(imxtm->clk_ipg);
  345. clk_prepare_enable(imxtm->clk_per);
  346. /*
  347. * Initialise to a known state (all timers off, and timing reset)
  348. */
  349. writel_relaxed(0, imxtm->base + MXC_TCTL);
  350. writel_relaxed(0, imxtm->base + MXC_TPRER); /* see datasheet note */
  351. imxtm->gpt->gpt_setup_tctl(imxtm);
  352. /* init and register the timer to the framework */
  353. ret = mxc_clocksource_init(imxtm);
  354. if (ret)
  355. return ret;
  356. return mxc_clockevent_init(imxtm);
  357. }
  358. void __init mxc_timer_init(unsigned long pbase, int irq, enum imx_gpt_type type)
  359. {
  360. struct imx_timer *imxtm;
  361. imxtm = kzalloc(sizeof(*imxtm), GFP_KERNEL);
  362. BUG_ON(!imxtm);
  363. imxtm->clk_per = clk_get_sys("imx-gpt.0", "per");
  364. imxtm->clk_ipg = clk_get_sys("imx-gpt.0", "ipg");
  365. imxtm->base = ioremap(pbase, SZ_4K);
  366. BUG_ON(!imxtm->base);
  367. imxtm->type = type;
  368. imxtm->irq = irq;
  369. _mxc_timer_init(imxtm);
  370. }
  371. static int __init mxc_timer_init_dt(struct device_node *np, enum imx_gpt_type type)
  372. {
  373. struct imx_timer *imxtm;
  374. static int initialized;
  375. int ret;
  376. /* Support one instance only */
  377. if (initialized)
  378. return 0;
  379. imxtm = kzalloc(sizeof(*imxtm), GFP_KERNEL);
  380. if (!imxtm)
  381. return -ENOMEM;
  382. imxtm->base = of_iomap(np, 0);
  383. if (!imxtm->base)
  384. return -ENXIO;
  385. imxtm->irq = irq_of_parse_and_map(np, 0);
  386. if (imxtm->irq <= 0)
  387. return -EINVAL;
  388. imxtm->clk_ipg = of_clk_get_by_name(np, "ipg");
  389. /* Try osc_per first, and fall back to per otherwise */
  390. imxtm->clk_per = of_clk_get_by_name(np, "osc_per");
  391. if (IS_ERR(imxtm->clk_per))
  392. imxtm->clk_per = of_clk_get_by_name(np, "per");
  393. imxtm->type = type;
  394. ret = _mxc_timer_init(imxtm);
  395. if (ret)
  396. return ret;
  397. initialized = 1;
  398. return 0;
  399. }
  400. static int __init imx1_timer_init_dt(struct device_node *np)
  401. {
  402. return mxc_timer_init_dt(np, GPT_TYPE_IMX1);
  403. }
  404. static int __init imx21_timer_init_dt(struct device_node *np)
  405. {
  406. return mxc_timer_init_dt(np, GPT_TYPE_IMX21);
  407. }
  408. static int __init imx31_timer_init_dt(struct device_node *np)
  409. {
  410. enum imx_gpt_type type = GPT_TYPE_IMX31;
  411. /*
  412. * We were using the same compatible string for i.MX6Q/D and i.MX6DL/S
  413. * GPT device, while they actually have different programming model.
  414. * This is a workaround to keep the existing i.MX6DL/S DTBs continue
  415. * working with the new kernel.
  416. */
  417. if (of_machine_is_compatible("fsl,imx6dl"))
  418. type = GPT_TYPE_IMX6DL;
  419. return mxc_timer_init_dt(np, type);
  420. }
  421. static int __init imx6dl_timer_init_dt(struct device_node *np)
  422. {
  423. return mxc_timer_init_dt(np, GPT_TYPE_IMX6DL);
  424. }
  425. TIMER_OF_DECLARE(imx1_timer, "fsl,imx1-gpt", imx1_timer_init_dt);
  426. TIMER_OF_DECLARE(imx21_timer, "fsl,imx21-gpt", imx21_timer_init_dt);
  427. TIMER_OF_DECLARE(imx27_timer, "fsl,imx27-gpt", imx21_timer_init_dt);
  428. TIMER_OF_DECLARE(imx31_timer, "fsl,imx31-gpt", imx31_timer_init_dt);
  429. TIMER_OF_DECLARE(imx25_timer, "fsl,imx25-gpt", imx31_timer_init_dt);
  430. TIMER_OF_DECLARE(imx50_timer, "fsl,imx50-gpt", imx31_timer_init_dt);
  431. TIMER_OF_DECLARE(imx51_timer, "fsl,imx51-gpt", imx31_timer_init_dt);
  432. TIMER_OF_DECLARE(imx53_timer, "fsl,imx53-gpt", imx31_timer_init_dt);
  433. TIMER_OF_DECLARE(imx6q_timer, "fsl,imx6q-gpt", imx31_timer_init_dt);
  434. TIMER_OF_DECLARE(imx6dl_timer, "fsl,imx6dl-gpt", imx6dl_timer_init_dt);
  435. TIMER_OF_DECLARE(imx6sl_timer, "fsl,imx6sl-gpt", imx6dl_timer_init_dt);
  436. TIMER_OF_DECLARE(imx6sx_timer, "fsl,imx6sx-gpt", imx6dl_timer_init_dt);