cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

phy.h (13690B)


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