xref: /linux-6.15/include/linux/phy/phy.h (revision 79a5a18a)
1 /*
2  * phy.h -- generic phy header file
3  *
4  * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
5  *
6  * Author: Kishon Vijay Abraham I <[email protected]>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  */
13 
14 #ifndef __DRIVERS_PHY_H
15 #define __DRIVERS_PHY_H
16 
17 #include <linux/err.h>
18 #include <linux/of.h>
19 #include <linux/device.h>
20 #include <linux/pm_runtime.h>
21 #include <linux/regulator/consumer.h>
22 
23 struct phy;
24 
25 enum phy_mode {
26 	PHY_MODE_INVALID,
27 	PHY_MODE_USB_HOST,
28 	PHY_MODE_USB_HOST_LS,
29 	PHY_MODE_USB_HOST_FS,
30 	PHY_MODE_USB_HOST_HS,
31 	PHY_MODE_USB_HOST_SS,
32 	PHY_MODE_USB_DEVICE,
33 	PHY_MODE_USB_DEVICE_LS,
34 	PHY_MODE_USB_DEVICE_FS,
35 	PHY_MODE_USB_DEVICE_HS,
36 	PHY_MODE_USB_DEVICE_SS,
37 	PHY_MODE_USB_OTG,
38 	PHY_MODE_SGMII,
39 	PHY_MODE_2500SGMII,
40 	PHY_MODE_QSGMII,
41 	PHY_MODE_10GKR,
42 	PHY_MODE_UFS_HS_A,
43 	PHY_MODE_UFS_HS_B,
44 	PHY_MODE_PCIE,
45 };
46 
47 /**
48  * struct phy_ops - set of function pointers for performing phy operations
49  * @init: operation to be performed for initializing phy
50  * @exit: operation to be performed while exiting
51  * @power_on: powering on the phy
52  * @power_off: powering off the phy
53  * @set_mode: set the mode of the phy
54  * @reset: resetting the phy
55  * @calibrate: calibrate the phy
56  * @owner: the module owner containing the ops
57  */
58 struct phy_ops {
59 	int	(*init)(struct phy *phy);
60 	int	(*exit)(struct phy *phy);
61 	int	(*power_on)(struct phy *phy);
62 	int	(*power_off)(struct phy *phy);
63 	int	(*set_mode)(struct phy *phy, enum phy_mode mode, int submode);
64 	int	(*reset)(struct phy *phy);
65 	int	(*calibrate)(struct phy *phy);
66 	struct module *owner;
67 };
68 
69 /**
70  * struct phy_attrs - represents phy attributes
71  * @bus_width: Data path width implemented by PHY
72  */
73 struct phy_attrs {
74 	u32			bus_width;
75 	enum phy_mode		mode;
76 };
77 
78 /**
79  * struct phy - represents the phy device
80  * @dev: phy device
81  * @id: id of the phy device
82  * @ops: function pointers for performing phy operations
83  * @init_data: list of PHY consumers (non-dt only)
84  * @mutex: mutex to protect phy_ops
85  * @init_count: used to protect when the PHY is used by multiple consumers
86  * @power_count: used to protect when the PHY is used by multiple consumers
87  * @attrs: used to specify PHY specific attributes
88  * @pwr: power regulator associated with the phy
89  */
90 struct phy {
91 	struct device		dev;
92 	int			id;
93 	const struct phy_ops	*ops;
94 	struct mutex		mutex;
95 	int			init_count;
96 	int			power_count;
97 	struct phy_attrs	attrs;
98 	struct regulator	*pwr;
99 };
100 
101 /**
102  * struct phy_provider - represents the phy provider
103  * @dev: phy provider device
104  * @children: can be used to override the default (dev->of_node) child node
105  * @owner: the module owner having of_xlate
106  * @list: to maintain a linked list of PHY providers
107  * @of_xlate: function pointer to obtain phy instance from phy pointer
108  */
109 struct phy_provider {
110 	struct device		*dev;
111 	struct device_node	*children;
112 	struct module		*owner;
113 	struct list_head	list;
114 	struct phy * (*of_xlate)(struct device *dev,
115 		struct of_phandle_args *args);
116 };
117 
118 /**
119  * struct phy_lookup - PHY association in list of phys managed by the phy driver
120  * @node: list node
121  * @dev_id: the device of the association
122  * @con_id: connection ID string on device
123  * @phy: the phy of the association
124  */
125 struct phy_lookup {
126 	struct list_head node;
127 	const char *dev_id;
128 	const char *con_id;
129 	struct phy *phy;
130 };
131 
132 #define	to_phy(a)	(container_of((a), struct phy, dev))
133 
134 #define	of_phy_provider_register(dev, xlate)	\
135 	__of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))
136 
137 #define	devm_of_phy_provider_register(dev, xlate)	\
138 	__devm_of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))
139 
140 #define of_phy_provider_register_full(dev, children, xlate) \
141 	__of_phy_provider_register(dev, children, THIS_MODULE, xlate)
142 
143 #define devm_of_phy_provider_register_full(dev, children, xlate) \
144 	__devm_of_phy_provider_register(dev, children, THIS_MODULE, xlate)
145 
146 static inline void phy_set_drvdata(struct phy *phy, void *data)
147 {
148 	dev_set_drvdata(&phy->dev, data);
149 }
150 
151 static inline void *phy_get_drvdata(struct phy *phy)
152 {
153 	return dev_get_drvdata(&phy->dev);
154 }
155 
156 #if IS_ENABLED(CONFIG_GENERIC_PHY)
157 int phy_pm_runtime_get(struct phy *phy);
158 int phy_pm_runtime_get_sync(struct phy *phy);
159 int phy_pm_runtime_put(struct phy *phy);
160 int phy_pm_runtime_put_sync(struct phy *phy);
161 void phy_pm_runtime_allow(struct phy *phy);
162 void phy_pm_runtime_forbid(struct phy *phy);
163 int phy_init(struct phy *phy);
164 int phy_exit(struct phy *phy);
165 int phy_power_on(struct phy *phy);
166 int phy_power_off(struct phy *phy);
167 int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, int submode);
168 #define phy_set_mode(phy, mode) \
169 	phy_set_mode_ext(phy, mode, 0)
170 
171 static inline enum phy_mode phy_get_mode(struct phy *phy)
172 {
173 	return phy->attrs.mode;
174 }
175 int phy_reset(struct phy *phy);
176 int phy_calibrate(struct phy *phy);
177 static inline int phy_get_bus_width(struct phy *phy)
178 {
179 	return phy->attrs.bus_width;
180 }
181 static inline void phy_set_bus_width(struct phy *phy, int bus_width)
182 {
183 	phy->attrs.bus_width = bus_width;
184 }
185 struct phy *phy_get(struct device *dev, const char *string);
186 struct phy *phy_optional_get(struct device *dev, const char *string);
187 struct phy *devm_phy_get(struct device *dev, const char *string);
188 struct phy *devm_phy_optional_get(struct device *dev, const char *string);
189 struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
190 			    const char *con_id);
191 struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,
192 				     int index);
193 void phy_put(struct phy *phy);
194 void devm_phy_put(struct device *dev, struct phy *phy);
195 struct phy *of_phy_get(struct device_node *np, const char *con_id);
196 struct phy *of_phy_simple_xlate(struct device *dev,
197 	struct of_phandle_args *args);
198 struct phy *phy_create(struct device *dev, struct device_node *node,
199 		       const struct phy_ops *ops);
200 struct phy *devm_phy_create(struct device *dev, struct device_node *node,
201 			    const struct phy_ops *ops);
202 void phy_destroy(struct phy *phy);
203 void devm_phy_destroy(struct device *dev, struct phy *phy);
204 struct phy_provider *__of_phy_provider_register(struct device *dev,
205 	struct device_node *children, struct module *owner,
206 	struct phy * (*of_xlate)(struct device *dev,
207 				 struct of_phandle_args *args));
208 struct phy_provider *__devm_of_phy_provider_register(struct device *dev,
209 	struct device_node *children, struct module *owner,
210 	struct phy * (*of_xlate)(struct device *dev,
211 				 struct of_phandle_args *args));
212 void of_phy_provider_unregister(struct phy_provider *phy_provider);
213 void devm_of_phy_provider_unregister(struct device *dev,
214 	struct phy_provider *phy_provider);
215 int phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id);
216 void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id);
217 #else
218 static inline int phy_pm_runtime_get(struct phy *phy)
219 {
220 	if (!phy)
221 		return 0;
222 	return -ENOSYS;
223 }
224 
225 static inline int phy_pm_runtime_get_sync(struct phy *phy)
226 {
227 	if (!phy)
228 		return 0;
229 	return -ENOSYS;
230 }
231 
232 static inline int phy_pm_runtime_put(struct phy *phy)
233 {
234 	if (!phy)
235 		return 0;
236 	return -ENOSYS;
237 }
238 
239 static inline int phy_pm_runtime_put_sync(struct phy *phy)
240 {
241 	if (!phy)
242 		return 0;
243 	return -ENOSYS;
244 }
245 
246 static inline void phy_pm_runtime_allow(struct phy *phy)
247 {
248 	return;
249 }
250 
251 static inline void phy_pm_runtime_forbid(struct phy *phy)
252 {
253 	return;
254 }
255 
256 static inline int phy_init(struct phy *phy)
257 {
258 	if (!phy)
259 		return 0;
260 	return -ENOSYS;
261 }
262 
263 static inline int phy_exit(struct phy *phy)
264 {
265 	if (!phy)
266 		return 0;
267 	return -ENOSYS;
268 }
269 
270 static inline int phy_power_on(struct phy *phy)
271 {
272 	if (!phy)
273 		return 0;
274 	return -ENOSYS;
275 }
276 
277 static inline int phy_power_off(struct phy *phy)
278 {
279 	if (!phy)
280 		return 0;
281 	return -ENOSYS;
282 }
283 
284 static inline int phy_set_mode_ext(struct phy *phy, enum phy_mode mode,
285 				   int submode)
286 {
287 	if (!phy)
288 		return 0;
289 	return -ENOSYS;
290 }
291 
292 #define phy_set_mode(phy, mode) \
293 	phy_set_mode_ext(phy, mode, 0)
294 
295 static inline enum phy_mode phy_get_mode(struct phy *phy)
296 {
297 	return PHY_MODE_INVALID;
298 }
299 
300 static inline int phy_reset(struct phy *phy)
301 {
302 	if (!phy)
303 		return 0;
304 	return -ENOSYS;
305 }
306 
307 static inline int phy_calibrate(struct phy *phy)
308 {
309 	if (!phy)
310 		return 0;
311 	return -ENOSYS;
312 }
313 
314 static inline int phy_get_bus_width(struct phy *phy)
315 {
316 	return -ENOSYS;
317 }
318 
319 static inline void phy_set_bus_width(struct phy *phy, int bus_width)
320 {
321 	return;
322 }
323 
324 static inline struct phy *phy_get(struct device *dev, const char *string)
325 {
326 	return ERR_PTR(-ENOSYS);
327 }
328 
329 static inline struct phy *phy_optional_get(struct device *dev,
330 					   const char *string)
331 {
332 	return ERR_PTR(-ENOSYS);
333 }
334 
335 static inline struct phy *devm_phy_get(struct device *dev, const char *string)
336 {
337 	return ERR_PTR(-ENOSYS);
338 }
339 
340 static inline struct phy *devm_phy_optional_get(struct device *dev,
341 						const char *string)
342 {
343 	return NULL;
344 }
345 
346 static inline struct phy *devm_of_phy_get(struct device *dev,
347 					  struct device_node *np,
348 					  const char *con_id)
349 {
350 	return ERR_PTR(-ENOSYS);
351 }
352 
353 static inline struct phy *devm_of_phy_get_by_index(struct device *dev,
354 						   struct device_node *np,
355 						   int index)
356 {
357 	return ERR_PTR(-ENOSYS);
358 }
359 
360 static inline void phy_put(struct phy *phy)
361 {
362 }
363 
364 static inline void devm_phy_put(struct device *dev, struct phy *phy)
365 {
366 }
367 
368 static inline struct phy *of_phy_get(struct device_node *np, const char *con_id)
369 {
370 	return ERR_PTR(-ENOSYS);
371 }
372 
373 static inline struct phy *of_phy_simple_xlate(struct device *dev,
374 	struct of_phandle_args *args)
375 {
376 	return ERR_PTR(-ENOSYS);
377 }
378 
379 static inline struct phy *phy_create(struct device *dev,
380 				     struct device_node *node,
381 				     const struct phy_ops *ops)
382 {
383 	return ERR_PTR(-ENOSYS);
384 }
385 
386 static inline struct phy *devm_phy_create(struct device *dev,
387 					  struct device_node *node,
388 					  const struct phy_ops *ops)
389 {
390 	return ERR_PTR(-ENOSYS);
391 }
392 
393 static inline void phy_destroy(struct phy *phy)
394 {
395 }
396 
397 static inline void devm_phy_destroy(struct device *dev, struct phy *phy)
398 {
399 }
400 
401 static inline struct phy_provider *__of_phy_provider_register(
402 	struct device *dev, struct device_node *children, struct module *owner,
403 	struct phy * (*of_xlate)(struct device *dev,
404 				 struct of_phandle_args *args))
405 {
406 	return ERR_PTR(-ENOSYS);
407 }
408 
409 static inline struct phy_provider *__devm_of_phy_provider_register(struct device
410 	*dev, struct device_node *children, struct module *owner,
411 	struct phy * (*of_xlate)(struct device *dev,
412 				 struct of_phandle_args *args))
413 {
414 	return ERR_PTR(-ENOSYS);
415 }
416 
417 static inline void of_phy_provider_unregister(struct phy_provider *phy_provider)
418 {
419 }
420 
421 static inline void devm_of_phy_provider_unregister(struct device *dev,
422 	struct phy_provider *phy_provider)
423 {
424 }
425 static inline int
426 phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id)
427 {
428 	return 0;
429 }
430 static inline void phy_remove_lookup(struct phy *phy, const char *con_id,
431 				     const char *dev_id) { }
432 #endif
433 
434 #endif /* __DRIVERS_PHY_H */
435