]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
f26c8a8e SG |
2 | /* |
3 | * Copyright (c) 2015 Google, Inc | |
4 | * Written by Simon Glass <[email protected]> | |
135aa950 | 5 | * Copyright (c) 2016, NVIDIA CORPORATION. |
f26c8a8e SG |
6 | */ |
7 | ||
08d0d6f3 MS |
8 | #ifndef _CLK_H_ |
9 | #define _CLK_H_ | |
10 | ||
75f98314 | 11 | #include <dm/ofnode.h> |
6f791747 | 12 | #include <linux/err.h> |
1221ce45 | 13 | #include <linux/errno.h> |
ad1cf785 MY |
14 | #include <linux/types.h> |
15 | ||
135aa950 SW |
16 | /** |
17 | * A clock is a hardware signal that oscillates autonomously at a specific | |
18 | * frequency and duty cycle. Most hardware modules require one or more clock | |
19 | * signal to drive their operation. Clock signals are typically generated | |
20 | * externally to the HW module consuming them, by an entity this API calls a | |
21 | * clock provider. This API provides a standard means for drivers to enable and | |
22 | * disable clocks, and to set the rate at which they oscillate. | |
23 | * | |
a9092710 | 24 | * A driver that implements UCLASS_CLK is a clock provider. A provider will |
135aa950 | 25 | * often implement multiple separate clocks, since the hardware it manages |
9bf86506 | 26 | * often has this capability. clk-uclass.h describes the interface which |
135aa950 SW |
27 | * clock providers must implement. |
28 | * | |
29 | * Clock consumers/clients are the HW modules driven by the clock signals. This | |
30 | * header file describes the API used by drivers for those HW modules. | |
31 | */ | |
ad1cf785 | 32 | |
135aa950 | 33 | struct udevice; |
08d0d6f3 | 34 | |
135aa950 SW |
35 | /** |
36 | * struct clk - A handle to (allowing control of) a single clock. | |
37 | * | |
38 | * Clients provide storage for clock handles. The content of the structure is | |
39 | * managed solely by the clock API and clock drivers. A clock struct is | |
40 | * initialized by "get"ing the clock struct. The clock struct is passed to all | |
41 | * other clock APIs to identify which clock signal to operate upon. | |
42 | * | |
43 | * @dev: The device which implements the clock signal. | |
105db959 | 44 | * @rate: The clock rate (in HZ). |
a8592cdd LM |
45 | * @flags: Flags used across common clock structure (e.g. CLK_) |
46 | * Clock IP blocks specific flags (i.e. mux, div, gate, etc) are defined | |
47 | * in struct's for those devices (e.g. struct clk_mux). | |
135aa950 | 48 | * @id: The clock signal ID within the provider. |
3b3969bd AD |
49 | * @data: An optional data field for scenarios where a single integer ID is not |
50 | * sufficient. If used, it can be populated through an .of_xlate op and | |
51 | * processed during the various clock ops. | |
135aa950 | 52 | * |
3b3969bd AD |
53 | * Should additional information to identify and configure any clock signal |
54 | * for any provider be required in the future, the struct could be expanded to | |
135aa950 SW |
55 | * either (a) add more fields to allow clock providers to store additional |
56 | * information, or (b) replace the id field with an opaque pointer, which the | |
57 | * provider would dynamically allocated during its .of_xlate op, and process | |
58 | * during is .request op. This may require the addition of an extra op to clean | |
59 | * up the allocation. | |
60 | */ | |
61 | struct clk { | |
62 | struct udevice *dev; | |
105db959 | 63 | long long rate; /* in HZ */ |
a8592cdd | 64 | u32 flags; |
e6849e2f | 65 | int enable_count; |
135aa950 | 66 | /* |
3b3969bd | 67 | * Written by of_xlate. In the future, we might add more fields here. |
f26c8a8e | 68 | */ |
135aa950 | 69 | unsigned long id; |
3b3969bd | 70 | unsigned long data; |
f26c8a8e SG |
71 | }; |
72 | ||
a855be87 NA |
73 | /** |
74 | * struct clk_bulk - A handle to (allowing control of) a bulk of clocks. | |
75 | * | |
76 | * Clients provide storage for the clock bulk. The content of the structure is | |
77 | * managed solely by the clock API. A clock bulk struct is | |
78 | * initialized by "get"ing the clock bulk struct. | |
79 | * The clock bulk struct is passed to all other bulk clock APIs to apply | |
80 | * the API to all the clock in the bulk struct. | |
81 | * | |
82 | * @clks: An array of clock handles. | |
83 | * @count: The number of clock handles in the clks array. | |
84 | */ | |
85 | struct clk_bulk { | |
86 | struct clk *clks; | |
87 | unsigned int count; | |
88 | }; | |
89 | ||
3f96f875 | 90 | #if CONFIG_IS_ENABLED(OF_CONTROL) && CONFIG_IS_ENABLED(CLK) |
0d15463c | 91 | struct phandle_1_arg; |
f0ab8f9f SG |
92 | /** |
93 | * clk_get_by_phandle() - Get a clock by its phandle information (of-platadata) | |
94 | * | |
95 | * This function is used when of-platdata is enabled. | |
96 | * | |
97 | * This looks up a clock using the phandle info. With dtoc, each phandle in the | |
98 | * 'clocks' property is transformed into an idx representing the device. For | |
99 | * example: | |
100 | * | |
101 | * clocks = <&dpll_mpu_ck 23>; | |
102 | * | |
103 | * might result in: | |
104 | * | |
105 | * .clocks = {1, {23}},}, | |
106 | * | |
107 | * indicating that the clock is udevice idx 1 in dt-plat.c with an argument of | |
108 | * 23. This function can return a valid clock given the above information. In | |
109 | * this example it would return a clock containing the 'dpll_mpu_ck' device and | |
110 | * the clock ID 23. | |
111 | * | |
112 | * @dev: Device containing the phandle | |
113 | * @cells: Phandle info | |
114 | * @clock: A pointer to a clock struct to initialise | |
115 | * @return 0 if OK, or a negative error code. | |
116 | */ | |
117 | int clk_get_by_phandle(struct udevice *dev, const struct phandle_1_arg *cells, | |
118 | struct clk *clk); | |
7423daa6 | 119 | |
135aa950 | 120 | /** |
f0ab8f9f | 121 | * clk_get_by_index() - Get/request a clock by integer index. |
135aa950 SW |
122 | * |
123 | * This looks up and requests a clock. The index is relative to the client | |
124 | * device; each device is assumed to have n clocks associated with it somehow, | |
125 | * and this function finds and requests one of them. 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 | * @index: The index of the clock to request, within the client's list of | |
131 | * clocks. | |
132 | * @clock A pointer to a clock struct to initialize. | |
133 | * @return 0 if OK, or a negative error code. | |
134 | */ | |
135 | int clk_get_by_index(struct udevice *dev, int index, struct clk *clk); | |
f26c8a8e | 136 | |
75f98314 | 137 | /** |
d7c56616 | 138 | * clk_get_by_index_nodev - Get/request a clock by integer index |
75f98314 JT |
139 | * without a device. |
140 | * | |
141 | * This is a version of clk_get_by_index() that does not use a device. | |
142 | * | |
143 | * @node: The client ofnode. | |
144 | * @index: The index of the clock to request, within the client's list of | |
145 | * clocks. | |
146 | * @clock A pointer to a clock struct to initialize. | |
147 | * @return 0 if OK, or a negative error code. | |
148 | */ | |
149 | int clk_get_by_index_nodev(ofnode node, int index, struct clk *clk); | |
150 | ||
a855be87 | 151 | /** |
d7c56616 | 152 | * clk_get_bulk - Get/request all clocks of a device. |
a855be87 NA |
153 | * |
154 | * This looks up and requests all clocks of the client device; each device is | |
155 | * assumed to have n clocks associated with it somehow, and this function finds | |
156 | * and requests all of them in a separate structure. The mapping of client | |
157 | * device clock indices to provider clocks may be via device-tree properties, | |
158 | * board-provided mapping tables, or some other mechanism. | |
159 | * | |
160 | * @dev: The client device. | |
161 | * @bulk A pointer to a clock bulk struct to initialize. | |
162 | * @return 0 if OK, or a negative error code. | |
163 | */ | |
164 | int clk_get_bulk(struct udevice *dev, struct clk_bulk *bulk); | |
165 | ||
f26c8a8e | 166 | /** |
d7c56616 | 167 | * clk_get_by_name - Get/request a clock by name. |
f26c8a8e | 168 | * |
135aa950 SW |
169 | * This looks up and requests a clock. The name is relative to the client |
170 | * device; each device is assumed to have n clocks associated with it somehow, | |
171 | * and this function finds and requests one of them. The mapping of client | |
172 | * device clock names to provider clocks may be via device-tree properties, | |
173 | * board-provided mapping tables, or some other mechanism. | |
174 | * | |
175 | * @dev: The client device. | |
176 | * @name: The name of the clock to request, within the client's list of | |
177 | * clocks. | |
178 | * @clock: A pointer to a clock struct to initialize. | |
179 | * @return 0 if OK, or a negative error code. | |
f26c8a8e | 180 | */ |
135aa950 | 181 | int clk_get_by_name(struct udevice *dev, const char *name, struct clk *clk); |
b108d8a0 | 182 | |
d646420e CY |
183 | /** |
184 | * clk_get_by_name_nodev - Get/request a clock by name without a device. | |
185 | * | |
186 | * This is a version of clk_get_by_name() that does not use a device. | |
187 | * | |
188 | * @node: The client ofnode. | |
189 | * @name: The name of the clock to request, within the client's list of | |
190 | * clocks. | |
191 | * @clock: A pointer to a clock struct to initialize. | |
192 | * @return 0 if OK, or a negative error code. | |
193 | */ | |
194 | int clk_get_by_name_nodev(ofnode node, const char *name, struct clk *clk); | |
195 | ||
196 | /** | |
d7c56616 | 197 | * clk_get_optional_nodev - Get/request an optinonal clock by name |
d646420e CY |
198 | * without a device. |
199 | * @node: The client ofnode. | |
200 | * @name: The name of the clock to request. | |
201 | * @name: The name of the clock to request, within the client's list of | |
202 | * clocks. | |
203 | * @clock: A pointer to a clock struct to initialize. | |
204 | * | |
205 | * Behaves the same as clk_get_by_name_nodev() except where there is | |
206 | * no clock producer, in this case, skip the error number -ENODATA, and | |
207 | * the function returns 0. | |
208 | */ | |
209 | int clk_get_optional_nodev(ofnode node, const char *name, struct clk *clk); | |
210 | ||
52720c53 JJH |
211 | /** |
212 | * devm_clk_get - lookup and obtain a managed reference to a clock producer. | |
213 | * @dev: device for clock "consumer" | |
214 | * @id: clock consumer ID | |
215 | * | |
216 | * Returns a struct clk corresponding to the clock producer, or | |
217 | * valid IS_ERR() condition containing errno. The implementation | |
218 | * uses @dev and @id to determine the clock consumer, and thereby | |
219 | * the clock producer. (IOW, @id may be identical strings, but | |
220 | * clk_get may return different clock producers depending on @dev.) | |
221 | * | |
222 | * Drivers must assume that the clock source is not enabled. | |
223 | * | |
224 | * devm_clk_get should not be called from within interrupt context. | |
225 | * | |
226 | * The clock will automatically be freed when the device is unbound | |
227 | * from the bus. | |
228 | */ | |
229 | struct clk *devm_clk_get(struct udevice *dev, const char *id); | |
230 | ||
231 | /** | |
232 | * devm_clk_get_optional - lookup and obtain a managed reference to an optional | |
233 | * clock producer. | |
234 | * @dev: device for clock "consumer" | |
235 | * @id: clock consumer ID | |
236 | * | |
237 | * Behaves the same as devm_clk_get() except where there is no clock producer. | |
238 | * In this case, instead of returning -ENOENT, the function returns NULL. | |
239 | */ | |
240 | struct clk *devm_clk_get_optional(struct udevice *dev, const char *id); | |
241 | ||
b108d8a0 PC |
242 | /** |
243 | * clk_release_all() - Disable (turn off)/Free an array of previously | |
244 | * requested clocks. | |
245 | * | |
246 | * For each clock contained in the clock array, this function will check if | |
247 | * clock has been previously requested and then will disable and free it. | |
248 | * | |
249 | * @clk: A clock struct array that was previously successfully | |
250 | * requested by clk_request/get_by_*(). | |
251 | * @count Number of clock contained in the array | |
252 | * @return zero on success, or -ve error code. | |
253 | */ | |
254 | int clk_release_all(struct clk *clk, int count); | |
255 | ||
52720c53 JJH |
256 | /** |
257 | * devm_clk_put - "free" a managed clock source | |
258 | * @dev: device used to acquire the clock | |
259 | * @clk: clock source acquired with devm_clk_get() | |
260 | * | |
261 | * Note: drivers must ensure that all clk_enable calls made on this | |
262 | * clock source are balanced by clk_disable calls prior to calling | |
263 | * this function. | |
264 | * | |
265 | * clk_put should not be called from within interrupt context. | |
266 | */ | |
267 | void devm_clk_put(struct udevice *dev, struct clk *clk); | |
268 | ||
021abf69 MY |
269 | #else |
270 | static inline int clk_get_by_index(struct udevice *dev, int index, | |
271 | struct clk *clk) | |
272 | { | |
273 | return -ENOSYS; | |
274 | } | |
275 | ||
a855be87 NA |
276 | static inline int clk_get_bulk(struct udevice *dev, struct clk_bulk *bulk) |
277 | { | |
278 | return -ENOSYS; | |
279 | } | |
280 | ||
021abf69 MY |
281 | static inline int clk_get_by_name(struct udevice *dev, const char *name, |
282 | struct clk *clk) | |
283 | { | |
284 | return -ENOSYS; | |
285 | } | |
b108d8a0 | 286 | |
d646420e CY |
287 | static inline int |
288 | clk_get_by_name_nodev(ofnode node, const char *name, struct clk *clk) | |
289 | { | |
290 | return -ENOSYS; | |
291 | } | |
292 | ||
293 | static inline int | |
294 | clk_get_optional_nodev(ofnode node, const char *name, struct clk *clk) | |
295 | { | |
296 | return -ENOSYS; | |
297 | } | |
298 | ||
b108d8a0 PC |
299 | static inline int clk_release_all(struct clk *clk, int count) |
300 | { | |
301 | return -ENOSYS; | |
302 | } | |
021abf69 | 303 | #endif |
f26c8a8e | 304 | |
6e33eba5 SA |
305 | /** |
306 | * enum clk_defaults_stage - What stage clk_set_defaults() is called at | |
307 | * @CLK_DEFAULTS_PRE: Called before probe. Setting of defaults for clocks owned | |
308 | * by this clock driver will be defered until after probing. | |
309 | * @CLK_DEFAULTS_POST: Called after probe. Only defaults for clocks owned by | |
310 | * this clock driver will be set. | |
311 | * @CLK_DEFAULTS_POST_FORCE: Called after probe, and always set defaults, even | |
312 | * before relocation. Usually, defaults are not set | |
313 | * pre-relocation to avoid setting them twice (when | |
314 | * the device is probed again post-relocation). This | |
315 | * may incur a performance cost as device tree | |
316 | * properties must be parsed for a second time. | |
317 | * However, when not using SPL, pre-relocation may be | |
318 | * the only time we can set defaults for some clocks | |
319 | * (such as those used for the RAM we will relocate | |
320 | * into). | |
321 | */ | |
322 | enum clk_defaults_stage { | |
323 | CLK_DEFAULTS_PRE = 0, | |
324 | CLK_DEFAULTS_POST = 1, | |
325 | CLK_DEFAULTS_POST_FORCE, | |
326 | }; | |
327 | ||
414cc151 | 328 | #if CONFIG_IS_ENABLED(OF_REAL) && CONFIG_IS_ENABLED(CLK) |
f4fcba5c PT |
329 | /** |
330 | * clk_set_defaults - Process 'assigned-{clocks/clock-parents/clock-rates}' | |
331 | * properties to configure clocks | |
332 | * | |
333 | * @dev: A device to process (the ofnode associated with this device | |
334 | * will be processed). | |
6e33eba5 | 335 | * @stage: The stage of the probing process this function is called during. |
f4fcba5c | 336 | */ |
6e33eba5 | 337 | int clk_set_defaults(struct udevice *dev, enum clk_defaults_stage stage); |
f4fcba5c | 338 | #else |
fd1ba296 | 339 | static inline int clk_set_defaults(struct udevice *dev, int stage) |
f4fcba5c PT |
340 | { |
341 | return 0; | |
342 | } | |
343 | #endif | |
344 | ||
a855be87 NA |
345 | /** |
346 | * clk_release_bulk() - Disable (turn off)/Free an array of previously | |
347 | * requested clocks in a clock bulk struct. | |
348 | * | |
349 | * For each clock contained in the clock bulk struct, this function will check | |
350 | * if clock has been previously requested and then will disable and free it. | |
351 | * | |
352 | * @clk: A clock bulk struct that was previously successfully | |
353 | * requested by clk_get_bulk(). | |
354 | * @return zero on success, or -ve error code. | |
355 | */ | |
356 | static inline int clk_release_bulk(struct clk_bulk *bulk) | |
357 | { | |
358 | return clk_release_all(bulk->clks, bulk->count); | |
359 | } | |
360 | ||
6f791747 | 361 | #if CONFIG_IS_ENABLED(CLK) |
f26c8a8e | 362 | /** |
135aa950 | 363 | * clk_request - Request a clock by provider-specific ID. |
f26c8a8e | 364 | * |
135aa950 SW |
365 | * This requests a clock using a provider-specific ID. Generally, this function |
366 | * should not be used, since clk_get_by_index/name() provide an interface that | |
367 | * better separates clients from intimate knowledge of clock providers. | |
368 | * However, this function may be useful in core SoC-specific code. | |
369 | * | |
370 | * @dev: The clock provider device. | |
371 | * @clock: A pointer to a clock struct to initialize. The caller must | |
372 | * have already initialized any field in this struct which the | |
373 | * clock provider uses to identify the clock. | |
374 | * @return 0 if OK, or a negative error code. | |
f26c8a8e | 375 | */ |
135aa950 | 376 | int clk_request(struct udevice *dev, struct clk *clk); |
f26c8a8e | 377 | |
f0e07516 | 378 | /** |
d7c56616 | 379 | * clk_free - Free a previously requested clock. |
f0e07516 | 380 | * |
135aa950 SW |
381 | * @clock: A clock struct that was previously successfully requested by |
382 | * clk_request/get_by_*(). | |
383 | * @return 0 if OK, or a negative error code. | |
f0e07516 | 384 | */ |
135aa950 | 385 | int clk_free(struct clk *clk); |
f0e07516 | 386 | |
f26c8a8e | 387 | /** |
135aa950 | 388 | * clk_get_rate() - Get current clock rate. |
f26c8a8e | 389 | * |
135aa950 SW |
390 | * @clk: A clock struct that was previously successfully requested by |
391 | * clk_request/get_by_*(). | |
392 | * @return clock rate in Hz, or -ve error code. | |
f26c8a8e | 393 | */ |
135aa950 | 394 | ulong clk_get_rate(struct clk *clk); |
f26c8a8e | 395 | |
0c660c2b LM |
396 | /** |
397 | * clk_get_parent() - Get current clock's parent. | |
398 | * | |
399 | * @clk: A clock struct that was previously successfully requested by | |
400 | * clk_request/get_by_*(). | |
401 | * @return pointer to parent's struct clk, or error code passed as pointer | |
402 | */ | |
403 | struct clk *clk_get_parent(struct clk *clk); | |
404 | ||
4aa78300 LM |
405 | /** |
406 | * clk_get_parent_rate() - Get parent of current clock rate. | |
407 | * | |
408 | * @clk: A clock struct that was previously successfully requested by | |
409 | * clk_request/get_by_*(). | |
410 | * @return clock rate in Hz, or -ve error code. | |
411 | */ | |
412 | long long clk_get_parent_rate(struct clk *clk); | |
413 | ||
2983ad55 DB |
414 | /** |
415 | * clk_round_rate() - Adjust a rate to the exact rate a clock can provide | |
416 | * | |
417 | * This answers the question "if I were to pass @rate to clk_set_rate(), | |
418 | * what clock rate would I end up with?" without changing the hardware | |
419 | * in any way. In other words: | |
420 | * | |
421 | * rate = clk_round_rate(clk, r); | |
422 | * | |
423 | * and: | |
424 | * | |
425 | * rate = clk_set_rate(clk, r); | |
426 | * | |
427 | * are equivalent except the former does not modify the clock hardware | |
428 | * in any way. | |
429 | * | |
430 | * @clk: A clock struct that was previously successfully requested by | |
431 | * clk_request/get_by_*(). | |
432 | * @rate: desired clock rate in Hz. | |
433 | * @return rounded rate in Hz, or -ve error code. | |
434 | */ | |
435 | ulong clk_round_rate(struct clk *clk, ulong rate); | |
436 | ||
f26c8a8e | 437 | /** |
135aa950 | 438 | * clk_set_rate() - Set current clock rate. |
f26c8a8e | 439 | * |
135aa950 SW |
440 | * @clk: A clock struct that was previously successfully requested by |
441 | * clk_request/get_by_*(). | |
442 | * @rate: New clock rate in Hz. | |
443 | * @return new rate, or -ve error code. | |
f26c8a8e | 444 | */ |
135aa950 | 445 | ulong clk_set_rate(struct clk *clk, ulong rate); |
f26c8a8e | 446 | |
f7d1046d PT |
447 | /** |
448 | * clk_set_parent() - Set current clock parent. | |
449 | * | |
450 | * @clk: A clock struct that was previously successfully requested by | |
451 | * clk_request/get_by_*(). | |
452 | * @parent: A clock struct that was previously successfully requested by | |
453 | * clk_request/get_by_*(). | |
454 | * @return new rate, or -ve error code. | |
455 | */ | |
456 | int clk_set_parent(struct clk *clk, struct clk *parent); | |
457 | ||
e70cc438 | 458 | /** |
135aa950 | 459 | * clk_enable() - Enable (turn on) a clock. |
e70cc438 | 460 | * |
135aa950 SW |
461 | * @clk: A clock struct that was previously successfully requested by |
462 | * clk_request/get_by_*(). | |
463 | * @return zero on success, or -ve error code. | |
464 | */ | |
465 | int clk_enable(struct clk *clk); | |
466 | ||
a855be87 NA |
467 | /** |
468 | * clk_enable_bulk() - Enable (turn on) all clocks in a clock bulk struct. | |
469 | * | |
470 | * @bulk: A clock bulk struct that was previously successfully requested | |
471 | * by clk_get_bulk(). | |
472 | * @return zero on success, or -ve error code. | |
473 | */ | |
474 | int clk_enable_bulk(struct clk_bulk *bulk); | |
475 | ||
135aa950 SW |
476 | /** |
477 | * clk_disable() - Disable (turn off) a clock. | |
e70cc438 | 478 | * |
135aa950 SW |
479 | * @clk: A clock struct that was previously successfully requested by |
480 | * clk_request/get_by_*(). | |
481 | * @return zero on success, or -ve error code. | |
e70cc438 | 482 | */ |
135aa950 | 483 | int clk_disable(struct clk *clk); |
e70cc438 | 484 | |
a855be87 NA |
485 | /** |
486 | * clk_disable_bulk() - Disable (turn off) all clocks in a clock bulk struct. | |
487 | * | |
488 | * @bulk: A clock bulk struct that was previously successfully requested | |
489 | * by clk_get_bulk(). | |
490 | * @return zero on success, or -ve error code. | |
491 | */ | |
492 | int clk_disable_bulk(struct clk_bulk *bulk); | |
493 | ||
acbb7cd4 SN |
494 | /** |
495 | * clk_is_match - check if two clk's point to the same hardware clock | |
496 | * @p: clk compared against q | |
497 | * @q: clk compared against p | |
498 | * | |
499 | * Returns true if the two struct clk pointers both point to the same hardware | |
500 | * clock node. | |
501 | * | |
502 | * Returns false otherwise. Note that two NULL clks are treated as matching. | |
503 | */ | |
504 | bool clk_is_match(const struct clk *p, const struct clk *q); | |
505 | ||
2796af73 LM |
506 | /** |
507 | * clk_get_by_id() - Get the clock by its ID | |
508 | * | |
509 | * @id: The clock ID to search for | |
510 | * | |
511 | * @clkp: A pointer to clock struct that has been found among added clocks | |
512 | * to UCLASS_CLK | |
513 | * @return zero on success, or -ENOENT on error | |
514 | */ | |
515 | int clk_get_by_id(ulong id, struct clk **clkp); | |
2457612d PF |
516 | |
517 | /** | |
518 | * clk_dev_binded() - Check whether the clk has a device binded | |
519 | * | |
520 | * @clk A pointer to the clk | |
521 | * | |
522 | * @return true on binded, or false on no | |
523 | */ | |
524 | bool clk_dev_binded(struct clk *clk); | |
6f791747 PD |
525 | |
526 | #else /* CONFIG_IS_ENABLED(CLK) */ | |
527 | ||
528 | static inline int clk_request(struct udevice *dev, struct clk *clk) | |
529 | { | |
530 | return -ENOSYS; | |
531 | } | |
532 | ||
533 | static inline int clk_free(struct clk *clk) | |
534 | { | |
535 | return 0; | |
536 | } | |
537 | ||
538 | static inline ulong clk_get_rate(struct clk *clk) | |
539 | { | |
540 | return -ENOSYS; | |
541 | } | |
542 | ||
543 | static inline struct clk *clk_get_parent(struct clk *clk) | |
544 | { | |
545 | return ERR_PTR(-ENOSYS); | |
546 | } | |
547 | ||
548 | static inline long long clk_get_parent_rate(struct clk *clk) | |
549 | { | |
550 | return -ENOSYS; | |
551 | } | |
552 | ||
2983ad55 DB |
553 | static inline ulong clk_round_rate(struct clk *clk, ulong rate) |
554 | { | |
555 | return -ENOSYS; | |
556 | } | |
557 | ||
6f791747 PD |
558 | static inline ulong clk_set_rate(struct clk *clk, ulong rate) |
559 | { | |
560 | return -ENOSYS; | |
561 | } | |
562 | ||
563 | static inline int clk_set_parent(struct clk *clk, struct clk *parent) | |
564 | { | |
565 | return -ENOSYS; | |
566 | } | |
567 | ||
568 | static inline int clk_enable(struct clk *clk) | |
569 | { | |
570 | return 0; | |
571 | } | |
572 | ||
573 | static inline int clk_enable_bulk(struct clk_bulk *bulk) | |
574 | { | |
575 | return 0; | |
576 | } | |
577 | ||
578 | static inline int clk_disable(struct clk *clk) | |
579 | { | |
580 | return 0; | |
581 | } | |
582 | ||
583 | static inline int clk_disable_bulk(struct clk_bulk *bulk) | |
584 | { | |
585 | return 0; | |
586 | } | |
587 | ||
588 | static inline bool clk_is_match(const struct clk *p, const struct clk *q) | |
589 | { | |
590 | return false; | |
591 | } | |
592 | ||
593 | static inline int clk_get_by_id(ulong id, struct clk **clkp) | |
594 | { | |
595 | return -ENOSYS; | |
596 | } | |
597 | ||
598 | static inline bool clk_dev_binded(struct clk *clk) | |
599 | { | |
600 | return false; | |
601 | } | |
602 | #endif /* CONFIG_IS_ENABLED(CLK) */ | |
603 | ||
604 | /** | |
605 | * clk_valid() - check if clk is valid | |
606 | * | |
607 | * @clk: the clock to check | |
608 | * @return true if valid, or false | |
609 | */ | |
610 | static inline bool clk_valid(struct clk *clk) | |
611 | { | |
612 | return clk && !!clk->dev; | |
613 | } | |
614 | ||
615 | int soc_clk_dump(void); | |
616 | ||
135aa950 | 617 | #endif |
52720c53 JJH |
618 | |
619 | #define clk_prepare_enable(clk) clk_enable(clk) | |
620 | #define clk_disable_unprepare(clk) clk_disable(clk) |