Merge tag 'trace-v5.15-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
[linux-block.git] / drivers / clk / zynqmp / clk-zynqmp.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  *  Copyright (C) 2016-2018 Xilinx
4  */
5
6 #ifndef __LINUX_CLK_ZYNQMP_H_
7 #define __LINUX_CLK_ZYNQMP_H_
8
9 #include <linux/spinlock.h>
10
11 #include <linux/firmware/xlnx-zynqmp.h>
12
13 /* Common Flags */
14 /* must be gated across rate change */
15 #define ZYNQMP_CLK_SET_RATE_GATE        BIT(0)
16 /* must be gated across re-parent */
17 #define ZYNQMP_CLK_SET_PARENT_GATE      BIT(1)
18 /* propagate rate change up one level */
19 #define ZYNQMP_CLK_SET_RATE_PARENT      BIT(2)
20 /* do not gate even if unused */
21 #define ZYNQMP_CLK_IGNORE_UNUSED        BIT(3)
22 /* don't re-parent on rate change */
23 #define ZYNQMP_CLK_SET_RATE_NO_REPARENT BIT(7)
24 /* do not gate, ever */
25 #define ZYNQMP_CLK_IS_CRITICAL          BIT(11)
26
27 /* Type Flags for divider clock */
28 #define ZYNQMP_CLK_DIVIDER_ONE_BASED            BIT(0)
29 #define ZYNQMP_CLK_DIVIDER_POWER_OF_TWO         BIT(1)
30 #define ZYNQMP_CLK_DIVIDER_ALLOW_ZERO           BIT(2)
31 #define ZYNQMP_CLK_DIVIDER_HIWORD_MASK          BIT(3)
32 #define ZYNQMP_CLK_DIVIDER_ROUND_CLOSEST        BIT(4)
33 #define ZYNQMP_CLK_DIVIDER_READ_ONLY            BIT(5)
34 #define ZYNQMP_CLK_DIVIDER_MAX_AT_ZERO          BIT(6)
35
36 /* Type Flags for mux clock */
37 #define ZYNQMP_CLK_MUX_INDEX_ONE                BIT(0)
38 #define ZYNQMP_CLK_MUX_INDEX_BIT                BIT(1)
39 #define ZYNQMP_CLK_MUX_HIWORD_MASK              BIT(2)
40 #define ZYNQMP_CLK_MUX_READ_ONLY                BIT(3)
41 #define ZYNQMP_CLK_MUX_ROUND_CLOSEST            BIT(4)
42 #define ZYNQMP_CLK_MUX_BIG_ENDIAN               BIT(5)
43
44 enum topology_type {
45         TYPE_INVALID,
46         TYPE_MUX,
47         TYPE_PLL,
48         TYPE_FIXEDFACTOR,
49         TYPE_DIV1,
50         TYPE_DIV2,
51         TYPE_GATE,
52 };
53
54 /**
55  * struct clock_topology - Clock topology
56  * @type:       Type of topology
57  * @flag:       Topology flags
58  * @type_flag:  Topology type specific flag
59  * @custom_type_flag: Topology type specific custom flag
60  */
61 struct clock_topology {
62         u32 type;
63         u32 flag;
64         u32 type_flag;
65         u8 custom_type_flag;
66 };
67
68 unsigned long zynqmp_clk_map_common_ccf_flags(const u32 zynqmp_flag);
69
70 struct clk_hw *zynqmp_clk_register_pll(const char *name, u32 clk_id,
71                                        const char * const *parents,
72                                        u8 num_parents,
73                                        const struct clock_topology *nodes);
74
75 struct clk_hw *zynqmp_clk_register_gate(const char *name, u32 clk_id,
76                                         const char * const *parents,
77                                         u8 num_parents,
78                                         const struct clock_topology *nodes);
79
80 struct clk_hw *zynqmp_clk_register_divider(const char *name,
81                                            u32 clk_id,
82                                            const char * const *parents,
83                                            u8 num_parents,
84                                            const struct clock_topology *nodes);
85
86 struct clk_hw *zynqmp_clk_register_mux(const char *name, u32 clk_id,
87                                        const char * const *parents,
88                                        u8 num_parents,
89                                        const struct clock_topology *nodes);
90
91 struct clk_hw *zynqmp_clk_register_fixed_factor(const char *name,
92                                         u32 clk_id,
93                                         const char * const *parents,
94                                         u8 num_parents,
95                                         const struct clock_topology *nodes);
96
97 #endif