timer-ti-dm.c 30 KB

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