phy: add cp_test callback
authorWilliam Wu <wulf@rock-chips.com>
Tue, 21 Feb 2017 11:43:02 +0000 (19:43 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 22 Feb 2017 06:18:11 +0000 (14:18 +0800)
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 <wulf@rock-chips.com>
drivers/phy/phy-core.c
include/linux/phy/phy.h

index c302fee60fe8419d70584e6a0bfc632a6965a0e5..e64a0be26f2984e179081d7567503769210e90a0 100644 (file)
@@ -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
index 392bdd67a604ae6ef0c90878b755ff47a30f9af0..a3965c3cc6535a1225c2ca8d4a6ad82f3c62c028 100644 (file)
@@ -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;