1
2
3
4
5
6
7
8
9
10
11
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
23struct phy;
24
25enum 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
49
50
51
52
53
54
55
56
57
58struct 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);
64 int (*reset)(struct phy *phy);
65 int (*calibrate)(struct phy *phy);
66 struct module *owner;
67};
68
69
70
71
72
73struct phy_attrs {
74 u32 bus_width;
75 enum phy_mode mode;
76};
77
78
79
80
81
82
83
84
85
86
87
88
89
90struct 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
103
104
105
106
107
108
109struct 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
120
121
122
123
124
125struct 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
146static inline void phy_set_drvdata(struct phy *phy, void *data)
147{
148 dev_set_drvdata(&phy->dev, data);
149}
150
151static 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)
157int phy_pm_runtime_get(struct phy *phy);
158int phy_pm_runtime_get_sync(struct phy *phy);
159int phy_pm_runtime_put(struct phy *phy);
160int phy_pm_runtime_put_sync(struct phy *phy);
161void phy_pm_runtime_allow(struct phy *phy);
162void phy_pm_runtime_forbid(struct phy *phy);
163int phy_init(struct phy *phy);
164int phy_exit(struct phy *phy);
165int phy_power_on(struct phy *phy);
166int phy_power_off(struct phy *phy);
167int phy_set_mode(struct phy *phy, enum phy_mode mode);
168static inline enum phy_mode phy_get_mode(struct phy *phy)
169{
170 return phy->attrs.mode;
171}
172int phy_reset(struct phy *phy);
173int phy_calibrate(struct phy *phy);
174static inline int phy_get_bus_width(struct phy *phy)
175{
176 return phy->attrs.bus_width;
177}
178static inline void phy_set_bus_width(struct phy *phy, int bus_width)
179{
180 phy->attrs.bus_width = bus_width;
181}
182struct phy *phy_get(struct device *dev, const char *string);
183struct phy *phy_optional_get(struct device *dev, const char *string);
184struct phy *devm_phy_get(struct device *dev, const char *string);
185struct phy *devm_phy_optional_get(struct device *dev, const char *string);
186struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
187 const char *con_id);
188struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,
189 int index);
190void phy_put(struct phy *phy);
191void devm_phy_put(struct device *dev, struct phy *phy);
192struct phy *of_phy_get(struct device_node *np, const char *con_id);
193struct phy *of_phy_simple_xlate(struct device *dev,
194 struct of_phandle_args *args);
195struct phy *phy_create(struct device *dev, struct device_node *node,
196 const struct phy_ops *ops);
197struct phy *devm_phy_create(struct device *dev, struct device_node *node,
198 const struct phy_ops *ops);
199void phy_destroy(struct phy *phy);
200void devm_phy_destroy(struct device *dev, struct phy *phy);
201struct phy_provider *__of_phy_provider_register(struct device *dev,
202 struct device_node *children, struct module *owner,
203 struct phy * (*of_xlate)(struct device *dev,
204 struct of_phandle_args *args));
205struct phy_provider *__devm_of_phy_provider_register(struct device *dev,
206 struct device_node *children, struct module *owner,
207 struct phy * (*of_xlate)(struct device *dev,
208 struct of_phandle_args *args));
209void of_phy_provider_unregister(struct phy_provider *phy_provider);
210void devm_of_phy_provider_unregister(struct device *dev,
211 struct phy_provider *phy_provider);
212int phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id);
213void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id);
214#else
215static inline int phy_pm_runtime_get(struct phy *phy)
216{
217 if (!phy)
218 return 0;
219 return -ENOSYS;
220}
221
222static inline int phy_pm_runtime_get_sync(struct phy *phy)
223{
224 if (!phy)
225 return 0;
226 return -ENOSYS;
227}
228
229static inline int phy_pm_runtime_put(struct phy *phy)
230{
231 if (!phy)
232 return 0;
233 return -ENOSYS;
234}
235
236static inline int phy_pm_runtime_put_sync(struct phy *phy)
237{
238 if (!phy)
239 return 0;
240 return -ENOSYS;
241}
242
243static inline void phy_pm_runtime_allow(struct phy *phy)
244{
245 return;
246}
247
248static inline void phy_pm_runtime_forbid(struct phy *phy)
249{
250 return;
251}
252
253static inline int phy_init(struct phy *phy)
254{
255 if (!phy)
256 return 0;
257 return -ENOSYS;
258}
259
260static inline int phy_exit(struct phy *phy)
261{
262 if (!phy)
263 return 0;
264 return -ENOSYS;
265}
266
267static inline int phy_power_on(struct phy *phy)
268{
269 if (!phy)
270 return 0;
271 return -ENOSYS;
272}
273
274static inline int phy_power_off(struct phy *phy)
275{
276 if (!phy)
277 return 0;
278 return -ENOSYS;
279}
280
281static inline int phy_set_mode(struct phy *phy, enum phy_mode mode)
282{
283 if (!phy)
284 return 0;
285 return -ENOSYS;
286}
287
288static inline enum phy_mode phy_get_mode(struct phy *phy)
289{
290 return PHY_MODE_INVALID;
291}
292
293static inline int phy_reset(struct phy *phy)
294{
295 if (!phy)
296 return 0;
297 return -ENOSYS;
298}
299
300static inline int phy_calibrate(struct phy *phy)
301{
302 if (!phy)
303 return 0;
304 return -ENOSYS;
305}
306
307static inline int phy_get_bus_width(struct phy *phy)
308{
309 return -ENOSYS;
310}
311
312static inline void phy_set_bus_width(struct phy *phy, int bus_width)
313{
314 return;
315}
316
317static inline struct phy *phy_get(struct device *dev, const char *string)
318{
319 return ERR_PTR(-ENOSYS);
320}
321
322static inline struct phy *phy_optional_get(struct device *dev,
323 const char *string)
324{
325 return ERR_PTR(-ENOSYS);
326}
327
328static inline struct phy *devm_phy_get(struct device *dev, const char *string)
329{
330 return ERR_PTR(-ENOSYS);
331}
332
333static inline struct phy *devm_phy_optional_get(struct device *dev,
334 const char *string)
335{
336 return NULL;
337}
338
339static inline struct phy *devm_of_phy_get(struct device *dev,
340 struct device_node *np,
341 const char *con_id)
342{
343 return ERR_PTR(-ENOSYS);
344}
345
346static inline struct phy *devm_of_phy_get_by_index(struct device *dev,
347 struct device_node *np,
348 int index)
349{
350 return ERR_PTR(-ENOSYS);
351}
352
353static inline void phy_put(struct phy *phy)
354{
355}
356
357static inline void devm_phy_put(struct device *dev, struct phy *phy)
358{
359}
360
361static inline struct phy *of_phy_get(struct device_node *np, const char *con_id)
362{
363 return ERR_PTR(-ENOSYS);
364}
365
366static inline struct phy *of_phy_simple_xlate(struct device *dev,
367 struct of_phandle_args *args)
368{
369 return ERR_PTR(-ENOSYS);
370}
371
372static inline struct phy *phy_create(struct device *dev,
373 struct device_node *node,
374 const struct phy_ops *ops)
375{
376 return ERR_PTR(-ENOSYS);
377}
378
379static inline struct phy *devm_phy_create(struct device *dev,
380 struct device_node *node,
381 const struct phy_ops *ops)
382{
383 return ERR_PTR(-ENOSYS);
384}
385
386static inline void phy_destroy(struct phy *phy)
387{
388}
389
390static inline void devm_phy_destroy(struct device *dev, struct phy *phy)
391{
392}
393
394static inline struct phy_provider *__of_phy_provider_register(
395 struct device *dev, struct device_node *children, struct module *owner,
396 struct phy * (*of_xlate)(struct device *dev,
397 struct of_phandle_args *args))
398{
399 return ERR_PTR(-ENOSYS);
400}
401
402static inline struct phy_provider *__devm_of_phy_provider_register(struct device
403 *dev, struct device_node *children, struct module *owner,
404 struct phy * (*of_xlate)(struct device *dev,
405 struct of_phandle_args *args))
406{
407 return ERR_PTR(-ENOSYS);
408}
409
410static inline void of_phy_provider_unregister(struct phy_provider *phy_provider)
411{
412}
413
414static inline void devm_of_phy_provider_unregister(struct device *dev,
415 struct phy_provider *phy_provider)
416{
417}
418static inline int
419phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id)
420{
421 return 0;
422}
423static inline void phy_remove_lookup(struct phy *phy, const char *con_id,
424 const char *dev_id) { }
425#endif
426
427#endif
428