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: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
c29e240484
commit
f181dbb482
@@ -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)
|
|||||||
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)
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
|
|
||||||
#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 {
|
|||||||
struct usbhs_fifo_info fifo_info;
|
struct usbhs_fifo_info fifo_info;
|
||||||
|
|
||||||
struct phy *phy;
|
struct phy *phy;
|
||||||
|
struct reset_control *rsts;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user