1
2
3
4
5
6
7
8
9
10#ifndef __DRIVERS_PHY_H
11#define __DRIVERS_PHY_H
12
13#include <linux/err.h>
14#include <linux/of.h>
15#include <linux/device.h>
16#include <linux/pm_runtime.h>
17#include <linux/regulator/consumer.h>
18
19#include <linux/phy/phy-mipi-dphy.h>
20
21struct phy;
22
23enum phy_mode {
24 PHY_MODE_INVALID,
25 PHY_MODE_USB_HOST,
26 PHY_MODE_USB_HOST_LS,
27 PHY_MODE_USB_HOST_FS,
28 PHY_MODE_USB_HOST_HS,
29 PHY_MODE_USB_HOST_SS,
30 PHY_MODE_USB_DEVICE,
31 PHY_MODE_USB_DEVICE_LS,
32 PHY_MODE_USB_DEVICE_FS,
33 PHY_MODE_USB_DEVICE_HS,
34 PHY_MODE_USB_DEVICE_SS,
35 PHY_MODE_USB_OTG,
36 PHY_MODE_UFS_HS_A,
37 PHY_MODE_UFS_HS_B,
38 PHY_MODE_PCIE,
39 PHY_MODE_ETHERNET,
40 PHY_MODE_MIPI_DPHY,
41 PHY_MODE_SATA,
42 PHY_MODE_LVDS,
43};
44
45
46
47
48
49
50
51union phy_configure_opts {
52 struct phy_configure_opts_mipi_dphy mipi_dphy;
53};
54
55
56
57
58
59
60
61
62
63
64
65
66
67struct phy_ops {
68 int (*init)(struct phy *phy);
69 int (*exit)(struct phy *phy);
70 int (*power_on)(struct phy *phy);
71 int (*power_off)(struct phy *phy);
72 int (*set_mode)(struct phy *phy, enum phy_mode mode, int submode);
73
74
75
76
77
78
79
80
81
82
83
84 int (*configure)(struct phy *phy, union phy_configure_opts *opts);
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102 int (*validate)(struct phy *phy, enum phy_mode mode, int submode,
103 union phy_configure_opts *opts);
104 int (*reset)(struct phy *phy);
105 int (*calibrate)(struct phy *phy);
106 void (*release)(struct phy *phy);
107 struct module *owner;
108};
109
110
111
112
113
114
115struct phy_attrs {
116 u32 bus_width;
117 enum phy_mode mode;
118};
119
120
121
122
123
124
125
126
127
128
129
130
131struct phy {
132 struct device dev;
133 int id;
134 const struct phy_ops *ops;
135 struct mutex mutex;
136 int init_count;
137 int power_count;
138 struct phy_attrs attrs;
139 struct regulator *pwr;
140};
141
142
143
144
145
146
147
148
149
150struct phy_provider {
151 struct device *dev;
152 struct device_node *children;
153 struct module *owner;
154 struct list_head list;
155 struct phy * (*of_xlate)(struct device *dev,
156 struct of_phandle_args *args);
157};
158
159
160
161
162
163
164
165
166struct phy_lookup {
167 struct list_head node;
168 const char *dev_id;
169 const char *con_id;
170 struct phy *phy;
171};
172
173#define to_phy(a) (container_of((a), struct phy, dev))
174
175#define of_phy_provider_register(dev, xlate) \
176 __of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))
177
178#define devm_of_phy_provider_register(dev, xlate) \
179 __devm_of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))
180
181#define of_phy_provider_register_full(dev, children, xlate) \
182 __of_phy_provider_register(dev, children, THIS_MODULE, xlate)
183
184#define devm_of_phy_provider_register_full(dev, children, xlate) \
185 __devm_of_phy_provider_register(dev, children, THIS_MODULE, xlate)
186
187static inline void phy_set_drvdata(struct phy *phy, void *data)
188{
189 dev_set_drvdata(&phy->dev, data);
190}
191
192static inline void *phy_get_drvdata(struct phy *phy)
193{
194 return dev_get_drvdata(&phy->dev);
195}
196
197#if IS_ENABLED(CONFIG_GENERIC_PHY)
198int phy_pm_runtime_get(struct phy *phy);
199int phy_pm_runtime_get_sync(struct phy *phy);
200int phy_pm_runtime_put(struct phy *phy);
201int phy_pm_runtime_put_sync(struct phy *phy);
202void phy_pm_runtime_allow(struct phy *phy);
203void phy_pm_runtime_forbid(struct phy *phy);
204int phy_init(struct phy *phy);
205int phy_exit(struct phy *phy);
206int phy_power_on(struct phy *phy);
207int phy_power_off(struct phy *phy);
208int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, int submode);
209#define phy_set_mode(phy, mode) \
210 phy_set_mode_ext(phy, mode, 0)
211int phy_configure(struct phy *phy, union phy_configure_opts *opts);
212int phy_validate(struct phy *phy, enum phy_mode mode, int submode,
213 union phy_configure_opts *opts);
214
215static inline enum phy_mode phy_get_mode(struct phy *phy)
216{
217 return phy->attrs.mode;
218}
219int phy_reset(struct phy *phy);
220int phy_calibrate(struct phy *phy);
221static inline int phy_get_bus_width(struct phy *phy)
222{
223 return phy->attrs.bus_width;
224}
225static inline void phy_set_bus_width(struct phy *phy, int bus_width)
226{
227 phy->attrs.bus_width = bus_width;
228}
229struct phy *phy_get(struct device *dev, const char *string);
230struct phy *phy_optional_get(struct device *dev, const char *string);
231struct phy *devm_phy_get(struct device *dev, const char *string);
232struct phy *devm_phy_optional_get(struct device *dev, const char *string);
233struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
234 const char *con_id);
235struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,
236 int index);
237void phy_put(struct phy *phy);
238void devm_phy_put(struct device *dev, struct phy *phy);
239struct phy *of_phy_get(struct device_node *np, const char *con_id);
240struct phy *of_phy_simple_xlate(struct device *dev,
241 struct of_phandle_args *args);
242struct phy *phy_create(struct device *dev, struct device_node *node,
243 const struct phy_ops *ops);
244struct phy *devm_phy_create(struct device *dev, struct device_node *node,
245 const struct phy_ops *ops);
246void phy_destroy(struct phy *phy);
247void devm_phy_destroy(struct device *dev, struct phy *phy);
248struct phy_provider *__of_phy_provider_register(struct device *dev,
249 struct device_node *children, struct module *owner,
250 struct phy * (*of_xlate)(struct device *dev,
251 struct of_phandle_args *args));
252struct phy_provider *__devm_of_phy_provider_register(struct device *dev,
253 struct device_node *children, struct module *owner,
254 struct phy * (*of_xlate)(struct device *dev,
255 struct of_phandle_args *args));
256void of_phy_provider_unregister(struct phy_provider *phy_provider);
257void devm_of_phy_provider_unregister(struct device *dev,
258 struct phy_provider *phy_provider);
259int phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id);
260void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id);
261#else
262static inline int phy_pm_runtime_get(struct phy *phy)
263{
264 if (!phy)
265 return 0;
266 return -ENOSYS;
267}
268
269static inline int phy_pm_runtime_get_sync(struct phy *phy)
270{
271 if (!phy)
272 return 0;
273 return -ENOSYS;
274}
275
276static inline int phy_pm_runtime_put(struct phy *phy)
277{
278 if (!phy)
279 return 0;
280 return -ENOSYS;
281}
282
283static inline int phy_pm_runtime_put_sync(struct phy *phy)
284{
285 if (!phy)
286 return 0;
287 return -ENOSYS;
288}
289
290static inline void phy_pm_runtime_allow(struct phy *phy)
291{
292 return;
293}
294
295static inline void phy_pm_runtime_forbid(struct phy *phy)
296{
297 return;
298}
299
300static inline int phy_init(struct phy *phy)
301{
302 if (!phy)
303 return 0;
304 return -ENOSYS;
305}
306
307static inline int phy_exit(struct phy *phy)
308{
309 if (!phy)
310 return 0;
311 return -ENOSYS;
312}
313
314static inline int phy_power_on(struct phy *phy)
315{
316 if (!phy)
317 return 0;
318 return -ENOSYS;
319}
320
321static inline int phy_power_off(struct phy *phy)
322{
323 if (!phy)
324 return 0;
325 return -ENOSYS;
326}
327
328static inline int phy_set_mode_ext(struct phy *phy, enum phy_mode mode,
329 int submode)
330{
331 if (!phy)
332 return 0;
333 return -ENOSYS;
334}
335
336#define phy_set_mode(phy, mode) \
337 phy_set_mode_ext(phy, mode, 0)
338
339static inline enum phy_mode phy_get_mode(struct phy *phy)
340{
341 return PHY_MODE_INVALID;
342}
343
344static inline int phy_reset(struct phy *phy)
345{
346 if (!phy)
347 return 0;
348 return -ENOSYS;
349}
350
351static inline int phy_calibrate(struct phy *phy)
352{
353 if (!phy)
354 return 0;
355 return -ENOSYS;
356}
357
358static inline int phy_configure(struct phy *phy,
359 union phy_configure_opts *opts)
360{
361 if (!phy)
362 return 0;
363
364 return -ENOSYS;
365}
366
367static inline int phy_validate(struct phy *phy, enum phy_mode mode, int submode,
368 union phy_configure_opts *opts)
369{
370 if (!phy)
371 return 0;
372
373 return -ENOSYS;
374}
375
376static inline int phy_get_bus_width(struct phy *phy)
377{
378 return -ENOSYS;
379}
380
381static inline void phy_set_bus_width(struct phy *phy, int bus_width)
382{
383 return;
384}
385
386static inline struct phy *phy_get(struct device *dev, const char *string)
387{
388 return ERR_PTR(-ENOSYS);
389}
390
391static inline struct phy *phy_optional_get(struct device *dev,
392 const char *string)
393{
394 return ERR_PTR(-ENOSYS);
395}
396
397static inline struct phy *devm_phy_get(struct device *dev, const char *string)
398{
399 return ERR_PTR(-ENOSYS);
400}
401
402static inline struct phy *devm_phy_optional_get(struct device *dev,
403 const char *string)
404{
405 return NULL;
406}
407
408static inline struct phy *devm_of_phy_get(struct device *dev,
409 struct device_node *np,
410 const char *con_id)
411{
412 return ERR_PTR(-ENOSYS);
413}
414
415static inline struct phy *devm_of_phy_get_by_index(struct device *dev,
416 struct device_node *np,
417 int index)
418{
419 return ERR_PTR(-ENOSYS);
420}
421
422static inline void phy_put(struct phy *phy)
423{
424}
425
426static inline void devm_phy_put(struct device *dev, struct phy *phy)
427{
428}
429
430static inline struct phy *of_phy_get(struct device_node *np, const char *con_id)
431{
432 return ERR_PTR(-ENOSYS);
433}
434
435static inline struct phy *of_phy_simple_xlate(struct device *dev,
436 struct of_phandle_args *args)
437{
438 return ERR_PTR(-ENOSYS);
439}
440
441static inline struct phy *phy_create(struct device *dev,
442 struct device_node *node,
443 const struct phy_ops *ops)
444{
445 return ERR_PTR(-ENOSYS);
446}
447
448static inline struct phy *devm_phy_create(struct device *dev,
449 struct device_node *node,
450 const struct phy_ops *ops)
451{
452 return ERR_PTR(-ENOSYS);
453}
454
455static inline void phy_destroy(struct phy *phy)
456{
457}
458
459static inline void devm_phy_destroy(struct device *dev, struct phy *phy)
460{
461}
462
463static inline struct phy_provider *__of_phy_provider_register(
464 struct device *dev, struct device_node *children, struct module *owner,
465 struct phy * (*of_xlate)(struct device *dev,
466 struct of_phandle_args *args))
467{
468 return ERR_PTR(-ENOSYS);
469}
470
471static inline struct phy_provider *__devm_of_phy_provider_register(struct device
472 *dev, struct device_node *children, struct module *owner,
473 struct phy * (*of_xlate)(struct device *dev,
474 struct of_phandle_args *args))
475{
476 return ERR_PTR(-ENOSYS);
477}
478
479static inline void of_phy_provider_unregister(struct phy_provider *phy_provider)
480{
481}
482
483static inline void devm_of_phy_provider_unregister(struct device *dev,
484 struct phy_provider *phy_provider)
485{
486}
487static inline int
488phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id)
489{
490 return 0;
491}
492static inline void phy_remove_lookup(struct phy *phy, const char *con_id,
493 const char *dev_id) { }
494#endif
495
496#endif
497