1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright (C) 2021 Sean Anderson <sean.anderson@seco.com>
4  */
5 
6 #ifndef XILINX_TIMER_H
7 #define XILINX_TIMER_H
8 
9 #include <linux/compiler.h>
10 
11 #define TCSR0	0x00
12 #define TLR0	0x04
13 #define TCR0	0x08
14 #define TCSR1	0x10
15 #define TLR1	0x14
16 #define TCR1	0x18
17 
18 #define TCSR_MDT	BIT(0)
19 #define TCSR_UDT	BIT(1)
20 #define TCSR_GENT	BIT(2)
21 #define TCSR_CAPT	BIT(3)
22 #define TCSR_ARHT	BIT(4)
23 #define TCSR_LOAD	BIT(5)
24 #define TCSR_ENIT	BIT(6)
25 #define TCSR_ENT	BIT(7)
26 #define TCSR_TINT	BIT(8)
27 #define TCSR_PWMA	BIT(9)
28 #define TCSR_ENALL	BIT(10)
29 #define TCSR_CASC	BIT(11)
30 
31 struct clk;
32 struct device_node;
33 struct regmap;
34 
35 /**
36  * struct xilinx_timer_priv - Private data for Xilinx AXI timer drivers
37  * @map: Regmap of the device, possibly with an offset
38  * @clk: Parent clock
39  * @max: Maximum value of the counters
40  */
41 struct xilinx_timer_priv {
42 	struct regmap *map;
43 	struct clk *clk;
44 	u32 max;
45 };
46 
47 /**
48  * xilinx_timer_tlr_cycles() - Calculate the TLR for a period specified
49  *                             in clock cycles
50  * @priv: The timer's private data
51  * @tcsr: The value of the TCSR register for this counter
52  * @cycles: The number of cycles in this period
53  *
54  * Callers of this function MUST ensure that @cycles is representable as
55  * a TLR.
56  *
57  * Return: The calculated value for TLR
58  */
59 u32 xilinx_timer_tlr_cycles(struct xilinx_timer_priv *priv, u32 tcsr,
60 			    u64 cycles);
61 
62 /**
63  * xilinx_timer_get_period() - Get the current period of a counter
64  * @priv: The timer's private data
65  * @tlr: The value of TLR for this counter
66  * @tcsr: The value of TCSR for this counter
67  *
68  * Return: The period, in ns
69  */
70 unsigned int xilinx_timer_get_period(struct xilinx_timer_priv *priv,
71 				     u32 tlr, u32 tcsr);
72 
73 #endif /* XILINX_TIMER_H */
74