Browse Source

Merge tag 'phy-set-mode-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/kishon/linux-phy into next

Add new set_mode phy ops

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Kishon Vijay Abraham I 9 years ago
parent
commit
6f7d2346cb
3 changed files with 34 additions and 2 deletions
  1. 15 0
      drivers/phy/phy-core.c
  2. 2 2
      drivers/phy/phy-xgene.c
  3. 17 0
      include/linux/phy/phy.h

+ 15 - 0
drivers/phy/phy-core.c

@@ -342,6 +342,21 @@ int phy_power_off(struct phy *phy)
 }
 }
 EXPORT_SYMBOL_GPL(phy_power_off);
 EXPORT_SYMBOL_GPL(phy_power_off);
 
 
+int phy_set_mode(struct phy *phy, enum phy_mode mode)
+{
+	int ret;
+
+	if (!phy || !phy->ops->set_mode)
+		return 0;
+
+	mutex_lock(&phy->mutex);
+	ret = phy->ops->set_mode(phy, mode);
+	mutex_unlock(&phy->mutex);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(phy_set_mode);
+
 /**
 /**
  * _of_phy_get() - lookup and obtain a reference to a phy by phandle
  * _of_phy_get() - lookup and obtain a reference to a phy by phandle
  * @np: device_node for which to get the phy
  * @np: device_node for which to get the phy

+ 2 - 2
drivers/phy/phy-xgene.c

@@ -518,7 +518,7 @@ enum clk_type_t {
 	CLK_INT_SING = 2,	/* Internal single ended */
 	CLK_INT_SING = 2,	/* Internal single ended */
 };
 };
 
 
-enum phy_mode {
+enum xgene_phy_mode {
 	MODE_SATA	= 0,	/* List them for simple reference */
 	MODE_SATA	= 0,	/* List them for simple reference */
 	MODE_SGMII	= 1,
 	MODE_SGMII	= 1,
 	MODE_PCIE	= 2,
 	MODE_PCIE	= 2,
@@ -542,7 +542,7 @@ struct xgene_sata_override_param {
 struct xgene_phy_ctx {
 struct xgene_phy_ctx {
 	struct device *dev;
 	struct device *dev;
 	struct phy *phy;
 	struct phy *phy;
-	enum phy_mode mode;		/* Mode of operation */
+	enum xgene_phy_mode mode;		/* Mode of operation */
 	enum clk_type_t clk_type;	/* Input clock selection */
 	enum clk_type_t clk_type;	/* Input clock selection */
 	void __iomem *sds_base;		/* PHY CSR base addr */
 	void __iomem *sds_base;		/* PHY CSR base addr */
 	struct clk *clk;		/* Optional clock */
 	struct clk *clk;		/* Optional clock */

+ 17 - 0
include/linux/phy/phy.h

@@ -22,12 +22,20 @@
 
 
 struct phy;
 struct phy;
 
 
+enum phy_mode {
+	PHY_MODE_INVALID,
+	PHY_MODE_USB_HOST,
+	PHY_MODE_USB_DEVICE,
+	PHY_MODE_USB_OTG,
+};
+
 /**
 /**
  * struct phy_ops - set of function pointers for performing phy operations
  * struct phy_ops - set of function pointers for performing phy operations
  * @init: operation to be performed for initializing phy
  * @init: operation to be performed for initializing phy
  * @exit: operation to be performed while exiting
  * @exit: operation to be performed while exiting
  * @power_on: powering on the phy
  * @power_on: powering on the phy
  * @power_off: powering off the phy
  * @power_off: powering off the phy
+ * @set_mode: set the mode of the phy
  * @owner: the module owner containing the ops
  * @owner: the module owner containing the ops
  */
  */
 struct phy_ops {
 struct phy_ops {
@@ -35,6 +43,7 @@ struct phy_ops {
 	int	(*exit)(struct phy *phy);
 	int	(*exit)(struct phy *phy);
 	int	(*power_on)(struct phy *phy);
 	int	(*power_on)(struct phy *phy);
 	int	(*power_off)(struct phy *phy);
 	int	(*power_off)(struct phy *phy);
+	int	(*set_mode)(struct phy *phy, enum phy_mode mode);
 	struct module *owner;
 	struct module *owner;
 };
 };
 
 
@@ -126,6 +135,7 @@ int phy_init(struct phy *phy);
 int phy_exit(struct phy *phy);
 int phy_exit(struct phy *phy);
 int phy_power_on(struct phy *phy);
 int phy_power_on(struct phy *phy);
 int phy_power_off(struct phy *phy);
 int phy_power_off(struct phy *phy);
+int phy_set_mode(struct phy *phy, enum phy_mode mode);
 static inline int phy_get_bus_width(struct phy *phy)
 static inline int phy_get_bus_width(struct phy *phy)
 {
 {
 	return phy->attrs.bus_width;
 	return phy->attrs.bus_width;
@@ -233,6 +243,13 @@ static inline int phy_power_off(struct phy *phy)
 	return -ENOSYS;
 	return -ENOSYS;
 }
 }
 
 
+static inline int phy_set_mode(struct phy *phy, enum phy_mode mode)
+{
+	if (!phy)
+		return 0;
+	return -ENOSYS;
+}
+
 static inline int phy_get_bus_width(struct phy *phy)
 static inline int phy_get_bus_width(struct phy *phy)
 {
 {
 	return -ENOSYS;
 	return -ENOSYS;