| From bd4f7c6a85575acf06597ea54d452a29921c1b67 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 27 Mar 2021 08:38:53 +0100 |
| Subject: usb: gadget: s3c: Fix the error handling path in |
| 's3c2410_udc_probe()' |
| |
| From: Christophe JAILLET <christophe.jaillet@wanadoo.fr> |
| |
| [ Upstream commit e5242861ec6a0bce25b4cd10af0fc8a508fd067d ] |
| |
| Some 'clk_prepare_enable()' and 'clk_get()' must be undone in the error |
| handling path of the probe function, as already done in the remove |
| function. |
| |
| Fixes: 3fc154b6b813 ("USB Gadget driver for Samsung s3c2410 ARM SoC") |
| Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr> |
| Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com> |
| Link: https://lore.kernel.org/r/2bee52e4ce968f48b4c32545cf8f3b2ab825ba82.1616830026.git.christophe.jaillet@wanadoo.fr |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/gadget/udc/s3c2410_udc.c | 16 ++++++++++++---- |
| 1 file changed, 12 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/usb/gadget/udc/s3c2410_udc.c b/drivers/usb/gadget/udc/s3c2410_udc.c |
| index b81979b3bdb6..b154b62abefa 100644 |
| --- a/drivers/usb/gadget/udc/s3c2410_udc.c |
| +++ b/drivers/usb/gadget/udc/s3c2410_udc.c |
| @@ -1750,7 +1750,8 @@ static int s3c2410_udc_probe(struct platform_device *pdev) |
| udc_clock = clk_get(NULL, "usb-device"); |
| if (IS_ERR(udc_clock)) { |
| dev_err(dev, "failed to get udc clock source\n"); |
| - return PTR_ERR(udc_clock); |
| + retval = PTR_ERR(udc_clock); |
| + goto err_usb_bus_clk; |
| } |
| |
| clk_prepare_enable(udc_clock); |
| @@ -1773,7 +1774,7 @@ static int s3c2410_udc_probe(struct platform_device *pdev) |
| base_addr = devm_platform_ioremap_resource(pdev, 0); |
| if (IS_ERR(base_addr)) { |
| retval = PTR_ERR(base_addr); |
| - goto err; |
| + goto err_udc_clk; |
| } |
| |
| the_controller = udc; |
| @@ -1791,7 +1792,7 @@ static int s3c2410_udc_probe(struct platform_device *pdev) |
| if (retval != 0) { |
| dev_err(dev, "cannot get irq %i, err %d\n", irq_usbd, retval); |
| retval = -EBUSY; |
| - goto err; |
| + goto err_udc_clk; |
| } |
| |
| dev_dbg(dev, "got irq %i\n", irq_usbd); |
| @@ -1862,7 +1863,14 @@ err_gpio_claim: |
| gpio_free(udc_info->vbus_pin); |
| err_int: |
| free_irq(irq_usbd, udc); |
| -err: |
| +err_udc_clk: |
| + clk_disable_unprepare(udc_clock); |
| + clk_put(udc_clock); |
| + udc_clock = NULL; |
| +err_usb_bus_clk: |
| + clk_disable_unprepare(usb_bus_clock); |
| + clk_put(usb_bus_clock); |
| + usb_bus_clock = NULL; |
| |
| return retval; |
| } |
| -- |
| 2.30.2 |
| |