xref: /openbmc/u-boot/include/clk.h (revision 2290fe06)
1 /*
2  * Copyright (c) 2015 Google, Inc
3  * Written by Simon Glass <sjg@chromium.org>
4  * Copyright (c) 2016, NVIDIA CORPORATION.
5  *
6  * SPDX-License-Identifier:	GPL-2.0+
7  */
8 
9 #ifndef _CLK_H_
10 #define _CLK_H_
11 
12 #include <linux/types.h>
13 
14 /**
15  * A clock is a hardware signal that oscillates autonomously at a specific
16  * frequency and duty cycle. Most hardware modules require one or more clock
17  * signal to drive their operation. Clock signals are typically generated
18  * externally to the HW module consuming them, by an entity this API calls a
19  * clock provider. This API provides a standard means for drivers to enable and
20  * disable clocks, and to set the rate at which they oscillate.
21  *
22  * A driver that implements UCLASS_CLOCK is a clock provider. A provider will
23  * often implement multiple separate clocks, since the hardware it manages
24  * often has this capability. clock_uclass.h describes the interface which
25  * clock providers must implement.
26  *
27  * Clock consumers/clients are the HW modules driven by the clock signals. This
28  * header file describes the API used by drivers for those HW modules.
29  */
30 
31 struct udevice;
32 
33 /**
34  * struct clk - A handle to (allowing control of) a single clock.
35  *
36  * Clients provide storage for clock handles. The content of the structure is
37  * managed solely by the clock API and clock drivers. A clock struct is
38  * initialized by "get"ing the clock struct. The clock struct is passed to all
39  * other clock APIs to identify which clock signal to operate upon.
40  *
41  * @dev: The device which implements the clock signal.
42  * @id: The clock signal ID within the provider.
43  *
44  * Currently, the clock API assumes that a single integer ID is enough to
45  * identify and configure any clock signal for any clock provider. If this
46  * assumption becomes invalid in the future, the struct could be expanded to
47  * either (a) add more fields to allow clock providers to store additional
48  * information, or (b) replace the id field with an opaque pointer, which the
49  * provider would dynamically allocated during its .of_xlate op, and process
50  * during is .request op. This may require the addition of an extra op to clean
51  * up the allocation.
52  */
53 struct clk {
54 	struct udevice *dev;
55 	/*
56 	 * Written by of_xlate. We assume a single id is enough for now. In the
57 	 * future, we might add more fields here.
58 	 */
59 	unsigned long id;
60 };
61 
62 #if CONFIG_IS_ENABLED(OF_CONTROL)
63 /**
64  * clock_get_by_index - Get/request a clock by integer index.
65  *
66  * This looks up and requests a clock. The index is relative to the client
67  * device; each device is assumed to have n clocks associated with it somehow,
68  * and this function finds and requests one of them. The mapping of client
69  * device clock indices to provider clocks may be via device-tree properties,
70  * board-provided mapping tables, or some other mechanism.
71  *
72  * @dev:	The client device.
73  * @index:	The index of the clock to request, within the client's list of
74  *		clocks.
75  * @clock	A pointer to a clock struct to initialize.
76  * @return 0 if OK, or a negative error code.
77  */
78 int clk_get_by_index(struct udevice *dev, int index, struct clk *clk);
79 
80 /**
81  * clock_get_by_name - Get/request a clock by name.
82  *
83  * This looks up and requests a clock. The name is relative to the client
84  * device; each device is assumed to have n clocks associated with it somehow,
85  * and this function finds and requests one of them. The mapping of client
86  * device clock names to provider clocks may be via device-tree properties,
87  * board-provided mapping tables, or some other mechanism.
88  *
89  * @dev:	The client device.
90  * @name:	The name of the clock to request, within the client's list of
91  *		clocks.
92  * @clock:	A pointer to a clock struct to initialize.
93  * @return 0 if OK, or a negative error code.
94  */
95 int clk_get_by_name(struct udevice *dev, const char *name, struct clk *clk);
96 #else
97 static inline int clk_get_by_index(struct udevice *dev, int index,
98 				   struct clk *clk)
99 {
100 	return -ENOSYS;
101 }
102 
103 static int clk_get_by_name(struct udevice *dev, const char *name,
104 			   struct clk *clk)
105 {
106 	return -ENOSYS;
107 }
108 #endif
109 
110 /**
111  * clk_request - Request a clock by provider-specific ID.
112  *
113  * This requests a clock using a provider-specific ID. Generally, this function
114  * should not be used, since clk_get_by_index/name() provide an interface that
115  * better separates clients from intimate knowledge of clock providers.
116  * However, this function may be useful in core SoC-specific code.
117  *
118  * @dev:	The clock provider device.
119  * @clock:	A pointer to a clock struct to initialize. The caller must
120  *		have already initialized any field in this struct which the
121  *		clock provider uses to identify the clock.
122  * @return 0 if OK, or a negative error code.
123  */
124 int clk_request(struct udevice *dev, struct clk *clk);
125 
126 /**
127  * clock_free - Free a previously requested clock.
128  *
129  * @clock:	A clock struct that was previously successfully requested by
130  *		clk_request/get_by_*().
131  * @return 0 if OK, or a negative error code.
132  */
133 int clk_free(struct clk *clk);
134 
135 /**
136  * clk_get_rate() - Get current clock rate.
137  *
138  * @clk:	A clock struct that was previously successfully requested by
139  *		clk_request/get_by_*().
140  * @return clock rate in Hz, or -ve error code.
141  */
142 ulong clk_get_rate(struct clk *clk);
143 
144 /**
145  * clk_set_rate() - Set current clock rate.
146  *
147  * @clk:	A clock struct that was previously successfully requested by
148  *		clk_request/get_by_*().
149  * @rate:	New clock rate in Hz.
150  * @return new rate, or -ve error code.
151  */
152 ulong clk_set_rate(struct clk *clk, ulong rate);
153 
154 /**
155  * clk_enable() - Enable (turn on) a clock.
156  *
157  * @clk:	A clock struct that was previously successfully requested by
158  *		clk_request/get_by_*().
159  * @return zero on success, or -ve error code.
160  */
161 int clk_enable(struct clk *clk);
162 
163 /**
164  * clk_disable() - Disable (turn off) a clock.
165  *
166  * @clk:	A clock struct that was previously successfully requested by
167  *		clk_request/get_by_*().
168  * @return zero on success, or -ve error code.
169  */
170 int clk_disable(struct clk *clk);
171 
172 int soc_clk_dump(void);
173 
174 #endif
175