blob: 64b3884d016e0492ad3309401787505ae16cf083 [file] [log] [blame]
From b5f1bef8e829bebe2eecd8e73870e9883ce4878b Mon Sep 17 00:00:00 2001
From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Date: Wed, 13 Dec 2017 15:47:00 +0900
Subject: [PATCH 0513/1795] usb: renesas_usbhs: add extcon notifier to set mode
for non-otg channel
This patch adds extcon notifier callback to set the mode of
host/peripheral by using extcon state (e.g phy-rcar-gen3-usb2) for
non-otg channel (e.g. R-Car D3).
[Fengguang Wu: fixed sparse warning]
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
usb: renesas_usbhs: usbhs_rcar3_notifier() can be static
Fixes: 3a7cce26122e ("usb: renesas_usbhs: add extcon notifier to set mode for non-otg channel")
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
(cherry picked from commit 8ada211d0383b72878582bd312b984a9eae62b30)
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
drivers/usb/renesas_usbhs/common.c | 9 +++++++++
drivers/usb/renesas_usbhs/common.h | 1 +
drivers/usb/renesas_usbhs/rcar3.c | 11 +++++++++++
3 files changed, 21 insertions(+)
diff --git a/drivers/usb/renesas_usbhs/common.c b/drivers/usb/renesas_usbhs/common.c
index 56079bb6759a..c5289b3ecf8d 100644
--- a/drivers/usb/renesas_usbhs/common.c
+++ b/drivers/usb/renesas_usbhs/common.c
@@ -581,6 +581,15 @@ static int usbhs_probe(struct platform_device *pdev)
break;
case USBHS_TYPE_RCAR_GEN3_WITH_PLL:
priv->pfunc = usbhs_rcar3_with_pll_ops;
+ if (!IS_ERR_OR_NULL(priv->edev)) {
+ priv->nb.notifier_call = priv->pfunc.notifier;
+ ret = devm_extcon_register_notifier(&pdev->dev,
+ priv->edev,
+ EXTCON_USB_HOST,
+ &priv->nb);
+ if (ret < 0)
+ dev_err(&pdev->dev, "no notifier registered\n");
+ }
break;
default:
if (!info->platform_callback.get_id) {
diff --git a/drivers/usb/renesas_usbhs/common.h b/drivers/usb/renesas_usbhs/common.h
index 64797784a6df..c9747f064601 100644
--- a/drivers/usb/renesas_usbhs/common.h
+++ b/drivers/usb/renesas_usbhs/common.h
@@ -249,6 +249,7 @@ struct usbhs_priv {
struct platform_device *pdev;
struct extcon_dev *edev;
+ struct notifier_block nb;
spinlock_t lock;
diff --git a/drivers/usb/renesas_usbhs/rcar3.c b/drivers/usb/renesas_usbhs/rcar3.c
index b9a8453a5e68..d0ea4ff89622 100644
--- a/drivers/usb/renesas_usbhs/rcar3.c
+++ b/drivers/usb/renesas_usbhs/rcar3.c
@@ -112,6 +112,16 @@ static int usbhs_rcar3_get_id(struct platform_device *pdev)
return USBHS_GADGET;
}
+static int usbhs_rcar3_notifier(struct notifier_block *nb, unsigned long event,
+ void *data)
+{
+ struct usbhs_priv *priv = container_of(nb, struct usbhs_priv, nb);
+
+ usbhs_rcar3_set_usbsel(priv, !!event);
+
+ return NOTIFY_DONE;
+}
+
const struct renesas_usbhs_platform_callback usbhs_rcar3_ops = {
.power_ctrl = usbhs_rcar3_power_ctrl,
.get_id = usbhs_rcar3_get_id,
@@ -120,4 +130,5 @@ const struct renesas_usbhs_platform_callback usbhs_rcar3_ops = {
const struct renesas_usbhs_platform_callback usbhs_rcar3_with_pll_ops = {
.power_ctrl = usbhs_rcar3_power_and_pll_ctrl,
.get_id = usbhs_rcar3_get_id,
+ .notifier = usbhs_rcar3_notifier,
};
--
2.19.0