linux/include/linux/phy/phy.h
<<
>>
Prefs
   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-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 * union phy_configure_opts - Opaque generic phy configuration
  47 *
  48 * @mipi_dphy:  Configuration set applicable for phys supporting
  49 *              the MIPI_DPHY phy mode.
  50 */
  51union phy_configure_opts {
  52        struct phy_configure_opts_mipi_dphy     mipi_dphy;
  53};
  54
  55/**
  56 * struct phy_ops - set of function pointers for performing phy operations
  57 * @init: operation to be performed for initializing phy
  58 * @exit: operation to be performed while exiting
  59 * @power_on: powering on the phy
  60 * @power_off: powering off the phy
  61 * @set_mode: set the mode of the phy
  62 * @reset: resetting the phy
  63 * @calibrate: calibrate the phy
  64 * @release: ops to be performed while the consumer relinquishes the PHY
  65 * @owner: the module owner containing the ops
  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         * @configure:
  76         *
  77         * Optional.
  78         *
  79         * Used to change the PHY parameters. phy_init() must have
  80         * been called on the phy.
  81         *
  82         * Returns: 0 if successful, an negative error code otherwise
  83         */
  84        int     (*configure)(struct phy *phy, union phy_configure_opts *opts);
  85
  86        /**
  87         * @validate:
  88         *
  89         * Optional.
  90         *
  91         * Used to check that the current set of parameters can be
  92         * handled by the phy. Implementations are free to tune the
  93         * parameters passed as arguments if needed by some
  94         * implementation detail or constraints. It must not change
  95         * any actual configuration of the PHY, so calling it as many
  96         * times as deemed fit by the consumer must have no side
  97         * effect.
  98         *
  99         * Returns: 0 if the configuration can be applied, an negative
 100         * error code otherwise
 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 * struct phy_attrs - represents phy attributes
 112 * @bus_width: Data path width implemented by PHY
 113 * @mode: PHY mode
 114 */
 115struct phy_attrs {
 116        u32                     bus_width;
 117        enum phy_mode           mode;
 118};
 119
 120/**
 121 * struct phy - represents the phy device
 122 * @dev: phy device
 123 * @id: id of the phy device
 124 * @ops: function pointers for performing phy operations
 125 * @mutex: mutex to protect phy_ops
 126 * @init_count: used to protect when the PHY is used by multiple consumers
 127 * @power_count: used to protect when the PHY is used by multiple consumers
 128 * @attrs: used to specify PHY specific attributes
 129 * @pwr: power regulator associated with the phy
 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 * struct phy_provider - represents the phy provider
 144 * @dev: phy provider device
 145 * @children: can be used to override the default (dev->of_node) child node
 146 * @owner: the module owner having of_xlate
 147 * @list: to maintain a linked list of PHY providers
 148 * @of_xlate: function pointer to obtain phy instance from phy pointer
 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 * struct phy_lookup - PHY association in list of phys managed by the phy driver
 161 * @node: list node
 162 * @dev_id: the device of the association
 163 * @con_id: connection ID string on device
 164 * @phy: the phy of the association
 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 /* __DRIVERS_PHY_H */
 497