Commit | Line | Data |
---|---|---|
004c1229 LM |
1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
2 | /* | |
3 | * Copyright (C) 2019 DENX Software Engineering | |
4 | * Lukasz Majewski, DENX Software Engineering, lukma@denx.de | |
5 | * | |
6 | * Copyright (c) 2010-2011 Jeremy Kerr <jeremy.kerr@canonical.com> | |
7 | * Copyright (C) 2011-2012 Linaro Ltd <mturquette@linaro.org> | |
8 | */ | |
9 | #ifndef __LINUX_CLK_PROVIDER_H | |
10 | #define __LINUX_CLK_PROVIDER_H | |
11 | ||
1d7993d1 LM |
12 | static inline void clk_dm(ulong id, struct clk *clk) |
13 | { | |
14 | if (!IS_ERR(clk)) | |
15 | clk->id = id; | |
16 | } | |
17 | ||
18 | /* | |
19 | * flags used across common struct clk. these flags should only affect the | |
20 | * top-level framework. custom flags for dealing with hardware specifics | |
21 | * belong in struct clk_foo | |
22 | * | |
23 | * Please update clk_flags[] in drivers/clk/clk.c when making changes here! | |
24 | */ | |
25 | #define CLK_SET_RATE_GATE BIT(0) /* must be gated across rate change */ | |
26 | #define CLK_SET_PARENT_GATE BIT(1) /* must be gated across re-parent */ | |
27 | #define CLK_SET_RATE_PARENT BIT(2) /* propagate rate change up one level */ | |
28 | #define CLK_IGNORE_UNUSED BIT(3) /* do not gate even if unused */ | |
29 | /* unused */ | |
30 | #define CLK_IS_BASIC BIT(5) /* Basic clk, can't do a to_clk_foo() */ | |
31 | #define CLK_GET_RATE_NOCACHE BIT(6) /* do not use the cached clk rate */ | |
32 | #define CLK_SET_RATE_NO_REPARENT BIT(7) /* don't re-parent on rate change */ | |
33 | #define CLK_GET_ACCURACY_NOCACHE BIT(8) /* do not use the cached clk accuracy */ | |
34 | #define CLK_RECALC_NEW_RATES BIT(9) /* recalc rates after notifications */ | |
35 | #define CLK_SET_RATE_UNGATE BIT(10) /* clock needs to run to set rate */ | |
36 | #define CLK_IS_CRITICAL BIT(11) /* do not gate, ever */ | |
37 | /* parents need enable during gate/ungate, set rate and re-parent */ | |
38 | #define CLK_OPS_PARENT_ENABLE BIT(12) | |
39 | /* duty cycle call may be forwarded to the parent clock */ | |
40 | #define CLK_DUTY_CYCLE_PARENT BIT(13) | |
41 | ||
42 | #define CLK_MUX_INDEX_ONE BIT(0) | |
43 | #define CLK_MUX_INDEX_BIT BIT(1) | |
44 | #define CLK_MUX_HIWORD_MASK BIT(2) | |
45 | #define CLK_MUX_READ_ONLY BIT(3) /* mux can't be changed */ | |
46 | #define CLK_MUX_ROUND_CLOSEST BIT(4) | |
47 | ||
48 | struct clk_mux { | |
49 | struct clk clk; | |
50 | void __iomem *reg; | |
51 | u32 *table; | |
52 | u32 mask; | |
53 | u8 shift; | |
54 | u8 flags; | |
55 | ||
56 | /* | |
57 | * Fields from struct clk_init_data - this struct has been | |
58 | * omitted to avoid too deep level of CCF for bootloader | |
59 | */ | |
60 | const char * const *parent_names; | |
61 | u8 num_parents; | |
5da0095e LM |
62 | #if CONFIG_IS_ENABLED(SANDBOX_CLK_CCF) |
63 | u32 io_mux_val; | |
64 | #endif | |
65 | ||
1d7993d1 LM |
66 | }; |
67 | ||
68 | #define to_clk_mux(_clk) container_of(_clk, struct clk_mux, clk) | |
4b044082 PF |
69 | extern const struct clk_ops clk_mux_ops; |
70 | u8 clk_mux_get_parent(struct clk *clk); | |
1d7993d1 | 71 | |
1c643303 PF |
72 | struct clk_gate { |
73 | struct clk clk; | |
74 | void __iomem *reg; | |
75 | u8 bit_idx; | |
76 | u8 flags; | |
77 | }; | |
78 | ||
79 | #define to_clk_gate(_clk) container_of(_clk, struct clk_gate, clk) | |
80 | ||
81 | #define CLK_GATE_SET_TO_DISABLE BIT(0) | |
82 | #define CLK_GATE_HIWORD_MASK BIT(1) | |
83 | ||
84 | extern const struct clk_ops clk_gate_ops; | |
85 | struct clk *clk_register_gate(struct device *dev, const char *name, | |
86 | const char *parent_name, unsigned long flags, | |
87 | void __iomem *reg, u8 bit_idx, | |
88 | u8 clk_gate_flags, spinlock_t *lock); | |
89 | ||
1d7993d1 LM |
90 | struct clk_div_table { |
91 | unsigned int val; | |
92 | unsigned int div; | |
93 | }; | |
94 | ||
95 | struct clk_divider { | |
96 | struct clk clk; | |
97 | void __iomem *reg; | |
98 | u8 shift; | |
99 | u8 width; | |
100 | u8 flags; | |
101 | const struct clk_div_table *table; | |
6bb15d6f LM |
102 | #if CONFIG_IS_ENABLED(SANDBOX_CLK_CCF) |
103 | u32 io_divider_val; | |
104 | #endif | |
1d7993d1 LM |
105 | }; |
106 | ||
107 | #define clk_div_mask(width) ((1 << (width)) - 1) | |
108 | #define to_clk_divider(_clk) container_of(_clk, struct clk_divider, clk) | |
109 | ||
110 | #define CLK_DIVIDER_ONE_BASED BIT(0) | |
111 | #define CLK_DIVIDER_POWER_OF_TWO BIT(1) | |
112 | #define CLK_DIVIDER_ALLOW_ZERO BIT(2) | |
113 | #define CLK_DIVIDER_HIWORD_MASK BIT(3) | |
114 | #define CLK_DIVIDER_ROUND_CLOSEST BIT(4) | |
115 | #define CLK_DIVIDER_READ_ONLY BIT(5) | |
116 | #define CLK_DIVIDER_MAX_AT_ZERO BIT(6) | |
1b0d09cd PF |
117 | extern const struct clk_ops clk_divider_ops; |
118 | unsigned long divider_recalc_rate(struct clk *hw, unsigned long parent_rate, | |
119 | unsigned int val, | |
120 | const struct clk_div_table *table, | |
121 | unsigned long flags, unsigned long width); | |
1d7993d1 LM |
122 | |
123 | struct clk_fixed_factor { | |
124 | struct clk clk; | |
125 | unsigned int mult; | |
126 | unsigned int div; | |
127 | }; | |
128 | ||
129 | #define to_clk_fixed_factor(_clk) container_of(_clk, struct clk_fixed_factor,\ | |
130 | clk) | |
131 | ||
4f305bf1 PF |
132 | struct clk_fixed_rate { |
133 | struct clk clk; | |
134 | unsigned long fixed_rate; | |
135 | }; | |
136 | ||
137 | #define to_clk_fixed_rate(dev) ((struct clk_fixed_rate *)dev_get_platdata(dev)) | |
138 | ||
1d7993d1 LM |
139 | int clk_register(struct clk *clk, const char *drv_name, const char *name, |
140 | const char *parent_name); | |
141 | ||
142 | struct clk *clk_register_fixed_factor(struct device *dev, const char *name, | |
143 | const char *parent_name, unsigned long flags, | |
144 | unsigned int mult, unsigned int div); | |
145 | ||
146 | struct clk *clk_register_divider(struct device *dev, const char *name, | |
147 | const char *parent_name, unsigned long flags, | |
148 | void __iomem *reg, u8 shift, u8 width, | |
149 | u8 clk_divider_flags); | |
150 | ||
151 | struct clk *clk_register_mux(struct device *dev, const char *name, | |
152 | const char * const *parent_names, u8 num_parents, | |
153 | unsigned long flags, | |
154 | void __iomem *reg, u8 shift, u8 width, | |
155 | u8 clk_mux_flags); | |
156 | ||
157 | const char *clk_hw_get_name(const struct clk *hw); | |
158 | ulong clk_generic_get_rate(struct clk *clk); | |
159 | ||
004c1229 LM |
160 | static inline struct clk *dev_get_clk_ptr(struct udevice *dev) |
161 | { | |
162 | return (struct clk *)dev_get_uclass_priv(dev); | |
163 | } | |
164 | #endif /* __LINUX_CLK_PROVIDER_H */ |