xref: /linux/drivers/clocksource/timer-ti-dm.c (revision bba2c3615bd6cfee7456d1130f2e6b01b3f4e9ba)
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 
21 #include <linux/clk.h>
22 #include <linux/clk-provider.h>
23 #include <linux/clocksource.h>
24 #include <linux/clockchips.h>
25 #include <linux/cpu_pm.h>
26 #include <linux/module.h>
27 #include <linux/interrupt.h>
28 #include <linux/io.h>
29 #include <linux/device.h>
30 #include <linux/err.h>
31 #include <linux/pm_runtime.h>
32 #include <linux/of.h>
33 #include <linux/platform_device.h>
34 #include <linux/platform_data/dmtimer-omap.h>
35 #include <linux/sched_clock.h>
36 
37 #include <clocksource/timer-ti-dm.h>
38 #include <linux/delay.h>
39 
40 /*
41  * timer errata flags
42  *
43  * Errata i103/i767 impacts all OMAP3/4/5 devices including AM33xx. This
44  * errata prevents us from using posted mode on these devices, unless the
45  * timer counter register is never read. For more details please refer to
46  * the OMAP3/4/5 errata documents.
47  */
48 #define OMAP_TIMER_ERRATA_I103_I767			0x80000000
49 
50 /* posted mode types */
51 #define OMAP_TIMER_NONPOSTED			0x00
52 #define OMAP_TIMER_POSTED			0x01
53 
54 /* register offsets with the write pending bit encoded */
55 #define	WPSHIFT					16
56 
57 #define OMAP_TIMER_WAKEUP_EN_REG		(_OMAP_TIMER_WAKEUP_EN_OFFSET \
58 							| (WP_NONE << WPSHIFT))
59 
60 #define OMAP_TIMER_CTRL_REG			(_OMAP_TIMER_CTRL_OFFSET \
61 							| (WP_TCLR << WPSHIFT))
62 
63 #define OMAP_TIMER_COUNTER_REG			(_OMAP_TIMER_COUNTER_OFFSET \
64 							| (WP_TCRR << WPSHIFT))
65 
66 #define OMAP_TIMER_LOAD_REG			(_OMAP_TIMER_LOAD_OFFSET \
67 							| (WP_TLDR << WPSHIFT))
68 
69 #define OMAP_TIMER_TRIGGER_REG			(_OMAP_TIMER_TRIGGER_OFFSET \
70 							| (WP_TTGR << WPSHIFT))
71 
72 #define OMAP_TIMER_WRITE_PEND_REG		(_OMAP_TIMER_WRITE_PEND_OFFSET \
73 							| (WP_NONE << WPSHIFT))
74 
75 #define OMAP_TIMER_MATCH_REG			(_OMAP_TIMER_MATCH_OFFSET \
76 							| (WP_TMAR << WPSHIFT))
77 
78 #define OMAP_TIMER_CAPTURE_REG			(_OMAP_TIMER_CAPTURE_OFFSET \
79 							| (WP_NONE << WPSHIFT))
80 
81 #define OMAP_TIMER_IF_CTRL_REG			(_OMAP_TIMER_IF_CTRL_OFFSET \
82 							| (WP_NONE << WPSHIFT))
83 
84 #define OMAP_TIMER_CAPTURE2_REG			(_OMAP_TIMER_CAPTURE2_OFFSET \
85 							| (WP_NONE << WPSHIFT))
86 
87 #define OMAP_TIMER_TICK_POS_REG			(_OMAP_TIMER_TICK_POS_OFFSET \
88 							| (WP_TPIR << WPSHIFT))
89 
90 #define OMAP_TIMER_TICK_NEG_REG			(_OMAP_TIMER_TICK_NEG_OFFSET \
91 							| (WP_TNIR << WPSHIFT))
92 
93 #define OMAP_TIMER_TICK_COUNT_REG		(_OMAP_TIMER_TICK_COUNT_OFFSET \
94 							| (WP_TCVR << WPSHIFT))
95 
96 #define OMAP_TIMER_TICK_INT_MASK_SET_REG				\
97 		(_OMAP_TIMER_TICK_INT_MASK_SET_OFFSET | (WP_TOCR << WPSHIFT))
98 
99 #define OMAP_TIMER_TICK_INT_MASK_COUNT_REG				\
100 		(_OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET | (WP_TOWR << WPSHIFT))
101 
102 struct timer_regs {
103 	u32 ocp_cfg;
104 	u32 tidr;
105 	u32 tier;
106 	u32 twer;
107 	u32 tclr;
108 	u32 tcrr;
109 	u32 tldr;
110 	u32 ttrg;
111 	u32 twps;
112 	u32 tmar;
113 	u32 tcar1;
114 	u32 tsicr;
115 	u32 tcar2;
116 	u32 tpir;
117 	u32 tnir;
118 	u32 tcvr;
119 	u32 tocr;
120 	u32 towr;
121 };
122 
123 struct dmtimer {
124 	struct omap_dm_timer cookie;
125 	int id;
126 	int irq;
127 	struct clk *fclk;
128 
129 	void __iomem	*io_base;
130 	int		irq_stat;	/* TISR/IRQSTATUS interrupt status */
131 	int		irq_ena;	/* irq enable */
132 	int		irq_dis;	/* irq disable, only on v2 ip */
133 	void __iomem	*pend;		/* write pending */
134 	void __iomem	*func_base;	/* function register base */
135 
136 	atomic_t enabled;
137 	unsigned reserved:1;
138 	unsigned posted:1;
139 	unsigned omap1:1;
140 	struct timer_regs context;
141 	int revision;
142 	u32 capability;
143 	u32 errata;
144 	struct platform_device *pdev;
145 	struct list_head node;
146 	struct notifier_block nb;
147 	struct notifier_block fclk_nb;
148 	unsigned long fclk_rate;
149 };
150 
151 static u32 omap_reserved_systimers;
152 static LIST_HEAD(omap_timer_list);
153 static DEFINE_SPINLOCK(dm_timer_lock);
154 
155 struct dmtimer_clocksource {
156 	struct clocksource dev;
157 	struct dmtimer *timer;
158 	unsigned int loadval;
159 };
160 
161 struct omap_dm_timer_clockevent {
162 	struct clock_event_device dev;
163 	struct dmtimer *timer;
164 	u32 period;
165 };
166 
167 static bool omap_dm_timer_clockevent_setup;
168 static void __iomem *omap_dm_timer_sched_clock_counter;
169 
170 enum {
171 	REQUEST_ANY = 0,
172 	REQUEST_BY_ID,
173 	REQUEST_BY_CAP,
174 	REQUEST_BY_NODE,
175 };
176 
177 /**
178  * dmtimer_read - read timer registers in posted and non-posted mode
179  * @timer:	timer pointer over which read operation to perform
180  * @reg:	lowest byte holds the register offset
181  *
182  * The posted mode bit is encoded in reg. Note that in posted mode, write
183  * pending bit must be checked. Otherwise a read of a non completed write
184  * will produce an error.
185  */
186 static inline u32 dmtimer_read(struct dmtimer *timer, u32 reg)
187 {
188 	u16 wp, offset;
189 
190 	wp = reg >> WPSHIFT;
191 	offset = reg & 0xff;
192 
193 	/* Wait for a possible write pending bit in posted mode */
194 	if (wp && timer->posted)
195 		while (readl_relaxed(timer->pend) & wp)
196 			cpu_relax();
197 
198 	return readl_relaxed(timer->func_base + offset);
199 }
200 
201 /**
202  * dmtimer_write - write timer registers in posted and non-posted mode
203  * @timer:      timer pointer over which write operation is to perform
204  * @reg:        lowest byte holds the register offset
205  * @val:        data to write into the register
206  *
207  * The posted mode bit is encoded in reg. Note that in posted mode, the write
208  * pending bit must be checked. Otherwise a write on a register which has a
209  * pending write will be lost.
210  */
211 static inline void dmtimer_write(struct dmtimer *timer, u32 reg, u32 val)
212 {
213 	u16 wp, offset;
214 
215 	wp = reg >> WPSHIFT;
216 	offset = reg & 0xff;
217 
218 	/* Wait for a possible write pending bit in posted mode */
219 	if (wp && timer->posted)
220 		while (readl_relaxed(timer->pend) & wp)
221 			cpu_relax();
222 
223 	writel_relaxed(val, timer->func_base + offset);
224 }
225 
226 static inline void __omap_dm_timer_init_regs(struct dmtimer *timer)
227 {
228 	u32 tidr;
229 
230 	/* Assume v1 ip if bits [31:16] are zero */
231 	tidr = readl_relaxed(timer->io_base);
232 	if (!(tidr >> 16)) {
233 		timer->revision = 1;
234 		timer->irq_stat = OMAP_TIMER_V1_STAT_OFFSET;
235 		timer->irq_ena = OMAP_TIMER_V1_INT_EN_OFFSET;
236 		timer->irq_dis = OMAP_TIMER_V1_INT_EN_OFFSET;
237 		timer->pend = timer->io_base + _OMAP_TIMER_WRITE_PEND_OFFSET;
238 		timer->func_base = timer->io_base;
239 	} else {
240 		timer->revision = 2;
241 		timer->irq_stat = OMAP_TIMER_V2_IRQSTATUS - OMAP_TIMER_V2_FUNC_OFFSET;
242 		timer->irq_ena = OMAP_TIMER_V2_IRQENABLE_SET - OMAP_TIMER_V2_FUNC_OFFSET;
243 		timer->irq_dis = OMAP_TIMER_V2_IRQENABLE_CLR - OMAP_TIMER_V2_FUNC_OFFSET;
244 		timer->pend = timer->io_base +
245 			_OMAP_TIMER_WRITE_PEND_OFFSET +
246 				OMAP_TIMER_V2_FUNC_OFFSET;
247 		timer->func_base = timer->io_base + OMAP_TIMER_V2_FUNC_OFFSET;
248 	}
249 }
250 
251 /*
252  * __omap_dm_timer_enable_posted - enables write posted mode
253  * @timer:      pointer to timer instance handle
254  *
255  * Enables the write posted mode for the timer. When posted mode is enabled
256  * writes to certain timer registers are immediately acknowledged by the
257  * internal bus and hence prevents stalling the CPU waiting for the write to
258  * complete. Enabling this feature can improve performance for writing to the
259  * timer registers.
260  */
261 static inline void __omap_dm_timer_enable_posted(struct dmtimer *timer)
262 {
263 	if (timer->posted)
264 		return;
265 
266 	if (timer->errata & OMAP_TIMER_ERRATA_I103_I767) {
267 		timer->posted = OMAP_TIMER_NONPOSTED;
268 		dmtimer_write(timer, OMAP_TIMER_IF_CTRL_REG, 0);
269 		return;
270 	}
271 
272 	dmtimer_write(timer, OMAP_TIMER_IF_CTRL_REG, OMAP_TIMER_CTRL_POSTED);
273 	timer->context.tsicr = OMAP_TIMER_CTRL_POSTED;
274 	timer->posted = OMAP_TIMER_POSTED;
275 }
276 
277 static inline void __omap_dm_timer_stop(struct dmtimer *timer)
278 {
279 	u32 l;
280 
281 	l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
282 	if (l & OMAP_TIMER_CTRL_ST) {
283 		l &= ~0x1;
284 		dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l);
285 #ifdef CONFIG_ARCH_OMAP2PLUS
286 		/* Readback to make sure write has completed */
287 		dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
288 		/*
289 		 * Wait for functional clock period x 3.5 to make sure that
290 		 * timer is stopped
291 		 */
292 		udelay(3500000 / timer->fclk_rate + 1);
293 #endif
294 	}
295 
296 	/* Ack possibly pending interrupt */
297 	dmtimer_write(timer, timer->irq_stat, OMAP_TIMER_INT_OVERFLOW);
298 }
299 
300 static inline void __omap_dm_timer_int_enable(struct dmtimer *timer,
301 					      unsigned int value)
302 {
303 	dmtimer_write(timer, timer->irq_ena, value);
304 	dmtimer_write(timer, OMAP_TIMER_WAKEUP_EN_REG, value);
305 }
306 
307 static inline unsigned int
308 __omap_dm_timer_read_counter(struct dmtimer *timer)
309 {
310 	return dmtimer_read(timer, OMAP_TIMER_COUNTER_REG);
311 }
312 
313 static inline void __omap_dm_timer_write_status(struct dmtimer *timer,
314 						unsigned int value)
315 {
316 	dmtimer_write(timer, timer->irq_stat, value);
317 }
318 
319 static void omap_timer_restore_context(struct dmtimer *timer)
320 {
321 	dmtimer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, timer->context.ocp_cfg);
322 
323 	dmtimer_write(timer, OMAP_TIMER_WAKEUP_EN_REG, timer->context.twer);
324 	dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, timer->context.tcrr);
325 	dmtimer_write(timer, OMAP_TIMER_LOAD_REG, timer->context.tldr);
326 	dmtimer_write(timer, OMAP_TIMER_MATCH_REG, timer->context.tmar);
327 	dmtimer_write(timer, OMAP_TIMER_IF_CTRL_REG, timer->context.tsicr);
328 	dmtimer_write(timer, timer->irq_ena, timer->context.tier);
329 	dmtimer_write(timer, OMAP_TIMER_CTRL_REG, timer->context.tclr);
330 }
331 
332 static void omap_timer_save_context(struct dmtimer *timer)
333 {
334 	timer->context.ocp_cfg = dmtimer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET);
335 
336 	timer->context.tclr = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
337 	timer->context.twer = dmtimer_read(timer, OMAP_TIMER_WAKEUP_EN_REG);
338 	timer->context.tldr = dmtimer_read(timer, OMAP_TIMER_LOAD_REG);
339 	timer->context.tmar = dmtimer_read(timer, OMAP_TIMER_MATCH_REG);
340 	timer->context.tier = dmtimer_read(timer, timer->irq_ena);
341 	timer->context.tsicr = dmtimer_read(timer, OMAP_TIMER_IF_CTRL_REG);
342 }
343 
344 static int omap_timer_context_notifier(struct notifier_block *nb,
345 				       unsigned long cmd, void *v)
346 {
347 	struct dmtimer *timer;
348 
349 	timer = container_of(nb, struct dmtimer, nb);
350 
351 	switch (cmd) {
352 	case CPU_CLUSTER_PM_ENTER:
353 		if ((timer->capability & OMAP_TIMER_ALWON) ||
354 		    !atomic_read(&timer->enabled))
355 			break;
356 		omap_timer_save_context(timer);
357 		break;
358 	case CPU_CLUSTER_PM_ENTER_FAILED:	/* No need to restore context */
359 		break;
360 	case CPU_CLUSTER_PM_EXIT:
361 		if ((timer->capability & OMAP_TIMER_ALWON) ||
362 		    !atomic_read(&timer->enabled))
363 			break;
364 		omap_timer_restore_context(timer);
365 		break;
366 	}
367 
368 	return NOTIFY_OK;
369 }
370 
371 static int omap_timer_fclk_notifier(struct notifier_block *nb,
372 				    unsigned long event, void *data)
373 {
374 	struct clk_notifier_data *clk_data = data;
375 	struct dmtimer *timer = container_of(nb, struct dmtimer, fclk_nb);
376 
377 	switch (event) {
378 	case POST_RATE_CHANGE:
379 		timer->fclk_rate = clk_data->new_rate;
380 		return NOTIFY_OK;
381 	default:
382 		return NOTIFY_DONE;
383 	}
384 }
385 
386 static int omap_dm_timer_reset(struct dmtimer *timer)
387 {
388 	u32 l, timeout = 100000;
389 
390 	if (timer->revision != 1)
391 		return -EINVAL;
392 
393 	dmtimer_write(timer, OMAP_TIMER_IF_CTRL_REG, 0x06);
394 
395 	do {
396 		l = dmtimer_read(timer, OMAP_TIMER_V1_SYS_STAT_OFFSET);
397 	} while (!l && timeout--);
398 
399 	if (!timeout) {
400 		dev_err(&timer->pdev->dev, "Timer failed to reset\n");
401 		return -ETIMEDOUT;
402 	}
403 
404 	/* Configure timer for smart-idle mode */
405 	l = dmtimer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET);
406 	l |= 0x2 << 0x3;
407 	dmtimer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, l);
408 
409 	timer->posted = 0;
410 
411 	return 0;
412 }
413 
414 /*
415  * Functions exposed to PWM and remoteproc drivers via platform_data.
416  * Do not use these in the driver, these will get deprecated and will
417  * will be replaced by Linux generic framework functions such as
418  * chained interrupts and clock framework.
419  */
420 static struct dmtimer *to_dmtimer(struct omap_dm_timer *cookie)
421 {
422 	if (!cookie)
423 		return NULL;
424 
425 	return container_of(cookie, struct dmtimer, cookie);
426 }
427 
428 static int omap_dm_timer_set_source(struct omap_dm_timer *cookie, int source)
429 {
430 	int ret;
431 	const char *parent_name;
432 	struct clk *parent;
433 	struct dmtimer_platform_data *pdata;
434 	struct dmtimer *timer;
435 
436 	timer = to_dmtimer(cookie);
437 	if (unlikely(!timer) || IS_ERR(timer->fclk))
438 		return -EINVAL;
439 
440 	switch (source) {
441 	case OMAP_TIMER_SRC_SYS_CLK:
442 		parent_name = "timer_sys_ck";
443 		break;
444 	case OMAP_TIMER_SRC_32_KHZ:
445 		parent_name = "timer_32k_ck";
446 		break;
447 	case OMAP_TIMER_SRC_EXT_CLK:
448 		parent_name = "timer_ext_ck";
449 		break;
450 	default:
451 		return -EINVAL;
452 	}
453 
454 	pdata = timer->pdev->dev.platform_data;
455 
456 	/*
457 	 * FIXME: Used for OMAP1 devices only because they do not currently
458 	 * use the clock framework to set the parent clock. To be removed
459 	 * once OMAP1 migrated to using clock framework for dmtimers
460 	 */
461 	if (timer->omap1 && pdata && pdata->set_timer_src)
462 		return pdata->set_timer_src(timer->pdev, source);
463 
464 #if defined(CONFIG_COMMON_CLK)
465 	/* Check if the clock has configurable parents */
466 	if (clk_hw_get_num_parents(__clk_get_hw(timer->fclk)) < 2)
467 		return 0;
468 #endif
469 
470 	parent = clk_get(&timer->pdev->dev, parent_name);
471 	if (IS_ERR(parent)) {
472 		pr_err("%s: %s not found\n", __func__, parent_name);
473 		return -EINVAL;
474 	}
475 
476 	ret = clk_set_parent(timer->fclk, parent);
477 	if (ret < 0)
478 		pr_err("%s: failed to set %s as parent\n", __func__,
479 			parent_name);
480 
481 	clk_put(parent);
482 
483 	return ret;
484 }
485 
486 static void omap_dm_timer_enable(struct omap_dm_timer *cookie)
487 {
488 	struct dmtimer *timer = to_dmtimer(cookie);
489 	struct device *dev = &timer->pdev->dev;
490 	int rc;
491 
492 	rc = pm_runtime_resume_and_get(dev);
493 	if (rc)
494 		dev_err(dev, "could not enable timer\n");
495 }
496 
497 static void omap_dm_timer_disable(struct omap_dm_timer *cookie)
498 {
499 	struct dmtimer *timer = to_dmtimer(cookie);
500 	struct device *dev = &timer->pdev->dev;
501 
502 	pm_runtime_put_sync(dev);
503 }
504 
505 static int omap_dm_timer_prepare(struct dmtimer *timer)
506 {
507 	struct device *dev = &timer->pdev->dev;
508 	int rc;
509 
510 	rc = pm_runtime_resume_and_get(dev);
511 	if (rc)
512 		return rc;
513 
514 	if (timer->capability & OMAP_TIMER_NEEDS_RESET) {
515 		rc = omap_dm_timer_reset(timer);
516 		if (rc) {
517 			pm_runtime_put_sync(dev);
518 			return rc;
519 		}
520 	}
521 
522 	__omap_dm_timer_enable_posted(timer);
523 	pm_runtime_put_sync(dev);
524 
525 	return 0;
526 }
527 
528 static inline u32 omap_dm_timer_reserved_systimer(int id)
529 {
530 	return (omap_reserved_systimers & (1 << (id - 1))) ? 1 : 0;
531 }
532 
533 static struct dmtimer *_omap_dm_timer_request(int req_type, void *data)
534 {
535 	struct dmtimer *timer = NULL, *t;
536 	struct device_node *np = NULL;
537 	unsigned long flags;
538 	u32 cap = 0;
539 	int id = 0;
540 
541 	switch (req_type) {
542 	case REQUEST_BY_ID:
543 		id = *(int *)data;
544 		break;
545 	case REQUEST_BY_CAP:
546 		cap = *(u32 *)data;
547 		break;
548 	case REQUEST_BY_NODE:
549 		np = (struct device_node *)data;
550 		break;
551 	default:
552 		/* REQUEST_ANY */
553 		break;
554 	}
555 
556 	spin_lock_irqsave(&dm_timer_lock, flags);
557 	list_for_each_entry(t, &omap_timer_list, node) {
558 		if (t->reserved)
559 			continue;
560 
561 		switch (req_type) {
562 		case REQUEST_BY_ID:
563 			if (id == t->pdev->id) {
564 				timer = t;
565 				timer->reserved = 1;
566 				goto found;
567 			}
568 			break;
569 		case REQUEST_BY_CAP:
570 			if (cap == (t->capability & cap)) {
571 				/*
572 				 * If timer is not NULL, we have already found
573 				 * one timer. But it was not an exact match
574 				 * because it had more capabilities than what
575 				 * was required. Therefore, unreserve the last
576 				 * timer found and see if this one is a better
577 				 * match.
578 				 */
579 				if (timer)
580 					timer->reserved = 0;
581 				timer = t;
582 				timer->reserved = 1;
583 
584 				/* Exit loop early if we find an exact match */
585 				if (t->capability == cap)
586 					goto found;
587 			}
588 			break;
589 		case REQUEST_BY_NODE:
590 			if (np == t->pdev->dev.of_node) {
591 				timer = t;
592 				timer->reserved = 1;
593 				goto found;
594 			}
595 			break;
596 		default:
597 			/* REQUEST_ANY */
598 			timer = t;
599 			timer->reserved = 1;
600 			goto found;
601 		}
602 	}
603 found:
604 	spin_unlock_irqrestore(&dm_timer_lock, flags);
605 
606 	if (timer && omap_dm_timer_prepare(timer)) {
607 		timer->reserved = 0;
608 		timer = NULL;
609 	}
610 
611 	if (!timer)
612 		pr_debug("%s: timer request failed!\n", __func__);
613 
614 	return timer;
615 }
616 
617 static struct omap_dm_timer *omap_dm_timer_request(void)
618 {
619 	struct dmtimer *timer;
620 
621 	timer = _omap_dm_timer_request(REQUEST_ANY, NULL);
622 	if (!timer)
623 		return NULL;
624 
625 	return &timer->cookie;
626 }
627 
628 static struct omap_dm_timer *omap_dm_timer_request_specific(int id)
629 {
630 	struct dmtimer *timer;
631 
632 	/* Requesting timer by ID is not supported when device tree is used */
633 	if (of_have_populated_dt()) {
634 		pr_warn("%s: Please use omap_dm_timer_request_by_node()\n",
635 			__func__);
636 		return NULL;
637 	}
638 
639 	timer = _omap_dm_timer_request(REQUEST_BY_ID, &id);
640 	if (!timer)
641 		return NULL;
642 
643 	return &timer->cookie;
644 }
645 
646 /**
647  * omap_dm_timer_request_by_node - Request a timer by device-tree node
648  * @np:		Pointer to device-tree timer node
649  *
650  * Request a timer based upon a device node pointer. Returns pointer to
651  * timer handle on success and a NULL pointer on failure.
652  */
653 static struct omap_dm_timer *omap_dm_timer_request_by_node(struct device_node *np)
654 {
655 	struct dmtimer *timer;
656 
657 	if (!np)
658 		return NULL;
659 
660 	timer = _omap_dm_timer_request(REQUEST_BY_NODE, np);
661 	if (!timer)
662 		return NULL;
663 
664 	return &timer->cookie;
665 }
666 
667 static int omap_dm_timer_free(struct omap_dm_timer *cookie)
668 {
669 	struct dmtimer *timer;
670 	struct device *dev;
671 	int rc;
672 
673 	timer = to_dmtimer(cookie);
674 	if (unlikely(!timer))
675 		return -EINVAL;
676 
677 	WARN_ON(!timer->reserved);
678 	timer->reserved = 0;
679 
680 	dev = &timer->pdev->dev;
681 	rc = pm_runtime_resume_and_get(dev);
682 	if (rc)
683 		return rc;
684 
685 	/* Clear timer configuration */
686 	dmtimer_write(timer, OMAP_TIMER_CTRL_REG, 0);
687 
688 	pm_runtime_put_sync(dev);
689 
690 	return 0;
691 }
692 
693 static int omap_dm_timer_get_irq(struct omap_dm_timer *cookie)
694 {
695 	struct dmtimer *timer = to_dmtimer(cookie);
696 	if (timer)
697 		return timer->irq;
698 	return -EINVAL;
699 }
700 
701 #if defined(CONFIG_ARCH_OMAP1)
702 #include <linux/soc/ti/omap1-io.h>
703 
704 static struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *cookie)
705 {
706 	return NULL;
707 }
708 
709 /**
710  * omap_dm_timer_modify_idlect_mask - Check if any running timers use ARMXOR
711  * @inputmask: current value of idlect mask
712  */
713 __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask)
714 {
715 	int i = 0;
716 	struct dmtimer *timer = NULL;
717 	unsigned long flags;
718 
719 	/* If ARMXOR cannot be idled this function call is unnecessary */
720 	if (!(inputmask & (1 << 1)))
721 		return inputmask;
722 
723 	/* If any active timer is using ARMXOR return modified mask */
724 	spin_lock_irqsave(&dm_timer_lock, flags);
725 	list_for_each_entry(timer, &omap_timer_list, node) {
726 		u32 l;
727 
728 		l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
729 		if (l & OMAP_TIMER_CTRL_ST) {
730 			if (((omap_readl(MOD_CONF_CTRL_1) >> (i * 2)) & 0x03) == 0)
731 				inputmask &= ~(1 << 1);
732 			else
733 				inputmask &= ~(1 << 2);
734 		}
735 		i++;
736 	}
737 	spin_unlock_irqrestore(&dm_timer_lock, flags);
738 
739 	return inputmask;
740 }
741 
742 #else
743 
744 static struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *cookie)
745 {
746 	struct dmtimer *timer = to_dmtimer(cookie);
747 
748 	if (timer && !IS_ERR(timer->fclk))
749 		return timer->fclk;
750 	return NULL;
751 }
752 
753 __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask)
754 {
755 	BUG();
756 
757 	return 0;
758 }
759 
760 #endif
761 
762 static int omap_dm_timer_start(struct omap_dm_timer *cookie)
763 {
764 	struct dmtimer *timer;
765 	struct device *dev;
766 	int rc;
767 	u32 l;
768 
769 	timer = to_dmtimer(cookie);
770 	if (unlikely(!timer))
771 		return -EINVAL;
772 
773 	dev = &timer->pdev->dev;
774 
775 	rc = pm_runtime_resume_and_get(dev);
776 	if (rc)
777 		return rc;
778 
779 	l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
780 	if (!(l & OMAP_TIMER_CTRL_ST)) {
781 		l |= OMAP_TIMER_CTRL_ST;
782 		dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l);
783 	}
784 
785 	return 0;
786 }
787 
788 static int omap_dm_timer_stop(struct omap_dm_timer *cookie)
789 {
790 	struct dmtimer *timer;
791 	struct device *dev;
792 
793 	timer = to_dmtimer(cookie);
794 	if (unlikely(!timer))
795 		return -EINVAL;
796 
797 	dev = &timer->pdev->dev;
798 
799 	__omap_dm_timer_stop(timer);
800 
801 	pm_runtime_put_sync(dev);
802 
803 	return 0;
804 }
805 
806 static int omap_dm_timer_set_load(struct omap_dm_timer *cookie,
807 				  unsigned int load)
808 {
809 	struct dmtimer *timer;
810 	struct device *dev;
811 	int rc;
812 
813 	timer = to_dmtimer(cookie);
814 	if (unlikely(!timer))
815 		return -EINVAL;
816 
817 	dev = &timer->pdev->dev;
818 	rc = pm_runtime_resume_and_get(dev);
819 	if (rc)
820 		return rc;
821 
822 	dmtimer_write(timer, OMAP_TIMER_LOAD_REG, load);
823 
824 	pm_runtime_put_sync(dev);
825 
826 	return 0;
827 }
828 
829 static int omap_dm_timer_set_match(struct omap_dm_timer *cookie, int enable,
830 				   unsigned int match)
831 {
832 	struct dmtimer *timer;
833 	struct device *dev;
834 	int rc;
835 	u32 l;
836 
837 	timer = to_dmtimer(cookie);
838 	if (unlikely(!timer))
839 		return -EINVAL;
840 
841 	dev = &timer->pdev->dev;
842 	rc = pm_runtime_resume_and_get(dev);
843 	if (rc)
844 		return rc;
845 
846 	l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
847 	if (enable)
848 		l |= OMAP_TIMER_CTRL_CE;
849 	else
850 		l &= ~OMAP_TIMER_CTRL_CE;
851 	dmtimer_write(timer, OMAP_TIMER_MATCH_REG, match);
852 	dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l);
853 
854 	pm_runtime_put_sync(dev);
855 
856 	return 0;
857 }
858 
859 static int omap_dm_timer_set_cap(struct omap_dm_timer *cookie,
860 					int autoreload, bool config_period)
861 {
862 	struct dmtimer *timer;
863 	struct device *dev;
864 	int rc;
865 	u32 l;
866 
867 	timer = to_dmtimer(cookie);
868 	if (unlikely(!timer))
869 		return -EINVAL;
870 
871 	dev = &timer->pdev->dev;
872 	rc = pm_runtime_resume_and_get(dev);
873 	if (rc)
874 		return rc;
875 	/*
876 	 *  1. Select autoreload mode. TIMER_TCLR[1] AR bit.
877 	 *  2. TIMER_TCLR[14]: Sets the functionality of the TIMER IO pin.
878 	 *  3. TIMER_TCLR[13] : Capture mode select bit.
879 	 *  3. TIMER_TCLR[9-8] : Select transition capture mode.
880 	 */
881 
882 	l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
883 
884 	if (autoreload)
885 		l |= OMAP_TIMER_CTRL_AR;
886 
887 	l |= OMAP_TIMER_CTRL_CAPTMODE | OMAP_TIMER_CTRL_GPOCFG;
888 
889 	if (config_period == true)
890 		l |= OMAP_TIMER_CTRL_TCM_LOWTOHIGH; /* Time Period config */
891 	else
892 		l |= OMAP_TIMER_CTRL_TCM_BOTHEDGES; /* Duty Cycle config */
893 
894 	dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l);
895 
896 	pm_runtime_put_sync(dev);
897 
898 	return 0;
899 }
900 
901 static int omap_dm_timer_set_pwm(struct omap_dm_timer *cookie, int def_on,
902 				 int toggle, int trigger, int autoreload)
903 {
904 	struct dmtimer *timer;
905 	struct device *dev;
906 	int rc;
907 	u32 l;
908 
909 	timer = to_dmtimer(cookie);
910 	if (unlikely(!timer))
911 		return -EINVAL;
912 
913 	dev = &timer->pdev->dev;
914 	rc = pm_runtime_resume_and_get(dev);
915 	if (rc)
916 		return rc;
917 
918 	l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
919 	l &= ~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM |
920 	       OMAP_TIMER_CTRL_PT | (0x03 << 10) | OMAP_TIMER_CTRL_AR);
921 	if (def_on)
922 		l |= OMAP_TIMER_CTRL_SCPWM;
923 	if (toggle)
924 		l |= OMAP_TIMER_CTRL_PT;
925 	l |= trigger << 10;
926 	if (autoreload)
927 		l |= OMAP_TIMER_CTRL_AR;
928 	dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l);
929 
930 	pm_runtime_put_sync(dev);
931 
932 	return 0;
933 }
934 
935 static int omap_dm_timer_get_pwm_status(struct omap_dm_timer *cookie)
936 {
937 	struct dmtimer *timer;
938 	struct device *dev;
939 	int rc;
940 	u32 l;
941 
942 	timer = to_dmtimer(cookie);
943 	if (unlikely(!timer))
944 		return -EINVAL;
945 
946 	dev = &timer->pdev->dev;
947 	rc = pm_runtime_resume_and_get(dev);
948 	if (rc)
949 		return rc;
950 
951 	l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
952 
953 	pm_runtime_put_sync(dev);
954 
955 	return l;
956 }
957 
958 static int omap_dm_timer_set_prescaler(struct omap_dm_timer *cookie,
959 				       int prescaler)
960 {
961 	struct dmtimer *timer;
962 	struct device *dev;
963 	int rc;
964 	u32 l;
965 
966 	timer = to_dmtimer(cookie);
967 	if (unlikely(!timer) || prescaler < -1 || prescaler > 7)
968 		return -EINVAL;
969 
970 	dev = &timer->pdev->dev;
971 	rc = pm_runtime_resume_and_get(dev);
972 	if (rc)
973 		return rc;
974 
975 	l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
976 	l &= ~(OMAP_TIMER_CTRL_PRE | (0x07 << 2));
977 	if (prescaler >= 0) {
978 		l |= OMAP_TIMER_CTRL_PRE;
979 		l |= prescaler << 2;
980 	}
981 	dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l);
982 
983 	pm_runtime_put_sync(dev);
984 
985 	return 0;
986 }
987 
988 static int omap_dm_timer_set_int_enable(struct omap_dm_timer *cookie,
989 					unsigned int value)
990 {
991 	struct dmtimer *timer;
992 	struct device *dev;
993 	int rc;
994 
995 	timer = to_dmtimer(cookie);
996 	if (unlikely(!timer))
997 		return -EINVAL;
998 
999 	dev = &timer->pdev->dev;
1000 	rc = pm_runtime_resume_and_get(dev);
1001 	if (rc)
1002 		return rc;
1003 
1004 	__omap_dm_timer_int_enable(timer, value);
1005 
1006 	pm_runtime_put_sync(dev);
1007 
1008 	return 0;
1009 }
1010 
1011 /**
1012  * omap_dm_timer_set_int_disable - disable timer interrupts
1013  * @cookie:	pointer to timer cookie
1014  * @mask:	bit mask of interrupts to be disabled
1015  *
1016  * Disables the specified timer interrupts for a timer.
1017  */
1018 static int omap_dm_timer_set_int_disable(struct omap_dm_timer *cookie, u32 mask)
1019 {
1020 	struct dmtimer *timer;
1021 	struct device *dev;
1022 	u32 l = mask;
1023 	int rc;
1024 
1025 	timer = to_dmtimer(cookie);
1026 	if (unlikely(!timer))
1027 		return -EINVAL;
1028 
1029 	dev = &timer->pdev->dev;
1030 	rc = pm_runtime_resume_and_get(dev);
1031 	if (rc)
1032 		return rc;
1033 
1034 	if (timer->revision == 1)
1035 		l = dmtimer_read(timer, timer->irq_ena) & ~mask;
1036 
1037 	dmtimer_write(timer, timer->irq_dis, l);
1038 	l = dmtimer_read(timer, OMAP_TIMER_WAKEUP_EN_REG) & ~mask;
1039 	dmtimer_write(timer, OMAP_TIMER_WAKEUP_EN_REG, l);
1040 
1041 	pm_runtime_put_sync(dev);
1042 
1043 	return 0;
1044 }
1045 
1046 static unsigned int omap_dm_timer_read_status(struct omap_dm_timer *cookie)
1047 {
1048 	struct dmtimer *timer;
1049 	unsigned int l;
1050 
1051 	timer = to_dmtimer(cookie);
1052 	if (unlikely(!timer || !atomic_read(&timer->enabled))) {
1053 		pr_err("%s: timer not available or enabled.\n", __func__);
1054 		return 0;
1055 	}
1056 
1057 	l = dmtimer_read(timer, timer->irq_stat);
1058 
1059 	return l;
1060 }
1061 
1062 static int omap_dm_timer_write_status(struct omap_dm_timer *cookie, unsigned int value)
1063 {
1064 	struct dmtimer *timer;
1065 
1066 	timer = to_dmtimer(cookie);
1067 	if (unlikely(!timer || !atomic_read(&timer->enabled)))
1068 		return -EINVAL;
1069 
1070 	__omap_dm_timer_write_status(timer, value);
1071 
1072 	return 0;
1073 }
1074 
1075 static unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *cookie)
1076 {
1077 	struct dmtimer *timer;
1078 
1079 	timer = to_dmtimer(cookie);
1080 	if (unlikely(!timer || !atomic_read(&timer->enabled))) {
1081 		pr_err("%s: timer not iavailable or enabled.\n", __func__);
1082 		return 0;
1083 	}
1084 
1085 	return __omap_dm_timer_read_counter(timer);
1086 }
1087 
1088 static inline unsigned int __omap_dm_timer_cap(struct dmtimer *timer, int idx)
1089 {
1090 	return idx == 0 ? dmtimer_read(timer, OMAP_TIMER_CAPTURE_REG) :
1091 			  dmtimer_read(timer, OMAP_TIMER_CAPTURE2_REG);
1092 }
1093 
1094 static int omap_dm_timer_write_counter(struct omap_dm_timer *cookie, unsigned int value)
1095 {
1096 	struct dmtimer *timer;
1097 	struct device *dev;
1098 
1099 	timer = to_dmtimer(cookie);
1100 	if (unlikely(!timer)) {
1101 		pr_err("%s: timer not available.\n", __func__);
1102 		return -EINVAL;
1103 	}
1104 
1105 	dev = &timer->pdev->dev;
1106 
1107 	pm_runtime_resume_and_get(dev);
1108 	dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, value);
1109 	pm_runtime_put_sync(dev);
1110 
1111 	/* Save the context */
1112 	timer->context.tcrr = value;
1113 	return 0;
1114 }
1115 
1116 /**
1117  * omap_dm_timer_cap_counter() - Calculate the high count or period count depending on the
1118  * configuration.
1119  * @cookie:Pointer to OMAP DM timer
1120  * @is_period:Whether to configure timer in period or duty cycle mode
1121  *
1122  * Return high count or period count if timer is enabled else appropriate error.
1123  */
1124 static unsigned int omap_dm_timer_cap_counter(struct omap_dm_timer *cookie,	bool is_period)
1125 {
1126 	struct dmtimer *timer;
1127 	unsigned int cap1 = 0;
1128 	unsigned int cap2 = 0;
1129 	u32 l, ret;
1130 
1131 	timer = to_dmtimer(cookie);
1132 	if (unlikely(!timer || !atomic_read(&timer->enabled))) {
1133 		pr_err("%s:timer is not available or enabled.%p\n", __func__, (void *)timer);
1134 		return -EINVAL;
1135 	}
1136 
1137 	/* Stop the timer */
1138 	omap_dm_timer_stop(cookie);
1139 
1140 	/* Clear the timer counter value to 0 */
1141 	ret = omap_dm_timer_write_counter(cookie, 0);
1142 	if (ret)
1143 		return ret;
1144 
1145 	/* Sets the timer capture configuration for period/duty cycle calculation */
1146 	ret = omap_dm_timer_set_cap(cookie, true, is_period);
1147 	if (ret) {
1148 		pr_err("%s: Failed to set timer capture configuration.\n", __func__);
1149 		return ret;
1150 	}
1151 	/* Start the timer */
1152 	omap_dm_timer_start(cookie);
1153 
1154 	/*
1155 	 * 1 sec delay is given so as to provide
1156 	 * enough time to capture low frequency signals.
1157 	 */
1158 	msleep(1000);
1159 
1160 	cap1 = __omap_dm_timer_cap(timer, 0);
1161 	cap2 = __omap_dm_timer_cap(timer, 1);
1162 
1163 	/*
1164 	 *  Clears the TCLR configuration.
1165 	 *  The start bit must be set to 1 as the timer is already in start mode.
1166 	 */
1167 	l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG);
1168 	l &= ~(0xffff) | 0x1;
1169 	dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l);
1170 
1171 	return (cap2-cap1);
1172 }
1173 
1174 static int __maybe_unused omap_dm_timer_runtime_suspend(struct device *dev)
1175 {
1176 	struct dmtimer *timer = dev_get_drvdata(dev);
1177 
1178 	atomic_set(&timer->enabled, 0);
1179 
1180 	if (timer->capability & OMAP_TIMER_ALWON || !timer->func_base)
1181 		return 0;
1182 
1183 	omap_timer_save_context(timer);
1184 
1185 	return 0;
1186 }
1187 
1188 static int __maybe_unused omap_dm_timer_runtime_resume(struct device *dev)
1189 {
1190 	struct dmtimer *timer = dev_get_drvdata(dev);
1191 
1192 	if (!(timer->capability & OMAP_TIMER_ALWON) && timer->func_base)
1193 		omap_timer_restore_context(timer);
1194 
1195 	atomic_set(&timer->enabled, 1);
1196 
1197 	return 0;
1198 }
1199 
1200 static const struct dev_pm_ops omap_dm_timer_pm_ops = {
1201 	SET_RUNTIME_PM_OPS(omap_dm_timer_runtime_suspend,
1202 			   omap_dm_timer_runtime_resume, NULL)
1203 };
1204 
1205 static const struct of_device_id omap_timer_match[];
1206 
1207 static struct dmtimer_clocksource *omap_dm_timer_to_clocksource(struct clocksource *cs)
1208 {
1209 	return container_of(cs, struct dmtimer_clocksource, dev);
1210 }
1211 
1212 static u64 omap_dm_timer_read_cycles(struct clocksource *cs)
1213 {
1214 	struct dmtimer_clocksource *clksrc = omap_dm_timer_to_clocksource(cs);
1215 	struct dmtimer *timer = clksrc->timer;
1216 
1217 	return (u64)__omap_dm_timer_read_counter(timer);
1218 }
1219 
1220 static u64 notrace omap_dm_timer_read_sched_clock(void)
1221 {
1222 	/* Posted mode is not active here, so we can read directly */
1223 	return readl_relaxed(omap_dm_timer_sched_clock_counter);
1224 }
1225 
1226 static void omap_dm_timer_clocksource_suspend(struct clocksource *cs)
1227 {
1228 	struct dmtimer_clocksource *clksrc = omap_dm_timer_to_clocksource(cs);
1229 	struct dmtimer *timer = clksrc->timer;
1230 
1231 	clksrc->loadval = __omap_dm_timer_read_counter(timer);
1232 	__omap_dm_timer_stop(timer);
1233 }
1234 
1235 static void omap_dm_timer_clocksource_resume(struct clocksource *cs)
1236 {
1237 	struct dmtimer_clocksource *clksrc = omap_dm_timer_to_clocksource(cs);
1238 	struct dmtimer *timer = clksrc->timer;
1239 
1240 	dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, clksrc->loadval);
1241 	dmtimer_write(timer, OMAP_TIMER_CTRL_REG, OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR);
1242 }
1243 
1244 static void omap_dm_timer_clocksource_unregister(void *data)
1245 {
1246 	struct clocksource *cs = data;
1247 
1248 	clocksource_unregister(cs);
1249 }
1250 
1251 static int omap_dm_timer_setup_clocksource(struct dmtimer *timer)
1252 {
1253 	struct device *dev = &timer->pdev->dev;
1254 	struct dmtimer_clocksource *clksrc;
1255 	int err;
1256 
1257 	__omap_dm_timer_init_regs(timer);
1258 
1259 	timer->reserved = 1;
1260 
1261 	clksrc = devm_kzalloc(dev, sizeof(*clksrc), GFP_KERNEL);
1262 	if (!clksrc)
1263 		return -ENOMEM;
1264 
1265 	clksrc->timer = timer;
1266 
1267 	clksrc->dev.name = "omap_dm_timer";
1268 	clksrc->dev.rating = 300;
1269 	clksrc->dev.read = omap_dm_timer_read_cycles;
1270 	clksrc->dev.mask = CLOCKSOURCE_MASK(32);
1271 	clksrc->dev.flags = CLOCK_SOURCE_IS_CONTINUOUS;
1272 	clksrc->dev.suspend = omap_dm_timer_clocksource_suspend;
1273 	clksrc->dev.resume = omap_dm_timer_clocksource_resume;
1274 
1275 	dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, 0);
1276 	dmtimer_write(timer, OMAP_TIMER_LOAD_REG, 0);
1277 	dmtimer_write(timer, OMAP_TIMER_CTRL_REG, OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR);
1278 
1279 	omap_dm_timer_sched_clock_counter = timer->func_base + _OMAP_TIMER_COUNTER_OFFSET;
1280 	sched_clock_register(omap_dm_timer_read_sched_clock, 32, timer->fclk_rate);
1281 
1282 	err = clocksource_register_hz(&clksrc->dev, timer->fclk_rate);
1283 	if (err)
1284 		return dev_err_probe(dev, err, "Could not register as clocksource\n");
1285 
1286 	err = devm_add_action_or_reset(dev, omap_dm_timer_clocksource_unregister, &clksrc->dev);
1287 	if (err)
1288 		return dev_err_probe(dev, err, "Could not register clocksource_unregister action\n");
1289 
1290 	return 0;
1291 }
1292 
1293 static struct omap_dm_timer_clockevent *to_dm_timer_clockevent(struct clock_event_device *evt)
1294 {
1295 	return container_of(evt, struct omap_dm_timer_clockevent, dev);
1296 }
1297 
1298 static int omap_dm_timer_evt_set_next_event(unsigned long cycles,
1299 					    struct clock_event_device *evt)
1300 {
1301 	struct omap_dm_timer_clockevent *clkevt = to_dm_timer_clockevent(evt);
1302 	struct dmtimer *timer = clkevt->timer;
1303 
1304 	dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, 0xffffffff - cycles);
1305 	dmtimer_write(timer, OMAP_TIMER_CTRL_REG, OMAP_TIMER_CTRL_ST);
1306 
1307 	return 0;
1308 }
1309 
1310 static int omap_dm_timer_evt_shutdown(struct clock_event_device *evt)
1311 {
1312 	struct omap_dm_timer_clockevent *clkevt = to_dm_timer_clockevent(evt);
1313 	struct dmtimer *timer = clkevt->timer;
1314 
1315 	__omap_dm_timer_stop(timer);
1316 
1317 	return 0;
1318 }
1319 
1320 static int omap_dm_timer_evt_set_periodic(struct clock_event_device *evt)
1321 {
1322 	struct omap_dm_timer_clockevent *clkevt = to_dm_timer_clockevent(evt);
1323 	struct dmtimer *timer = clkevt->timer;
1324 
1325 	omap_dm_timer_evt_shutdown(evt);
1326 
1327 	omap_dm_timer_set_load(&timer->cookie, clkevt->period);
1328 	dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, clkevt->period);
1329 	dmtimer_write(timer, OMAP_TIMER_CTRL_REG,
1330 		      OMAP_TIMER_CTRL_AR | OMAP_TIMER_CTRL_ST);
1331 
1332 	return 0;
1333 }
1334 
1335 static irqreturn_t omap_dm_timer_evt_interrupt(int irq, void *dev_id)
1336 {
1337 	struct omap_dm_timer_clockevent *clkevt = dev_id;
1338 	struct dmtimer *timer = clkevt->timer;
1339 
1340 	__omap_dm_timer_write_status(timer, OMAP_TIMER_INT_OVERFLOW);
1341 
1342 	clkevt->dev.event_handler(&clkevt->dev);
1343 
1344 	return IRQ_HANDLED;
1345 }
1346 
1347 static int omap_dm_timer_setup_clockevent(struct dmtimer *timer)
1348 {
1349 	struct device *dev = &timer->pdev->dev;
1350 	struct omap_dm_timer_clockevent *clkevt;
1351 	int ret;
1352 
1353 	clkevt = devm_kzalloc(dev, sizeof(*clkevt), GFP_KERNEL);
1354 	if (!clkevt)
1355 		return -ENOMEM;
1356 
1357 	timer->reserved = 1;
1358 	clkevt->timer = timer;
1359 
1360 	clkevt->dev.name = "omap_dm_timer";
1361 	clkevt->dev.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
1362 	clkevt->dev.rating = 300;
1363 	clkevt->dev.set_next_event = omap_dm_timer_evt_set_next_event;
1364 	clkevt->dev.set_state_shutdown = omap_dm_timer_evt_shutdown;
1365 	clkevt->dev.set_state_periodic = omap_dm_timer_evt_set_periodic;
1366 	clkevt->dev.set_state_oneshot = omap_dm_timer_evt_shutdown;
1367 	clkevt->dev.set_state_oneshot_stopped = omap_dm_timer_evt_shutdown;
1368 	clkevt->dev.tick_resume = omap_dm_timer_evt_shutdown;
1369 	clkevt->dev.cpumask = cpu_possible_mask;
1370 	clkevt->period = 0xffffffff - DIV_ROUND_CLOSEST(timer->fclk_rate, HZ);
1371 
1372 	__omap_dm_timer_init_regs(timer);
1373 	__omap_dm_timer_stop(timer);
1374 	__omap_dm_timer_enable_posted(timer);
1375 
1376 	ret = devm_request_irq(dev, timer->irq, omap_dm_timer_evt_interrupt,
1377 			       IRQF_TIMER, "omap_dm_timer_clockevent", clkevt);
1378 	if (ret) {
1379 		dev_err(dev, "Failed to request interrupt: %d\n", ret);
1380 		return ret;
1381 	}
1382 
1383 	__omap_dm_timer_int_enable(timer, OMAP_TIMER_INT_OVERFLOW);
1384 
1385 	clockevents_config_and_register(&clkevt->dev, timer->fclk_rate,
1386 					3,
1387 					0xffffffff);
1388 
1389 	omap_dm_timer_clockevent_setup = true;
1390 	return 0;
1391 }
1392 
1393 /**
1394  * omap_dm_timer_probe - probe function called for every registered device
1395  * @pdev:	pointer to current timer platform device
1396  *
1397  * Called by driver framework at the end of device registration for all
1398  * timer devices.
1399  */
1400 static int omap_dm_timer_probe(struct platform_device *pdev)
1401 {
1402 	unsigned long flags;
1403 	struct dmtimer *timer;
1404 	struct device *dev = &pdev->dev;
1405 	const struct dmtimer_platform_data *pdata;
1406 	int ret;
1407 
1408 	pdata = of_device_get_match_data(dev);
1409 	if (!pdata)
1410 		pdata = dev_get_platdata(dev);
1411 	else
1412 		dev->platform_data = (void *)pdata;
1413 
1414 	if (!pdata) {
1415 		dev_err(dev, "%s: no platform data.\n", __func__);
1416 		return -ENODEV;
1417 	}
1418 
1419 	timer = devm_kzalloc(dev, sizeof(*timer), GFP_KERNEL);
1420 	if (!timer)
1421 		return  -ENOMEM;
1422 
1423 	timer->irq = platform_get_irq(pdev, 0);
1424 	if (timer->irq < 0) {
1425 		if (of_property_read_bool(dev->of_node, "ti,timer-pwm"))
1426 			dev_info(dev, "Did not find timer interrupt, timer usable in PWM mode only\n");
1427 		else
1428 			return timer->irq;
1429 	}
1430 
1431 	timer->io_base = devm_platform_ioremap_resource(pdev, 0);
1432 	if (IS_ERR(timer->io_base))
1433 		return PTR_ERR(timer->io_base);
1434 
1435 	platform_set_drvdata(pdev, timer);
1436 
1437 	if (dev->of_node) {
1438 		if (of_property_read_bool(dev->of_node, "ti,timer-alwon"))
1439 			timer->capability |= OMAP_TIMER_ALWON;
1440 		if (of_property_read_bool(dev->of_node, "ti,timer-dsp"))
1441 			timer->capability |= OMAP_TIMER_HAS_DSP_IRQ;
1442 		if (of_property_read_bool(dev->of_node, "ti,timer-pwm"))
1443 			timer->capability |= OMAP_TIMER_HAS_PWM;
1444 		if (of_property_read_bool(dev->of_node, "ti,timer-secure"))
1445 			timer->capability |= OMAP_TIMER_SECURE;
1446 	} else {
1447 		timer->id = pdev->id;
1448 		timer->capability = pdata->timer_capability;
1449 		timer->reserved = omap_dm_timer_reserved_systimer(timer->id);
1450 	}
1451 
1452 	timer->omap1 = timer->capability & OMAP_TIMER_NEEDS_RESET;
1453 
1454 	/* OMAP1 devices do not yet use the clock framework for dmtimers */
1455 	if (!timer->omap1) {
1456 		timer->fclk = devm_clk_get(dev, "fck");
1457 		if (IS_ERR(timer->fclk))
1458 			return PTR_ERR(timer->fclk);
1459 
1460 		timer->fclk_nb.notifier_call = omap_timer_fclk_notifier;
1461 		ret = devm_clk_notifier_register(dev, timer->fclk,
1462 						 &timer->fclk_nb);
1463 		if (ret)
1464 			return ret;
1465 
1466 		timer->fclk_rate = clk_get_rate(timer->fclk);
1467 	} else {
1468 		timer->fclk = ERR_PTR(-ENODEV);
1469 	}
1470 
1471 	if (!(timer->capability & OMAP_TIMER_ALWON)) {
1472 		timer->nb.notifier_call = omap_timer_context_notifier;
1473 		cpu_pm_register_notifier(&timer->nb);
1474 	}
1475 
1476 	timer->errata = pdata->timer_errata;
1477 
1478 	timer->pdev = pdev;
1479 
1480 	if (timer->capability & OMAP_TIMER_ALWON && !IS_ERR_OR_NULL(timer->fclk)) {
1481 		if (!omap_dm_timer_sched_clock_counter) {
1482 			ret = omap_dm_timer_setup_clocksource(timer);
1483 			if (ret)
1484 				return ret;
1485 		} else if (!omap_dm_timer_clockevent_setup) {
1486 			ret = omap_dm_timer_setup_clockevent(timer);
1487 			if (ret)
1488 				return ret;
1489 		}
1490 	}
1491 
1492 	pm_runtime_enable(dev);
1493 
1494 	if (!timer->reserved) {
1495 		ret = pm_runtime_resume_and_get(dev);
1496 		if (ret) {
1497 			dev_err(dev, "%s: pm_runtime_get_sync failed!\n",
1498 				__func__);
1499 			goto err_disable;
1500 		}
1501 		__omap_dm_timer_init_regs(timer);
1502 
1503 		/* Clear timer configuration */
1504 		dmtimer_write(timer, OMAP_TIMER_CTRL_REG, 0);
1505 
1506 		pm_runtime_put(dev);
1507 	}
1508 
1509 	/* add the timer element to the list */
1510 	spin_lock_irqsave(&dm_timer_lock, flags);
1511 	list_add_tail(&timer->node, &omap_timer_list);
1512 	spin_unlock_irqrestore(&dm_timer_lock, flags);
1513 
1514 	dev_dbg(dev, "Device Probed.\n");
1515 
1516 	return 0;
1517 
1518 err_disable:
1519 	pm_runtime_disable(dev);
1520 	return ret;
1521 }
1522 
1523 /**
1524  * omap_dm_timer_remove - cleanup a registered timer device
1525  * @pdev:	pointer to current timer platform device
1526  *
1527  * Called by driver framework whenever a timer device is unregistered.
1528  * In addition to freeing platform resources it also deletes the timer
1529  * entry from the local list.
1530  */
1531 static void omap_dm_timer_remove(struct platform_device *pdev)
1532 {
1533 	struct dmtimer *timer;
1534 	unsigned long flags;
1535 	int ret = -EINVAL;
1536 
1537 	spin_lock_irqsave(&dm_timer_lock, flags);
1538 	list_for_each_entry(timer, &omap_timer_list, node)
1539 		if (!strcmp(dev_name(&timer->pdev->dev),
1540 			    dev_name(&pdev->dev))) {
1541 			if (!(timer->capability & OMAP_TIMER_ALWON))
1542 				cpu_pm_unregister_notifier(&timer->nb);
1543 			list_del(&timer->node);
1544 			ret = 0;
1545 			break;
1546 		}
1547 	spin_unlock_irqrestore(&dm_timer_lock, flags);
1548 
1549 	pm_runtime_disable(&pdev->dev);
1550 
1551 	if (ret)
1552 		dev_err(&pdev->dev, "Unable to determine timer entry in list of drivers on remove\n");
1553 }
1554 
1555 static const struct omap_dm_timer_ops dmtimer_ops = {
1556 	.request_by_node = omap_dm_timer_request_by_node,
1557 	.request_specific = omap_dm_timer_request_specific,
1558 	.request = omap_dm_timer_request,
1559 	.set_source = omap_dm_timer_set_source,
1560 	.get_irq = omap_dm_timer_get_irq,
1561 	.set_int_enable = omap_dm_timer_set_int_enable,
1562 	.set_int_disable = omap_dm_timer_set_int_disable,
1563 	.free = omap_dm_timer_free,
1564 	.enable = omap_dm_timer_enable,
1565 	.disable = omap_dm_timer_disable,
1566 	.get_fclk = omap_dm_timer_get_fclk,
1567 	.start = omap_dm_timer_start,
1568 	.stop = omap_dm_timer_stop,
1569 	.set_load = omap_dm_timer_set_load,
1570 	.set_match = omap_dm_timer_set_match,
1571 	.set_pwm = omap_dm_timer_set_pwm,
1572 	.get_pwm_status = omap_dm_timer_get_pwm_status,
1573 	.set_prescaler = omap_dm_timer_set_prescaler,
1574 	.read_counter = omap_dm_timer_read_counter,
1575 	.write_counter = omap_dm_timer_write_counter,
1576 	.read_status = omap_dm_timer_read_status,
1577 	.write_status = omap_dm_timer_write_status,
1578 	.set_cap = omap_dm_timer_set_cap,
1579 	.get_cap_status = omap_dm_timer_get_pwm_status,
1580 	.read_cap = omap_dm_timer_cap_counter,
1581 };
1582 
1583 static const struct dmtimer_platform_data omap3plus_pdata = {
1584 	.timer_errata = OMAP_TIMER_ERRATA_I103_I767,
1585 	.timer_ops = &dmtimer_ops,
1586 };
1587 
1588 static const struct dmtimer_platform_data am6_pdata = {
1589 	.timer_ops = &dmtimer_ops,
1590 };
1591 
1592 static const struct of_device_id omap_timer_match[] = {
1593 	{
1594 		.compatible = "ti,omap2420-timer",
1595 	},
1596 	{
1597 		.compatible = "ti,omap3430-timer",
1598 		.data = &omap3plus_pdata,
1599 	},
1600 	{
1601 		.compatible = "ti,omap4430-timer",
1602 		.data = &omap3plus_pdata,
1603 	},
1604 	{
1605 		.compatible = "ti,omap5430-timer",
1606 		.data = &omap3plus_pdata,
1607 	},
1608 	{
1609 		.compatible = "ti,am335x-timer",
1610 		.data = &omap3plus_pdata,
1611 	},
1612 	{
1613 		.compatible = "ti,am335x-timer-1ms",
1614 		.data = &omap3plus_pdata,
1615 	},
1616 	{
1617 		.compatible = "ti,dm816-timer",
1618 		.data = &omap3plus_pdata,
1619 	},
1620 	{
1621 		.compatible = "ti,am654-timer",
1622 		.data = &am6_pdata,
1623 	},
1624 	{},
1625 };
1626 MODULE_DEVICE_TABLE(of, omap_timer_match);
1627 
1628 static struct platform_driver omap_dm_timer_driver = {
1629 	.probe  = omap_dm_timer_probe,
1630 	.remove = omap_dm_timer_remove,
1631 	.driver = {
1632 		.name   = "omap_timer",
1633 		.of_match_table = omap_timer_match,
1634 		.pm = &omap_dm_timer_pm_ops,
1635 	},
1636 };
1637 
1638 module_platform_driver(omap_dm_timer_driver);
1639 
1640 MODULE_DESCRIPTION("OMAP Dual-Mode Timer Driver");
1641 MODULE_AUTHOR("Texas Instruments Inc");
1642