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

extcon: arizona: Fix runtime PM imbalance on error

When arizona_request_irq() returns an error code, a
pairing runtime PM usage counter decrement is needed
to keep the counter balanced. For error paths after
this function, things are the same.

Also, remove calls to pm_runtime_disable() when
pm_runtime_enable() has not been executed.

Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>

authored by

Dinghao Liu and committed by
Chanwoo Choi
b2e5575a 3d6954dd

+9 -8
+9 -8
drivers/extcon/extcon-arizona.c
··· 1460 1460 if (!info->input) { 1461 1461 dev_err(arizona->dev, "Can't allocate input dev\n"); 1462 1462 ret = -ENOMEM; 1463 - goto err_register; 1463 + return ret; 1464 1464 } 1465 1465 1466 1466 info->input->name = "Headset"; ··· 1492 1492 if (ret != 0) { 1493 1493 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n", 1494 1494 pdata->micd_pol_gpio, ret); 1495 - goto err_register; 1495 + return ret; 1496 1496 } 1497 1497 1498 1498 info->micd_pol_gpio = gpio_to_desc(pdata->micd_pol_gpio); ··· 1515 1515 dev_err(arizona->dev, 1516 1516 "Failed to get microphone polarity GPIO: %d\n", 1517 1517 ret); 1518 - goto err_register; 1518 + return ret; 1519 1519 } 1520 1520 } 1521 1521 ··· 1672 1672 if (ret != 0) { 1673 1673 dev_err(&pdev->dev, "Failed to get JACKDET rise IRQ: %d\n", 1674 1674 ret); 1675 - goto err_gpio; 1675 + goto err_pm; 1676 1676 } 1677 1677 1678 1678 ret = arizona_set_irq_wake(arizona, jack_irq_rise, 1); ··· 1721 1721 dev_warn(arizona->dev, "Failed to set MICVDD to bypass: %d\n", 1722 1722 ret); 1723 1723 1724 - pm_runtime_put(&pdev->dev); 1725 - 1726 1724 ret = input_register_device(info->input); 1727 1725 if (ret) { 1728 1726 dev_err(&pdev->dev, "Can't register input device: %d\n", ret); 1729 1727 goto err_hpdet; 1730 1728 } 1729 + 1730 + pm_runtime_put(&pdev->dev); 1731 1731 1732 1732 return 0; 1733 1733 ··· 1743 1743 arizona_set_irq_wake(arizona, jack_irq_rise, 0); 1744 1744 err_rise: 1745 1745 arizona_free_irq(arizona, jack_irq_rise, info); 1746 + err_pm: 1747 + pm_runtime_put(&pdev->dev); 1748 + pm_runtime_disable(&pdev->dev); 1746 1749 err_gpio: 1747 1750 gpiod_put(info->micd_pol_gpio); 1748 - err_register: 1749 - pm_runtime_disable(&pdev->dev); 1750 1751 return ret; 1751 1752 } 1752 1753