]>
Commit | Line | Data |
---|---|---|
f26c8a8e SG |
1 | /* |
2 | * Copyright (c) 2015 Google, Inc | |
3 | * Written by Simon Glass <[email protected]> | |
135aa950 | 4 | * Copyright (c) 2016, NVIDIA CORPORATION. |
f26c8a8e SG |
5 | * |
6 | * SPDX-License-Identifier: GPL-2.0+ | |
7 | */ | |
8 | ||
08d0d6f3 MS |
9 | #ifndef _CLK_H_ |
10 | #define _CLK_H_ | |
11 | ||
1221ce45 | 12 | #include <linux/errno.h> |
ad1cf785 MY |
13 | #include <linux/types.h> |
14 | ||
135aa950 SW |
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_CLOCK is a clock provider. A provider will | |
24 | * often implement multiple separate clocks, since the hardware it manages | |
25 | * often has this capability. clock_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 | */ | |
ad1cf785 | 31 | |
135aa950 | 32 | struct udevice; |
08d0d6f3 | 33 | |
135aa950 SW |
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 | * @id: The clock signal ID within the provider. | |
44 | * | |
45 | * Currently, the clock API assumes that a single integer ID is enough to | |
46 | * identify and configure any clock signal for any clock provider. If this | |
47 | * assumption becomes invalid in the future, the struct could be expanded to | |
48 | * either (a) add more fields to allow clock providers to store additional | |
49 | * information, or (b) replace the id field with an opaque pointer, which the | |
50 | * provider would dynamically allocated during its .of_xlate op, and process | |
51 | * during is .request op. This may require the addition of an extra op to clean | |
52 | * up the allocation. | |
53 | */ | |
54 | struct clk { | |
55 | struct udevice *dev; | |
56 | /* | |
57 | * Written by of_xlate. We assume a single id is enough for now. In the | |
58 | * future, we might add more fields here. | |
f26c8a8e | 59 | */ |
135aa950 | 60 | unsigned long id; |
f26c8a8e SG |
61 | }; |
62 | ||
3f96f875 | 63 | #if CONFIG_IS_ENABLED(OF_CONTROL) && CONFIG_IS_ENABLED(CLK) |
7423daa6 SG |
64 | struct phandle_2_cell; |
65 | int clk_get_by_index_platdata(struct udevice *dev, int index, | |
66 | struct phandle_2_cell *cells, struct clk *clk); | |
67 | ||
135aa950 SW |
68 | /** |
69 | * clock_get_by_index - Get/request a clock by integer index. | |
70 | * | |
71 | * This looks up and requests a clock. The index is relative to the client | |
72 | * device; each device is assumed to have n clocks associated with it somehow, | |
73 | * and this function finds and requests one of them. The mapping of client | |
74 | * device clock indices to provider clocks may be via device-tree properties, | |
75 | * board-provided mapping tables, or some other mechanism. | |
76 | * | |
77 | * @dev: The client device. | |
78 | * @index: The index of the clock to request, within the client's list of | |
79 | * clocks. | |
80 | * @clock A pointer to a clock struct to initialize. | |
81 | * @return 0 if OK, or a negative error code. | |
82 | */ | |
83 | int clk_get_by_index(struct udevice *dev, int index, struct clk *clk); | |
f26c8a8e SG |
84 | |
85 | /** | |
135aa950 | 86 | * clock_get_by_name - Get/request a clock by name. |
f26c8a8e | 87 | * |
135aa950 SW |
88 | * This looks up and requests a clock. The name is relative to the client |
89 | * device; each device is assumed to have n clocks associated with it somehow, | |
90 | * and this function finds and requests one of them. The mapping of client | |
91 | * device clock names to provider clocks may be via device-tree properties, | |
92 | * board-provided mapping tables, or some other mechanism. | |
93 | * | |
94 | * @dev: The client device. | |
95 | * @name: The name of the clock to request, within the client's list of | |
96 | * clocks. | |
97 | * @clock: A pointer to a clock struct to initialize. | |
98 | * @return 0 if OK, or a negative error code. | |
f26c8a8e | 99 | */ |
135aa950 | 100 | int clk_get_by_name(struct udevice *dev, const char *name, struct clk *clk); |
021abf69 MY |
101 | #else |
102 | static inline int clk_get_by_index(struct udevice *dev, int index, | |
103 | struct clk *clk) | |
104 | { | |
105 | return -ENOSYS; | |
106 | } | |
107 | ||
108 | static inline int clk_get_by_name(struct udevice *dev, const char *name, | |
109 | struct clk *clk) | |
110 | { | |
111 | return -ENOSYS; | |
112 | } | |
113 | #endif | |
f26c8a8e SG |
114 | |
115 | /** | |
135aa950 | 116 | * clk_request - Request a clock by provider-specific ID. |
f26c8a8e | 117 | * |
135aa950 SW |
118 | * This requests a clock using a provider-specific ID. Generally, this function |
119 | * should not be used, since clk_get_by_index/name() provide an interface that | |
120 | * better separates clients from intimate knowledge of clock providers. | |
121 | * However, this function may be useful in core SoC-specific code. | |
122 | * | |
123 | * @dev: The clock provider device. | |
124 | * @clock: A pointer to a clock struct to initialize. The caller must | |
125 | * have already initialized any field in this struct which the | |
126 | * clock provider uses to identify the clock. | |
127 | * @return 0 if OK, or a negative error code. | |
f26c8a8e | 128 | */ |
135aa950 | 129 | int clk_request(struct udevice *dev, struct clk *clk); |
f26c8a8e | 130 | |
f0e07516 | 131 | /** |
135aa950 | 132 | * clock_free - Free a previously requested clock. |
f0e07516 | 133 | * |
135aa950 SW |
134 | * @clock: A clock struct that was previously successfully requested by |
135 | * clk_request/get_by_*(). | |
136 | * @return 0 if OK, or a negative error code. | |
f0e07516 | 137 | */ |
135aa950 | 138 | int clk_free(struct clk *clk); |
f0e07516 | 139 | |
f26c8a8e | 140 | /** |
135aa950 | 141 | * clk_get_rate() - Get current clock rate. |
f26c8a8e | 142 | * |
135aa950 SW |
143 | * @clk: A clock struct that was previously successfully requested by |
144 | * clk_request/get_by_*(). | |
145 | * @return clock rate in Hz, or -ve error code. | |
f26c8a8e | 146 | */ |
135aa950 | 147 | ulong clk_get_rate(struct clk *clk); |
f26c8a8e SG |
148 | |
149 | /** | |
135aa950 | 150 | * clk_set_rate() - Set current clock rate. |
f26c8a8e | 151 | * |
135aa950 SW |
152 | * @clk: A clock struct that was previously successfully requested by |
153 | * clk_request/get_by_*(). | |
154 | * @rate: New clock rate in Hz. | |
155 | * @return new rate, or -ve error code. | |
f26c8a8e | 156 | */ |
135aa950 | 157 | ulong clk_set_rate(struct clk *clk, ulong rate); |
f26c8a8e | 158 | |
e70cc438 | 159 | /** |
135aa950 | 160 | * clk_enable() - Enable (turn on) a clock. |
e70cc438 | 161 | * |
135aa950 SW |
162 | * @clk: A clock struct that was previously successfully requested by |
163 | * clk_request/get_by_*(). | |
164 | * @return zero on success, or -ve error code. | |
165 | */ | |
166 | int clk_enable(struct clk *clk); | |
167 | ||
168 | /** | |
169 | * clk_disable() - Disable (turn off) a clock. | |
e70cc438 | 170 | * |
135aa950 SW |
171 | * @clk: A clock struct that was previously successfully requested by |
172 | * clk_request/get_by_*(). | |
173 | * @return zero on success, or -ve error code. | |
e70cc438 | 174 | */ |
135aa950 | 175 | int clk_disable(struct clk *clk); |
e70cc438 | 176 | |
135aa950 SW |
177 | int soc_clk_dump(void); |
178 | ||
179 | #endif |