timer-ti-dm.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * linux/arch/arm/plat-omap/dmtimer.c
  4. *
  5. * OMAP Dual-Mode Timers
  6. *
  7. * Copyright (C) 2010 Texas Instruments Incorporated - https://www.ti.com/
  8. * Tarun Kanti DebBarma <[email protected]>
  9. * Thara Gopinath <[email protected]>
  10. *
  11. * dmtimer adaptation to platform_driver.
  12. *
  13. * Copyright (C) 2005 Nokia Corporation
  14. * OMAP2 support by Juha Yrjola
  15. * API improvements and OMAP2 clock framework support by Timo Teras
  16. *
  17. * Copyright (C) 2009 Texas Instruments
  18. * Added OMAP4 support - Santosh Shilimkar <[email protected]>
  19. */
  20. #include <linux/clk.h>
  21. #include <linux/clk-provider.h>
  22. #include <linux/cpu_pm.h>
  23. #include <linux/module.h>
  24. #include <linux/io.h>
  25. #include <linux/device.h>
  26. #include <linux/err.h>
  27. #include <linux/pm_runtime.h>
  28. #include <linux/of.h>
  29. #include <linux/of_device.h>
  30. #include <linux/platform_device.h>
  31. #include <linux/platform_data/dmtimer-omap.h>
  32. #include <clocksource/timer-ti-dm.h>
  33. /*
  34. * timer errata flags
  35. *
  36. * Errata i103/i767 impacts all OMAP3/4/5 devices including AM33xx. This
  37. * errata prevents us from using posted mode on these devices, unless the
  38. * timer counter register is never read. For more details please refer to
  39. * the OMAP3/4/5 errata documents.
  40. */
  41. #define OMAP_TIMER_ERRATA_I103_I767 0x80000000
  42. /* posted mode types */
  43. #define OMAP_TIMER_NONPOSTED 0x00
  44. #define OMAP_TIMER_POSTED 0x01
  45. /* register offsets with the write pending bit encoded */
  46. #define WPSHIFT 16
  47. #define OMAP_TIMER_WAKEUP_EN_REG (_OMAP_TIMER_WAKEUP_EN_OFFSET \
  48. | (WP_NONE << WPSHIFT))
  49. #define OMAP_TIMER_CTRL_REG (_OMAP_TIMER_CTRL_OFFSET \
  50. | (WP_TCLR << WPSHIFT))
  51. #define OMAP_TIMER_COUNTER_REG (_OMAP_TIMER_COUNTER_OFFSET \
  52. | (WP_TCRR << WPSHIFT))
  53. #define OMAP_TIMER_LOAD_REG (_OMAP_TIMER_LOAD_OFFSET \
  54. | (WP_TLDR << WPSHIFT))
  55. #define OMAP_TIMER_TRIGGER_REG (_OMAP_TIMER_TRIGGER_OFFSET \
  56. | (WP_TTGR << WPSHIFT))
  57. #define OMAP_TIMER_WRITE_PEND_REG (_OMAP_TIMER_WRITE_PEND_OFFSET \
  58. | (WP_NONE << WPSHIFT))
  59. #define OMAP_TIMER_MATCH_REG (_OMAP_TIMER_MATCH_OFFSET \
  60. | (WP_TMAR << WPSHIFT))
  61. #define OMAP_TIMER_CAPTURE_REG (_OMAP_TIMER_CAPTURE_OFFSET \
  62. | (WP_NONE << WPSHIFT))
  63. #define OMAP_TIMER_IF_CTRL_REG (_OMAP_TIMER_IF_CTRL_OFFSET \
  64. | (WP_NONE << WPSHIFT))
  65. #define OMAP_TIMER_CAPTURE2_REG (_OMAP_TIMER_CAPTURE2_OFFSET \
  66. | (WP_NONE << WPSHIFT))
  67. #define OMAP_TIMER_TICK_POS_REG (_OMAP_TIMER_TICK_POS_OFFSET \
  68. | (WP_TPIR << WPSHIFT))
  69. #define OMAP_TIMER_TICK_NEG_REG (_OMAP_TIMER_TICK_NEG_OFFSET \
  70. | (WP_TNIR << WPSHIFT))
  71. #define OMAP_TIMER_TICK_COUNT_REG (_OMAP_TIMER_TICK_COUNT_OFFSET \
  72. | (WP_TCVR << WPSHIFT))
  73. #define OMAP_TIMER_TICK_INT_MASK_SET_REG \
  74. (_OMAP_TIMER_TICK_INT_MASK_SET_OFFSET | (WP_TOCR << WPSHIFT))
  75. #define OMAP_TIMER_TICK_INT_MASK_COUNT_REG \
  76. (_OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET | (WP_TOWR << WPSHIFT))
  77. struct timer_regs {
  78. u32 ocp_cfg;
  79. u32 tidr;
  80. u32 tier;
  81. u32 twer;
  82. u32 tclr;
  83. u32 tcrr;
  84. u32 tldr;
  85. u32 ttrg;
  86. u32 twps;
  87. u32 tmar;
  88. u32 tcar1;
  89. u32 tsicr;
  90. u32 tcar2;
  91. u32 tpir;
  92. u32 tnir;
  93. u32 tcvr;
  94. u32 tocr;
  95. u32 towr;
  96. };
  97. struct dmtimer {
  98. struct omap_dm_timer cookie;
  99. int id;
  100. int irq;
  101. struct clk *fclk;
  102. void __iomem *io_base;
  103. int irq_stat; /* TISR/IRQSTATUS interrupt status */
  104. int irq_ena; /* irq enable */
  105. int irq_dis; /* irq disable, only on v2 ip */
  106. void __iomem *pend; /* write pending */
  107. void __iomem *func_base; /* function register base */
  108. atomic_t enabled;
  109. unsigned long rate;
  110. unsigned reserved:1;
  111. unsigned posted:1;
  112. unsigned omap1:1;
  113. struct timer_regs context;
  114. int revision;
  115. u32 capability;
  116. u32 errata;
  117. struct platform_device *pdev;
  118. struct list_head node;
  119. struct notifier_block nb;
  120. struct notifier_block fclk_nb;
  121. unsigned long fclk_rate;
  122. };
  123. static u32 omap_reserved_systimers;
  124. static LIST_HEAD(omap_timer_list);
  125. static DEFINE_SPINLOCK(dm_timer_lock);
  126. enum {
  127. REQUEST_ANY = 0,
  128. REQUEST_BY_ID,
  129. REQUEST_BY_CAP,
  130. REQUEST_BY_NODE,
  131. };
  132. /**
  133. * dmtimer_read - read timer registers in posted and non-posted mode
  134. * @timer: timer pointer over which read operation to perform
  135. * @reg: lowest byte holds the register offset
  136. *
  137. * The posted mode bit is encoded in reg. Note that in posted mode, write
  138. * pending bit must be checked. Otherwise a read of a non completed write
  139. * will produce an error.
  140. */
  141. static inline u32 dmtimer_read(struct dmtimer *timer, u32 reg)
  142. {
  143. u16 wp, offset;
  144. wp = reg >> WPSHIFT;
  145. offset = reg & 0xff;
  146. /* Wait for a possible write pending bit in posted mode */
  147. if (wp && timer->posted)
  148. while (readl_relaxed(timer->pend) & wp)
  149. cpu_relax();
  150. return readl_relaxed(timer->func_base + offset);
  151. }
  152. /**
  153. * dmtimer_write - write timer registers in posted and non-posted mode
  154. * @timer: timer pointer over which write operation is to perform
  155. * @reg: lowest byte holds the register offset
  156. * @value: data to write into the register
  157. *
  158. * The posted mode bit is encoded in reg. Note that in posted mode, the write
  159. * pending bit must be checked. Otherwise a write on a register which has a
  160. * pending write will be lost.
  161. */
  162. static inline void dmtimer_write(struct dmtimer *timer, u32 reg, u32 val)
  163. {
  164. u16 wp, offset;
  165. wp = reg >> WPSHIFT;
  166. offset = reg & 0xff;
  167. /* Wait for a possible write pending bit in posted mode */
  168. if (wp && timer->posted)
  169. while (readl_relaxed(timer->pend) & wp)
  170. cpu_relax();
  171. writel_relaxed(val, timer->func_base + offset);
  172. }
  173. static inline void __omap_dm_timer_init_regs(struct dmtimer *timer)
  174. {
  175. u32 tidr;
  176. /* Assume v1 ip if bits [31:16] are zero */
  177. tidr = readl_relaxed(timer->io_base);
  178. if (!(tidr >> 16)) {
  179. timer->revision = 1;
  180. timer->irq_stat = OMAP_TIMER_V1_STAT_OFFSET;
  181. timer->irq_ena = OMAP_TIMER_V1_INT_EN_OFFSET;
  182. timer->irq_dis = OMAP_TIMER_V1_INT_EN_OFFSET;
  183. timer->pend = timer->io_base + _OMAP_TIMER_WRITE_PEND_OFFSET;
  184. timer->func_base = timer->io_base;
  185. } else {
  186. timer->revision = 2;
  187. timer->irq_stat = OMAP_TIMER_V2_IRQSTATUS - OMAP_TIMER_V2_FUNC_OFFSET;
  188. timer->irq_ena = OMAP_TIMER_V2_IRQENABLE_SET - OMAP_TIMER_V2_FUNC_OFFSET;
  189. timer->irq_dis = OMAP_TIMER_V2_IRQENABLE_CLR - OMAP_TIMER_V2_FUNC_OFFSET;
  190. timer->pend = timer->io_base +
  191. _OMAP_TIMER_WRITE_PEND_OFFSET +
  192. OMAP_TIMER_V2_FUNC_OFFSET;
  193. timer->func_base = timer->io_base + OMAP_TIMER_V2_FUNC_OFFSET;
  194. }
  195. }
  196. /*
  197. * __omap_dm_timer_enable_posted - enables write posted mode
  198. * @timer: pointer to timer instance handle
  199. *
  200. * Enables the write posted mode for the timer. When posted mode is enabled
  201. * writes to certain timer registers are immediately acknowledged by the
  202. * internal bus and hence prevents stalling the CPU waiting for the write to
  203. * complete. Enabling this feature can improve performance for writing to the
  204. * timer registers.
  205. */
  206. static inline void __omap_dm_timer_enable_posted(struct dmtimer *timer)
  207. {
  208. if (timer->posted)
  209. return;
  210. if (timer->errata & OMAP_TIMER_ERRATA_I103_I767) {
  211. timer->posted = OMAP_TIMER_NONPOSTED;
  212. dmtimer_write(timer, OMAP_TIMER_IF_CTRL_REG, 0);
  213. return;
  214. }
  215. dmtimer_write(timer, OMAP_TIMER_IF_CTRL_REG, OMAP_TIMER_CTRL_POSTED);
  216. timer->context.tsicr = OMAP_TIMER_CTRL_POSTED;
  217. timer->posted = OMAP_TIMER_POSTED;
  218. }
  219. static inline void __omap_dm_timer_stop(struct dmtimer *timer)
  220. {
  221. u32 l;
  222. l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
  223. if (l & OMAP_TIMER_CTRL_ST) {
  224. l &= ~0x1;
  225. dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l);
  226. #ifdef CONFIG_ARCH_OMAP2PLUS
  227. /* Readback to make sure write has completed */
  228. dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
  229. /*
  230. * Wait for functional clock period x 3.5 to make sure that
  231. * timer is stopped
  232. */
  233. udelay(3500000 / timer->fclk_rate + 1);
  234. #endif
  235. }
  236. /* Ack possibly pending interrupt */
  237. dmtimer_write(timer, timer->irq_stat, OMAP_TIMER_INT_OVERFLOW);
  238. }
  239. static inline void __omap_dm_timer_int_enable(struct dmtimer *timer,
  240. unsigned int value)
  241. {
  242. dmtimer_write(timer, timer->irq_ena, value);
  243. dmtimer_write(timer, OMAP_TIMER_WAKEUP_EN_REG, value);
  244. }
  245. static inline unsigned int
  246. __omap_dm_timer_read_counter(struct dmtimer *timer)
  247. {
  248. return dmtimer_read(timer, OMAP_TIMER_COUNTER_REG);
  249. }
  250. static inline void __omap_dm_timer_write_status(struct dmtimer *timer,
  251. unsigned int value)
  252. {
  253. dmtimer_write(timer, timer->irq_stat, value);
  254. }
  255. static void omap_timer_restore_context(struct dmtimer *timer)
  256. {
  257. dmtimer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, timer->context.ocp_cfg);
  258. dmtimer_write(timer, OMAP_TIMER_WAKEUP_EN_REG, timer->context.twer);
  259. dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, timer->context.tcrr);
  260. dmtimer_write(timer, OMAP_TIMER_LOAD_REG, timer->context.tldr);
  261. dmtimer_write(timer, OMAP_TIMER_MATCH_REG, timer->context.tmar);
  262. dmtimer_write(timer, OMAP_TIMER_IF_CTRL_REG, timer->context.tsicr);
  263. dmtimer_write(timer, timer->irq_ena, timer->context.tier);
  264. dmtimer_write(timer, OMAP_TIMER_CTRL_REG, timer->context.tclr);
  265. }
  266. static void omap_timer_save_context(struct dmtimer *timer)
  267. {
  268. timer->context.ocp_cfg = dmtimer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET);
  269. timer->context.tclr = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
  270. timer->context.twer = dmtimer_read(timer, OMAP_TIMER_WAKEUP_EN_REG);
  271. timer->context.tldr = dmtimer_read(timer, OMAP_TIMER_LOAD_REG);
  272. timer->context.tmar = dmtimer_read(timer, OMAP_TIMER_MATCH_REG);
  273. timer->context.tier = dmtimer_read(timer, timer->irq_ena);
  274. timer->context.tsicr = dmtimer_read(timer, OMAP_TIMER_IF_CTRL_REG);
  275. }
  276. static int omap_timer_context_notifier(struct notifier_block *nb,
  277. unsigned long cmd, void *v)
  278. {
  279. struct dmtimer *timer;
  280. timer = container_of(nb, struct dmtimer, nb);
  281. switch (cmd) {
  282. case CPU_CLUSTER_PM_ENTER:
  283. if ((timer->capability & OMAP_TIMER_ALWON) ||
  284. !atomic_read(&timer->enabled))
  285. break;
  286. omap_timer_save_context(timer);
  287. break;
  288. case CPU_CLUSTER_PM_ENTER_FAILED: /* No need to restore context */
  289. break;
  290. case CPU_CLUSTER_PM_EXIT:
  291. if ((timer->capability & OMAP_TIMER_ALWON) ||
  292. !atomic_read(&timer->enabled))
  293. break;
  294. omap_timer_restore_context(timer);
  295. break;
  296. }
  297. return NOTIFY_OK;
  298. }
  299. static int omap_timer_fclk_notifier(struct notifier_block *nb,
  300. unsigned long event, void *data)
  301. {
  302. struct clk_notifier_data *clk_data = data;
  303. struct dmtimer *timer = container_of(nb, struct dmtimer, fclk_nb);
  304. switch (event) {
  305. case POST_RATE_CHANGE:
  306. timer->fclk_rate = clk_data->new_rate;
  307. return NOTIFY_OK;
  308. default:
  309. return NOTIFY_DONE;
  310. }
  311. }
  312. static int omap_dm_timer_reset(struct dmtimer *timer)
  313. {
  314. u32 l, timeout = 100000;
  315. if (timer->revision != 1)
  316. return -EINVAL;
  317. dmtimer_write(timer, OMAP_TIMER_IF_CTRL_REG, 0x06);
  318. do {
  319. l = dmtimer_read(timer, OMAP_TIMER_V1_SYS_STAT_OFFSET);
  320. } while (!l && timeout--);
  321. if (!timeout) {
  322. dev_err(&timer->pdev->dev, "Timer failed to reset\n");
  323. return -ETIMEDOUT;
  324. }
  325. /* Configure timer for smart-idle mode */
  326. l = dmtimer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET);
  327. l |= 0x2 << 0x3;
  328. dmtimer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, l);
  329. timer->posted = 0;
  330. return 0;
  331. }
  332. /*
  333. * Functions exposed to PWM and remoteproc drivers via platform_data.
  334. * Do not use these in the driver, these will get deprecated and will
  335. * will be replaced by Linux generic framework functions such as
  336. * chained interrupts and clock framework.
  337. */
  338. static struct dmtimer *to_dmtimer(struct omap_dm_timer *cookie)
  339. {
  340. if (!cookie)
  341. return NULL;
  342. return container_of(cookie, struct dmtimer, cookie);
  343. }
  344. static int omap_dm_timer_set_source(struct omap_dm_timer *cookie, int source)
  345. {
  346. int ret;
  347. const char *parent_name;
  348. struct clk *parent;
  349. struct dmtimer_platform_data *pdata;
  350. struct dmtimer *timer;
  351. timer = to_dmtimer(cookie);
  352. if (unlikely(!timer) || IS_ERR(timer->fclk))
  353. return -EINVAL;
  354. switch (source) {
  355. case OMAP_TIMER_SRC_SYS_CLK:
  356. parent_name = "timer_sys_ck";
  357. break;
  358. case OMAP_TIMER_SRC_32_KHZ:
  359. parent_name = "timer_32k_ck";
  360. break;
  361. case OMAP_TIMER_SRC_EXT_CLK:
  362. parent_name = "timer_ext_ck";
  363. break;
  364. default:
  365. return -EINVAL;
  366. }
  367. pdata = timer->pdev->dev.platform_data;
  368. /*
  369. * FIXME: Used for OMAP1 devices only because they do not currently
  370. * use the clock framework to set the parent clock. To be removed
  371. * once OMAP1 migrated to using clock framework for dmtimers
  372. */
  373. if (timer->omap1 && pdata && pdata->set_timer_src)
  374. return pdata->set_timer_src(timer->pdev, source);
  375. #if defined(CONFIG_COMMON_CLK)
  376. /* Check if the clock has configurable parents */
  377. if (clk_hw_get_num_parents(__clk_get_hw(timer->fclk)) < 2)
  378. return 0;
  379. #endif
  380. parent = clk_get(&timer->pdev->dev, parent_name);
  381. if (IS_ERR(parent)) {
  382. pr_err("%s: %s not found\n", __func__, parent_name);
  383. return -EINVAL;
  384. }
  385. ret = clk_set_parent(timer->fclk, parent);
  386. if (ret < 0)
  387. pr_err("%s: failed to set %s as parent\n", __func__,
  388. parent_name);
  389. clk_put(parent);
  390. return ret;
  391. }
  392. static void omap_dm_timer_enable(struct omap_dm_timer *cookie)
  393. {
  394. struct dmtimer *timer = to_dmtimer(cookie);
  395. struct device *dev = &timer->pdev->dev;
  396. int rc;
  397. rc = pm_runtime_resume_and_get(dev);
  398. if (rc)
  399. dev_err(dev, "could not enable timer\n");
  400. }
  401. static void omap_dm_timer_disable(struct omap_dm_timer *cookie)
  402. {
  403. struct dmtimer *timer = to_dmtimer(cookie);
  404. struct device *dev = &timer->pdev->dev;
  405. pm_runtime_put_sync(dev);
  406. }
  407. static int omap_dm_timer_prepare(struct dmtimer *timer)
  408. {
  409. struct device *dev = &timer->pdev->dev;
  410. int rc;
  411. rc = pm_runtime_resume_and_get(dev);
  412. if (rc)
  413. return rc;
  414. if (timer->capability & OMAP_TIMER_NEEDS_RESET) {
  415. rc = omap_dm_timer_reset(timer);
  416. if (rc) {
  417. pm_runtime_put_sync(dev);
  418. return rc;
  419. }
  420. }
  421. __omap_dm_timer_enable_posted(timer);
  422. pm_runtime_put_sync(dev);
  423. return 0;
  424. }
  425. static inline u32 omap_dm_timer_reserved_systimer(int id)
  426. {
  427. return (omap_reserved_systimers & (1 << (id - 1))) ? 1 : 0;
  428. }
  429. static struct dmtimer *_omap_dm_timer_request(int req_type, void *data)
  430. {
  431. struct dmtimer *timer = NULL, *t;
  432. struct device_node *np = NULL;
  433. unsigned long flags;
  434. u32 cap = 0;
  435. int id = 0;
  436. switch (req_type) {
  437. case REQUEST_BY_ID:
  438. id = *(int *)data;
  439. break;
  440. case REQUEST_BY_CAP:
  441. cap = *(u32 *)data;
  442. break;
  443. case REQUEST_BY_NODE:
  444. np = (struct device_node *)data;
  445. break;
  446. default:
  447. /* REQUEST_ANY */
  448. break;
  449. }
  450. spin_lock_irqsave(&dm_timer_lock, flags);
  451. list_for_each_entry(t, &omap_timer_list, node) {
  452. if (t->reserved)
  453. continue;
  454. switch (req_type) {
  455. case REQUEST_BY_ID:
  456. if (id == t->pdev->id) {
  457. timer = t;
  458. timer->reserved = 1;
  459. goto found;
  460. }
  461. break;
  462. case REQUEST_BY_CAP:
  463. if (cap == (t->capability & cap)) {
  464. /*
  465. * If timer is not NULL, we have already found
  466. * one timer. But it was not an exact match
  467. * because it had more capabilities than what
  468. * was required. Therefore, unreserve the last
  469. * timer found and see if this one is a better
  470. * match.
  471. */
  472. if (timer)
  473. timer->reserved = 0;
  474. timer = t;
  475. timer->reserved = 1;
  476. /* Exit loop early if we find an exact match */
  477. if (t->capability == cap)
  478. goto found;
  479. }
  480. break;
  481. case REQUEST_BY_NODE:
  482. if (np == t->pdev->dev.of_node) {
  483. timer = t;
  484. timer->reserved = 1;
  485. goto found;
  486. }
  487. break;
  488. default:
  489. /* REQUEST_ANY */
  490. timer = t;
  491. timer->reserved = 1;
  492. goto found;
  493. }
  494. }
  495. found:
  496. spin_unlock_irqrestore(&dm_timer_lock, flags);
  497. if (timer && omap_dm_timer_prepare(timer)) {
  498. timer->reserved = 0;
  499. timer = NULL;
  500. }
  501. if (!timer)
  502. pr_debug("%s: timer request failed!\n", __func__);
  503. return timer;
  504. }
  505. static struct omap_dm_timer *omap_dm_timer_request(void)
  506. {
  507. struct dmtimer *timer;
  508. timer = _omap_dm_timer_request(REQUEST_ANY, NULL);
  509. if (!timer)
  510. return NULL;
  511. return &timer->cookie;
  512. }
  513. static struct omap_dm_timer *omap_dm_timer_request_specific(int id)
  514. {
  515. struct dmtimer *timer;
  516. /* Requesting timer by ID is not supported when device tree is used */
  517. if (of_have_populated_dt()) {
  518. pr_warn("%s: Please use omap_dm_timer_request_by_node()\n",
  519. __func__);
  520. return NULL;
  521. }
  522. timer = _omap_dm_timer_request(REQUEST_BY_ID, &id);
  523. if (!timer)
  524. return NULL;
  525. return &timer->cookie;
  526. }
  527. /**
  528. * omap_dm_timer_request_by_node - Request a timer by device-tree node
  529. * @np: Pointer to device-tree timer node
  530. *
  531. * Request a timer based upon a device node pointer. Returns pointer to
  532. * timer handle on success and a NULL pointer on failure.
  533. */
  534. static struct omap_dm_timer *omap_dm_timer_request_by_node(struct device_node *np)
  535. {
  536. struct dmtimer *timer;
  537. if (!np)
  538. return NULL;
  539. timer = _omap_dm_timer_request(REQUEST_BY_NODE, np);
  540. if (!timer)
  541. return NULL;
  542. return &timer->cookie;
  543. }
  544. static int omap_dm_timer_free(struct omap_dm_timer *cookie)
  545. {
  546. struct dmtimer *timer;
  547. timer = to_dmtimer(cookie);
  548. if (unlikely(!timer))
  549. return -EINVAL;
  550. WARN_ON(!timer->reserved);
  551. timer->reserved = 0;
  552. return 0;
  553. }
  554. int omap_dm_timer_get_irq(struct omap_dm_timer *cookie)
  555. {
  556. struct dmtimer *timer = to_dmtimer(cookie);
  557. if (timer)
  558. return timer->irq;
  559. return -EINVAL;
  560. }
  561. #if defined(CONFIG_ARCH_OMAP1)
  562. #include <linux/soc/ti/omap1-io.h>
  563. static struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *cookie)
  564. {
  565. return NULL;
  566. }
  567. /**
  568. * omap_dm_timer_modify_idlect_mask - Check if any running timers use ARMXOR
  569. * @inputmask: current value of idlect mask
  570. */
  571. __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask)
  572. {
  573. int i = 0;
  574. struct dmtimer *timer = NULL;
  575. unsigned long flags;
  576. /* If ARMXOR cannot be idled this function call is unnecessary */
  577. if (!(inputmask & (1 << 1)))
  578. return inputmask;
  579. /* If any active timer is using ARMXOR return modified mask */
  580. spin_lock_irqsave(&dm_timer_lock, flags);
  581. list_for_each_entry(timer, &omap_timer_list, node) {
  582. u32 l;
  583. l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
  584. if (l & OMAP_TIMER_CTRL_ST) {
  585. if (((omap_readl(MOD_CONF_CTRL_1) >> (i * 2)) & 0x03) == 0)
  586. inputmask &= ~(1 << 1);
  587. else
  588. inputmask &= ~(1 << 2);
  589. }
  590. i++;
  591. }
  592. spin_unlock_irqrestore(&dm_timer_lock, flags);
  593. return inputmask;
  594. }
  595. #else
  596. static struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *cookie)
  597. {
  598. struct dmtimer *timer = to_dmtimer(cookie);
  599. if (timer && !IS_ERR(timer->fclk))
  600. return timer->fclk;
  601. return NULL;
  602. }
  603. __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask)
  604. {
  605. BUG();
  606. return 0;
  607. }
  608. #endif
  609. static int omap_dm_timer_start(struct omap_dm_timer *cookie)
  610. {
  611. struct dmtimer *timer;
  612. struct device *dev;
  613. int rc;
  614. u32 l;
  615. timer = to_dmtimer(cookie);
  616. if (unlikely(!timer))
  617. return -EINVAL;
  618. dev = &timer->pdev->dev;
  619. rc = pm_runtime_resume_and_get(dev);
  620. if (rc)
  621. return rc;
  622. l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
  623. if (!(l & OMAP_TIMER_CTRL_ST)) {
  624. l |= OMAP_TIMER_CTRL_ST;
  625. dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l);
  626. }
  627. return 0;
  628. }
  629. static int omap_dm_timer_stop(struct omap_dm_timer *cookie)
  630. {
  631. struct dmtimer *timer;
  632. struct device *dev;
  633. timer = to_dmtimer(cookie);
  634. if (unlikely(!timer))
  635. return -EINVAL;
  636. dev = &timer->pdev->dev;
  637. __omap_dm_timer_stop(timer);
  638. pm_runtime_put_sync(dev);
  639. return 0;
  640. }
  641. static int omap_dm_timer_set_load(struct omap_dm_timer *cookie,
  642. unsigned int load)
  643. {
  644. struct dmtimer *timer;
  645. struct device *dev;
  646. int rc;
  647. timer = to_dmtimer(cookie);
  648. if (unlikely(!timer))
  649. return -EINVAL;
  650. dev = &timer->pdev->dev;
  651. rc = pm_runtime_resume_and_get(dev);
  652. if (rc)
  653. return rc;
  654. dmtimer_write(timer, OMAP_TIMER_LOAD_REG, load);
  655. pm_runtime_put_sync(dev);
  656. return 0;
  657. }
  658. static int omap_dm_timer_set_match(struct omap_dm_timer *cookie, int enable,
  659. unsigned int match)
  660. {
  661. struct dmtimer *timer;
  662. struct device *dev;
  663. int rc;
  664. u32 l;
  665. timer = to_dmtimer(cookie);
  666. if (unlikely(!timer))
  667. return -EINVAL;
  668. dev = &timer->pdev->dev;
  669. rc = pm_runtime_resume_and_get(dev);
  670. if (rc)
  671. return rc;
  672. l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
  673. if (enable)
  674. l |= OMAP_TIMER_CTRL_CE;
  675. else
  676. l &= ~OMAP_TIMER_CTRL_CE;
  677. dmtimer_write(timer, OMAP_TIMER_MATCH_REG, match);
  678. dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l);
  679. pm_runtime_put_sync(dev);
  680. return 0;
  681. }
  682. static int omap_dm_timer_set_pwm(struct omap_dm_timer *cookie, int def_on,
  683. int toggle, int trigger, int autoreload)
  684. {
  685. struct dmtimer *timer;
  686. struct device *dev;
  687. int rc;
  688. u32 l;
  689. timer = to_dmtimer(cookie);
  690. if (unlikely(!timer))
  691. return -EINVAL;
  692. dev = &timer->pdev->dev;
  693. rc = pm_runtime_resume_and_get(dev);
  694. if (rc)
  695. return rc;
  696. l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
  697. l &= ~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM |
  698. OMAP_TIMER_CTRL_PT | (0x03 << 10) | OMAP_TIMER_CTRL_AR);
  699. if (def_on)
  700. l |= OMAP_TIMER_CTRL_SCPWM;
  701. if (toggle)
  702. l |= OMAP_TIMER_CTRL_PT;
  703. l |= trigger << 10;
  704. if (autoreload)
  705. l |= OMAP_TIMER_CTRL_AR;
  706. dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l);
  707. pm_runtime_put_sync(dev);
  708. return 0;
  709. }
  710. static int omap_dm_timer_get_pwm_status(struct omap_dm_timer *cookie)
  711. {
  712. struct dmtimer *timer;
  713. struct device *dev;
  714. int rc;
  715. u32 l;
  716. timer = to_dmtimer(cookie);
  717. if (unlikely(!timer))
  718. return -EINVAL;
  719. dev = &timer->pdev->dev;
  720. rc = pm_runtime_resume_and_get(dev);
  721. if (rc)
  722. return rc;
  723. l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
  724. pm_runtime_put_sync(dev);
  725. return l;
  726. }
  727. static int omap_dm_timer_set_prescaler(struct omap_dm_timer *cookie,
  728. int prescaler)
  729. {
  730. struct dmtimer *timer;
  731. struct device *dev;
  732. int rc;
  733. u32 l;
  734. timer = to_dmtimer(cookie);
  735. if (unlikely(!timer) || prescaler < -1 || prescaler > 7)
  736. return -EINVAL;
  737. dev = &timer->pdev->dev;
  738. rc = pm_runtime_resume_and_get(dev);
  739. if (rc)
  740. return rc;
  741. l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
  742. l &= ~(OMAP_TIMER_CTRL_PRE | (0x07 << 2));
  743. if (prescaler >= 0) {
  744. l |= OMAP_TIMER_CTRL_PRE;
  745. l |= prescaler << 2;
  746. }
  747. dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l);
  748. pm_runtime_put_sync(dev);
  749. return 0;
  750. }
  751. static int omap_dm_timer_set_int_enable(struct omap_dm_timer *cookie,
  752. unsigned int value)
  753. {
  754. struct dmtimer *timer;
  755. struct device *dev;
  756. int rc;
  757. timer = to_dmtimer(cookie);
  758. if (unlikely(!timer))
  759. return -EINVAL;
  760. dev = &timer->pdev->dev;
  761. rc = pm_runtime_resume_and_get(dev);
  762. if (rc)
  763. return rc;
  764. __omap_dm_timer_int_enable(timer, value);
  765. pm_runtime_put_sync(dev);
  766. return 0;
  767. }
  768. /**
  769. * omap_dm_timer_set_int_disable - disable timer interrupts
  770. * @timer: pointer to timer handle
  771. * @mask: bit mask of interrupts to be disabled
  772. *
  773. * Disables the specified timer interrupts for a timer.
  774. */
  775. static int omap_dm_timer_set_int_disable(struct omap_dm_timer *cookie, u32 mask)
  776. {
  777. struct dmtimer *timer;
  778. struct device *dev;
  779. u32 l = mask;
  780. int rc;
  781. timer = to_dmtimer(cookie);
  782. if (unlikely(!timer))
  783. return -EINVAL;
  784. dev = &timer->pdev->dev;
  785. rc = pm_runtime_resume_and_get(dev);
  786. if (rc)
  787. return rc;
  788. if (timer->revision == 1)
  789. l = dmtimer_read(timer, timer->irq_ena) & ~mask;
  790. dmtimer_write(timer, timer->irq_dis, l);
  791. l = dmtimer_read(timer, OMAP_TIMER_WAKEUP_EN_REG) & ~mask;
  792. dmtimer_write(timer, OMAP_TIMER_WAKEUP_EN_REG, l);
  793. pm_runtime_put_sync(dev);
  794. return 0;
  795. }
  796. static unsigned int omap_dm_timer_read_status(struct omap_dm_timer *cookie)
  797. {
  798. struct dmtimer *timer;
  799. unsigned int l;
  800. timer = to_dmtimer(cookie);
  801. if (unlikely(!timer || !atomic_read(&timer->enabled))) {
  802. pr_err("%s: timer not available or enabled.\n", __func__);
  803. return 0;
  804. }
  805. l = dmtimer_read(timer, timer->irq_stat);
  806. return l;
  807. }
  808. static int omap_dm_timer_write_status(struct omap_dm_timer *cookie, unsigned int value)
  809. {
  810. struct dmtimer *timer;
  811. timer = to_dmtimer(cookie);
  812. if (unlikely(!timer || !atomic_read(&timer->enabled)))
  813. return -EINVAL;
  814. __omap_dm_timer_write_status(timer, value);
  815. return 0;
  816. }
  817. static unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *cookie)
  818. {
  819. struct dmtimer *timer;
  820. timer = to_dmtimer(cookie);
  821. if (unlikely(!timer || !atomic_read(&timer->enabled))) {
  822. pr_err("%s: timer not iavailable or enabled.\n", __func__);
  823. return 0;
  824. }
  825. return __omap_dm_timer_read_counter(timer);
  826. }
  827. static int omap_dm_timer_write_counter(struct omap_dm_timer *cookie, unsigned int value)
  828. {
  829. struct dmtimer *timer;
  830. timer = to_dmtimer(cookie);
  831. if (unlikely(!timer || !atomic_read(&timer->enabled))) {
  832. pr_err("%s: timer not available or enabled.\n", __func__);
  833. return -EINVAL;
  834. }
  835. dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, value);
  836. /* Save the context */
  837. timer->context.tcrr = value;
  838. return 0;
  839. }
  840. static int __maybe_unused omap_dm_timer_runtime_suspend(struct device *dev)
  841. {
  842. struct dmtimer *timer = dev_get_drvdata(dev);
  843. atomic_set(&timer->enabled, 0);
  844. if (timer->capability & OMAP_TIMER_ALWON || !timer->func_base)
  845. return 0;
  846. omap_timer_save_context(timer);
  847. return 0;
  848. }
  849. static int __maybe_unused omap_dm_timer_runtime_resume(struct device *dev)
  850. {
  851. struct dmtimer *timer = dev_get_drvdata(dev);
  852. if (!(timer->capability & OMAP_TIMER_ALWON) && timer->func_base)
  853. omap_timer_restore_context(timer);
  854. atomic_set(&timer->enabled, 1);
  855. return 0;
  856. }
  857. static const struct dev_pm_ops omap_dm_timer_pm_ops = {
  858. SET_RUNTIME_PM_OPS(omap_dm_timer_runtime_suspend,
  859. omap_dm_timer_runtime_resume, NULL)
  860. };
  861. static const struct of_device_id omap_timer_match[];
  862. /**
  863. * omap_dm_timer_probe - probe function called for every registered device
  864. * @pdev: pointer to current timer platform device
  865. *
  866. * Called by driver framework at the end of device registration for all
  867. * timer devices.
  868. */
  869. static int omap_dm_timer_probe(struct platform_device *pdev)
  870. {
  871. unsigned long flags;
  872. struct dmtimer *timer;
  873. struct device *dev = &pdev->dev;
  874. const struct dmtimer_platform_data *pdata;
  875. int ret;
  876. pdata = of_device_get_match_data(dev);
  877. if (!pdata)
  878. pdata = dev_get_platdata(dev);
  879. else
  880. dev->platform_data = (void *)pdata;
  881. if (!pdata) {
  882. dev_err(dev, "%s: no platform data.\n", __func__);
  883. return -ENODEV;
  884. }
  885. timer = devm_kzalloc(dev, sizeof(*timer), GFP_KERNEL);
  886. if (!timer)
  887. return -ENOMEM;
  888. timer->irq = platform_get_irq(pdev, 0);
  889. if (timer->irq < 0)
  890. return timer->irq;
  891. timer->io_base = devm_platform_ioremap_resource(pdev, 0);
  892. if (IS_ERR(timer->io_base))
  893. return PTR_ERR(timer->io_base);
  894. platform_set_drvdata(pdev, timer);
  895. if (dev->of_node) {
  896. if (of_find_property(dev->of_node, "ti,timer-alwon", NULL))
  897. timer->capability |= OMAP_TIMER_ALWON;
  898. if (of_find_property(dev->of_node, "ti,timer-dsp", NULL))
  899. timer->capability |= OMAP_TIMER_HAS_DSP_IRQ;
  900. if (of_find_property(dev->of_node, "ti,timer-pwm", NULL))
  901. timer->capability |= OMAP_TIMER_HAS_PWM;
  902. if (of_find_property(dev->of_node, "ti,timer-secure", NULL))
  903. timer->capability |= OMAP_TIMER_SECURE;
  904. } else {
  905. timer->id = pdev->id;
  906. timer->capability = pdata->timer_capability;
  907. timer->reserved = omap_dm_timer_reserved_systimer(timer->id);
  908. }
  909. timer->omap1 = timer->capability & OMAP_TIMER_NEEDS_RESET;
  910. /* OMAP1 devices do not yet use the clock framework for dmtimers */
  911. if (!timer->omap1) {
  912. timer->fclk = devm_clk_get(dev, "fck");
  913. if (IS_ERR(timer->fclk))
  914. return PTR_ERR(timer->fclk);
  915. timer->fclk_nb.notifier_call = omap_timer_fclk_notifier;
  916. ret = devm_clk_notifier_register(dev, timer->fclk,
  917. &timer->fclk_nb);
  918. if (ret)
  919. return ret;
  920. timer->fclk_rate = clk_get_rate(timer->fclk);
  921. } else {
  922. timer->fclk = ERR_PTR(-ENODEV);
  923. }
  924. if (!(timer->capability & OMAP_TIMER_ALWON)) {
  925. timer->nb.notifier_call = omap_timer_context_notifier;
  926. cpu_pm_register_notifier(&timer->nb);
  927. }
  928. timer->errata = pdata->timer_errata;
  929. timer->pdev = pdev;
  930. pm_runtime_enable(dev);
  931. if (!timer->reserved) {
  932. ret = pm_runtime_resume_and_get(dev);
  933. if (ret) {
  934. dev_err(dev, "%s: pm_runtime_get_sync failed!\n",
  935. __func__);
  936. goto err_disable;
  937. }
  938. __omap_dm_timer_init_regs(timer);
  939. pm_runtime_put(dev);
  940. }
  941. /* add the timer element to the list */
  942. spin_lock_irqsave(&dm_timer_lock, flags);
  943. list_add_tail(&timer->node, &omap_timer_list);
  944. spin_unlock_irqrestore(&dm_timer_lock, flags);
  945. dev_dbg(dev, "Device Probed.\n");
  946. return 0;
  947. err_disable:
  948. pm_runtime_disable(dev);
  949. return ret;
  950. }
  951. /**
  952. * omap_dm_timer_remove - cleanup a registered timer device
  953. * @pdev: pointer to current timer platform device
  954. *
  955. * Called by driver framework whenever a timer device is unregistered.
  956. * In addition to freeing platform resources it also deletes the timer
  957. * entry from the local list.
  958. */
  959. static int omap_dm_timer_remove(struct platform_device *pdev)
  960. {
  961. struct dmtimer *timer;
  962. unsigned long flags;
  963. int ret = -EINVAL;
  964. spin_lock_irqsave(&dm_timer_lock, flags);
  965. list_for_each_entry(timer, &omap_timer_list, node)
  966. if (!strcmp(dev_name(&timer->pdev->dev),
  967. dev_name(&pdev->dev))) {
  968. if (!(timer->capability & OMAP_TIMER_ALWON))
  969. cpu_pm_unregister_notifier(&timer->nb);
  970. list_del(&timer->node);
  971. ret = 0;
  972. break;
  973. }
  974. spin_unlock_irqrestore(&dm_timer_lock, flags);
  975. pm_runtime_disable(&pdev->dev);
  976. return ret;
  977. }
  978. static const struct omap_dm_timer_ops dmtimer_ops = {
  979. .request_by_node = omap_dm_timer_request_by_node,
  980. .request_specific = omap_dm_timer_request_specific,
  981. .request = omap_dm_timer_request,
  982. .set_source = omap_dm_timer_set_source,
  983. .get_irq = omap_dm_timer_get_irq,
  984. .set_int_enable = omap_dm_timer_set_int_enable,
  985. .set_int_disable = omap_dm_timer_set_int_disable,
  986. .free = omap_dm_timer_free,
  987. .enable = omap_dm_timer_enable,
  988. .disable = omap_dm_timer_disable,
  989. .get_fclk = omap_dm_timer_get_fclk,
  990. .start = omap_dm_timer_start,
  991. .stop = omap_dm_timer_stop,
  992. .set_load = omap_dm_timer_set_load,
  993. .set_match = omap_dm_timer_set_match,
  994. .set_pwm = omap_dm_timer_set_pwm,
  995. .get_pwm_status = omap_dm_timer_get_pwm_status,
  996. .set_prescaler = omap_dm_timer_set_prescaler,
  997. .read_counter = omap_dm_timer_read_counter,
  998. .write_counter = omap_dm_timer_write_counter,
  999. .read_status = omap_dm_timer_read_status,
  1000. .write_status = omap_dm_timer_write_status,
  1001. };
  1002. static const struct dmtimer_platform_data omap3plus_pdata = {
  1003. .timer_errata = OMAP_TIMER_ERRATA_I103_I767,
  1004. .timer_ops = &dmtimer_ops,
  1005. };
  1006. static const struct dmtimer_platform_data am6_pdata = {
  1007. .timer_ops = &dmtimer_ops,
  1008. };
  1009. static const struct of_device_id omap_timer_match[] = {
  1010. {
  1011. .compatible = "ti,omap2420-timer",
  1012. },
  1013. {
  1014. .compatible = "ti,omap3430-timer",
  1015. .data = &omap3plus_pdata,
  1016. },
  1017. {
  1018. .compatible = "ti,omap4430-timer",
  1019. .data = &omap3plus_pdata,
  1020. },
  1021. {
  1022. .compatible = "ti,omap5430-timer",
  1023. .data = &omap3plus_pdata,
  1024. },
  1025. {
  1026. .compatible = "ti,am335x-timer",
  1027. .data = &omap3plus_pdata,
  1028. },
  1029. {
  1030. .compatible = "ti,am335x-timer-1ms",
  1031. .data = &omap3plus_pdata,
  1032. },
  1033. {
  1034. .compatible = "ti,dm816-timer",
  1035. .data = &omap3plus_pdata,
  1036. },
  1037. {
  1038. .compatible = "ti,am654-timer",
  1039. .data = &am6_pdata,
  1040. },
  1041. {},
  1042. };
  1043. MODULE_DEVICE_TABLE(of, omap_timer_match);
  1044. static struct platform_driver omap_dm_timer_driver = {
  1045. .probe = omap_dm_timer_probe,
  1046. .remove = omap_dm_timer_remove,
  1047. .driver = {
  1048. .name = "omap_timer",
  1049. .of_match_table = omap_timer_match,
  1050. .pm = &omap_dm_timer_pm_ops,
  1051. },
  1052. };
  1053. module_platform_driver(omap_dm_timer_driver);
  1054. MODULE_DESCRIPTION("OMAP Dual-Mode Timer Driver");
  1055. MODULE_LICENSE("GPL");
  1056. MODULE_AUTHOR("Texas Instruments Inc");