Mian Yousaf Kaukab cdae8b
From fb227ba57fad181864500ebf6bf3ab327023e1ae Mon Sep 17 00:00:00 2001
Mian Yousaf Kaukab cdae8b
From: Frank Wang <frank.wang@rock-chips.com>
Mian Yousaf Kaukab cdae8b
Date: Fri, 11 Aug 2017 16:07:49 +0800
Mian Yousaf Kaukab cdae8b
Subject: [PATCH 38/86] phy: rockchip-inno-usb2: add support for otg-mux
Mian Yousaf Kaukab cdae8b
 interrupt
Mian Yousaf Kaukab cdae8b
Mian Yousaf Kaukab cdae8b
Git-commit: 0983e2abc8334a0fec1e93a47e712708acaf5ad2
Mian Yousaf Kaukab cdae8b
Patch-mainline: v4.14-rc1
Mian Yousaf Kaukab cdae8b
References: fate#323912
Mian Yousaf Kaukab cdae8b
Mian Yousaf Kaukab cdae8b
The otg-id/otg-bvalid/linestate interrupts are multiplexed together
Mian Yousaf Kaukab cdae8b
in otg-port on some Rockchip SoC (e.g RV1108), this patch add support
Mian Yousaf Kaukab cdae8b
for it.
Mian Yousaf Kaukab cdae8b
Mian Yousaf Kaukab cdae8b
Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
Mian Yousaf Kaukab cdae8b
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Mian Yousaf Kaukab cdae8b
Signed-off-by: Mian Yousaf Kaukab <yousaf.kaukab@suse.com>
Mian Yousaf Kaukab cdae8b
---
Mian Yousaf Kaukab cdae8b
 drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 63 +++++++++++++++++++++------
Mian Yousaf Kaukab cdae8b
 1 file changed, 50 insertions(+), 13 deletions(-)
