Messages in this thread | | | Date | Wed, 13 Jan 2021 11:14:35 +0530 | From | sanm@codeauro ... | Subject | Re: [PATCH] usb: dwc3: qcom: Add shutdown callback for dwc3 |
| |
On 2020-11-12 12:00, Sandeep Maheswaram wrote: > 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@codeaurora.org> > --- > drivers/usb/dwc3/dwc3-qcom.c | 26 ++++++++++++++++++++------ > 1 file changed, 20 insertions(+), 6 deletions(-) > > 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); > +} > + > +static int dwc3_qcom_remove(struct platform_device *pdev) > +{ > + struct dwc3_qcom *qcom = platform_get_drvdata(pdev); > + > + __dwc3_qcom_teardown(qcom); > > return 0; > } > > +static void dwc3_qcom_shutdown(struct platform_device *pdev) > +{ > + struct dwc3_qcom *qcom = platform_get_drvdata(pdev); > + > + __dwc3_qcom_teardown(qcom); > + > +} > + > static int __maybe_unused dwc3_qcom_pm_suspend(struct device *dev) > { > struct dwc3_qcom *qcom = dev_get_drvdata(dev); > @@ -887,6 +900,7 @@ MODULE_DEVICE_TABLE(acpi, dwc3_qcom_acpi_match); > static struct platform_driver dwc3_qcom_driver = { > .probe = dwc3_qcom_probe, > .remove = dwc3_qcom_remove, > + .shutdown = dwc3_qcom_shutdown, > .driver = { > .name = "dwc3-qcom", > .pm = &dwc3_qcom_dev_pm_ops,
Hi Felipe,
Can you please review this patch.
Regards Sandeep
| |