timer-imx-gpt.c 13 KB

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