From 4224e942fdbd73c47d59f4bee4bdbecd91a43822 Mon Sep 17 00:00:00 2001 From: William Wu Date: Tue, 21 Feb 2017 19:43:02 +0800 Subject: [PATCH] phy: add cp_test callback There are several SoCs (e.g. rk3228h and rk3328) that integrated with Inno USB3 PHY, they can't toggle CP test pattern when do USB3 compliance test by default. This patch add a cp_test callback for USB3 controller to enable the special USB3 PHY to toggle the CP test pattern. Change-Id: I2d603202723a4c044d4231af10cfe2c60ec0e988 Signed-off-by: William Wu --- drivers/phy/phy-core.c | 15 +++++++++++++++ include/linux/phy/phy.h | 10 ++++++++++ 2 files changed, 25 insertions(+) diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c index c302fee60fe8..e64a0be26f29 100644 --- a/drivers/phy/phy-core.c +++ b/drivers/phy/phy-core.c @@ -372,6 +372,21 @@ int phy_reset(struct phy *phy) } EXPORT_SYMBOL_GPL(phy_reset); +int phy_cp_test(struct phy *phy) +{ + int ret; + + if (!phy || !phy->ops->cp_test) + return 0; + + mutex_lock(&phy->mutex); + ret = phy->ops->cp_test(phy); + mutex_unlock(&phy->mutex); + + return ret; +} +EXPORT_SYMBOL_GPL(phy_cp_test); + /** * _of_phy_get() - lookup and obtain a reference to a phy by phandle * @np: device_node for which to get the phy diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h index 392bdd67a604..a3965c3cc653 100644 --- a/include/linux/phy/phy.h +++ b/include/linux/phy/phy.h @@ -37,6 +37,7 @@ enum phy_mode { * @power_off: powering off the phy * @set_mode: set the mode of the phy * @reset: resetting the phy + * @cp_test: prepare for the phy compliance test * @owner: the module owner containing the ops */ struct phy_ops { @@ -46,6 +47,7 @@ struct phy_ops { int (*power_off)(struct phy *phy); int (*set_mode)(struct phy *phy, enum phy_mode mode); int (*reset)(struct phy *phy); + int (*cp_test)(struct phy *phy); struct module *owner; }; @@ -132,6 +134,7 @@ int phy_power_on(struct phy *phy); int phy_power_off(struct phy *phy); int phy_set_mode(struct phy *phy, enum phy_mode mode); int phy_reset(struct phy *phy); +int phy_cp_test(struct phy *phy); static inline int phy_get_bus_width(struct phy *phy) { return phy->attrs.bus_width; @@ -251,6 +254,13 @@ static inline int phy_reset(struct phy *phy) return -ENOSYS; } +static inline int phy_cp_test(struct phy *phy) +{ + if (!phy) + return 0; + return -ENOSYS; +} + static inline int phy_get_bus_width(struct phy *phy) { return -ENOSYS; -- 2.34.1