1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __TIMER_OF_H__
3 #define __TIMER_OF_H__
4 
5 #include <linux/clockchips.h>
6 
7 #define TIMER_OF_BASE	0x1
8 #define TIMER_OF_CLOCK	0x2
9 #define TIMER_OF_IRQ	0x4
10 
11 struct of_timer_irq {
12 	int irq;
13 	int index;
14 	const char *name;
15 	unsigned long flags;
16 	irq_handler_t handler;
17 };
18 
19 struct of_timer_base {
20 	void __iomem *base;
21 	const char *name;
22 	int index;
23 };
24 
25 struct of_timer_clk {
26 	struct clk *clk;
27 	const char *name;
28 	int index;
29 	unsigned long rate;
30 	unsigned long period;
31 };
32 
33 struct timer_of {
34 	unsigned int flags;
35 	struct device_node *np;
36 	struct clock_event_device clkevt;
37 	struct of_timer_base of_base;
38 	struct of_timer_irq  of_irq;
39 	struct of_timer_clk  of_clk;
40 	void *private_data;
41 };
42 
to_timer_of(struct clock_event_device * clkevt)43 static inline struct timer_of *to_timer_of(struct clock_event_device *clkevt)
44 {
45 	return container_of(clkevt, struct timer_of, clkevt);
46 }
47 
timer_of_base(struct timer_of * to)48 static inline void __iomem *timer_of_base(struct timer_of *to)
49 {
50 	return to->of_base.base;
51 }
52 
timer_of_irq(struct timer_of * to)53 static inline int timer_of_irq(struct timer_of *to)
54 {
55 	return to->of_irq.irq;
56 }
57 
timer_of_rate(struct timer_of * to)58 static inline unsigned long timer_of_rate(struct timer_of *to)
59 {
60 	return to->of_clk.rate;
61 }
62 
timer_of_period(struct timer_of * to)63 static inline unsigned long timer_of_period(struct timer_of *to)
64 {
65 	return to->of_clk.period;
66 }
67 
68 extern int __init timer_of_init(struct device_node *np,
69 				struct timer_of *to);
70 
71 extern void __init timer_of_cleanup(struct timer_of *to);
72 
73 #endif
74