From 955bb70bf167976ee9e57ccd54a613ae3a038948 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 35fd38c5a4a1..c309f645cded 100644 --- a/drivers/phy/phy-core.c +++ b/drivers/phy/phy-core.c @@ -392,6 +392,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); + int phy_calibrate(struct phy *phy) { int ret; diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h index 5f7ed6d86e43..e549ecc1b74b 100644 --- a/include/linux/phy/phy.h +++ b/include/linux/phy/phy.h @@ -56,6 +56,7 @@ enum phy_mode { * @set_mode: set the mode of the phy * @reset: resetting the phy * @calibrate: calibrate the phy + * @cp_test: prepare for the phy compliance test * @owner: the module owner containing the ops */ struct phy_ops { @@ -66,6 +67,7 @@ struct phy_ops { int (*set_mode)(struct phy *phy, enum phy_mode mode); int (*reset)(struct phy *phy); int (*calibrate)(struct phy *phy); + int (*cp_test)(struct phy *phy); struct module *owner; }; @@ -174,6 +176,7 @@ static inline enum phy_mode phy_get_mode(struct phy *phy) } int phy_reset(struct phy *phy); int phy_calibrate(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; @@ -300,6 +303,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_calibrate(struct phy *phy) { if (!phy)