| /* |
| * phy.h -- generic phy header file |
| * |
| * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com |
| * |
| * Author: Kishon Vijay Abraham I <kishon@ti.com> |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| */ |
| |
| #ifndef __DRIVERS_PHY_H |
| #define __DRIVERS_PHY_H |
| |
| #include <linux/err.h> |
| #include <linux/of.h> |
| #include <linux/device.h> |
| #include <linux/pm_runtime.h> |
| |
| struct phy; |
| |
| /** |
| * struct phy_ops - set of function pointers for performing phy operations |
| * @init: operation to be performed for initializing phy |
| * @exit: operation to be performed while exiting |
| * @power_on: powering on the phy |
| * @power_off: powering off the phy |
| * @owner: the module owner containing the ops |
| */ |
| struct phy_ops { |
| int (*init)(struct phy *phy); |
| int (*exit)(struct phy *phy); |
| int (*power_on)(struct phy *phy); |
| int (*power_off)(struct phy *phy); |
| struct module *owner; |
| }; |
| |
| /** |
| * struct phy_attrs - represents phy attributes |
| * @bus_width: Data path width implemented by PHY |
| */ |
| struct phy_attrs { |
| u32 bus_width; |
| }; |
| |
| /** |
| * struct phy - represents the phy device |
| * @dev: phy device |
| * @id: id of the phy device |
| * @ops: function pointers for performing phy operations |
| * @init_data: list of PHY consumers (non-dt only) |
| * @mutex: mutex to protect phy_ops |
| * @init_count: used to protect when the PHY is used by multiple consumers |
| * @power_count: used to protect when the PHY is used by multiple consumers |
| * @phy_attrs: used to specify PHY specific attributes |
| */ |
| struct phy { |
| struct device dev; |
| int id; |
| const struct phy_ops *ops; |
| struct phy_init_data *init_data; |
| struct mutex mutex; |
| int init_count; |
| int power_count; |
| struct phy_attrs attrs; |
| }; |
| |
| /** |
| * struct phy_provider - represents the phy provider |
| * @dev: phy provider device |
| * @owner: the module owner having of_xlate |
| * @of_xlate: function pointer to obtain phy instance from phy pointer |
| * @list: to maintain a linked list of PHY providers |
| */ |
| struct phy_provider { |
| struct device *dev; |
| struct module *owner; |
| struct list_head list; |
| struct phy * (*of_xlate)(struct device *dev, |
| struct of_phandle_args *args); |
| }; |
| |
| /** |
| * struct phy_consumer - represents the phy consumer |
| * @dev_name: the device name of the controller that will use this PHY device |
| * @port: name given to the consumer port |
| */ |
| struct phy_consumer { |
| const char *dev_name; |
| const char *port; |
| }; |
| |
| /** |
| * struct phy_init_data - contains the list of PHY consumers |
| * @num_consumers: number of consumers for this PHY device |
| * @consumers: list of PHY consumers |
| */ |
| struct phy_init_data { |
| unsigned int num_consumers; |
| struct phy_consumer *consumers; |
| }; |
| |
| #define PHY_CONSUMER(_dev_name, _port) \ |
| { \ |
| .dev_name = _dev_name, \ |
| .port = _port, \ |
| } |
| |
| #define to_phy(dev) (container_of((dev), struct phy, dev)) |
| |
| #define of_phy_provider_register(dev, xlate) \ |
| __of_phy_provider_register((dev), THIS_MODULE, (xlate)) |
| |
| #define devm_of_phy_provider_register(dev, xlate) \ |
| __devm_of_phy_provider_register((dev), THIS_MODULE, (xlate)) |
| |
| static inline void phy_set_drvdata(struct phy *phy, void *data) |
| { |
| dev_set_drvdata(&phy->dev, data); |
| } |
| |
| static inline void *phy_get_drvdata(struct phy *phy) |
| { |
| return dev_get_drvdata(&phy->dev); |
| } |
| |
| #if IS_ENABLED(CONFIG_GENERIC_PHY) |
| int phy_pm_runtime_get(struct phy *phy); |
| int phy_pm_runtime_get_sync(struct phy *phy); |
| int phy_pm_runtime_put(struct phy *phy); |
| int phy_pm_runtime_put_sync(struct phy *phy); |
| void phy_pm_runtime_allow(struct phy *phy); |
| void phy_pm_runtime_forbid(struct phy *phy); |
| int phy_init(struct phy *phy); |
| int phy_exit(struct phy *phy); |
| int phy_power_on(struct phy *phy); |
| int phy_power_off(struct phy *phy); |
| static inline int phy_get_bus_width(struct phy *phy) |
| { |
| return phy->attrs.bus_width; |
| } |
| static inline void phy_set_bus_width(struct phy *phy, int bus_width) |
| { |
| phy->attrs.bus_width = bus_width; |
| } |
| struct phy *phy_get(struct device *dev, const char *string); |
| struct phy *phy_optional_get(struct device *dev, const char *string); |
| struct phy *devm_phy_get(struct device *dev, const char *string); |
| struct phy *devm_phy_optional_get(struct device *dev, const char *string); |
| void phy_put(struct phy *phy); |
| void devm_phy_put(struct device *dev, struct phy *phy); |
| struct phy *of_phy_simple_xlate(struct device *dev, |
| struct of_phandle_args *args); |
| struct phy *phy_create(struct device *dev, const struct phy_ops *ops, |
| struct phy_init_data *init_data); |
| struct phy *devm_phy_create(struct device *dev, |
| const struct phy_ops *ops, struct phy_init_data *init_data); |
| void phy_destroy(struct phy *phy); |
| void devm_phy_destroy(struct device *dev, struct phy *phy); |
| struct phy_provider *__of_phy_provider_register(struct device *dev, |
| struct module *owner, struct phy * (*of_xlate)(struct device *dev, |
| struct of_phandle_args *args)); |
| struct phy_provider *__devm_of_phy_provider_register(struct device *dev, |
| struct module *owner, struct phy * (*of_xlate)(struct device *dev, |
| struct of_phandle_args *args)); |
| void of_phy_provider_unregister(struct phy_provider *phy_provider); |
| void devm_of_phy_provider_unregister(struct device *dev, |
| struct phy_provider *phy_provider); |
| #else |
| static inline int phy_pm_runtime_get(struct phy *phy) |
| { |
| return -ENOSYS; |
| } |
| |
| static inline int phy_pm_runtime_get_sync(struct phy *phy) |
| { |
| return -ENOSYS; |
| } |
| |
| static inline int phy_pm_runtime_put(struct phy *phy) |
| { |
| return -ENOSYS; |
| } |
| |
| static inline int phy_pm_runtime_put_sync(struct phy *phy) |
| { |
| return -ENOSYS; |
| } |
| |
| static inline void phy_pm_runtime_allow(struct phy *phy) |
| { |
| return; |
| } |
| |
| static inline void phy_pm_runtime_forbid(struct phy *phy) |
| { |
| return; |
| } |
| |
| static inline int phy_init(struct phy *phy) |
| { |
| return -ENOSYS; |
| } |
| |
| static inline int phy_exit(struct phy *phy) |
| { |
| return -ENOSYS; |
| } |
| |
| static inline int phy_power_on(struct phy *phy) |
| { |
| return -ENOSYS; |
| } |
| |
| static inline int phy_power_off(struct phy *phy) |
| { |
| return -ENOSYS; |
| } |
| |
| static inline int phy_get_bus_width(struct phy *phy) |
| { |
| return -ENOSYS; |
| } |
| |
| static inline void phy_set_bus_width(struct phy *phy, int bus_width) |
| { |
| return; |
| } |
| |
| static inline struct phy *phy_get(struct device *dev, const char *string) |
| { |
| return ERR_PTR(-ENOSYS); |
| } |
| |
| static inline struct phy *phy_optional_get(struct device *dev, |
| const char *string) |
| { |
| return ERR_PTR(-ENOSYS); |
| } |
| |
| static inline struct phy *devm_phy_get(struct device *dev, const char *string) |
| { |
| return ERR_PTR(-ENOSYS); |
| } |
| |
| static inline struct phy *devm_phy_optional_get(struct device *dev, |
| const char *string) |
| { |
| return ERR_PTR(-ENOSYS); |
| } |
| |
| static inline void phy_put(struct phy *phy) |
| { |
| } |
| |
| static inline void devm_phy_put(struct device *dev, struct phy *phy) |
| { |
| } |
| |
| static inline struct phy *of_phy_simple_xlate(struct device *dev, |
| struct of_phandle_args *args) |
| { |
| return ERR_PTR(-ENOSYS); |
| } |
| |
| static inline struct phy *phy_create(struct device *dev, |
| const struct phy_ops *ops, struct phy_init_data *init_data) |
| { |
| return ERR_PTR(-ENOSYS); |
| } |
| |
| static inline struct phy *devm_phy_create(struct device *dev, |
| const struct phy_ops *ops, struct phy_init_data *init_data) |
| { |
| return ERR_PTR(-ENOSYS); |
| } |
| |
| static inline void phy_destroy(struct phy *phy) |
| { |
| } |
| |
| static inline void devm_phy_destroy(struct device *dev, struct phy *phy) |
| { |
| } |
| |
| static inline struct phy_provider *__of_phy_provider_register( |
| struct device *dev, struct module *owner, struct phy * (*of_xlate)( |
| struct device *dev, struct of_phandle_args *args)) |
| { |
| return ERR_PTR(-ENOSYS); |
| } |
| |
| static inline struct phy_provider *__devm_of_phy_provider_register(struct device |
| *dev, struct module *owner, struct phy * (*of_xlate)(struct device *dev, |
| struct of_phandle_args *args)) |
| { |
| return ERR_PTR(-ENOSYS); |
| } |
| |
| static inline void of_phy_provider_unregister(struct phy_provider *phy_provider) |
| { |
| } |
| |
| static inline void devm_of_phy_provider_unregister(struct device *dev, |
| struct phy_provider *phy_provider) |
| { |
| } |
| #endif |
| |
| #endif /* __DRIVERS_PHY_H */ |