@@ -1812,10 +1812,6 @@ static void r8a66597_remove(struct platform_device *pdev)
usb_del_gadget_udc(&r8a66597->gadget);
del_timer_sync(&r8a66597->timer);
r8a66597_free_request(&r8a66597->ep[0].ep, r8a66597->ep0_req);
-
- if (r8a66597->pdata->on_chip) {
- clk_disable_unprepare(r8a66597->clk);
- }
}
static void nop_completion(struct usb_ep *ep, struct usb_request *r)
@@ -1876,12 +1872,11 @@ static int r8a66597_probe(struct platform_device *pdev)
if (r8a66597->pdata->on_chip) {
snprintf(clk_name, sizeof(clk_name), "usb%d", pdev->id);
- r8a66597->clk = devm_clk_get(dev, clk_name);
+ r8a66597->clk = devm_clk_get_enabled(dev, clk_name);
if (IS_ERR(r8a66597->clk)) {
- dev_err(dev, "cannot get clock \"%s\"\n", clk_name);
+ dev_err(dev, "cannot get and enable clock \"%s\"\n", clk_name);
return PTR_ERR(r8a66597->clk);
}
- clk_prepare_enable(r8a66597->clk);
}
if (r8a66597->pdata->sudmac) {
@@ -1953,9 +1948,6 @@ static int r8a66597_probe(struct platform_device *pdev)
err_add_udc:
r8a66597_free_request(&r8a66597->ep[0].ep, r8a66597->ep0_req);
clean_up2:
- if (r8a66597->pdata->on_chip)
- clk_disable_unprepare(r8a66597->clk);
-
if (r8a66597->ep0_req)
r8a66597_free_request(&r8a66597->ep[0].ep, r8a66597->ep0_req);
If the clock r8a66597->clk was not enabled in r8a66597_probe, r8a66597->clk will contain a non-NULL value leading to the clock being incorrectly disabled later in r8a66597_remove. Use the devm_clk_get_enabled helper function to ensure proper call balance for r8a66597->clk. Found by Linux Verification Center (linuxtesting.org) with Klever. Fixes: d2e27bdf2870 ("usb: add clock support to r8a66597 gadget driver") Cc: stable@vger.kernel.org Signed-off-by: Vitalii Mordan <mordan@ispras.ru> --- drivers/usb/gadget/udc/r8a66597-udc.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-)