Mian Yousaf Kaukab cdae8b
Mian Yousaf Kaukab cdae8b
diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
Mian Yousaf Kaukab cdae8b
index 6796aeea6410..5ec671422118 100644
Mian Yousaf Kaukab cdae8b
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
Mian Yousaf Kaukab cdae8b
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
Mian Yousaf Kaukab cdae8b
@@ -172,6 +172,8 @@ struct rockchip_usb2phy_cfg {
Mian Yousaf Kaukab cdae8b
  * @vbus_attached: otg device vbus status.
Mian Yousaf Kaukab cdae8b
  * @bvalid_irq: IRQ number assigned for vbus valid rise detection.
Mian Yousaf Kaukab cdae8b
  * @ls_irq: IRQ number assigned for linestate detection.
Mian Yousaf Kaukab cdae8b
+ * @otg_mux_irq: IRQ number which multiplex otg-id/otg-bvalid/linestate
Mian Yousaf Kaukab cdae8b
+ *		 irqs to one irq in otg-port.
Mian Yousaf Kaukab cdae8b
  * @mutex: for register updating in sm_work.
Mian Yousaf Kaukab cdae8b
  * @chg_work: charge detect work.
Mian Yousaf Kaukab cdae8b
  * @otg_sm_work: OTG state machine work.
Mian Yousaf Kaukab cdae8b
@@ -189,6 +191,7 @@ struct rockchip_usb2phy_port {
Mian Yousaf Kaukab cdae8b
 	bool		vbus_attached;
Mian Yousaf Kaukab cdae8b
 	int		bvalid_irq;
Mian Yousaf Kaukab cdae8b
 	int		ls_irq;
Mian Yousaf Kaukab cdae8b
+	int		otg_mux_irq;
Mian Yousaf Kaukab cdae8b
 	struct mutex	mutex;
Mian Yousaf Kaukab cdae8b
 	struct		delayed_work chg_work;
Mian Yousaf Kaukab cdae8b
 	struct		delayed_work otg_sm_work;
Mian Yousaf Kaukab cdae8b
@@ -934,6 +937,17 @@ static irqreturn_t rockchip_usb2phy_bvalid_irq(int irq, void *data)
Mian Yousaf Kaukab cdae8b
 	return IRQ_HANDLED;
Mian Yousaf Kaukab cdae8b
 }
Mian Yousaf Kaukab cdae8b
 
Mian Yousaf Kaukab cdae8b
+static irqreturn_t rockchip_usb2phy_otg_mux_irq(int irq, void *data)
Mian Yousaf Kaukab cdae8b
+{
Mian Yousaf Kaukab cdae8b
+	struct rockchip_usb2phy_port *rport = data;
Mian Yousaf Kaukab cdae8b
+	struct rockchip_usb2phy *rphy = dev_get_drvdata(rport->phy->dev.parent);
Mian Yousaf Kaukab cdae8b
+
Mian Yousaf Kaukab cdae8b
+	if (property_enabled(rphy->grf, &rport->port_cfg->bvalid_det_st))
Mian Yousaf Kaukab cdae8b
+		return rockchip_usb2phy_bvalid_irq(irq, data);
Mian Yousaf Kaukab cdae8b
+	else
Mian Yousaf Kaukab cdae8b
+		return IRQ_NONE;
Mian Yousaf Kaukab cdae8b
+}
Mian Yousaf Kaukab cdae8b
+
Mian Yousaf Kaukab cdae8b
 static int rockchip_usb2phy_host_port_init(struct rockchip_usb2phy *rphy,
Mian Yousaf Kaukab cdae8b
 					   struct rockchip_usb2phy_port *rport,
Mian Yousaf Kaukab cdae8b
 					   struct device_node *child_np)
Mian Yousaf Kaukab cdae8b
@@ -1010,20 +1024,43 @@ static int rockchip_usb2phy_otg_port_init(struct rockchip_usb2phy *rphy,
Mian Yousaf Kaukab cdae8b
 	rport->utmi_avalid =
Mian Yousaf Kaukab cdae8b
 		of_property_read_bool(child_np, "rockchip,utmi-avalid");
Mian Yousaf Kaukab cdae8b
 
Mian Yousaf Kaukab cdae8b
-	rport->bvalid_irq = of_irq_get_byname(child_np, "otg-bvalid");
Mian Yousaf Kaukab cdae8b
-	if (rport->bvalid_irq < 0) {
Mian Yousaf Kaukab cdae8b
-		dev_err(rphy->dev, "no vbus valid irq provided\n");
Mian Yousaf Kaukab cdae8b
-		ret = rport->bvalid_irq;
Mian Yousaf Kaukab cdae8b
-		goto out;
Mian Yousaf Kaukab cdae8b
-	}
Mian Yousaf Kaukab cdae8b
+	/*
Mian Yousaf Kaukab cdae8b
+	 * Some SoCs use one interrupt with otg-id/otg-bvalid/linestate
Mian Yousaf Kaukab cdae8b
+	 * interrupts muxed together, so probe the otg-mux interrupt first,
Mian Yousaf Kaukab cdae8b
+	 * if not found, then look for the regular interrupts one by one.
Mian Yousaf Kaukab cdae8b
+	 */
Mian Yousaf Kaukab cdae8b
+	rport->otg_mux_irq = of_irq_get_byname(child_np, "otg-mux");
Mian Yousaf Kaukab cdae8b
+	if (rport->otg_mux_irq > 0) {
Mian Yousaf Kaukab cdae8b
+		ret = devm_request_threaded_irq(rphy->dev, rport->otg_mux_irq,
Mian Yousaf Kaukab cdae8b
+						NULL,
Mian Yousaf Kaukab cdae8b
+						rockchip_usb2phy_otg_mux_irq,
Mian Yousaf Kaukab cdae8b
+						IRQF_ONESHOT,
Mian Yousaf Kaukab cdae8b
+						"rockchip_usb2phy_otg",
Mian Yousaf Kaukab cdae8b
+						rport);
Mian Yousaf Kaukab cdae8b
+		if (ret) {
Mian Yousaf Kaukab cdae8b
+			dev_err(rphy->dev,
Mian Yousaf Kaukab cdae8b
+				"failed to request otg-mux irq handle\n");
Mian Yousaf Kaukab cdae8b
+			goto out;
Mian Yousaf Kaukab cdae8b
+		}
Mian Yousaf Kaukab cdae8b
+	} else {
Mian Yousaf Kaukab cdae8b
+		rport->bvalid_irq = of_irq_get_byname(child_np, "otg-bvalid");
Mian Yousaf Kaukab cdae8b
+		if (rport->bvalid_irq < 0) {
Mian Yousaf Kaukab cdae8b
+			dev_err(rphy->dev, "no vbus valid irq provided\n");
Mian Yousaf Kaukab cdae8b
+			ret = rport->bvalid_irq;
Mian Yousaf Kaukab cdae8b
+			goto out;
Mian Yousaf Kaukab cdae8b
+		}
Mian Yousaf Kaukab cdae8b
 
Mian Yousaf Kaukab cdae8b
-	ret = devm_request_threaded_irq(rphy->dev, rport->bvalid_irq, NULL,
Mian Yousaf Kaukab cdae8b
-					rockchip_usb2phy_bvalid_irq,
Mian Yousaf Kaukab cdae8b
-					IRQF_ONESHOT,
Mian Yousaf Kaukab cdae8b
-					"rockchip_usb2phy_bvalid", rport);
Mian Yousaf Kaukab cdae8b
-	if (ret) {
Mian Yousaf Kaukab cdae8b
-		dev_err(rphy->dev, "failed to request otg-bvalid irq handle\n");
Mian Yousaf Kaukab cdae8b
-		goto out;
Mian Yousaf Kaukab cdae8b
+		ret = devm_request_threaded_irq(rphy->dev, rport->bvalid_irq,
Mian Yousaf Kaukab cdae8b
+						NULL,
Mian Yousaf Kaukab cdae8b
+						rockchip_usb2phy_bvalid_irq,
Mian Yousaf Kaukab cdae8b
+						IRQF_ONESHOT,
Mian Yousaf Kaukab cdae8b
+						"rockchip_usb2phy_bvalid",
Mian Yousaf Kaukab cdae8b
+						rport);
Mian Yousaf Kaukab cdae8b
+		if (ret) {
Mian Yousaf Kaukab cdae8b
+			dev_err(rphy->dev,
Mian Yousaf Kaukab cdae8b
+				"failed to request otg-bvalid irq handle\n");
Mian Yousaf Kaukab cdae8b
+			goto out;
Mian Yousaf Kaukab cdae8b
+		}
Mian Yousaf Kaukab cdae8b
 	}
Mian Yousaf Kaukab cdae8b
 
Mian Yousaf Kaukab cdae8b
 	if (!IS_ERR(rphy->edev)) {
Mian Yousaf Kaukab cdae8b
-- 
Mian Yousaf Kaukab cdae8b
2.11.0
Mian Yousaf Kaukab cdae8b