Skip to content

Commit 782be79

Browse files
jhovoldgregkh
authored andcommitted
usb: gadget: lpc32xx_udc: fix clock imbalance in error path
A recent change fixing a device reference leak introduced a clock imbalance by reusing an error path so that the clock may be disabled before having been enabled. Note that the clock framework allows for passing in NULL clocks so there is no risk for a NULL pointer dereference. Also drop the bogus I2C client NULL check added by the offending commit as the pointer has already been verified to be non-NULL. Fixes: c841179 ("USB: lpc32xx_udc: Fix error handling in probe") Cc: stable@vger.kernel.org Cc: Ma Ke <make24@iscas.ac.cn> Signed-off-by: Johan Hovold <johan@kernel.org> Reviewed-by: Vladimir Zapolskiy <vz@mleia.com> Link: https://patch.msgid.link/20251218153519.19453-2-johan@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 5106dba commit 782be79

1 file changed

Lines changed: 10 additions & 10 deletions

File tree

drivers/usb/gadget/udc/lpc32xx_udc.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3020,7 +3020,7 @@ static int lpc32xx_udc_probe(struct platform_device *pdev)
30203020
pdev->dev.dma_mask = &lpc32xx_usbd_dmamask;
30213021
retval = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
30223022
if (retval)
3023-
goto i2c_fail;
3023+
goto err_put_client;
30243024

30253025
udc->board = &lpc32xx_usbddata;
30263026

@@ -3040,30 +3040,30 @@ static int lpc32xx_udc_probe(struct platform_device *pdev)
30403040
udc->udp_irq[i] = platform_get_irq(pdev, i);
30413041
if (udc->udp_irq[i] < 0) {
30423042
retval = udc->udp_irq[i];
3043-
goto i2c_fail;
3043+
goto err_put_client;
30443044
}
30453045
}
30463046

30473047
udc->udp_baseaddr = devm_platform_ioremap_resource(pdev, 0);
30483048
if (IS_ERR(udc->udp_baseaddr)) {
30493049
dev_err(udc->dev, "IO map failure\n");
30503050
retval = PTR_ERR(udc->udp_baseaddr);
3051-
goto i2c_fail;
3051+
goto err_put_client;
30523052
}
30533053

30543054
/* Get USB device clock */
30553055
udc->usb_slv_clk = devm_clk_get(&pdev->dev, NULL);
30563056
if (IS_ERR(udc->usb_slv_clk)) {
30573057
dev_err(udc->dev, "failed to acquire USB device clock\n");
30583058
retval = PTR_ERR(udc->usb_slv_clk);
3059-
goto i2c_fail;
3059+
goto err_put_client;
30603060
}
30613061

30623062
/* Enable USB device clock */
30633063
retval = clk_prepare_enable(udc->usb_slv_clk);
30643064
if (retval < 0) {
30653065
dev_err(udc->dev, "failed to start USB device clock\n");
3066-
goto i2c_fail;
3066+
goto err_put_client;
30673067
}
30683068

30693069
/* Setup deferred workqueue data */
@@ -3165,9 +3165,10 @@ static int lpc32xx_udc_probe(struct platform_device *pdev)
31653165
dma_free_coherent(&pdev->dev, UDCA_BUFF_SIZE,
31663166
udc->udca_v_base, udc->udca_p_base);
31673167
i2c_fail:
3168-
if (udc->isp1301_i2c_client)
3169-
put_device(&udc->isp1301_i2c_client->dev);
31703168
clk_disable_unprepare(udc->usb_slv_clk);
3169+
err_put_client:
3170+
put_device(&udc->isp1301_i2c_client->dev);
3171+
31713172
dev_err(udc->dev, "%s probe failed, %d\n", driver_name, retval);
31723173

31733174
return retval;
@@ -3195,10 +3196,9 @@ static void lpc32xx_udc_remove(struct platform_device *pdev)
31953196
dma_free_coherent(&pdev->dev, UDCA_BUFF_SIZE,
31963197
udc->udca_v_base, udc->udca_p_base);
31973198

3198-
if (udc->isp1301_i2c_client)
3199-
put_device(&udc->isp1301_i2c_client->dev);
3200-
32013199
clk_disable_unprepare(udc->usb_slv_clk);
3200+
3201+
put_device(&udc->isp1301_i2c_client->dev);
32023202
}
32033203

32043204
#ifdef CONFIG_PM

0 commit comments

Comments
 (0)