Commit | Line | Data |
---|---|---|
83d290c5 | 1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
72e5016f JJH |
2 | /* |
3 | * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/ | |
4 | * Written by Jean-Jacques Hiblot <jjhiblot@ti.com> | |
72e5016f JJH |
5 | */ |
6 | ||
7 | #ifndef __GENERIC_PHY_H | |
8 | #define __GENERIC_PHY_H | |
9 | ||
c2b9aa98 NA |
10 | #include <dm/ofnode.h> |
11 | ||
a265e5ef | 12 | struct ofnode_phandle_args; |
72e5016f JJH |
13 | |
14 | /** | |
15 | * struct phy - A handle to (allowing control of) a single phy port. | |
16 | * | |
17 | * Clients provide storage for phy handles. The content of the structure is | |
18 | * managed solely by the PHY API and PHY drivers. A phy struct is | |
19 | * initialized by "get"ing the phy struct. The phy struct is passed to all | |
20 | * other phy APIs to identify which PHY port to operate upon. | |
21 | * | |
22 | * @dev: The device which implements the PHY port. | |
23 | * @id: The PHY ID within the provider. | |
24 | * | |
25 | */ | |
26 | struct phy { | |
27 | struct udevice *dev; | |
28 | unsigned long id; | |
29 | }; | |
30 | ||
31 | /* | |
32 | * struct udevice_ops - set of function pointers for phy operations | |
33 | * @init: operation to be performed for initializing phy (optional) | |
34 | * @exit: operation to be performed while exiting (optional) | |
35 | * @reset: reset the phy (optional). | |
36 | * @power_on: powering on the phy (optional) | |
37 | * @power_off: powering off the phy (optional) | |
38 | */ | |
39 | struct phy_ops { | |
40 | /** | |
41 | * of_xlate - Translate a client's device-tree (OF) phy specifier. | |
42 | * | |
43 | * The PHY core calls this function as the first step in implementing | |
44 | * a client's generic_phy_get_by_*() call. | |
45 | * | |
46 | * If this function pointer is set to NULL, the PHY core will use a | |
47 | * default implementation, which assumes #phy-cells = <0> or | |
48 | * #phy-cells = <1>, and in the later case that the DT cell | |
49 | * contains a simple integer PHY port ID. | |
50 | * | |
51 | * @phy: The phy struct to hold the translation result. | |
52 | * @args: The phy specifier values from device tree. | |
53 | * @return 0 if OK, or a negative error code. | |
54 | */ | |
23558bb6 | 55 | int (*of_xlate)(struct phy *phy, struct ofnode_phandle_args *args); |
72e5016f JJH |
56 | |
57 | /** | |
58 | * init - initialize the hardware. | |
59 | * | |
60 | * Hardware intialization should not be done in during probe() but | |
61 | * should be implemented in this init() function. It could be starting | |
62 | * PLL, taking a controller out of reset, routing, etc. This function | |
63 | * is typically called only once per PHY port. | |
64 | * If power_on() is not implemented, it must power up the phy. | |
65 | * | |
66 | * @phy: the PHY port to initialize | |
67 | * @return 0 if OK, or a negative error code. | |
68 | */ | |
69 | int (*init)(struct phy *phy); | |
70 | ||
71 | /** | |
72 | * exit - de-initialize the PHY device | |
73 | * | |
74 | * Hardware de-intialization should be done here. Every step done in | |
75 | * init() should be undone here. | |
76 | * This could be used to suspend the phy to reduce power consumption or | |
77 | * to put the phy in a known condition before booting the OS (though it | |
78 | * is NOT called automatically before booting the OS) | |
79 | * If power_off() is not implemented, it must power down the phy. | |
80 | * | |
81 | * @phy: PHY port to be de-initialized | |
82 | * @return 0 if OK, or a negative error code | |
83 | */ | |
84 | int (*exit)(struct phy *phy); | |
85 | ||
86 | /** | |
87 | * reset - resets a PHY device without shutting down | |
88 | * | |
89 | * @phy: PHY port to be reset | |
90 | * | |
91 | * During runtime, the PHY may need to be reset in order to | |
92 | * re-establish connection etc without being shut down or exit. | |
93 | * | |
94 | * @return 0 if OK, or a negative error code | |
95 | */ | |
96 | int (*reset)(struct phy *phy); | |
97 | ||
98 | /** | |
99 | * power_on - power on a PHY device | |
100 | * | |
101 | * @phy: PHY port to be powered on | |
102 | * | |
103 | * During runtime, the PHY may need to be powered on or off several | |
104 | * times. This function is used to power on the PHY. It relies on the | |
105 | * setup done in init(). If init() is not implemented, it must take care | |
106 | * of setting up the context (PLLs, ...) | |
107 | * | |
108 | * @return 0 if OK, or a negative error code | |
109 | */ | |
110 | int (*power_on)(struct phy *phy); | |
111 | ||
112 | /** | |
113 | * power_off - power off a PHY device | |
114 | * | |
115 | * @phy: PHY port to be powered off | |
116 | * | |
117 | * During runtime, the PHY may need to be powered on or off several | |
118 | * times. This function is used to power off the PHY. Except if | |
119 | * init()/deinit() are not implemented, it must not de-initialize | |
120 | * everything. | |
121 | * | |
122 | * @return 0 if OK, or a negative error code | |
123 | */ | |
124 | int (*power_off)(struct phy *phy); | |
125 | }; | |
126 | ||
b13307b4 CY |
127 | /** |
128 | * struct phy_bulk - A handle to (allowing control of) a bulk of phys. | |
129 | * | |
130 | * Consumers provide storage for the phy bulk. The content of the structure is | |
131 | * managed solely by the phy API. A phy bulk struct is initialized | |
132 | * by "get"ing the phy bulk struct. | |
133 | * The phy bulk struct is passed to all other bulk phy APIs to apply | |
134 | * the API to all the phy in the bulk struct. | |
135 | * | |
136 | * @phys: An array of phy handles. | |
137 | * @count: The number of phy handles in the phys array. | |
138 | */ | |
139 | struct phy_bulk { | |
140 | struct phy *phys; | |
141 | unsigned int count; | |
142 | }; | |
143 | ||
d9fb7bec | 144 | #ifdef CONFIG_PHY |
72e5016f JJH |
145 | |
146 | /** | |
147 | * generic_phy_init() - initialize the PHY port | |
148 | * | |
149 | * @phy: the PHY port to initialize | |
150 | * @return 0 if OK, or a negative error code | |
151 | */ | |
152 | int generic_phy_init(struct phy *phy); | |
153 | ||
154 | /** | |
155 | * generic_phy_init() - de-initialize the PHY device | |
156 | * | |
157 | * @phy: PHY port to be de-initialized | |
158 | * @return 0 if OK, or a negative error code | |
159 | */ | |
160 | int generic_phy_exit(struct phy *phy); | |
161 | ||
162 | /** | |
163 | * generic_phy_reset() - resets a PHY device without shutting down | |
164 | * | |
165 | * @phy: PHY port to be reset | |
166 | *@return 0 if OK, or a negative error code | |
167 | */ | |
168 | int generic_phy_reset(struct phy *phy); | |
169 | ||
170 | /** | |
171 | * generic_phy_power_on() - power on a PHY device | |
172 | * | |
173 | * @phy: PHY port to be powered on | |
174 | * @return 0 if OK, or a negative error code | |
175 | */ | |
176 | int generic_phy_power_on(struct phy *phy); | |
177 | ||
178 | /** | |
179 | * generic_phy_power_off() - power off a PHY device | |
180 | * | |
181 | * @phy: PHY port to be powered off | |
182 | * @return 0 if OK, or a negative error code | |
183 | */ | |
184 | int generic_phy_power_off(struct phy *phy); | |
185 | ||
186 | ||
187 | /** | |
188 | * generic_phy_get_by_index() - Get a PHY device by integer index. | |
189 | * | |
190 | * @user: the client device | |
191 | * @index: The index in the list of available PHYs | |
192 | * @phy: A pointer to the PHY port | |
193 | * | |
194 | * This looks up a PHY device for a client device based on its position in the | |
195 | * list of the possible PHYs. | |
196 | * | |
197 | * example: | |
198 | * usb1: usb_otg_ss@xxx { | |
199 | * compatible = "xxx"; | |
200 | * reg = <xxx>; | |
201 | * . | |
202 | * . | |
203 | * phys = <&usb2_phy>, <&usb3_phy>; | |
204 | * . | |
205 | * . | |
206 | * }; | |
207 | * the USB2 phy can be accessed by passing index '0' and the USB3 phy can | |
208 | * be accessed by passing index '1' | |
209 | * | |
210 | * @return 0 if OK, or a negative error code | |
211 | */ | |
212 | int generic_phy_get_by_index(struct udevice *user, int index, | |
213 | struct phy *phy); | |
214 | ||
c2b9aa98 | 215 | /** |
5a2b6778 JT |
216 | * generic_phy_get_by_index_nodev() - Get a PHY device by integer index |
217 | * without a device | |
c2b9aa98 | 218 | * |
cd3e01b1 | 219 | * @node: The client ofnode. |
c2b9aa98 NA |
220 | * @index: The index in the list of available PHYs |
221 | * @phy: A pointer to the PHY port | |
222 | * | |
5a2b6778 JT |
223 | * This is a version of generic_phy_get_by_index() that does not use a device. |
224 | * | |
c2b9aa98 NA |
225 | * This looks up a PHY device for a client device based on its ofnode and on |
226 | * its position in the list of the possible PHYs. | |
227 | * | |
228 | * example: | |
229 | * usb1: usb_otg_ss@xxx { | |
230 | * compatible = "xxx"; | |
231 | * reg = <xxx>; | |
232 | * . | |
233 | * . | |
234 | * phys = <&usb2_phy>, <&usb3_phy>; | |
235 | * . | |
236 | * . | |
237 | * }; | |
238 | * the USB2 phy can be accessed by passing index '0' and the USB3 phy can | |
239 | * be accessed by passing index '1' | |
240 | * | |
241 | * @return 0 if OK, or a negative error code | |
242 | */ | |
5a2b6778 | 243 | int generic_phy_get_by_index_nodev(ofnode node, int index, struct phy *phy); |
c2b9aa98 | 244 | |
72e5016f JJH |
245 | /** |
246 | * generic_phy_get_by_name() - Get a PHY device by its name. | |
247 | * | |
248 | * @user: the client device | |
249 | * @phy_name: The name of the PHY in the list of possible PHYs | |
250 | * @phy: A pointer to the PHY port | |
251 | * | |
252 | * This looks up a PHY device for a client device in the | |
253 | * list of the possible PHYs based on its name. | |
254 | * | |
255 | * example: | |
256 | * usb1: usb_otg_ss@xxx { | |
257 | * compatible = "xxx"; | |
258 | * reg = <xxx>; | |
259 | * . | |
260 | * . | |
261 | * phys = <&usb2_phy>, <&usb3_phy>; | |
262 | * phy-names = "usb2phy", "usb3phy"; | |
263 | * . | |
264 | * . | |
265 | * }; | |
266 | * the USB3 phy can be accessed using "usb3phy", and USB2 by using "usb2phy" | |
267 | * | |
268 | * @return 0 if OK, or a negative error code | |
269 | */ | |
270 | int generic_phy_get_by_name(struct udevice *user, const char *phy_name, | |
271 | struct phy *phy); | |
272 | ||
b13307b4 CY |
273 | /** |
274 | * generic_phy_get_bulk - Get all phys of a device. | |
275 | * | |
276 | * This looks up and gets all phys of the consumer device; each device is | |
277 | * assumed to have n phys associated with it somehow, and this function finds | |
278 | * and gets all of them in a separate structure. | |
279 | * | |
280 | * @dev: The consumer device. | |
281 | * @bulk A pointer to a phy bulk struct to initialize. | |
282 | * @return 0 if OK, or a negative error code. | |
283 | */ | |
284 | int generic_phy_get_bulk(struct udevice *dev, struct phy_bulk *bulk); | |
285 | ||
286 | /** | |
287 | * generic_phy_init_bulk() - Initialize all phys in a phy bulk struct. | |
288 | * | |
289 | * @bulk: A phy bulk struct that was previously successfully requested | |
290 | * by generic_phy_get_bulk(). | |
291 | * @return 0 if OK, or negative error code. | |
292 | */ | |
293 | int generic_phy_init_bulk(struct phy_bulk *bulk); | |
294 | ||
295 | /** | |
296 | * generic_phy_exit_bulk() - de-initialize all phys in a phy bulk struct. | |
297 | * | |
298 | * @bulk: A phy bulk struct that was previously successfully requested | |
299 | * by generic_phy_get_bulk(). | |
300 | * @return 0 if OK, or negative error code. | |
301 | */ | |
302 | int generic_phy_exit_bulk(struct phy_bulk *bulk); | |
303 | ||
304 | /** | |
305 | * generic_phy_power_on_bulk() - Power on all phys in a phy bulk struct. | |
306 | * | |
307 | * @bulk: A phy bulk struct that was previously successfully requested | |
308 | * by generic_phy_get_bulk(). | |
309 | * @return 0 if OK, or negative error code. | |
310 | */ | |
311 | int generic_phy_power_on_bulk(struct phy_bulk *bulk); | |
312 | ||
313 | /** | |
314 | * generic_phy_power_off_bulk() - Power off all phys in a phy bulk struct. | |
315 | * | |
316 | * @bulk: A phy bulk struct that was previously successfully requested | |
317 | * by generic_phy_get_bulk(). | |
318 | * @return 0 if OK, or negative error code. | |
319 | */ | |
320 | int generic_phy_power_off_bulk(struct phy_bulk *bulk); | |
321 | ||
d9fb7bec PC |
322 | #else /* CONFIG_PHY */ |
323 | ||
324 | static inline int generic_phy_init(struct phy *phy) | |
325 | { | |
326 | return 0; | |
327 | } | |
328 | ||
329 | static inline int generic_phy_exit(struct phy *phy) | |
330 | { | |
331 | return 0; | |
332 | } | |
333 | ||
334 | static inline int generic_phy_reset(struct phy *phy) | |
335 | { | |
336 | return 0; | |
337 | } | |
338 | ||
339 | static inline int generic_phy_power_on(struct phy *phy) | |
340 | { | |
341 | return 0; | |
342 | } | |
343 | ||
344 | static inline int generic_phy_power_off(struct phy *phy) | |
345 | { | |
346 | return 0; | |
347 | } | |
348 | ||
349 | static inline int generic_phy_get_by_index(struct udevice *user, int index, | |
350 | struct phy *phy) | |
351 | { | |
352 | return 0; | |
353 | } | |
354 | ||
355 | static inline int generic_phy_get_by_name(struct udevice *user, const char *phy_name, | |
356 | struct phy *phy) | |
357 | { | |
358 | return 0; | |
359 | } | |
360 | ||
b13307b4 CY |
361 | static inline int |
362 | generic_phy_get_bulk(struct udevice *dev, struct phy_bulk *bulk) | |
363 | { | |
364 | return 0; | |
365 | } | |
366 | ||
367 | static inline int generic_phy_init_bulk(struct phy_bulk *bulk) | |
368 | { | |
369 | return 0; | |
370 | } | |
371 | ||
372 | static inline int generic_phy_exit_bulk(struct phy_bulk *bulk) | |
373 | { | |
374 | return 0; | |
375 | } | |
376 | ||
377 | static inline int generic_phy_power_on_bulk(struct phy_bulk *bulk) | |
378 | { | |
379 | return 0; | |
380 | } | |
381 | ||
382 | static inline int generic_phy_power_off_bulk(struct phy_bulk *bulk) | |
383 | { | |
384 | return 0; | |
385 | } | |
386 | ||
d9fb7bec PC |
387 | #endif /* CONFIG_PHY */ |
388 | ||
b94888b4 PC |
389 | /** |
390 | * generic_phy_valid() - check if PHY port is valid | |
391 | * | |
392 | * @phy: the PHY port to check | |
393 | * @return TRUE if valid, or FALSE | |
394 | */ | |
395 | static inline bool generic_phy_valid(struct phy *phy) | |
396 | { | |
4e184298 | 397 | return phy && phy->dev; |
b94888b4 PC |
398 | } |
399 | ||
72e5016f | 400 | #endif /*__GENERIC_PHY_H */ |