usb: renesas_usbhs: Add reset_control
authorYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Tue, 11 Sep 2018 08:47:03 +0000 (17:47 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 20 Sep 2018 11:16:14 +0000 (13:16 +0200)
R-Car Gen3 needs to deassert resets of both host and peripheral.
Since [eo]hci-platform is possible to assert the reset(s) when
the probing failed, renesas_usbhs driver doesn't work correctly
regardless of finished probing. To fix this issue, this patch adds
reset_control on this renesas_usbhs driver.

Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/renesas_usbhs/common.c
drivers/usb/renesas_usbhs/common.h

index 4310df46639d25d1d4b8b96628aca3bc890869cf..1d355d59b5e48bfb1c4d10955d927ca1b3a59a8e 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/of_device.h>
 #include <linux/of_gpio.h>
 #include <linux/pm_runtime.h>
+#include <linux/reset.h>
 #include <linux/slab.h>
 #include <linux/sysfs.h>
 #include "common.h"
@@ -574,6 +575,10 @@ static int usbhs_probe(struct platform_device *pdev)
                        return PTR_ERR(priv->edev);
        }
 
+       priv->rsts = devm_reset_control_array_get_optional_shared(&pdev->dev);
+       if (IS_ERR(priv->rsts))
+               return PTR_ERR(priv->rsts);
+
        /*
         * care platform info
         */
@@ -658,6 +663,10 @@ static int usbhs_probe(struct platform_device *pdev)
        /* dev_set_drvdata should be called after usbhs_mod_init */
        platform_set_drvdata(pdev, priv);
 
+       ret = reset_control_deassert(priv->rsts);
+       if (ret)
+               goto probe_fail_rst;
+
        /*
         * deviece reset here because
         * USB device might be used in boot loader.
@@ -711,6 +720,8 @@ static int usbhs_probe(struct platform_device *pdev)
        return ret;
 
 probe_end_mod_exit:
+       reset_control_assert(priv->rsts);
+probe_fail_rst:
        usbhs_mod_remove(priv);
 probe_end_fifo_exit:
        usbhs_fifo_remove(priv);
@@ -739,6 +750,7 @@ static int usbhs_remove(struct platform_device *pdev)
        pm_runtime_disable(&pdev->dev);
 
        usbhs_platform_call(priv, hardware_exit, pdev);
+       reset_control_assert(priv->rsts);
        usbhs_mod_remove(priv);
        usbhs_fifo_remove(priv);
        usbhs_pipe_remove(priv);
index 6137f7942c05cabc1423771c21a0855aaec3be70..bce7d35fed80783144c286f0d9eceee6cb7336a1 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <linux/extcon.h>
 #include <linux/platform_device.h>
+#include <linux/reset.h>
 #include <linux/usb/renesas_usbhs.h>
 
 struct usbhs_priv;
@@ -277,6 +278,7 @@ struct usbhs_priv {
        struct usbhs_fifo_info fifo_info;
 
        struct phy *phy;
+       struct reset_control *rsts;
 };
 
 /*