Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/tegra: dpaux: Fix PM disable depth imbalance in tegra_dpaux_probe

The pm_runtime_enable function increases the power disable depth,
which means that we must perform a matching decrement on the error
handling path to maintain balance within the given context.
Additionally, we need to address the same issue for pm_runtime_get_sync.
We fix this by invoking pm_runtime_disable and pm_runtime_put_sync
when error returns.

Fixes: 82b81b3ec1a7 ("drm/tegra: dpaux: Implement runtime PM")
Signed-off-by: Zhang Shurong <zhang_shurong@foxmail.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/tencent_B13DB7F6C0023C46157250A524966F326A09@qq.com

authored by

Zhang Shurong and committed by
Thierry Reding
0800880f 11aa6d78

+10 -4
+10 -4
drivers/gpu/drm/tegra/dpaux.c
··· 522 522 if (err < 0) { 523 523 dev_err(dpaux->dev, "failed to request IRQ#%u: %d\n", 524 524 dpaux->irq, err); 525 - return err; 525 + goto err_pm_disable; 526 526 } 527 527 528 528 disable_irq(dpaux->irq); ··· 542 542 */ 543 543 err = tegra_dpaux_pad_config(dpaux, DPAUX_PADCTL_FUNC_I2C); 544 544 if (err < 0) 545 - return err; 545 + goto err_pm_disable; 546 546 547 547 #ifdef CONFIG_GENERIC_PINCONF 548 548 dpaux->desc.name = dev_name(&pdev->dev); ··· 555 555 dpaux->pinctrl = devm_pinctrl_register(&pdev->dev, &dpaux->desc, dpaux); 556 556 if (IS_ERR(dpaux->pinctrl)) { 557 557 dev_err(&pdev->dev, "failed to register pincontrol\n"); 558 - return PTR_ERR(dpaux->pinctrl); 558 + err = PTR_ERR(dpaux->pinctrl); 559 + goto err_pm_disable; 559 560 } 560 561 #endif 561 562 /* enable and clear all interrupts */ ··· 572 571 err = devm_of_dp_aux_populate_ep_devices(&dpaux->aux); 573 572 if (err < 0) { 574 573 dev_err(dpaux->dev, "failed to populate AUX bus: %d\n", err); 575 - return err; 574 + goto err_pm_disable; 576 575 } 577 576 578 577 return 0; 578 + 579 + err_pm_disable: 580 + pm_runtime_put_sync(&pdev->dev); 581 + pm_runtime_disable(&pdev->dev); 582 + return err; 579 583 } 580 584 581 585 static void tegra_dpaux_remove(struct platform_device *pdev)