Merge tag 'pwm/for-5.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry...
[linux-2.6-block.git] / include / clocksource / timer-xilinx.h
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 */