OSDN Git Service

usb: renesas_usbhs: Add reset_control
authorYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Tue, 11 Sep 2018 08:47:03 +0000 (17:47 +0900)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Tue, 2 Oct 2018 07:38:25 +0000 (10:38 +0300)
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: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/renesas_usbhs/common.c
drivers/usb/renesas_usbhs/common.h

index dc04111..03489d8 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
         */
@@ -649,6 +654,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.
@@ -702,6 +711,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);
@@ -730,6 +741,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 473e87e..f997a4d 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;
@@ -276,6 +277,7 @@ struct usbhs_priv {
        struct usbhs_fifo_info fifo_info;
 
        struct phy *phy;
+       struct reset_control *rsts;
 };
 
 /*