Re: [PATCH] drm/bridge: Fix error handling in analogix_dp_probe
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-...@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 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 1642struct platform_device *pdev = to_platform_device(dev); 3424e3a4f844c0 Yakir Yang 2016-03-29 1643struct analogix_dp_device *dp; 3424e3a4f844c0 Yakir Yang 2016-03-29 1644struct resource *res; 3424e3a4f844c0 Yakir Yang 2016-03-29 1645unsigned int irq_flags; 3424e3a4f844c0 Yakir Yang 2016-03-29 1646int ret; 3424e3a4f844c0 Yakir Yang 2016-03-29 1647 3424e3a4f844c0 Yakir Yang 2016-03-29 1648if (!plat_data) { 3424e3a4f844c0 Yakir Yang 2016-03-29 1649dev_err(dev, "Invalided input plat_data\n"); 6b2d8fd98d051f Jeffy Chen 2018-01-10 1650return ERR_PTR(-EINVAL); 3424e3a4f844c0 Yakir Yang 2016-03-29 1651} 3424e3a4f844c0 Yakir Yang 2016-03-29 1652 3424e3a4f844c0 Yakir Yang 2016-03-29 1653dp = devm_kzalloc(dev, sizeof(struct analogix_dp_device), GFP_KERNEL); 3424e3a4f844c0 Yakir Yang 2016-03-29 1654if (!dp) 6b2d8fd98d051f Jeffy Chen 2018-01-10 1655return ERR_PTR(-ENOMEM); 3424e3a4f844c0 Yakir Yang 2016-03-29 1656 3424e3a4f844c0 Yakir Yang 2016-03-29 1657dp->dev = >dev; 3424e3a4f844c0 Yakir Yang 2016-03-29 1658dp->dpms_mode = DRM_MODE_DPMS_OFF; 3424e3a4f844c0 Yakir Yang 2016-03-29 1659 0b8b059a75b08f Sean Paul2016-08-08 1660 mutex_init(>panel_lock); 0b8b059a75b08f Sean Paul2016-08-08 1661dp->panel_is_modeset = false; 0b8b059a75b08f Sean Paul2016-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 1668dp->plat_data = plat_data; 3424e3a4f844c0 Yakir Yang 2016-03-29 1669 793ce4eb84ea2f Yakir Yang 2016-02-15 1670ret = analogix_dp_dt_parse_pdata(dp); 793ce4eb84ea2f Yakir Yang 2016-02-15 1671if (ret) 6b2d8fd98d051f Jeffy Chen 2018-01-10 1672return ERR_PTR(ret); 3424e3a4f844c0 Yakir Yang 2016-03-29 1673 3424e3a4f844c0 Yakir Yang 2016-03-29 1674dp->phy = devm_phy_get(dp->dev, "dp"); 3424e3a4f844c0 Yakir Yang 2016-03-29 1675if (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 1677ret = PTR_ERR(dp->phy); 3424e3a4f844c0 Yakir Yang 2016-03-29 1678if (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
[PATCH] drm/bridge: Fix error handling in analogix_dp_probe
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 --- .../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(>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(>dev, "failed to get irq\n"); - return ERR_PTR(-ENODEV); + ret = -ENODEV; + goto err_disable_clk; } ret = devm_request_threaded_irq(>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(>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