Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0-or-later */
2 : : /*
3 : : * phy.h -- generic phy header file
4 : : *
5 : : * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
6 : : *
7 : : * Author: Kishon Vijay Abraham I <kishon@ti.com>
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-dp.h>
20 : : #include <linux/phy/phy-mipi-dphy.h>
21 : :
22 : : struct phy;
23 : :
24 : : enum phy_mode {
25 : : PHY_MODE_INVALID,
26 : : PHY_MODE_USB_HOST,
27 : : PHY_MODE_USB_HOST_LS,
28 : : PHY_MODE_USB_HOST_FS,
29 : : PHY_MODE_USB_HOST_HS,
30 : : PHY_MODE_USB_HOST_SS,
31 : : PHY_MODE_USB_DEVICE,
32 : : PHY_MODE_USB_DEVICE_LS,
33 : : PHY_MODE_USB_DEVICE_FS,
34 : : PHY_MODE_USB_DEVICE_HS,
35 : : PHY_MODE_USB_DEVICE_SS,
36 : : PHY_MODE_USB_OTG,
37 : : PHY_MODE_UFS_HS_A,
38 : : PHY_MODE_UFS_HS_B,
39 : : PHY_MODE_PCIE,
40 : : PHY_MODE_ETHERNET,
41 : : PHY_MODE_MIPI_DPHY,
42 : : PHY_MODE_SATA,
43 : : PHY_MODE_LVDS,
44 : : PHY_MODE_DP
45 : : };
46 : :
47 : : /**
48 : : * union phy_configure_opts - Opaque generic phy configuration
49 : : *
50 : : * @mipi_dphy: Configuration set applicable for phys supporting
51 : : * the MIPI_DPHY phy mode.
52 : : * @dp: Configuration set applicable for phys supporting
53 : : * the DisplayPort protocol.
54 : : */
55 : : union phy_configure_opts {
56 : : struct phy_configure_opts_mipi_dphy mipi_dphy;
57 : : struct phy_configure_opts_dp dp;
58 : : };
59 : :
60 : : /**
61 : : * struct phy_ops - set of function pointers for performing phy operations
62 : : * @init: operation to be performed for initializing phy
63 : : * @exit: operation to be performed while exiting
64 : : * @power_on: powering on the phy
65 : : * @power_off: powering off the phy
66 : : * @set_mode: set the mode of the phy
67 : : * @reset: resetting the phy
68 : : * @calibrate: calibrate the phy
69 : : * @release: ops to be performed while the consumer relinquishes the PHY
70 : : * @owner: the module owner containing the ops
71 : : */
72 : : struct phy_ops {
73 : : int (*init)(struct phy *phy);
74 : : int (*exit)(struct phy *phy);
75 : : int (*power_on)(struct phy *phy);
76 : : int (*power_off)(struct phy *phy);
77 : : int (*set_mode)(struct phy *phy, enum phy_mode mode, int submode);
78 : :
79 : : /**
80 : : * @configure:
81 : : *
82 : : * Optional.
83 : : *
84 : : * Used to change the PHY parameters. phy_init() must have
85 : : * been called on the phy.
86 : : *
87 : : * Returns: 0 if successful, an negative error code otherwise
88 : : */
89 : : int (*configure)(struct phy *phy, union phy_configure_opts *opts);
90 : :
91 : : /**
92 : : * @validate:
93 : : *
94 : : * Optional.
95 : : *
96 : : * Used to check that the current set of parameters can be
97 : : * handled by the phy. Implementations are free to tune the
98 : : * parameters passed as arguments if needed by some
99 : : * implementation detail or constraints. It must not change
100 : : * any actual configuration of the PHY, so calling it as many
101 : : * times as deemed fit by the consumer must have no side
102 : : * effect.
103 : : *
104 : : * Returns: 0 if the configuration can be applied, an negative
105 : : * error code otherwise
106 : : */
107 : : int (*validate)(struct phy *phy, enum phy_mode mode, int submode,
108 : : union phy_configure_opts *opts);
109 : : int (*reset)(struct phy *phy);
110 : : int (*calibrate)(struct phy *phy);
111 : : void (*release)(struct phy *phy);
112 : : struct module *owner;
113 : : };
114 : :
115 : : /**
116 : : * struct phy_attrs - represents phy attributes
117 : : * @bus_width: Data path width implemented by PHY
118 : : * @mode: PHY mode
119 : : */
120 : : struct phy_attrs {
121 : : u32 bus_width;
122 : : enum phy_mode mode;
123 : : };
124 : :
125 : : /**
126 : : * struct phy - represents the phy device
127 : : * @dev: phy device
128 : : * @id: id of the phy device
129 : : * @ops: function pointers for performing phy operations
130 : : * @mutex: mutex to protect phy_ops
131 : : * @init_count: used to protect when the PHY is used by multiple consumers
132 : : * @power_count: used to protect when the PHY is used by multiple consumers
133 : : * @attrs: used to specify PHY specific attributes
134 : : * @pwr: power regulator associated with the phy
135 : : */
136 : : struct phy {
137 : : struct device dev;
138 : : int id;
139 : : const struct phy_ops *ops;
140 : : struct mutex mutex;
141 : : int init_count;
142 : : int power_count;
143 : : struct phy_attrs attrs;
144 : : struct regulator *pwr;
145 : : };
146 : :
147 : : /**
148 : : * struct phy_provider - represents the phy provider
149 : : * @dev: phy provider device
150 : : * @children: can be used to override the default (dev->of_node) child node
151 : : * @owner: the module owner having of_xlate
152 : : * @list: to maintain a linked list of PHY providers
153 : : * @of_xlate: function pointer to obtain phy instance from phy pointer
154 : : */
155 : : struct phy_provider {
156 : : struct device *dev;
157 : : struct device_node *children;
158 : : struct module *owner;
159 : : struct list_head list;
160 : : struct phy * (*of_xlate)(struct device *dev,
161 : : struct of_phandle_args *args);
162 : : };
163 : :
164 : : /**
165 : : * struct phy_lookup - PHY association in list of phys managed by the phy driver
166 : : * @node: list node
167 : : * @dev_id: the device of the association
168 : : * @con_id: connection ID string on device
169 : : * @phy: the phy of the association
170 : : */
171 : : struct phy_lookup {
172 : : struct list_head node;
173 : : const char *dev_id;
174 : : const char *con_id;
175 : : struct phy *phy;
176 : : };
177 : :
178 : : #define to_phy(a) (container_of((a), struct phy, dev))
179 : :
180 : : #define of_phy_provider_register(dev, xlate) \
181 : : __of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))
182 : :
183 : : #define devm_of_phy_provider_register(dev, xlate) \
184 : : __devm_of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))
185 : :
186 : : #define of_phy_provider_register_full(dev, children, xlate) \
187 : : __of_phy_provider_register(dev, children, THIS_MODULE, xlate)
188 : :
189 : : #define devm_of_phy_provider_register_full(dev, children, xlate) \
190 : : __devm_of_phy_provider_register(dev, children, THIS_MODULE, xlate)
191 : :
192 : : static inline void phy_set_drvdata(struct phy *phy, void *data)
193 : : {
194 : : dev_set_drvdata(&phy->dev, data);
195 : : }
196 : :
197 : : static inline void *phy_get_drvdata(struct phy *phy)
198 : : {
199 : : return dev_get_drvdata(&phy->dev);
200 : : }
201 : :
202 : : #if IS_ENABLED(CONFIG_GENERIC_PHY)
203 : : int phy_pm_runtime_get(struct phy *phy);
204 : : int phy_pm_runtime_get_sync(struct phy *phy);
205 : : int phy_pm_runtime_put(struct phy *phy);
206 : : int phy_pm_runtime_put_sync(struct phy *phy);
207 : : void phy_pm_runtime_allow(struct phy *phy);
208 : : void phy_pm_runtime_forbid(struct phy *phy);
209 : : int phy_init(struct phy *phy);
210 : : int phy_exit(struct phy *phy);
211 : : int phy_power_on(struct phy *phy);
212 : : int phy_power_off(struct phy *phy);
213 : : int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, int submode);
214 : : #define phy_set_mode(phy, mode) \
215 : : phy_set_mode_ext(phy, mode, 0)
216 : : int phy_configure(struct phy *phy, union phy_configure_opts *opts);
217 : : int phy_validate(struct phy *phy, enum phy_mode mode, int submode,
218 : : union phy_configure_opts *opts);
219 : :
220 : : static inline enum phy_mode phy_get_mode(struct phy *phy)
221 : : {
222 : : return phy->attrs.mode;
223 : : }
224 : : int phy_reset(struct phy *phy);
225 : : int phy_calibrate(struct phy *phy);
226 : : static inline int phy_get_bus_width(struct phy *phy)
227 : : {
228 : : return phy->attrs.bus_width;
229 : : }
230 : : static inline void phy_set_bus_width(struct phy *phy, int bus_width)
231 : : {
232 : : phy->attrs.bus_width = bus_width;
233 : : }
234 : : struct phy *phy_get(struct device *dev, const char *string);
235 : : struct phy *phy_optional_get(struct device *dev, const char *string);
236 : : struct phy *devm_phy_get(struct device *dev, const char *string);
237 : : struct phy *devm_phy_optional_get(struct device *dev, const char *string);
238 : : struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
239 : : const char *con_id);
240 : : struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,
241 : : int index);
242 : : void of_phy_put(struct phy *phy);
243 : : void phy_put(struct device *dev, struct phy *phy);
244 : : void devm_phy_put(struct device *dev, struct phy *phy);
245 : : struct phy *of_phy_get(struct device_node *np, const char *con_id);
246 : : struct phy *of_phy_simple_xlate(struct device *dev,
247 : : struct of_phandle_args *args);
248 : : struct phy *phy_create(struct device *dev, struct device_node *node,
249 : : const struct phy_ops *ops);
250 : : struct phy *devm_phy_create(struct device *dev, struct device_node *node,
251 : : const struct phy_ops *ops);
252 : : void phy_destroy(struct phy *phy);
253 : : void devm_phy_destroy(struct device *dev, struct phy *phy);
254 : : struct phy_provider *__of_phy_provider_register(struct device *dev,
255 : : struct device_node *children, struct module *owner,
256 : : struct phy * (*of_xlate)(struct device *dev,
257 : : struct of_phandle_args *args));
258 : : struct phy_provider *__devm_of_phy_provider_register(struct device *dev,
259 : : struct device_node *children, struct module *owner,
260 : : struct phy * (*of_xlate)(struct device *dev,
261 : : struct of_phandle_args *args));
262 : : void of_phy_provider_unregister(struct phy_provider *phy_provider);
263 : : void devm_of_phy_provider_unregister(struct device *dev,
264 : : struct phy_provider *phy_provider);
265 : : int phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id);
266 : : void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id);
267 : : #else
268 : : static inline int phy_pm_runtime_get(struct phy *phy)
269 : : {
270 : : if (!phy)
271 : : return 0;
272 : : return -ENOSYS;
273 : : }
274 : :
275 : : static inline int phy_pm_runtime_get_sync(struct phy *phy)
276 : : {
277 : : if (!phy)
278 : : return 0;
279 : : return -ENOSYS;
280 : : }
281 : :
282 : : static inline int phy_pm_runtime_put(struct phy *phy)
283 : : {
284 : : if (!phy)
285 : : return 0;
286 : : return -ENOSYS;
287 : : }
288 : :
289 : : static inline int phy_pm_runtime_put_sync(struct phy *phy)
290 : : {
291 : : if (!phy)
292 : : return 0;
293 : : return -ENOSYS;
294 : : }
295 : :
296 : : static inline void phy_pm_runtime_allow(struct phy *phy)
297 : : {
298 : : return;
299 : : }
300 : :
301 : : static inline void phy_pm_runtime_forbid(struct phy *phy)
302 : : {
303 : : return;
304 : : }
305 : :
306 : 0 : static inline int phy_init(struct phy *phy)
307 : : {
308 [ # # # # ]: 0 : if (!phy)
309 : 0 : return 0;
310 : : return -ENOSYS;
311 : : }
312 : :
313 : 0 : static inline int phy_exit(struct phy *phy)
314 : : {
315 [ # # # # ]: 0 : if (!phy)
316 : 0 : return 0;
317 : : return -ENOSYS;
318 : : }
319 : :
320 : 0 : static inline int phy_power_on(struct phy *phy)
321 : : {
322 [ # # # # ]: 0 : if (!phy)
323 : 0 : return 0;
324 : : return -ENOSYS;
325 : : }
326 : :
327 : 0 : static inline int phy_power_off(struct phy *phy)
328 : : {
329 : 0 : if (!phy)
330 : : return 0;
331 : : return -ENOSYS;
332 : : }
333 : :
334 : 0 : static inline int phy_set_mode_ext(struct phy *phy, enum phy_mode mode,
335 : : int submode)
336 : : {
337 [ # # ]: 0 : if (!phy)
338 : 0 : return 0;
339 : : return -ENOSYS;
340 : : }
341 : :
342 : : #define phy_set_mode(phy, mode) \
343 : : phy_set_mode_ext(phy, mode, 0)
344 : :
345 : : static inline enum phy_mode phy_get_mode(struct phy *phy)
346 : : {
347 : : return PHY_MODE_INVALID;
348 : : }
349 : :
350 : : static inline int phy_reset(struct phy *phy)
351 : : {
352 : : if (!phy)
353 : : return 0;
354 : : return -ENOSYS;
355 : : }
356 : :
357 : 0 : static inline int phy_calibrate(struct phy *phy)
358 : : {
359 [ # # ]: 0 : if (!phy)
360 : 0 : return 0;
361 : : return -ENOSYS;
362 : : }
363 : :
364 : : static inline int phy_configure(struct phy *phy,
365 : : union phy_configure_opts *opts)
366 : : {
367 : : if (!phy)
368 : : return 0;
369 : :
370 : : return -ENOSYS;
371 : : }
372 : :
373 : : static inline int phy_validate(struct phy *phy, enum phy_mode mode, int submode,
374 : : union phy_configure_opts *opts)
375 : : {
376 : : if (!phy)
377 : : return 0;
378 : :
379 : : return -ENOSYS;
380 : : }
381 : :
382 : : static inline int phy_get_bus_width(struct phy *phy)
383 : : {
384 : : return -ENOSYS;
385 : : }
386 : :
387 : : static inline void phy_set_bus_width(struct phy *phy, int bus_width)
388 : : {
389 : : return;
390 : : }
391 : :
392 : : static inline struct phy *phy_get(struct device *dev, const char *string)
393 : : {
394 : : return ERR_PTR(-ENOSYS);
395 : : }
396 : :
397 : : static inline struct phy *phy_optional_get(struct device *dev,
398 : : const char *string)
399 : : {
400 : : return ERR_PTR(-ENOSYS);
401 : : }
402 : :
403 : : static inline struct phy *devm_phy_get(struct device *dev, const char *string)
404 : : {
405 : : return ERR_PTR(-ENOSYS);
406 : : }
407 : :
408 : : static inline struct phy *devm_phy_optional_get(struct device *dev,
409 : : const char *string)
410 : : {
411 : : return NULL;
412 : : }
413 : :
414 : : static inline struct phy *devm_of_phy_get(struct device *dev,
415 : : struct device_node *np,
416 : : const char *con_id)
417 : : {
418 : : return ERR_PTR(-ENOSYS);
419 : : }
420 : :
421 : : static inline struct phy *devm_of_phy_get_by_index(struct device *dev,
422 : : struct device_node *np,
423 : : int index)
424 : : {
425 : : return ERR_PTR(-ENOSYS);
426 : : }
427 : :
428 : : static inline void of_phy_put(struct phy *phy)
429 : : {
430 : : }
431 : :
432 : : static inline void phy_put(struct device *dev, struct phy *phy)
433 : : {
434 : : }
435 : :
436 : : static inline void devm_phy_put(struct device *dev, struct phy *phy)
437 : : {
438 : : }
439 : :
440 : : static inline struct phy *of_phy_get(struct device_node *np, const char *con_id)
441 : : {
442 : : return ERR_PTR(-ENOSYS);
443 : : }
444 : :
445 : : static inline struct phy *of_phy_simple_xlate(struct device *dev,
446 : : struct of_phandle_args *args)
447 : : {
448 : : return ERR_PTR(-ENOSYS);
449 : : }
450 : :
451 : : static inline struct phy *phy_create(struct device *dev,
452 : : struct device_node *node,
453 : : const struct phy_ops *ops)
454 : : {
455 : : return ERR_PTR(-ENOSYS);
456 : : }
457 : :
458 : : static inline struct phy *devm_phy_create(struct device *dev,
459 : : struct device_node *node,
460 : : const struct phy_ops *ops)
461 : : {
462 : : return ERR_PTR(-ENOSYS);
463 : : }
464 : :
465 : : static inline void phy_destroy(struct phy *phy)
466 : : {
467 : : }
468 : :
469 : : static inline void devm_phy_destroy(struct device *dev, struct phy *phy)
470 : : {
471 : : }
472 : :
473 : : static inline struct phy_provider *__of_phy_provider_register(
474 : : struct device *dev, struct device_node *children, struct module *owner,
475 : : struct phy * (*of_xlate)(struct device *dev,
476 : : struct of_phandle_args *args))
477 : : {
478 : : return ERR_PTR(-ENOSYS);
479 : : }
480 : :
481 : : static inline struct phy_provider *__devm_of_phy_provider_register(struct device
482 : : *dev, struct device_node *children, struct module *owner,
483 : : struct phy * (*of_xlate)(struct device *dev,
484 : : struct of_phandle_args *args))
485 : : {
486 : : return ERR_PTR(-ENOSYS);
487 : : }
488 : :
489 : : static inline void of_phy_provider_unregister(struct phy_provider *phy_provider)
490 : : {
491 : : }
492 : :
493 : : static inline void devm_of_phy_provider_unregister(struct device *dev,
494 : : struct phy_provider *phy_provider)
495 : : {
496 : : }
497 : : static inline int
498 : : phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id)
499 : : {
500 : : return 0;
501 : : }
502 : : static inline void phy_remove_lookup(struct phy *phy, const char *con_id,
503 : : const char *dev_id) { }
504 : : #endif
505 : :
506 : : #endif /* __DRIVERS_PHY_H */
|