Commit f181dbb4 authored by Yoshihiro Shimoda's avatar Yoshihiro Shimoda Committed by Greg Kroah-Hartman

usb: renesas_usbhs: Add reset_control

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: default avatarYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c29e2404
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/reset.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include "common.h" #include "common.h"
...@@ -574,6 +575,10 @@ static int usbhs_probe(struct platform_device *pdev) ...@@ -574,6 +575,10 @@ static int usbhs_probe(struct platform_device *pdev)
return PTR_ERR(priv->edev); 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 * care platform info
*/ */
...@@ -658,6 +663,10 @@ static int usbhs_probe(struct platform_device *pdev) ...@@ -658,6 +663,10 @@ static int usbhs_probe(struct platform_device *pdev)
/* dev_set_drvdata should be called after usbhs_mod_init */ /* dev_set_drvdata should be called after usbhs_mod_init */
platform_set_drvdata(pdev, priv); platform_set_drvdata(pdev, priv);
ret = reset_control_deassert(priv->rsts);
if (ret)
goto probe_fail_rst;
/* /*
* deviece reset here because * deviece reset here because
* USB device might be used in boot loader. * USB device might be used in boot loader.
...@@ -711,6 +720,8 @@ static int usbhs_probe(struct platform_device *pdev) ...@@ -711,6 +720,8 @@ static int usbhs_probe(struct platform_device *pdev)
return ret; return ret;
probe_end_mod_exit: probe_end_mod_exit:
reset_control_assert(priv->rsts);
probe_fail_rst:
usbhs_mod_remove(priv); usbhs_mod_remove(priv);
probe_end_fifo_exit: probe_end_fifo_exit:
usbhs_fifo_remove(priv); usbhs_fifo_remove(priv);
...@@ -739,6 +750,7 @@ static int usbhs_remove(struct platform_device *pdev) ...@@ -739,6 +750,7 @@ static int usbhs_remove(struct platform_device *pdev)
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
usbhs_platform_call(priv, hardware_exit, pdev); usbhs_platform_call(priv, hardware_exit, pdev);
reset_control_assert(priv->rsts);
usbhs_mod_remove(priv); usbhs_mod_remove(priv);
usbhs_fifo_remove(priv); usbhs_fifo_remove(priv);
usbhs_pipe_remove(priv); usbhs_pipe_remove(priv);
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/extcon.h> #include <linux/extcon.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/reset.h>
#include <linux/usb/renesas_usbhs.h> #include <linux/usb/renesas_usbhs.h>
struct usbhs_priv; struct usbhs_priv;
...@@ -277,6 +278,7 @@ struct usbhs_priv { ...@@ -277,6 +278,7 @@ struct usbhs_priv {
struct usbhs_fifo_info fifo_info; struct usbhs_fifo_info fifo_info;
struct phy *phy; struct phy *phy;
struct reset_control *rsts;
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment