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