Re: [PATCH] drm/bridge: Fix error handling in analogix_dp_probe

2022-04-03 Thread kernel test robot
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

2022-04-02 Thread Miaoqian Lin
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