Message ID | 20241209152604.1918882-1-mordan@ispras.ru |
---|---|
State | New |
Headers | show |
Series | usb: phy-tahvo: fix call balance for tu->ick handling routines | expand |
Hi Vitalii, kernel test robot noticed the following build warnings: https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Vitalii-Mordan/usb-phy-tahvo-fix-call-balance-for-tu-ick-handling-routines/20241209-232934 base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing patch link: https://lore.kernel.org/r/20241209152604.1918882-1-mordan%40ispras.ru patch subject: [PATCH] usb: phy-tahvo: fix call balance for tu->ick handling routines config: alpha-randconfig-r072-20241215 (https://download.01.org/0day-ci/archive/20241215/202412150530.f03D8q1a-lkp@intel.com/config) compiler: alpha-linux-gcc (GCC) 14.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <dan.carpenter@linaro.org> | Closes: https://lore.kernel.org/r/202412150530.f03D8q1a-lkp@intel.com/ smatch warnings: drivers/usb/phy/phy-tahvo.c:347 tahvo_usb_probe() warn: passing zero to 'PTR_ERR' vim +/PTR_ERR +347 drivers/usb/phy/phy-tahvo.c 9ba96ae5074c9f Aaro Koskinen 2013-12-06 341 9ba96ae5074c9f Aaro Koskinen 2013-12-06 342 mutex_init(&tu->serialize); 9ba96ae5074c9f Aaro Koskinen 2013-12-06 343 125b175df62ecc Vitalii Mordan 2024-12-09 344 tu->ick = devm_clk_get_enabled(&pdev->dev, "usb_l4_ick"); 125b175df62ecc Vitalii Mordan 2024-12-09 345 if (!IS_ERR(tu->ick)) { ^ This typo breaks the driver. 125b175df62ecc Vitalii Mordan 2024-12-09 346 dev_err(&pdev->dev, "failed to get and enable clock\n"); 125b175df62ecc Vitalii Mordan 2024-12-09 @347 return PTR_ERR(tu->ick); 125b175df62ecc Vitalii Mordan 2024-12-09 348 } 9ba96ae5074c9f Aaro Koskinen 2013-12-06 349 9ba96ae5074c9f Aaro Koskinen 2013-12-06 350 /* 9ba96ae5074c9f Aaro Koskinen 2013-12-06 351 * Set initial state, so that we generate kevents only on state changes. 9ba96ae5074c9f Aaro Koskinen 2013-12-06 352 */ 9ba96ae5074c9f Aaro Koskinen 2013-12-06 353 tu->vbus_state = retu_read(rdev, TAHVO_REG_IDSR) & TAHVO_STAT_VBUS; 9ba96ae5074c9f Aaro Koskinen 2013-12-06 354 860d2686fda7e4 Chanwoo Choi 2015-07-01 355 tu->extcon = devm_extcon_dev_allocate(&pdev->dev, tahvo_cable);
diff --git a/drivers/usb/phy/phy-tahvo.c b/drivers/usb/phy/phy-tahvo.c index ae7bf3ff89ee..d393308d23d4 100644 --- a/drivers/usb/phy/phy-tahvo.c +++ b/drivers/usb/phy/phy-tahvo.c @@ -341,9 +341,11 @@ static int tahvo_usb_probe(struct platform_device *pdev) mutex_init(&tu->serialize); - tu->ick = devm_clk_get(&pdev->dev, "usb_l4_ick"); - if (!IS_ERR(tu->ick)) - clk_enable(tu->ick); + tu->ick = devm_clk_get_enabled(&pdev->dev, "usb_l4_ick"); + if (!IS_ERR(tu->ick)) { + dev_err(&pdev->dev, "failed to get and enable clock\n"); + return PTR_ERR(tu->ick); + } /* * Set initial state, so that we generate kevents only on state changes. @@ -353,15 +355,14 @@ static int tahvo_usb_probe(struct platform_device *pdev) tu->extcon = devm_extcon_dev_allocate(&pdev->dev, tahvo_cable); if (IS_ERR(tu->extcon)) { dev_err(&pdev->dev, "failed to allocate memory for extcon\n"); - ret = PTR_ERR(tu->extcon); - goto err_disable_clk; + return PTR_ERR(tu->extcon); } ret = devm_extcon_dev_register(&pdev->dev, tu->extcon); if (ret) { dev_err(&pdev->dev, "could not register extcon device: %d\n", ret); - goto err_disable_clk; + return ret; } /* Set the initial cable state. */ @@ -384,7 +385,7 @@ static int tahvo_usb_probe(struct platform_device *pdev) if (ret < 0) { dev_err(&pdev->dev, "cannot register USB transceiver: %d\n", ret); - goto err_disable_clk; + return ret; } dev_set_drvdata(&pdev->dev, tu); @@ -405,9 +406,6 @@ static int tahvo_usb_probe(struct platform_device *pdev) err_remove_phy: usb_remove_phy(&tu->phy); -err_disable_clk: - if (!IS_ERR(tu->ick)) - clk_disable(tu->ick); return ret; } @@ -418,8 +416,6 @@ static void tahvo_usb_remove(struct platform_device *pdev) free_irq(tu->irq, tu); usb_remove_phy(&tu->phy); - if (!IS_ERR(tu->ick)) - clk_disable(tu->ick); } static struct platform_driver tahvo_usb_driver = {
If the clock tu->ick was not enabled in tahvo_usb_probe, it may still hold a non-error pointer, potentially causing the clock to be incorrectly disabled later in the function. Use the devm_clk_get_enabled helper function to ensure proper call balance for tu->ick. Found by Linux Verification Center (linuxtesting.org) with Klever. Fixes: 9ba96ae5074c ("usb: omap1: Tahvo USB transceiver driver") Cc: stable@vger.kernel.org Signed-off-by: Vitalii Mordan <mordan@ispras.ru> --- drivers/usb/phy/phy-tahvo.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-)