* [PATCH] drm/bridge: Fix error handling in analogix_dp_probe
@ 2022-04-03 5:17 Miaoqian Lin
2022-04-03 11:43 ` kernel test robot
0 siblings, 1 reply; 5+ messages in thread
From: Miaoqian Lin @ 2022-04-03 5:17 UTC (permalink / raw)
To: Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
Jonas Karlman, Jernej Skrabec, David Airlie, Daniel Vetter,
Ville Syrjälä,
Tomi Valkeinen, Dave Airlie, Jyri Sarha, Maxime Ripard,
Miaoqian Lin, Lyude Paul, Inki Dae, Yakir Yang, Heiko Stuebner,
dri-devel, linux-kernel
In the error handling path, the clk_prepare_enable() function
call should be balanced by a corresponding 'clk_disable_unprepare()'
call , as already done in the remove function.
Fixes: 3424e3a4f844 ("drm: bridge: analogix/dp: split exynos dp driver to bridge directory")
Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
---
.../gpu/drm/bridge/analogix/analogix_dp_core.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index eb590fb8e8d0..2c0f582b4d32 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1698,7 +1698,10 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
dp->reg_base = devm_ioremap_resource(&pdev->dev, res);
- if (IS_ERR(dp->reg_base))
+ if (IS_ERR(dp->reg_base)) {
+ ret = PTR_ERR(dp->reg_base);
+ goto err_disable_clk;
+ }
return ERR_CAST(dp->reg_base);
dp->force_hpd = of_property_read_bool(dev->of_node, "force-hpd");
@@ -1711,7 +1714,8 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
if (IS_ERR(dp->hpd_gpiod)) {
dev_err(dev, "error getting HDP GPIO: %ld\n",
PTR_ERR(dp->hpd_gpiod));
- return ERR_CAST(dp->hpd_gpiod);
+ ret = PTR_ERR(dp->hpd_gpiod);
+ goto err_disable_clk;
}
if (dp->hpd_gpiod) {
@@ -1731,7 +1735,8 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
if (dp->irq == -ENXIO) {
dev_err(&pdev->dev, "failed to get irq\n");
- return ERR_PTR(-ENODEV);
+ ret = -ENODEV;
+ goto err_disable_clk;
}
ret = devm_request_threaded_irq(&pdev->dev, dp->irq,
@@ -1740,11 +1745,15 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
irq_flags, "analogix-dp", dp);
if (ret) {
dev_err(&pdev->dev, "failed to request irq\n");
- return ERR_PTR(ret);
+ goto err_disable_clk;
}
disable_irq(dp->irq);
return dp;
+
+err_disable_clk:
+ clk_disable_unprepare(dp->clock);
+ return ERR_PTR(ret);
}
EXPORT_SYMBOL_GPL(analogix_dp_probe);
--
2.17.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] drm/bridge: Fix error handling in analogix_dp_probe
2022-04-03 5:17 [PATCH] drm/bridge: Fix error handling in analogix_dp_probe Miaoqian Lin
@ 2022-04-03 11:43 ` kernel test robot
2022-04-20 1:16 ` [PATCH v2] " Miaoqian Lin
0 siblings, 1 reply; 5+ messages in thread
From: kernel test robot @ 2022-04-03 11:43 UTC (permalink / raw)
To: Miaoqian Lin, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec, David Airlie,
Daniel Vetter, Ville Syrjälä,
Tomi Valkeinen, Dave Airlie, Jyri Sarha, Maxime Ripard,
Lyude Paul, Inki Dae, Yakir Yang, Heiko Stuebner, dri-devel,
linux-kernel
Cc: kbuild-all
Hi Miaoqian,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on drm/drm-next]
[also build test WARNING on v5.17 next-20220401]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Miaoqian-Lin/drm-bridge-Fix-error-handling-in-analogix_dp_probe/20220403-131916
base: git://anongit.freedesktop.org/drm/drm drm-next
config: x86_64-randconfig-m001 (https://download.01.org/0day-ci/archive/20220403/202204031935.5SkYsM2M-lkp@intel.com/config)
compiler: gcc-11 (Debian 11.2.0-19) 11.2.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
New smatch warnings:
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c:1705 analogix_dp_probe() warn: inconsistent indenting
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c:1705 analogix_dp_probe() warn: passing zero to 'ERR_CAST'
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c:1707 analogix_dp_probe() warn: ignoring unreachable code.
Old smatch warnings:
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c:1846 analogix_dp_resume() warn: 'dp->clock' from clk_prepare_enable() not released on lines: 1842.
vim +1705 drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
0d97ad03f4220c Tomeu Vizoso 2016-08-24 1638
6b2d8fd98d051f Jeffy Chen 2018-01-10 1639 struct analogix_dp_device *
152cce0006abf7 Marek Szyprowski 2020-03-10 1640 analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
3424e3a4f844c0 Yakir Yang 2016-03-29 1641 {
3424e3a4f844c0 Yakir Yang 2016-03-29 1642 struct platform_device *pdev = to_platform_device(dev);
3424e3a4f844c0 Yakir Yang 2016-03-29 1643 struct analogix_dp_device *dp;
3424e3a4f844c0 Yakir Yang 2016-03-29 1644 struct resource *res;
3424e3a4f844c0 Yakir Yang 2016-03-29 1645 unsigned int irq_flags;
3424e3a4f844c0 Yakir Yang 2016-03-29 1646 int ret;
3424e3a4f844c0 Yakir Yang 2016-03-29 1647
3424e3a4f844c0 Yakir Yang 2016-03-29 1648 if (!plat_data) {
3424e3a4f844c0 Yakir Yang 2016-03-29 1649 dev_err(dev, "Invalided input plat_data\n");
6b2d8fd98d051f Jeffy Chen 2018-01-10 1650 return ERR_PTR(-EINVAL);
3424e3a4f844c0 Yakir Yang 2016-03-29 1651 }
3424e3a4f844c0 Yakir Yang 2016-03-29 1652
3424e3a4f844c0 Yakir Yang 2016-03-29 1653 dp = devm_kzalloc(dev, sizeof(struct analogix_dp_device), GFP_KERNEL);
3424e3a4f844c0 Yakir Yang 2016-03-29 1654 if (!dp)
6b2d8fd98d051f Jeffy Chen 2018-01-10 1655 return ERR_PTR(-ENOMEM);
3424e3a4f844c0 Yakir Yang 2016-03-29 1656
3424e3a4f844c0 Yakir Yang 2016-03-29 1657 dp->dev = &pdev->dev;
3424e3a4f844c0 Yakir Yang 2016-03-29 1658 dp->dpms_mode = DRM_MODE_DPMS_OFF;
3424e3a4f844c0 Yakir Yang 2016-03-29 1659
0b8b059a75b08f Sean Paul 2016-08-08 1660 mutex_init(&dp->panel_lock);
0b8b059a75b08f Sean Paul 2016-08-08 1661 dp->panel_is_modeset = false;
0b8b059a75b08f Sean Paul 2016-08-08 1662
3424e3a4f844c0 Yakir Yang 2016-03-29 1663 /*
3424e3a4f844c0 Yakir Yang 2016-03-29 1664 * platform dp driver need containor_of the plat_data to get
3424e3a4f844c0 Yakir Yang 2016-03-29 1665 * the driver private data, so we need to store the point of
3424e3a4f844c0 Yakir Yang 2016-03-29 1666 * plat_data, not the context of plat_data.
3424e3a4f844c0 Yakir Yang 2016-03-29 1667 */
3424e3a4f844c0 Yakir Yang 2016-03-29 1668 dp->plat_data = plat_data;
3424e3a4f844c0 Yakir Yang 2016-03-29 1669
793ce4eb84ea2f Yakir Yang 2016-02-15 1670 ret = analogix_dp_dt_parse_pdata(dp);
793ce4eb84ea2f Yakir Yang 2016-02-15 1671 if (ret)
6b2d8fd98d051f Jeffy Chen 2018-01-10 1672 return ERR_PTR(ret);
3424e3a4f844c0 Yakir Yang 2016-03-29 1673
3424e3a4f844c0 Yakir Yang 2016-03-29 1674 dp->phy = devm_phy_get(dp->dev, "dp");
3424e3a4f844c0 Yakir Yang 2016-03-29 1675 if (IS_ERR(dp->phy)) {
3424e3a4f844c0 Yakir Yang 2016-03-29 1676 dev_err(dp->dev, "no DP phy configured\n");
3424e3a4f844c0 Yakir Yang 2016-03-29 1677 ret = PTR_ERR(dp->phy);
3424e3a4f844c0 Yakir Yang 2016-03-29 1678 if (ret) {
3424e3a4f844c0 Yakir Yang 2016-03-29 1679 /*
3424e3a4f844c0 Yakir Yang 2016-03-29 1680 * phy itself is not enabled, so we can move forward
3424e3a4f844c0 Yakir Yang 2016-03-29 1681 * assigning NULL to phy pointer.
3424e3a4f844c0 Yakir Yang 2016-03-29 1682 */
3424e3a4f844c0 Yakir Yang 2016-03-29 1683 if (ret == -ENOSYS || ret == -ENODEV)
3424e3a4f844c0 Yakir Yang 2016-03-29 1684 dp->phy = NULL;
3424e3a4f844c0 Yakir Yang 2016-03-29 1685 else
6b2d8fd98d051f Jeffy Chen 2018-01-10 1686 return ERR_PTR(ret);
3424e3a4f844c0 Yakir Yang 2016-03-29 1687 }
3424e3a4f844c0 Yakir Yang 2016-03-29 1688 }
3424e3a4f844c0 Yakir Yang 2016-03-29 1689
3424e3a4f844c0 Yakir Yang 2016-03-29 1690 dp->clock = devm_clk_get(&pdev->dev, "dp");
3424e3a4f844c0 Yakir Yang 2016-03-29 1691 if (IS_ERR(dp->clock)) {
3424e3a4f844c0 Yakir Yang 2016-03-29 1692 dev_err(&pdev->dev, "failed to get clock\n");
6b2d8fd98d051f Jeffy Chen 2018-01-10 1693 return ERR_CAST(dp->clock);
3424e3a4f844c0 Yakir Yang 2016-03-29 1694 }
3424e3a4f844c0 Yakir Yang 2016-03-29 1695
3424e3a4f844c0 Yakir Yang 2016-03-29 1696 clk_prepare_enable(dp->clock);
3424e3a4f844c0 Yakir Yang 2016-03-29 1697
3424e3a4f844c0 Yakir Yang 2016-03-29 1698 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
3424e3a4f844c0 Yakir Yang 2016-03-29 1699
3424e3a4f844c0 Yakir Yang 2016-03-29 1700 dp->reg_base = devm_ioremap_resource(&pdev->dev, res);
af6df465625fb3 Miaoqian Lin 2022-04-03 1701 if (IS_ERR(dp->reg_base)) {
af6df465625fb3 Miaoqian Lin 2022-04-03 1702 ret = PTR_ERR(dp->reg_base);
af6df465625fb3 Miaoqian Lin 2022-04-03 1703 goto err_disable_clk;
af6df465625fb3 Miaoqian Lin 2022-04-03 1704 }
6b2d8fd98d051f Jeffy Chen 2018-01-10 @1705 return ERR_CAST(dp->reg_base);
3424e3a4f844c0 Yakir Yang 2016-03-29 1706
5cff007c58b710 Yakir Yang 2016-02-15 @1707 dp->force_hpd = of_property_read_bool(dev->of_node, "force-hpd");
5cff007c58b710 Yakir Yang 2016-02-15 1708
5b038dcf9d0aa0 Linus Walleij 2019-06-10 1709 /* Try two different names */
5b038dcf9d0aa0 Linus Walleij 2019-06-10 1710 dp->hpd_gpiod = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN);
5b038dcf9d0aa0 Linus Walleij 2019-06-10 1711 if (!dp->hpd_gpiod)
5b038dcf9d0aa0 Linus Walleij 2019-06-10 1712 dp->hpd_gpiod = devm_gpiod_get_optional(dev, "samsung,hpd",
5b038dcf9d0aa0 Linus Walleij 2019-06-10 1713 GPIOD_IN);
5b038dcf9d0aa0 Linus Walleij 2019-06-10 1714 if (IS_ERR(dp->hpd_gpiod)) {
5b038dcf9d0aa0 Linus Walleij 2019-06-10 1715 dev_err(dev, "error getting HDP GPIO: %ld\n",
5b038dcf9d0aa0 Linus Walleij 2019-06-10 1716 PTR_ERR(dp->hpd_gpiod));
af6df465625fb3 Miaoqian Lin 2022-04-03 1717 ret = PTR_ERR(dp->hpd_gpiod);
af6df465625fb3 Miaoqian Lin 2022-04-03 1718 goto err_disable_clk;
5b038dcf9d0aa0 Linus Walleij 2019-06-10 1719 }
3424e3a4f844c0 Yakir Yang 2016-03-29 1720
5b038dcf9d0aa0 Linus Walleij 2019-06-10 1721 if (dp->hpd_gpiod) {
3424e3a4f844c0 Yakir Yang 2016-03-29 1722 /*
3424e3a4f844c0 Yakir Yang 2016-03-29 1723 * Set up the hotplug GPIO from the device tree as an interrupt.
3424e3a4f844c0 Yakir Yang 2016-03-29 1724 * Simply specifying a different interrupt in the device tree
3424e3a4f844c0 Yakir Yang 2016-03-29 1725 * doesn't work since we handle hotplug rather differently when
3424e3a4f844c0 Yakir Yang 2016-03-29 1726 * using a GPIO. We also need the actual GPIO specifier so
3424e3a4f844c0 Yakir Yang 2016-03-29 1727 * that we can get the current state of the GPIO.
3424e3a4f844c0 Yakir Yang 2016-03-29 1728 */
5b038dcf9d0aa0 Linus Walleij 2019-06-10 1729 dp->irq = gpiod_to_irq(dp->hpd_gpiod);
3424e3a4f844c0 Yakir Yang 2016-03-29 1730 irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
3424e3a4f844c0 Yakir Yang 2016-03-29 1731 } else {
3424e3a4f844c0 Yakir Yang 2016-03-29 1732 dp->irq = platform_get_irq(pdev, 0);
3424e3a4f844c0 Yakir Yang 2016-03-29 1733 irq_flags = 0;
3424e3a4f844c0 Yakir Yang 2016-03-29 1734 }
3424e3a4f844c0 Yakir Yang 2016-03-29 1735
3424e3a4f844c0 Yakir Yang 2016-03-29 1736 if (dp->irq == -ENXIO) {
3424e3a4f844c0 Yakir Yang 2016-03-29 1737 dev_err(&pdev->dev, "failed to get irq\n");
af6df465625fb3 Miaoqian Lin 2022-04-03 1738 ret = -ENODEV;
af6df465625fb3 Miaoqian Lin 2022-04-03 1739 goto err_disable_clk;
3424e3a4f844c0 Yakir Yang 2016-03-29 1740 }
3424e3a4f844c0 Yakir Yang 2016-03-29 1741
7b4b7a8db439dc Yakir Yang 2016-02-15 1742 ret = devm_request_threaded_irq(&pdev->dev, dp->irq,
7b4b7a8db439dc Yakir Yang 2016-02-15 1743 analogix_dp_hardirq,
7b4b7a8db439dc Yakir Yang 2016-02-15 1744 analogix_dp_irq_thread,
3424e3a4f844c0 Yakir Yang 2016-03-29 1745 irq_flags, "analogix-dp", dp);
3424e3a4f844c0 Yakir Yang 2016-03-29 1746 if (ret) {
3424e3a4f844c0 Yakir Yang 2016-03-29 1747 dev_err(&pdev->dev, "failed to request irq\n");
af6df465625fb3 Miaoqian Lin 2022-04-03 1748 goto err_disable_clk;
3424e3a4f844c0 Yakir Yang 2016-03-29 1749 }
3424e3a4f844c0 Yakir Yang 2016-03-29 1750 disable_irq(dp->irq);
3424e3a4f844c0 Yakir Yang 2016-03-29 1751
152cce0006abf7 Marek Szyprowski 2020-03-10 1752 return dp;
af6df465625fb3 Miaoqian Lin 2022-04-03 1753
af6df465625fb3 Miaoqian Lin 2022-04-03 1754 err_disable_clk:
af6df465625fb3 Miaoqian Lin 2022-04-03 1755 clk_disable_unprepare(dp->clock);
af6df465625fb3 Miaoqian Lin 2022-04-03 1756 return ERR_PTR(ret);
152cce0006abf7 Marek Szyprowski 2020-03-10 1757 }
152cce0006abf7 Marek Szyprowski 2020-03-10 1758 EXPORT_SYMBOL_GPL(analogix_dp_probe);
152cce0006abf7 Marek Szyprowski 2020-03-10 1759
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2] drm/bridge: Fix error handling in analogix_dp_probe
2022-04-03 11:43 ` kernel test robot
@ 2022-04-20 1:16 ` Miaoqian Lin
2022-04-21 12:24 ` Robert Foss
0 siblings, 1 reply; 5+ messages in thread
From: Miaoqian Lin @ 2022-04-20 1:16 UTC (permalink / raw)
To: Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
Jonas Karlman, Jernej Skrabec, David Airlie, Daniel Vetter,
Dave Airlie, Tomi Valkeinen, Jyri Sarha, Miaoqian Lin,
Lyude Paul, Maxime Ripard, Yakir Yang, Inki Dae, Heiko Stuebner,
dri-devel, linux-kernel
In the error handling path, the clk_prepare_enable() function
call should be balanced by a corresponding 'clk_disable_unprepare()'
call , as already done in the remove function.
Fixes: 3424e3a4f844 ("drm: bridge: analogix/dp: split exynos dp driver to bridge directory")
Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
---
changes in v2:
- remove the wrong return statement.
---
.../gpu/drm/bridge/analogix/analogix_dp_core.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index eb590fb8e8d0..474ef88015ae 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1698,8 +1698,10 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
dp->reg_base = devm_ioremap_resource(&pdev->dev, res);
- if (IS_ERR(dp->reg_base))
- return ERR_CAST(dp->reg_base);
+ if (IS_ERR(dp->reg_base)) {
+ ret = PTR_ERR(dp->reg_base);
+ goto err_disable_clk;
+ }
dp->force_hpd = of_property_read_bool(dev->of_node, "force-hpd");
@@ -1711,7 +1713,8 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
if (IS_ERR(dp->hpd_gpiod)) {
dev_err(dev, "error getting HDP GPIO: %ld\n",
PTR_ERR(dp->hpd_gpiod));
- return ERR_CAST(dp->hpd_gpiod);
+ ret = PTR_ERR(dp->hpd_gpiod);
+ goto err_disable_clk;
}
if (dp->hpd_gpiod) {
@@ -1731,7 +1734,8 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
if (dp->irq == -ENXIO) {
dev_err(&pdev->dev, "failed to get irq\n");
- return ERR_PTR(-ENODEV);
+ ret = -ENODEV;
+ goto err_disable_clk;
}
ret = devm_request_threaded_irq(&pdev->dev, dp->irq,
@@ -1740,11 +1744,15 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
irq_flags, "analogix-dp", dp);
if (ret) {
dev_err(&pdev->dev, "failed to request irq\n");
- return ERR_PTR(ret);
+ goto err_disable_clk;
}
disable_irq(dp->irq);
return dp;
+
+err_disable_clk:
+ clk_disable_unprepare(dp->clock);
+ return ERR_PTR(ret);
}
EXPORT_SYMBOL_GPL(analogix_dp_probe);
--
2.17.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2] drm/bridge: Fix error handling in analogix_dp_probe
2022-04-20 1:16 ` [PATCH v2] " Miaoqian Lin
@ 2022-04-21 12:24 ` Robert Foss
0 siblings, 0 replies; 5+ messages in thread
From: Robert Foss @ 2022-04-21 12:24 UTC (permalink / raw)
To: Miaoqian Lin
Cc: Andrzej Hajda, Neil Armstrong, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, David Airlie, Daniel Vetter, Dave Airlie,
Tomi Valkeinen, Jyri Sarha, Lyude Paul, Maxime Ripard,
Yakir Yang, Inki Dae, Heiko Stuebner, dri-devel, linux-kernel
On Wed, 20 Apr 2022 at 03:16, Miaoqian Lin <linmq006@gmail.com> wrote:
>
> In the error handling path, the clk_prepare_enable() function
> call should be balanced by a corresponding 'clk_disable_unprepare()'
> call , as already done in the remove function.
>
> Fixes: 3424e3a4f844 ("drm: bridge: analogix/dp: split exynos dp driver to bridge directory")
> Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
> ---
> changes in v2:
> - remove the wrong return statement.
> ---
> .../gpu/drm/bridge/analogix/analogix_dp_core.c | 18 +++++++++++++-----
> 1 file changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> index eb590fb8e8d0..474ef88015ae 100644
> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> @@ -1698,8 +1698,10 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
> res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>
> dp->reg_base = devm_ioremap_resource(&pdev->dev, res);
> - if (IS_ERR(dp->reg_base))
> - return ERR_CAST(dp->reg_base);
> + if (IS_ERR(dp->reg_base)) {
> + ret = PTR_ERR(dp->reg_base);
> + goto err_disable_clk;
> + }
>
> dp->force_hpd = of_property_read_bool(dev->of_node, "force-hpd");
>
> @@ -1711,7 +1713,8 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
> if (IS_ERR(dp->hpd_gpiod)) {
> dev_err(dev, "error getting HDP GPIO: %ld\n",
> PTR_ERR(dp->hpd_gpiod));
> - return ERR_CAST(dp->hpd_gpiod);
> + ret = PTR_ERR(dp->hpd_gpiod);
> + goto err_disable_clk;
> }
>
> if (dp->hpd_gpiod) {
> @@ -1731,7 +1734,8 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
>
> if (dp->irq == -ENXIO) {
> dev_err(&pdev->dev, "failed to get irq\n");
> - return ERR_PTR(-ENODEV);
> + ret = -ENODEV;
> + goto err_disable_clk;
> }
>
> ret = devm_request_threaded_irq(&pdev->dev, dp->irq,
> @@ -1740,11 +1744,15 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
> irq_flags, "analogix-dp", dp);
> if (ret) {
> dev_err(&pdev->dev, "failed to request irq\n");
> - return ERR_PTR(ret);
> + goto err_disable_clk;
> }
> disable_irq(dp->irq);
>
> return dp;
> +
> +err_disable_clk:
> + clk_disable_unprepare(dp->clock);
> + return ERR_PTR(ret);
> }
> EXPORT_SYMBOL_GPL(analogix_dp_probe);
>
Reviewed-by: Robert Foss <robert.foss@linaro.org>
Applied to drm-misc-next.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] drm/bridge: Fix error handling in analogix_dp_probe
@ 2022-04-21 12:24 ` Robert Foss
0 siblings, 0 replies; 5+ messages in thread
From: Robert Foss @ 2022-04-21 12:24 UTC (permalink / raw)
To: Miaoqian Lin
Cc: Jonas Karlman, David Airlie, Tomi Valkeinen, dri-devel,
Neil Armstrong, Yakir Yang, Jernej Skrabec, linux-kernel,
Laurent Pinchart, Andrzej Hajda, Dave Airlie, Jyri Sarha,
Maxime Ripard
On Wed, 20 Apr 2022 at 03:16, Miaoqian Lin <linmq006@gmail.com> wrote:
>
> In the error handling path, the clk_prepare_enable() function
> call should be balanced by a corresponding 'clk_disable_unprepare()'
> call , as already done in the remove function.
>
> Fixes: 3424e3a4f844 ("drm: bridge: analogix/dp: split exynos dp driver to bridge directory")
> Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
> ---
> changes in v2:
> - remove the wrong return statement.
> ---
> .../gpu/drm/bridge/analogix/analogix_dp_core.c | 18 +++++++++++++-----
> 1 file changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> index eb590fb8e8d0..474ef88015ae 100644
> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> @@ -1698,8 +1698,10 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
> res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>
> dp->reg_base = devm_ioremap_resource(&pdev->dev, res);
> - if (IS_ERR(dp->reg_base))
> - return ERR_CAST(dp->reg_base);
> + if (IS_ERR(dp->reg_base)) {
> + ret = PTR_ERR(dp->reg_base);
> + goto err_disable_clk;
> + }
>
> dp->force_hpd = of_property_read_bool(dev->of_node, "force-hpd");
>
> @@ -1711,7 +1713,8 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
> if (IS_ERR(dp->hpd_gpiod)) {
> dev_err(dev, "error getting HDP GPIO: %ld\n",
> PTR_ERR(dp->hpd_gpiod));
> - return ERR_CAST(dp->hpd_gpiod);
> + ret = PTR_ERR(dp->hpd_gpiod);
> + goto err_disable_clk;
> }
>
> if (dp->hpd_gpiod) {
> @@ -1731,7 +1734,8 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
>
> if (dp->irq == -ENXIO) {
> dev_err(&pdev->dev, "failed to get irq\n");
> - return ERR_PTR(-ENODEV);
> + ret = -ENODEV;
> + goto err_disable_clk;
> }
>
> ret = devm_request_threaded_irq(&pdev->dev, dp->irq,
> @@ -1740,11 +1744,15 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
> irq_flags, "analogix-dp", dp);
> if (ret) {
> dev_err(&pdev->dev, "failed to request irq\n");
> - return ERR_PTR(ret);
> + goto err_disable_clk;
> }
> disable_irq(dp->irq);
>
> return dp;
> +
> +err_disable_clk:
> + clk_disable_unprepare(dp->clock);
> + return ERR_PTR(ret);
> }
> EXPORT_SYMBOL_GPL(analogix_dp_probe);
>
Reviewed-by: Robert Foss <robert.foss@linaro.org>
Applied to drm-misc-next.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-04-21 12:25 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-03 5:17 [PATCH] drm/bridge: Fix error handling in analogix_dp_probe Miaoqian Lin
2022-04-03 11:43 ` kernel test robot
2022-04-20 1:16 ` [PATCH v2] " Miaoqian Lin
2022-04-21 12:24 ` Robert Foss
2022-04-21 12:24 ` Robert Foss
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.