clk: Extend struct clk to provide information regarding clock rate
[platform/kernel/u-boot.git] / include / clk.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright (c) 2015 Google, Inc
4  * Written by Simon Glass <sjg@chromium.org>
5  * Copyright (c) 2016, NVIDIA CORPORATION.
6  */
7
8 #ifndef _CLK_H_
9 #define _CLK_H_
10
11 #include <dm/ofnode.h>
12 #include <linux/errno.h>
13 #include <linux/types.h>
14
15 /**
16  * A clock is a hardware signal that oscillates autonomously at a specific
17  * frequency and duty cycle. Most hardware modules require one or more clock
18  * signal to drive their operation. Clock signals are typically generated
19  * externally to the HW module consuming them, by an entity this API calls a
20  * clock provider. This API provides a standard means for drivers to enable and
21  * disable clocks, and to set the rate at which they oscillate.
22  *
23  * A driver that implements UCLASS_CLK is a clock provider. A provider will
24  * often implement multiple separate clocks, since the hardware it manages
25  * often has this capability. clk-uclass.h describes the interface which
26  * clock providers must implement.
27  *
28  * Clock consumers/clients are the HW modules driven by the clock signals. This
29  * header file describes the API used by drivers for those HW modules.
30  */
31
32 struct udevice;
33
34 /**
35  * struct clk - A handle to (allowing control of) a single clock.
36  *
37  * Clients provide storage for clock handles. The content of the structure is
38  * managed solely by the clock API and clock drivers. A clock struct is
39  * initialized by "get"ing the clock struct. The clock struct is passed to all
40  * other clock APIs to identify which clock signal to operate upon.
41  *
42  * @dev: The device which implements the clock signal.
43  * @rate: The clock rate (in HZ).
44  * @id: The clock signal ID within the provider.
45  * @data: An optional data field for scenarios where a single integer ID is not
46  *        sufficient. If used, it can be populated through an .of_xlate op and
47  *        processed during the various clock ops.
48  *
49  * Should additional information to identify and configure any clock signal
50  * for any provider be required in the future, the struct could be expanded to
51  * either (a) add more fields to allow clock providers to store additional
52  * information, or (b) replace the id field with an opaque pointer, which the
53  * provider would dynamically allocated during its .of_xlate op, and process
54  * during is .request op. This may require the addition of an extra op to clean
55  * up the allocation.
56  */
57 struct clk {
58         struct udevice *dev;
59         long long rate; /* in HZ */
60         /*
61          * Written by of_xlate. In the future, we might add more fields here.
62          */
63         unsigned long id;
64         unsigned long data;
65 };
66
67 /**
68  * struct clk_bulk - A handle to (allowing control of) a bulk of clocks.
69  *
70  * Clients provide storage for the clock bulk. The content of the structure is
71  * managed solely by the clock API. A clock bulk struct is
72  * initialized by "get"ing the clock bulk struct.
73  * The clock bulk struct is passed to all other bulk clock APIs to apply
74  * the API to all the clock in the bulk struct.
75  *
76  * @clks: An array of clock handles.
77  * @count: The number of clock handles in the clks array.
78  */
79 struct clk_bulk {
80         struct clk *clks;
81         unsigned int count;
82 };
83
84 #if CONFIG_IS_ENABLED(OF_CONTROL) && CONFIG_IS_ENABLED(CLK)
85 struct phandle_1_arg;
86 int clk_get_by_index_platdata(struct udevice *dev, int index,
87                               struct phandle_1_arg *cells, struct clk *clk);
88
89 /**
90  * clock_get_by_index - Get/request a clock by integer index.
91  *
92  * This looks up and requests a clock. The index is relative to the client
93  * device; each device is assumed to have n clocks associated with it somehow,
94  * and this function finds and requests one of them. The mapping of client
95  * device clock indices to provider clocks may be via device-tree properties,
96  * board-provided mapping tables, or some other mechanism.
97  *
98  * @dev:        The client device.
99  * @index:      The index of the clock to request, within the client's list of
100  *              clocks.
101  * @clock       A pointer to a clock struct to initialize.
102  * @return 0 if OK, or a negative error code.
103  */
104 int clk_get_by_index(struct udevice *dev, int index, struct clk *clk);
105
106 /**
107  * clock_get_by_index_nodev - Get/request a clock by integer index
108  * without a device.
109  *
110  * This is a version of clk_get_by_index() that does not use a device.
111  *
112  * @node:       The client ofnode.
113  * @index:      The index of the clock to request, within the client's list of
114  *              clocks.
115  * @clock       A pointer to a clock struct to initialize.
116  * @return 0 if OK, or a negative error code.
117  */
118 int clk_get_by_index_nodev(ofnode node, int index, struct clk *clk);
119
120 /**
121  * clock_get_bulk - Get/request all clocks of a device.
122  *
123  * This looks up and requests all clocks of the client device; each device is
124  * assumed to have n clocks associated with it somehow, and this function finds
125  * and requests all of them in a separate structure. The mapping of client
126  * device clock indices to provider clocks may be via device-tree properties,
127  * board-provided mapping tables, or some other mechanism.
128  *
129  * @dev:        The client device.
130  * @bulk        A pointer to a clock bulk struct to initialize.
131  * @return 0 if OK, or a negative error code.
132  */
133 int clk_get_bulk(struct udevice *dev, struct clk_bulk *bulk);
134
135 /**
136  * clock_get_by_name - Get/request a clock by name.
137  *
138  * This looks up and requests a clock. The name is relative to the client
139  * device; each device is assumed to have n clocks associated with it somehow,
140  * and this function finds and requests one of them. The mapping of client
141  * device clock names to provider clocks may be via device-tree properties,
142  * board-provided mapping tables, or some other mechanism.
143  *
144  * @dev:        The client device.
145  * @name:       The name of the clock to request, within the client's list of
146  *              clocks.
147  * @clock:      A pointer to a clock struct to initialize.
148  * @return 0 if OK, or a negative error code.
149  */
150 int clk_get_by_name(struct udevice *dev, const char *name, struct clk *clk);
151
152 /**
153  * clk_release_all() - Disable (turn off)/Free an array of previously
154  * requested clocks.
155  *
156  * For each clock contained in the clock array, this function will check if
157  * clock has been previously requested and then will disable and free it.
158  *
159  * @clk:        A clock struct array that was previously successfully
160  *              requested by clk_request/get_by_*().
161  * @count       Number of clock contained in the array
162  * @return zero on success, or -ve error code.
163  */
164 int clk_release_all(struct clk *clk, int count);
165
166 #else
167 static inline int clk_get_by_index(struct udevice *dev, int index,
168                                    struct clk *clk)
169 {
170         return -ENOSYS;
171 }
172
173 static inline int clk_get_bulk(struct udevice *dev, struct clk_bulk *bulk)
174 {
175         return -ENOSYS;
176 }
177
178 static inline int clk_get_by_name(struct udevice *dev, const char *name,
179                            struct clk *clk)
180 {
181         return -ENOSYS;
182 }
183
184 static inline int clk_release_all(struct clk *clk, int count)
185 {
186         return -ENOSYS;
187 }
188 #endif
189
190 #if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) && \
191         CONFIG_IS_ENABLED(CLK)
192 /**
193  * clk_set_defaults - Process 'assigned-{clocks/clock-parents/clock-rates}'
194  *                    properties to configure clocks
195  *
196  * @dev:        A device to process (the ofnode associated with this device
197  *              will be processed).
198  */
199 int clk_set_defaults(struct udevice *dev);
200 #else
201 static inline int clk_set_defaults(struct udevice *dev)
202 {
203         return 0;
204 }
205 #endif
206
207 /**
208  * clk_release_bulk() - Disable (turn off)/Free an array of previously
209  * requested clocks in a clock bulk struct.
210  *
211  * For each clock contained in the clock bulk struct, this function will check
212  * if clock has been previously requested and then will disable and free it.
213  *
214  * @clk:        A clock bulk struct that was previously successfully
215  *              requested by clk_get_bulk().
216  * @return zero on success, or -ve error code.
217  */
218 static inline int clk_release_bulk(struct clk_bulk *bulk)
219 {
220         return clk_release_all(bulk->clks, bulk->count);
221 }
222
223 /**
224  * clk_request - Request a clock by provider-specific ID.
225  *
226  * This requests a clock using a provider-specific ID. Generally, this function
227  * should not be used, since clk_get_by_index/name() provide an interface that
228  * better separates clients from intimate knowledge of clock providers.
229  * However, this function may be useful in core SoC-specific code.
230  *
231  * @dev:        The clock provider device.
232  * @clock:      A pointer to a clock struct to initialize. The caller must
233  *              have already initialized any field in this struct which the
234  *              clock provider uses to identify the clock.
235  * @return 0 if OK, or a negative error code.
236  */
237 int clk_request(struct udevice *dev, struct clk *clk);
238
239 /**
240  * clock_free - Free a previously requested clock.
241  *
242  * @clock:      A clock struct that was previously successfully requested by
243  *              clk_request/get_by_*().
244  * @return 0 if OK, or a negative error code.
245  */
246 int clk_free(struct clk *clk);
247
248 /**
249  * clk_get_rate() - Get current clock rate.
250  *
251  * @clk:        A clock struct that was previously successfully requested by
252  *              clk_request/get_by_*().
253  * @return clock rate in Hz, or -ve error code.
254  */
255 ulong clk_get_rate(struct clk *clk);
256
257 /**
258  * clk_set_rate() - Set current clock rate.
259  *
260  * @clk:        A clock struct that was previously successfully requested by
261  *              clk_request/get_by_*().
262  * @rate:       New clock rate in Hz.
263  * @return new rate, or -ve error code.
264  */
265 ulong clk_set_rate(struct clk *clk, ulong rate);
266
267 /**
268  * clk_set_parent() - Set current clock parent.
269  *
270  * @clk:        A clock struct that was previously successfully requested by
271  *              clk_request/get_by_*().
272  * @parent:     A clock struct that was previously successfully requested by
273  *              clk_request/get_by_*().
274  * @return new rate, or -ve error code.
275  */
276 int clk_set_parent(struct clk *clk, struct clk *parent);
277
278 /**
279  * clk_enable() - Enable (turn on) a clock.
280  *
281  * @clk:        A clock struct that was previously successfully requested by
282  *              clk_request/get_by_*().
283  * @return zero on success, or -ve error code.
284  */
285 int clk_enable(struct clk *clk);
286
287 /**
288  * clk_enable_bulk() - Enable (turn on) all clocks in a clock bulk struct.
289  *
290  * @bulk:       A clock bulk struct that was previously successfully requested
291  *              by clk_get_bulk().
292  * @return zero on success, or -ve error code.
293  */
294 int clk_enable_bulk(struct clk_bulk *bulk);
295
296 /**
297  * clk_disable() - Disable (turn off) a clock.
298  *
299  * @clk:        A clock struct that was previously successfully requested by
300  *              clk_request/get_by_*().
301  * @return zero on success, or -ve error code.
302  */
303 int clk_disable(struct clk *clk);
304
305 /**
306  * clk_disable_bulk() - Disable (turn off) all clocks in a clock bulk struct.
307  *
308  * @bulk:       A clock bulk struct that was previously successfully requested
309  *              by clk_get_bulk().
310  * @return zero on success, or -ve error code.
311  */
312 int clk_disable_bulk(struct clk_bulk *bulk);
313
314 int soc_clk_dump(void);
315
316 /**
317  * clk_valid() - check if clk is valid
318  *
319  * @clk:        the clock to check
320  * @return true if valid, or false
321  */
322 static inline bool clk_valid(struct clk *clk)
323 {
324         return !!clk->dev;
325 }
326 #endif