162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __TIMER_OF_H__
362306a36Sopenharmony_ci#define __TIMER_OF_H__
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/clockchips.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#define TIMER_OF_BASE	0x1
862306a36Sopenharmony_ci#define TIMER_OF_CLOCK	0x2
962306a36Sopenharmony_ci#define TIMER_OF_IRQ	0x4
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistruct of_timer_irq {
1262306a36Sopenharmony_ci	int irq;
1362306a36Sopenharmony_ci	int index;
1462306a36Sopenharmony_ci	int percpu;
1562306a36Sopenharmony_ci	const char *name;
1662306a36Sopenharmony_ci	unsigned long flags;
1762306a36Sopenharmony_ci	irq_handler_t handler;
1862306a36Sopenharmony_ci};
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistruct of_timer_base {
2162306a36Sopenharmony_ci	void __iomem *base;
2262306a36Sopenharmony_ci	const char *name;
2362306a36Sopenharmony_ci	int index;
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistruct of_timer_clk {
2762306a36Sopenharmony_ci	struct clk *clk;
2862306a36Sopenharmony_ci	const char *name;
2962306a36Sopenharmony_ci	int index;
3062306a36Sopenharmony_ci	unsigned long rate;
3162306a36Sopenharmony_ci	unsigned long period;
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistruct timer_of {
3562306a36Sopenharmony_ci	unsigned int flags;
3662306a36Sopenharmony_ci	struct device_node *np;
3762306a36Sopenharmony_ci	struct clock_event_device clkevt;
3862306a36Sopenharmony_ci	struct of_timer_base of_base;
3962306a36Sopenharmony_ci	struct of_timer_irq  of_irq;
4062306a36Sopenharmony_ci	struct of_timer_clk  of_clk;
4162306a36Sopenharmony_ci	void *private_data;
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic inline struct timer_of *to_timer_of(struct clock_event_device *clkevt)
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	return container_of(clkevt, struct timer_of, clkevt);
4762306a36Sopenharmony_ci}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistatic inline void __iomem *timer_of_base(struct timer_of *to)
5062306a36Sopenharmony_ci{
5162306a36Sopenharmony_ci	return to->of_base.base;
5262306a36Sopenharmony_ci}
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistatic inline int timer_of_irq(struct timer_of *to)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	return to->of_irq.irq;
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistatic inline unsigned long timer_of_rate(struct timer_of *to)
6062306a36Sopenharmony_ci{
6162306a36Sopenharmony_ci	return to->of_clk.rate;
6262306a36Sopenharmony_ci}
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistatic inline unsigned long timer_of_period(struct timer_of *to)
6562306a36Sopenharmony_ci{
6662306a36Sopenharmony_ci	return to->of_clk.period;
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ciextern int __init timer_of_init(struct device_node *np,
7062306a36Sopenharmony_ci				struct timer_of *to);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciextern void __init timer_of_cleanup(struct timer_of *to);
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci#endif
75