Re: [PATCH] usb: dwc3: qcom: Add shutdown callback for dwc3

From: sanm
Date: Mon Jan 18 2021 - 01:33:01 EST


On 2021-01-13 14:10, Felipe Balbi wrote:
Hi,

Sandeep Maheswaram <sanm@xxxxxxxxxxxxxx> writes:
This patch adds a shutdown callback to USB DWC QCOM driver to ensure that
it is properly shutdown in reboot/shutdown path. This is required
where SMMU address translation is enabled like on SC7180
SoC and few others. If the hardware is still accessing memory after
SMMU translation is disabled as part of SMMU shutdown callback in
system reboot or shutdown path, then IOVAs(I/O virtual address)
which it was using will go on the bus as the physical addresses which
might result in unknown crashes (NoC/interconnect errors).

Signed-off-by: Sandeep Maheswaram <sanm@xxxxxxxxxxxxxx>

sounds like this is fixing a bug. Do you have a Fixes tag for it? Should
this go to stable?

Didn't encounter any bug till now but made this change to prevent issue.

diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c
index c703d55..a930e06 100644
--- a/drivers/usb/dwc3/dwc3-qcom.c
+++ b/drivers/usb/dwc3/dwc3-qcom.c
@@ -790,13 +790,11 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
return ret;
}

-static int dwc3_qcom_remove(struct platform_device *pdev)
+static void __dwc3_qcom_teardown(struct dwc3_qcom *qcom)
{
- struct dwc3_qcom *qcom = platform_get_drvdata(pdev);
- struct device *dev = &pdev->dev;
int i;

- of_platform_depopulate(dev);
+ of_platform_depopulate(qcom->dev);

for (i = qcom->num_clocks - 1; i >= 0; i--) {
clk_disable_unprepare(qcom->clks[i]);
@@ -807,12 +805,27 @@ static int dwc3_qcom_remove(struct platform_device *pdev)
dwc3_qcom_interconnect_exit(qcom);
reset_control_assert(qcom->resets);

- pm_runtime_allow(dev);
- pm_runtime_disable(dev);
+ pm_runtime_allow(qcom->dev);
+ pm_runtime_disable(qcom->dev);
+}

you can make the changes smaller by adding:

struct device *dev = qcom->dev;

The nothing else needs to change in this function ;-)

I will do this in next version