On Fri, Nov 17, 2023 at 06:36:48PM +0100, Johan Hovold wrote: > The driver needs to deregister and free the newly allocated dwc3 core > platform device on ACPI probe errors (e.g. probe deferral) and on driver > unbind but instead it leaked those resources while erroneously dropping > a reference to the parent platform device which is still in use. > > For OF probing the driver takes a reference to the dwc3 core platform > device which has also always been leaked. > > Fix the broken ACPI tear down and make sure to drop the dwc3 core > reference for both OF and ACPI. > > Fixes: 8fd95da2cfb5 ("usb: dwc3: qcom: Release the correct resources in dwc3_qcom_remove()") > Fixes: 2bc02355f8ba ("usb: dwc3: qcom: Add support for booting with ACPI") > Fixes: a4333c3a6ba9 ("usb: dwc3: Add Qualcomm DWC3 glue driver") > Cc: stable@xxxxxxxxxxxxxxx # 4.18 > Cc: Christophe JAILLET <christophe.jaillet@xxxxxxxxxx> > Cc: Lee Jones <lee@xxxxxxxxxx> > Signed-off-by: Johan Hovold <johan+linaro@xxxxxxxxxx> > --- I foobared the review of one of the patches listed as being fixed by this, but for what it is worth I think this makes sense. Hopefully my eye is better this time. Acked-by: Andrew Halaney <ahalaney@xxxxxxxxxx> > drivers/usb/dwc3/dwc3-qcom.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c > index 3de43df6bbe8..00c3021b43ce 100644 > --- a/drivers/usb/dwc3/dwc3-qcom.c > +++ b/drivers/usb/dwc3/dwc3-qcom.c > @@ -758,6 +758,7 @@ static int dwc3_qcom_of_register_core(struct platform_device *pdev) > if (!qcom->dwc3) { > ret = -ENODEV; > dev_err(dev, "failed to get dwc3 platform device\n"); > + of_platform_depopulate(dev); > } > > node_put: > @@ -899,7 +900,7 @@ static int dwc3_qcom_probe(struct platform_device *pdev) > > if (ret) { > dev_err(dev, "failed to register DWC3 Core, err=%d\n", ret); > - goto depopulate; > + goto clk_disable; > } > > ret = dwc3_qcom_interconnect_init(qcom); > @@ -934,7 +935,8 @@ static int dwc3_qcom_probe(struct platform_device *pdev) > if (np) > of_platform_depopulate(&pdev->dev); > else > - platform_device_put(pdev); > + platform_device_del(qcom->dwc3); > + platform_device_put(qcom->dwc3); > clk_disable: > for (i = qcom->num_clocks - 1; i >= 0; i--) { > clk_disable_unprepare(qcom->clks[i]); > @@ -957,7 +959,8 @@ static void dwc3_qcom_remove(struct platform_device *pdev) > if (np) > of_platform_depopulate(&pdev->dev); > else > - platform_device_put(pdev); > + platform_device_del(qcom->dwc3); > + platform_device_put(qcom->dwc3); > > for (i = qcom->num_clocks - 1; i >= 0; i--) { > clk_disable_unprepare(qcom->clks[i]); > -- > 2.41.0 > >