Re: [PATCH v6 3/5] phy: core: Add support for phy power down & power up
From: Krishna Chaitanya Chundru <hidden>
Date: 2022-09-14 14:51:00
Also in:
linux-arm-msm, linux-pci, lkml
On 9/9/2022 2:34 PM, Dmitry Baryshkov wrote:
On Fri, 9 Sept 2022 at 11:45, Krishna chaitanya chundru [off-list ref] wrote:quoted
Introducing phy power down/up callbacks for allowing to park the link-state in L1ss without holding any PCIe resources during system suspend. Signed-off-by: Krishna chaitanya chundru <redacted> --- drivers/phy/phy-core.c | 30 ++++++++++++++++++++++++++++++ include/linux/phy/phy.h | 20 ++++++++++++++++++++ 2 files changed, 50 insertions(+)diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c index d93ddf1..1b0b757 100644 --- a/drivers/phy/phy-core.c +++ b/drivers/phy/phy-core.c@@ -441,6 +441,36 @@ int phy_set_speed(struct phy *phy, int speed) } EXPORT_SYMBOL_GPL(phy_set_speed); +int phy_power_down(struct phy *phy) +{ + int ret; + + if (!phy || !phy->ops->power_down) + return 0; + + mutex_lock(&phy->mutex); + ret = phy->ops->power_down(phy); + mutex_unlock(&phy->mutex); + + return ret; +} +EXPORT_SYMBOL_GPL(phy_power_down); + +int phy_power_up(struct phy *phy) +{ + int ret; + + if (!phy || !phy->ops->power_up) + return 0; + + mutex_lock(&phy->mutex); + ret = phy->ops->power_up(phy); + mutex_unlock(&phy->mutex); + + return ret; +}As it can be seen from the phy_power_off(), the PHY can be a shared resource, with the power_count counting the number of users that requested the PHY to be powered up. By introducing suc calls you break directly into this by allowing a single user to power down the PHY, no matter how many other users have requested the PHY to stay alive.
can we use same power_count in this function also here and restrict the single user to power down the PHY same like phy_power_off?.
quoted
+EXPORT_SYMBOL_GPL(phy_power_up); + int phy_reset(struct phy *phy) { int ret;diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h index b141375..3a45f4d 100644 --- a/include/linux/phy/phy.h +++ b/include/linux/phy/phy.h@@ -76,6 +76,8 @@ union phy_configure_opts { * @set_mode: set the mode of the phy * @set_media: set the media type of the phy (optional) * @set_speed: set the speed of the phy (optional) + * @power_down: parking the phy in power down state + * @power_up: pulling back the phy from power down * @reset: resetting the phy * @calibrate: calibrate the phy * @release: ops to be performed while the consumer relinquishes the PHY@@ -89,6 +91,8 @@ struct phy_ops { int (*set_mode)(struct phy *phy, enum phy_mode mode, int submode); int (*set_media)(struct phy *phy, enum phy_media media); int (*set_speed)(struct phy *phy, int speed); + int (*power_down)(struct phy *phy); + int (*power_up)(struct phy *phy); /** * @configure:@@ -226,6 +230,8 @@ 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); +int phy_power_down(struct phy *phy); +int phy_power_up(struct phy *phy); int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, int submode); #define phy_set_mode(phy, mode) \ phy_set_mode_ext(phy, mode, 0)@@ -349,6 +355,20 @@ static inline int phy_power_off(struct phy *phy) return -ENOSYS; } +static inline int phy_power_down(struct phy *phy) +{ + if (!phy) + return 0; + return -ENOSYS; +} + +static inline int phy_power_up(struct phy *phy) +{ + if (!phy) + return 0; + return -ENOSYS; +} + static inline int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, int submode) { --2.7.4
-- linux-phy mailing list linux-phy@lists.infradead.org https://lists.infradead.org/mailman/listinfo/linux-phy