| 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 |
| |