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
  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_SGMII,
  39        PHY_MODE_2500SGMII,
  40        PHY_MODE_10GKR,
  41        PHY_MODE_UFS_HS_A,
  42        PHY_MODE_UFS_HS_B,
  43};
  44
  45/**
  46 * struct phy_ops - set of function pointers for performing phy operations
  47 * @init: operation to be performed for initializing phy
  48 * @exit: operation to be performed while exiting
  49 * @power_on: powering on the phy
  50 * @power_off: powering off the phy
  51 * @set_mode: set the mode of the phy
  52 * @reset: resetting the phy
  53 * @calibrate: calibrate the phy
  54 * @owner: the module owner containing the ops
  55 */
  56struct phy_ops {
  57        int     (*init)(struct phy *phy);
  58        int     (*exit)(struct phy *phy);
  59        int     (*power_on)(struct phy *phy);
  60        int     (*power_off)(struct phy *phy);
  61        int     (*set_mode)(struct phy *phy, enum phy_mode mode);
  62        int     (*reset)(struct phy *phy);
  63        int     (*calibrate)(struct phy *phy);
  64        struct module *owner;
  65};
  66
  67/**
  68 * struct phy_attrs - represents phy attributes
  69 * @bus_width: Data path width implemented by PHY
  70 */
  71struct phy_attrs {
  72        u32                     bus_width;
  73        enum phy_mode           mode;
  74};
  75
  76/**
  77 * struct phy - represents the phy device
  78 * @dev: phy device
  79 * @id: id of the phy device
  80 * @ops: function pointers for performing phy operations
  81 * @init_data: list of PHY consumers (non-dt only)
  82 * @mutex: mutex to protect phy_ops
  83 * @init_count: used to protect when the PHY is used by multiple consumers
  84 * @power_count: used to protect when the PHY is used by multiple consumers
  85 * @attrs: used to specify PHY specific attributes
  86 * @pwr: power regulator associated with the phy
  87 */
  88struct phy {
  89        struct device           dev;
  90        int                     id;
  91        const struct phy_ops    *ops;
  92        struct mutex            mutex;
  93        int                     init_count;
  94        int                     power_count;
  95        struct phy_attrs        attrs;
  96        struct regulator        *pwr;
  97};
  98
  99/**
 100 * struct phy_provider - represents the phy provider
 101 * @dev: phy provider device
 102 * @children: can be used to override the default (dev->of_node) child node
 103 * @owner: the module owner having of_xlate
 104 * @list: to maintain a linked list of PHY providers
 105 * @of_xlate: function pointer to obtain phy instance from phy pointer
 106 */
 107struct phy_provider {
 108        struct device           *dev;
 109        struct device_node      *children;
 110        struct module           *owner;
 111        struct list_head        list;
 112        struct phy * (*of_xlate)(struct device *dev,
 113                struct of_phandle_args *args);
 114};
 115
 116/**
 117 * struct phy_lookup - PHY association in list of phys managed by the phy driver
 118 * @node: list node
 119 * @dev_id: the device of the association
 120 * @con_id: connection ID string on device
 121 * @phy: the phy of the association
 122 */
 123struct phy_lookup {
 124        struct list_head node;
 125        const char *dev_id;
 126        const char *con_id;
 127        struct phy *phy;
 128};
 129
 130#define to_phy(a)       (container_of((a), struct phy, dev))
 131
 132#define of_phy_provider_register(dev, xlate)    \
 133        __of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))
 134
 135#define devm_of_phy_provider_register(dev, xlate)       \
 136        __devm_of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))
 137
 138#define of_phy_provider_register_full(dev, children, xlate) \
 139        __of_phy_provider_register(dev, children, THIS_MODULE, xlate)
 140
 141#define devm_of_phy_provider_register_full(dev, children, xlate) \
 142        __devm_of_phy_provider_register(dev, children, THIS_MODULE, xlate)
 143
 144static inline void phy_set_drvdata(struct phy *phy, void *data)
 145{
 146        dev_set_drvdata(&phy->dev, data);
 147}
 148
 149static inline void *phy_get_drvdata(struct phy *phy)
 150{
 151        return dev_get_drvdata(&phy->dev);
 152}
 153
 154#if IS_ENABLED(CONFIG_GENERIC_PHY)
 155int phy_pm_runtime_get(struct phy *phy);
 156int phy_pm_runtime_get_sync(struct phy *phy);
 157int phy_pm_runtime_put(struct phy *phy);
 158int phy_pm_runtime_put_sync(struct phy *phy);
 159void phy_pm_runtime_allow(struct phy *phy);
 160void phy_pm_runtime_forbid(struct phy *phy);
 161int phy_init(struct phy *phy);
 162int phy_exit(struct phy *phy);
 163int phy_power_on(struct phy *phy);
 164int phy_power_off(struct phy *phy);
 165int phy_set_mode(struct phy *phy, enum phy_mode mode);
 166static inline enum phy_mode phy_get_mode(struct phy *phy)
 167{
 168        return phy->attrs.mode;
 169}
 170int phy_reset(struct phy *phy);
 171int phy_calibrate(struct phy *phy);
 172static inline int phy_get_bus_width(struct phy *phy)
 173{
 174        return phy->attrs.bus_width;
 175}
 176static inline void phy_set_bus_width(struct phy *phy, int bus_width)
 177{
 178        phy->attrs.bus_width = bus_width;
 179}
 180struct phy *phy_get(struct device *dev, const char *string);
 181struct phy *phy_optional_get(struct device *dev, const char *string);
 182struct phy *devm_phy_get(struct device *dev, const char *string);
 183struct phy *devm_phy_optional_get(struct device *dev, const char *string);
 184struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
 185                            const char *con_id);
 186struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,
 187                                     int index);
 188void phy_put(struct phy *phy);
 189void devm_phy_put(struct device *dev, struct phy *phy);
 190struct phy *of_phy_get(struct device_node *np, const char *con_id);
 191struct phy *of_phy_simple_xlate(struct device *dev,
 192        struct of_phandle_args *args);
 193struct phy *phy_create(struct device *dev, struct device_node *node,
 194                       const struct phy_ops *ops);
 195struct phy *devm_phy_create(struct device *dev, struct device_node *node,
 196                            const struct phy_ops *ops);
 197void phy_destroy(struct phy *phy);
 198void devm_phy_destroy(struct device *dev, struct phy *phy);
 199struct phy_provider *__of_phy_provider_register(struct device *dev,
 200        struct device_node *children, struct module *owner,
 201        struct phy * (*of_xlate)(struct device *dev,
 202                                 struct of_phandle_args *args));
 203struct phy_provider *__devm_of_phy_provider_register(struct device *dev,
 204        struct device_node *children, struct module *owner,
 205        struct phy * (*of_xlate)(struct device *dev,
 206                                 struct of_phandle_args *args));
 207void of_phy_provider_unregister(struct phy_provider *phy_provider);
 208void devm_of_phy_provider_unregister(struct device *dev,
 209        struct phy_provider *phy_provider);
 210int phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id);
 211void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id);
 212#else
 213static inline int phy_pm_runtime_get(struct phy *phy)
 214{
 215        if (!phy)
 216                return 0;
 217        return -ENOSYS;
 218}
 219
 220static inline int phy_pm_runtime_get_sync(struct phy *phy)
 221{
 222        if (!phy)
 223                return 0;
 224        return -ENOSYS;
 225}
 226
 227static inline int phy_pm_runtime_put(struct phy *phy)
 228{
 229        if (!phy)
 230                return 0;
 231        return -ENOSYS;
 232}
 233
 234static inline int phy_pm_runtime_put_sync(struct phy *phy)
 235{
 236        if (!phy)
 237                return 0;
 238        return -ENOSYS;
 239}
 240
 241static inline void phy_pm_runtime_allow(struct phy *phy)
 242{
 243        return;
 244}
 245
 246static inline void phy_pm_runtime_forbid(struct phy *phy)
 247{
 248        return;
 249}
 250
 251static inline int phy_init(struct phy *phy)
 252{
 253        if (!phy)
 254                return 0;
 255        return -ENOSYS;
 256}
 257
 258static inline int phy_exit(struct phy *phy)
 259{
 260        if (!phy)
 261                return 0;
 262        return -ENOSYS;
 263}
 264
 265static inline int phy_power_on(struct phy *phy)
 266{
 267        if (!phy)
 268                return 0;
 269        return -ENOSYS;
 270}
 271
 272static inline int phy_power_off(struct phy *phy)
 273{
 274        if (!phy)
 275                return 0;
 276        return -ENOSYS;
 277}
 278
 279static inline int phy_set_mode(struct phy *phy, enum phy_mode mode)
 280{
 281        if (!phy)
 282                return 0;
 283        return -ENOSYS;
 284}
 285
 286static inline enum phy_mode phy_get_mode(struct phy *phy)
 287{
 288        return PHY_MODE_INVALID;
 289}
 290
 291static inline int phy_reset(struct phy *phy)
 292{
 293        if (!phy)
 294                return 0;
 295        return -ENOSYS;
 296}
 297
 298static inline int phy_calibrate(struct phy *phy)
 299{
 300        if (!phy)
 301                return 0;
 302        return -ENOSYS;
 303}
 304
 305static inline int phy_get_bus_width(struct phy *phy)
 306{
 307        return -ENOSYS;
 308}
 309
 310static inline void phy_set_bus_width(struct phy *phy, int bus_width)
 311{
 312        return;
 313}
 314
 315static inline struct phy *phy_get(struct device *dev, const char *string)
 316{
 317        return ERR_PTR(-ENOSYS);
 318}
 319
 320static inline struct phy *phy_optional_get(struct device *dev,
 321                                           const char *string)
 322{
 323        return ERR_PTR(-ENOSYS);
 324}
 325
 326static inline struct phy *devm_phy_get(struct device *dev, const char *string)
 327{
 328        return ERR_PTR(-ENOSYS);
 329}
 330
 331static inline struct phy *devm_phy_optional_get(struct device *dev,
 332                                                const char *string)
 333{
 334        return NULL;
 335}
 336
 337static inline struct phy *devm_of_phy_get(struct device *dev,
 338                                          struct device_node *np,
 339                                          const char *con_id)
 340{
 341        return ERR_PTR(-ENOSYS);
 342}
 343
 344static inline struct phy *devm_of_phy_get_by_index(struct device *dev,
 345                                                   struct device_node *np,
 346                                                   int index)
 347{
 348        return ERR_PTR(-ENOSYS);
 349}
 350
 351static inline void phy_put(struct phy *phy)
 352{
 353}
 354
 355static inline void devm_phy_put(struct device *dev, struct phy *phy)
 356{
 357}
 358
 359static inline struct phy *of_phy_get(struct device_node *np, const char *con_id)
 360{
 361        return ERR_PTR(-ENOSYS);
 362}
 363
 364static inline struct phy *of_phy_simple_xlate(struct device *dev,
 365        struct of_phandle_args *args)
 366{
 367        return ERR_PTR(-ENOSYS);
 368}
 369
 370static inline struct phy *phy_create(struct device *dev,
 371                                     struct device_node *node,
 372                                     const struct phy_ops *ops)
 373{
 374        return ERR_PTR(-ENOSYS);
 375}
 376
 377static inline struct phy *devm_phy_create(struct device *dev,
 378                                          struct device_node *node,
 379                                          const struct phy_ops *ops)
 380{
 381        return ERR_PTR(-ENOSYS);
 382}
 383
 384static inline void phy_destroy(struct phy *phy)
 385{
 386}
 387
 388static inline void devm_phy_destroy(struct device *dev, struct phy *phy)
 389{
 390}
 391
 392static inline struct phy_provider *__of_phy_provider_register(
 393        struct device *dev, struct device_node *children, struct module *owner,
 394        struct phy * (*of_xlate)(struct device *dev,
 395                                 struct of_phandle_args *args))
 396{
 397        return ERR_PTR(-ENOSYS);
 398}
 399
 400static inline struct phy_provider *__devm_of_phy_provider_register(struct device
 401        *dev, struct device_node *children, struct module *owner,
 402        struct phy * (*of_xlate)(struct device *dev,
 403                                 struct of_phandle_args *args))
 404{
 405        return ERR_PTR(-ENOSYS);
 406}
 407
 408static inline void of_phy_provider_unregister(struct phy_provider *phy_provider)
 409{
 410}
 411
 412static inline void devm_of_phy_provider_unregister(struct device *dev,
 413        struct phy_provider *phy_provider)
 414{
 415}
 416static inline int
 417phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id)
 418{
 419        return 0;
 420}
 421static inline void phy_remove_lookup(struct phy *phy, const char *con_id,
 422                                     const char *dev_id) { }
 423#endif
 424
 425#endif /* __DRIVERS_PHY_H */
 426