Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  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
 22struct phy;
 23
 24enum 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 */
 55union 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 */
 72struct 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 */
120struct 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 */
136struct 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 */
155struct 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 */
171struct 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
192static inline void phy_set_drvdata(struct phy *phy, void *data)
193{
194	dev_set_drvdata(&phy->dev, data);
195}
196
197static 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)
203int phy_pm_runtime_get(struct phy *phy);
204int phy_pm_runtime_get_sync(struct phy *phy);
205int phy_pm_runtime_put(struct phy *phy);
206int phy_pm_runtime_put_sync(struct phy *phy);
207void phy_pm_runtime_allow(struct phy *phy);
208void phy_pm_runtime_forbid(struct phy *phy);
209int phy_init(struct phy *phy);
210int phy_exit(struct phy *phy);
211int phy_power_on(struct phy *phy);
212int phy_power_off(struct phy *phy);
213int 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)
216int phy_configure(struct phy *phy, union phy_configure_opts *opts);
217int phy_validate(struct phy *phy, enum phy_mode mode, int submode,
218		 union phy_configure_opts *opts);
219
220static inline enum phy_mode phy_get_mode(struct phy *phy)
221{
222	return phy->attrs.mode;
223}
224int phy_reset(struct phy *phy);
225int phy_calibrate(struct phy *phy);
226static inline int phy_get_bus_width(struct phy *phy)
227{
228	return phy->attrs.bus_width;
229}
230static inline void phy_set_bus_width(struct phy *phy, int bus_width)
231{
232	phy->attrs.bus_width = bus_width;
233}
234struct phy *phy_get(struct device *dev, const char *string);
235struct phy *phy_optional_get(struct device *dev, const char *string);
236struct phy *devm_phy_get(struct device *dev, const char *string);
237struct phy *devm_phy_optional_get(struct device *dev, const char *string);
238struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
239			    const char *con_id);
240struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,
241				     int index);
242void of_phy_put(struct phy *phy);
243void phy_put(struct device *dev, struct phy *phy);
244void devm_phy_put(struct device *dev, struct phy *phy);
245struct phy *of_phy_get(struct device_node *np, const char *con_id);
246struct phy *of_phy_simple_xlate(struct device *dev,
247	struct of_phandle_args *args);
248struct phy *phy_create(struct device *dev, struct device_node *node,
249		       const struct phy_ops *ops);
250struct phy *devm_phy_create(struct device *dev, struct device_node *node,
251			    const struct phy_ops *ops);
252void phy_destroy(struct phy *phy);
253void devm_phy_destroy(struct device *dev, struct phy *phy);
254struct 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));
258struct 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));
262void of_phy_provider_unregister(struct phy_provider *phy_provider);
263void devm_of_phy_provider_unregister(struct device *dev,
264	struct phy_provider *phy_provider);
265int phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id);
266void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id);
267#else
268static inline int phy_pm_runtime_get(struct phy *phy)
269{
270	if (!phy)
271		return 0;
272	return -ENOSYS;
273}
274
275static inline int phy_pm_runtime_get_sync(struct phy *phy)
276{
277	if (!phy)
278		return 0;
279	return -ENOSYS;
280}
281
282static inline int phy_pm_runtime_put(struct phy *phy)
283{
284	if (!phy)
285		return 0;
286	return -ENOSYS;
287}
288
289static inline int phy_pm_runtime_put_sync(struct phy *phy)
290{
291	if (!phy)
292		return 0;
293	return -ENOSYS;
294}
295
296static inline void phy_pm_runtime_allow(struct phy *phy)
297{
298	return;
299}
300
301static inline void phy_pm_runtime_forbid(struct phy *phy)
302{
303	return;
304}
305
306static inline int phy_init(struct phy *phy)
307{
308	if (!phy)
309		return 0;
310	return -ENOSYS;
311}
312
313static inline int phy_exit(struct phy *phy)
314{
315	if (!phy)
316		return 0;
317	return -ENOSYS;
318}
319
320static inline int phy_power_on(struct phy *phy)
321{
322	if (!phy)
323		return 0;
324	return -ENOSYS;
325}
326
327static inline int phy_power_off(struct phy *phy)
328{
329	if (!phy)
330		return 0;
331	return -ENOSYS;
332}
333
334static inline int phy_set_mode_ext(struct phy *phy, enum phy_mode mode,
335				   int submode)
336{
337	if (!phy)
338		return 0;
339	return -ENOSYS;
340}
341
342#define phy_set_mode(phy, mode) \
343	phy_set_mode_ext(phy, mode, 0)
344
345static inline enum phy_mode phy_get_mode(struct phy *phy)
346{
347	return PHY_MODE_INVALID;
348}
349
350static inline int phy_reset(struct phy *phy)
351{
352	if (!phy)
353		return 0;
354	return -ENOSYS;
355}
356
357static inline int phy_calibrate(struct phy *phy)
358{
359	if (!phy)
360		return 0;
361	return -ENOSYS;
362}
363
364static 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
373static 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
382static inline int phy_get_bus_width(struct phy *phy)
383{
384	return -ENOSYS;
385}
386
387static inline void phy_set_bus_width(struct phy *phy, int bus_width)
388{
389	return;
390}
391
392static inline struct phy *phy_get(struct device *dev, const char *string)
393{
394	return ERR_PTR(-ENOSYS);
395}
396
397static inline struct phy *phy_optional_get(struct device *dev,
398					   const char *string)
399{
400	return ERR_PTR(-ENOSYS);
401}
402
403static inline struct phy *devm_phy_get(struct device *dev, const char *string)
404{
405	return ERR_PTR(-ENOSYS);
406}
407
408static inline struct phy *devm_phy_optional_get(struct device *dev,
409						const char *string)
410{
411	return NULL;
412}
413
414static 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
421static 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
428static inline void of_phy_put(struct phy *phy)
429{
430}
431
432static inline void phy_put(struct device *dev, struct phy *phy)
433{
434}
435
436static inline void devm_phy_put(struct device *dev, struct phy *phy)
437{
438}
439
440static inline struct phy *of_phy_get(struct device_node *np, const char *con_id)
441{
442	return ERR_PTR(-ENOSYS);
443}
444
445static inline struct phy *of_phy_simple_xlate(struct device *dev,
446	struct of_phandle_args *args)
447{
448	return ERR_PTR(-ENOSYS);
449}
450
451static 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
458static 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
465static inline void phy_destroy(struct phy *phy)
466{
467}
468
469static inline void devm_phy_destroy(struct device *dev, struct phy *phy)
470{
471}
472
473static 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
481static 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
489static inline void of_phy_provider_unregister(struct phy_provider *phy_provider)
490{
491}
492
493static inline void devm_of_phy_provider_unregister(struct device *dev,
494	struct phy_provider *phy_provider)
495{
496}
497static inline int
498phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id)
499{
500	return 0;
501}
502static 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 */