All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] drm/bridge: display-connector: implement the error path of .probe()
@ 2024-12-14  1:26 Joe Hattori
  2024-12-14 15:22 ` Dmitry Baryshkov
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Joe Hattori @ 2024-12-14  1:26 UTC (permalink / raw)
  To: andrzej.hajda, neil.armstrong, rfoss, Laurent.pinchart, jonas,
	jernej.skrabec, maarten.lankhorst, mripard, tzimmermann, airlied,
	simona
  Cc: dri-devel, Joe Hattori

Current implementation of .probe() leaks a reference of i2c_adapter.
Implement an error path and call put_device() on the obtained
i2c_adapter in it to fix this refcount bug.

This bug was found by an experimental static analysis tool that I am
developing.

Fixes: 0c275c30176b ("drm/bridge: Add bridge driver for display connectors")
Signed-off-by: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
---
Changes in V2:
- Omit the null check before calling i2c_put_adapter().
---
 drivers/gpu/drm/bridge/display-connector.c | 27 +++++++++++++++-------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/bridge/display-connector.c b/drivers/gpu/drm/bridge/display-connector.c
index 72bc508d4e6e..97f3a344a245 100644
--- a/drivers/gpu/drm/bridge/display-connector.c
+++ b/drivers/gpu/drm/bridge/display-connector.c
@@ -332,8 +332,11 @@ static int display_connector_probe(struct platform_device *pdev)
 		int ret;
 
 		ret = display_connector_get_supply(pdev, conn, "dp-pwr");
-		if (ret < 0)
-			return dev_err_probe(&pdev->dev, ret, "failed to get DP PWR regulator\n");
+		if (ret < 0) {
+			ret = dev_err_probe(&pdev->dev, ret,
+					    "failed to get DP PWR regulator\n");
+			goto err_put;
+		}
 	}
 
 	/* enable DDC */
@@ -345,19 +348,24 @@ static int display_connector_probe(struct platform_device *pdev)
 
 		if (IS_ERR(conn->ddc_en)) {
 			dev_err(&pdev->dev, "Couldn't get ddc-en gpio\n");
-			return PTR_ERR(conn->ddc_en);
+			ret = PTR_ERR(conn->ddc_en);
+			goto err_put;
 		}
 
 		ret = display_connector_get_supply(pdev, conn, "hdmi-pwr");
-		if (ret < 0)
-			return dev_err_probe(&pdev->dev, ret, "failed to get HDMI +5V Power regulator\n");
+		if (ret < 0) {
+			ret = dev_err_probe(
+				&pdev->dev, ret,
+				"failed to get HDMI +5V Power regulator\n");
+			goto err_put;
+		}
 	}
 
 	if (conn->supply) {
 		ret = regulator_enable(conn->supply);
 		if (ret) {
 			dev_err(&pdev->dev, "failed to enable PWR regulator: %d\n", ret);
-			return ret;
+			goto err_put;
 		}
 	}
 
@@ -383,6 +391,10 @@ static int display_connector_probe(struct platform_device *pdev)
 	drm_bridge_add(&conn->bridge);
 
 	return 0;
+
+err_put:
+	i2c_put_adapter(conn->bridge.ddc);
+	return ret;
 }
 
 static void display_connector_remove(struct platform_device *pdev)
@@ -397,8 +409,7 @@ static void display_connector_remove(struct platform_device *pdev)
 
 	drm_bridge_remove(&conn->bridge);
 
-	if (!IS_ERR(conn->bridge.ddc))
-		i2c_put_adapter(conn->bridge.ddc);
+	i2c_put_adapter(conn->bridge.ddc);
 }
 
 static const struct of_device_id display_connector_match[] = {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] drm/bridge: display-connector: implement the error path of .probe()
  2024-12-14  1:26 Joe Hattori
@ 2024-12-14 15:22 ` Dmitry Baryshkov
  2024-12-14 20:39 ` Laurent Pinchart
  2025-01-06  9:02 ` Dan Carpenter
  2 siblings, 0 replies; 7+ messages in thread
From: Dmitry Baryshkov @ 2024-12-14 15:22 UTC (permalink / raw)
  To: Joe Hattori
  Cc: andrzej.hajda, neil.armstrong, rfoss, Laurent.pinchart, jonas,
	jernej.skrabec, maarten.lankhorst, mripard, tzimmermann, airlied,
	simona, dri-devel

On Sat, Dec 14, 2024 at 10:26:52AM +0900, Joe Hattori wrote:
> Current implementation of .probe() leaks a reference of i2c_adapter.
> Implement an error path and call put_device() on the obtained
> i2c_adapter in it to fix this refcount bug.
> 
> This bug was found by an experimental static analysis tool that I am
> developing.
> 
> Fixes: 0c275c30176b ("drm/bridge: Add bridge driver for display connectors")
> Signed-off-by: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
> ---
> Changes in V2:
> - Omit the null check before calling i2c_put_adapter().
> ---
>  drivers/gpu/drm/bridge/display-connector.c | 27 +++++++++++++++-------
>  1 file changed, 19 insertions(+), 8 deletions(-)

Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

-- 
With best wishes
Dmitry

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] drm/bridge: display-connector: implement the error path of .probe()
  2024-12-14  1:26 Joe Hattori
  2024-12-14 15:22 ` Dmitry Baryshkov
@ 2024-12-14 20:39 ` Laurent Pinchart
  2025-01-06  9:02 ` Dan Carpenter
  2 siblings, 0 replies; 7+ messages in thread
From: Laurent Pinchart @ 2024-12-14 20:39 UTC (permalink / raw)
  To: Joe Hattori
  Cc: andrzej.hajda, neil.armstrong, rfoss, jonas, jernej.skrabec,
	maarten.lankhorst, mripard, tzimmermann, airlied, simona,
	dri-devel

Hi Joe,

Thank you for the patch.

On Sat, Dec 14, 2024 at 10:26:52AM +0900, Joe Hattori wrote:
> Current implementation of .probe() leaks a reference of i2c_adapter.
> Implement an error path and call put_device() on the obtained
> i2c_adapter in it to fix this refcount bug.
> 
> This bug was found by an experimental static analysis tool that I am
> developing.
> 
> Fixes: 0c275c30176b ("drm/bridge: Add bridge driver for display connectors")
> Signed-off-by: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
> ---
> Changes in V2:
> - Omit the null check before calling i2c_put_adapter().
> ---
>  drivers/gpu/drm/bridge/display-connector.c | 27 +++++++++++++++-------
>  1 file changed, 19 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/bridge/display-connector.c b/drivers/gpu/drm/bridge/display-connector.c
> index 72bc508d4e6e..97f3a344a245 100644
> --- a/drivers/gpu/drm/bridge/display-connector.c
> +++ b/drivers/gpu/drm/bridge/display-connector.c
> @@ -332,8 +332,11 @@ static int display_connector_probe(struct platform_device *pdev)
>  		int ret;
>  
>  		ret = display_connector_get_supply(pdev, conn, "dp-pwr");
> -		if (ret < 0)
> -			return dev_err_probe(&pdev->dev, ret, "failed to get DP PWR regulator\n");
> +		if (ret < 0) {
> +			ret = dev_err_probe(&pdev->dev, ret,
> +					    "failed to get DP PWR regulator\n");
> +			goto err_put;
> +		}
>  	}
>  
>  	/* enable DDC */
> @@ -345,19 +348,24 @@ static int display_connector_probe(struct platform_device *pdev)
>  
>  		if (IS_ERR(conn->ddc_en)) {
>  			dev_err(&pdev->dev, "Couldn't get ddc-en gpio\n");
> -			return PTR_ERR(conn->ddc_en);
> +			ret = PTR_ERR(conn->ddc_en);
> +			goto err_put;
>  		}
>  
>  		ret = display_connector_get_supply(pdev, conn, "hdmi-pwr");
> -		if (ret < 0)
> -			return dev_err_probe(&pdev->dev, ret, "failed to get HDMI +5V Power regulator\n");
> +		if (ret < 0) {
> +			ret = dev_err_probe(
> +				&pdev->dev, ret,
> +				"failed to get HDMI +5V Power regulator\n");

			ret = dev_err_probe(&pdev->dev, ret,
					    "failed to get HDMI +5V Power regulator\n");

with that,

Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>

> +			goto err_put;
> +		}
>  	}
>  
>  	if (conn->supply) {
>  		ret = regulator_enable(conn->supply);
>  		if (ret) {
>  			dev_err(&pdev->dev, "failed to enable PWR regulator: %d\n", ret);
> -			return ret;
> +			goto err_put;
>  		}
>  	}
>  
> @@ -383,6 +391,10 @@ static int display_connector_probe(struct platform_device *pdev)
>  	drm_bridge_add(&conn->bridge);
>  
>  	return 0;
> +
> +err_put:
> +	i2c_put_adapter(conn->bridge.ddc);
> +	return ret;
>  }
>  
>  static void display_connector_remove(struct platform_device *pdev)
> @@ -397,8 +409,7 @@ static void display_connector_remove(struct platform_device *pdev)
>  
>  	drm_bridge_remove(&conn->bridge);
>  
> -	if (!IS_ERR(conn->bridge.ddc))
> -		i2c_put_adapter(conn->bridge.ddc);
> +	i2c_put_adapter(conn->bridge.ddc);
>  }
>  
>  static const struct of_device_id display_connector_match[] = {

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] drm/bridge: display-connector: implement the error path of .probe()
@ 2024-12-21  3:39 kernel test robot
  0 siblings, 0 replies; 7+ messages in thread
From: kernel test robot @ 2024-12-21  3:39 UTC (permalink / raw)
  To: oe-kbuild; +Cc: lkp, Dan Carpenter

BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
In-Reply-To: <20241214012652.2104807-1-joe@pf.is.s.u-tokyo.ac.jp>
References: <20241214012652.2104807-1-joe@pf.is.s.u-tokyo.ac.jp>
TO: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
TO: andrzej.hajda@intel.com
TO: neil.armstrong@linaro.org
TO: rfoss@kernel.org
TO: Laurent.pinchart@ideasonboard.com
TO: jonas@kwiboo.se
TO: jernej.skrabec@gmail.com
TO: maarten.lankhorst@linux.intel.com
TO: mripard@kernel.org
TO: tzimmermann@suse.de
TO: airlied@gmail.com
TO: simona@ffwll.ch
CC: dri-devel@lists.freedesktop.org
CC: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>

Hi Joe,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on drm-misc/drm-misc-next v6.13-rc3 next-20241220]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Joe-Hattori/drm-bridge-display-connector-implement-the-error-path-of-probe/20241214-230605
base:   linus/master
patch link:    https://lore.kernel.org/r/20241214012652.2104807-1-joe%40pf.is.s.u-tokyo.ac.jp
patch subject: [PATCH v2] drm/bridge: display-connector: implement the error path of .probe()
:::::: branch date: 7 days ago
:::::: commit date: 7 days ago
config: x86_64-randconfig-161-20241220 (https://download.01.org/0day-ci/archive/20241221/202412211150.heCXmLwf-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202412211150.heCXmLwf-lkp@intel.com/

smatch warnings:
drivers/gpu/drm/bridge/display-connector.c:397 display_connector_probe() error: uninitialized symbol 'ret'.

vim +/ret +397 drivers/gpu/drm/bridge/display-connector.c

6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  204  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  205  static int display_connector_probe(struct platform_device *pdev)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  206  {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  207  	struct display_connector *conn;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  208  	unsigned int type;
189723fbe9aca18 Dan Carpenter        2021-10-13  209  	const char *label = NULL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  210  	int ret;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  211  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  212  	conn = devm_kzalloc(&pdev->dev, sizeof(*conn), GFP_KERNEL);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  213  	if (!conn)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  214  		return -ENOMEM;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  215  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  216  	platform_set_drvdata(pdev, conn);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  217  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  218  	type = (uintptr_t)of_device_get_match_data(&pdev->dev);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  219  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  220  	/* Get the exact connector type. */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  221  	switch (type) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  222  	case DRM_MODE_CONNECTOR_DVII: {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  223  		bool analog, digital;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  224  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  225  		analog = of_property_read_bool(pdev->dev.of_node, "analog");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  226  		digital = of_property_read_bool(pdev->dev.of_node, "digital");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  227  		if (analog && !digital) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  228  			conn->bridge.type = DRM_MODE_CONNECTOR_DVIA;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  229  		} else if (!analog && digital) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  230  			conn->bridge.type = DRM_MODE_CONNECTOR_DVID;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  231  		} else if (analog && digital) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  232  			conn->bridge.type = DRM_MODE_CONNECTOR_DVII;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  233  		} else {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  234  			dev_err(&pdev->dev, "DVI connector with no type\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  235  			return -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  236  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  237  		break;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  238  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  239  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  240  	case DRM_MODE_CONNECTOR_HDMIA: {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  241  		const char *hdmi_type;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  242  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  243  		ret = of_property_read_string(pdev->dev.of_node, "type",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  244  					      &hdmi_type);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  245  		if (ret < 0) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  246  			dev_err(&pdev->dev, "HDMI connector with no type\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  247  			return -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  248  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  249  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  250  		if (!strcmp(hdmi_type, "a") || !strcmp(hdmi_type, "c") ||
0c275c30176b2e7 Laurent Pinchart     2020-02-26  251  		    !strcmp(hdmi_type, "d") || !strcmp(hdmi_type, "e")) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  252  			conn->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  253  		} else if (!strcmp(hdmi_type, "b")) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  254  			conn->bridge.type = DRM_MODE_CONNECTOR_HDMIB;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  255  		} else {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  256  			dev_err(&pdev->dev,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  257  				"Unsupported HDMI connector type '%s'\n",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  258  				hdmi_type);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  259  			return -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  260  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  261  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  262  		break;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  263  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  264  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  265  	default:
0c275c30176b2e7 Laurent Pinchart     2020-02-26  266  		conn->bridge.type = type;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  267  		break;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  268  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  269  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  270  	/* All the supported connector types support interlaced modes. */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  271  	conn->bridge.interlace_allowed = true;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  272  
d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  273  	if (type == DRM_MODE_CONNECTOR_HDMIA ||
d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  274  	    type == DRM_MODE_CONNECTOR_DisplayPort)
d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  275  		conn->bridge.ycbcr_420_allowed = true;
d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  276  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  277  	/* Get the optional connector label. */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  278  	of_property_read_string(pdev->dev.of_node, "label", &label);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  279  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  280  	/*
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  281  	 * Get the HPD GPIO for DVI, HDMI and DP connectors. If the GPIO can provide
0c275c30176b2e7 Laurent Pinchart     2020-02-26  282  	 * edge interrupts, register an interrupt handler.
0c275c30176b2e7 Laurent Pinchart     2020-02-26  283  	 */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  284  	if (type == DRM_MODE_CONNECTOR_DVII ||
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  285  	    type == DRM_MODE_CONNECTOR_HDMIA ||
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  286  	    type == DRM_MODE_CONNECTOR_DisplayPort) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  287  		conn->hpd_gpio = devm_gpiod_get_optional(&pdev->dev, "hpd",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  288  							 GPIOD_IN);
ed8f4e1002781c4 Ye Xingchen          2023-03-22  289  		if (IS_ERR(conn->hpd_gpio))
ed8f4e1002781c4 Ye Xingchen          2023-03-22  290  			return dev_err_probe(&pdev->dev, PTR_ERR(conn->hpd_gpio),
0c275c30176b2e7 Laurent Pinchart     2020-02-26  291  					     "Unable to retrieve HPD GPIO\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  292  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  293  		conn->hpd_irq = gpiod_to_irq(conn->hpd_gpio);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  294  	} else {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  295  		conn->hpd_irq = -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  296  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  297  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  298  	if (conn->hpd_irq >= 0) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  299  		ret = devm_request_threaded_irq(&pdev->dev, conn->hpd_irq,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  300  						NULL, display_connector_hpd_irq,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  301  						IRQF_TRIGGER_RISING |
0c275c30176b2e7 Laurent Pinchart     2020-02-26  302  						IRQF_TRIGGER_FALLING |
0c275c30176b2e7 Laurent Pinchart     2020-02-26  303  						IRQF_ONESHOT,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  304  						"HPD", conn);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  305  		if (ret) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  306  			dev_info(&pdev->dev,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  307  				 "Failed to request HPD edge interrupt, falling back to polling\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  308  			conn->hpd_irq = -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  309  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  310  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  311  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  312  	/* Retrieve the DDC I2C adapter for DVI, HDMI and VGA connectors. */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  313  	if (type == DRM_MODE_CONNECTOR_DVII ||
0c275c30176b2e7 Laurent Pinchart     2020-02-26  314  	    type == DRM_MODE_CONNECTOR_HDMIA ||
0c275c30176b2e7 Laurent Pinchart     2020-02-26  315  	    type == DRM_MODE_CONNECTOR_VGA) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  316  		struct device_node *phandle;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  317  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  318  		phandle = of_parse_phandle(pdev->dev.of_node, "ddc-i2c-bus", 0);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  319  		if (phandle) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  320  			conn->bridge.ddc = of_get_i2c_adapter_by_node(phandle);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  321  			of_node_put(phandle);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  322  			if (!conn->bridge.ddc)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  323  				return -EPROBE_DEFER;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  324  		} else {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  325  			dev_dbg(&pdev->dev,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  326  				"No I2C bus specified, disabling EDID readout\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  327  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  328  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  329  
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  330  	/* Get the DP PWR for DP connector. */
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  331  	if (type == DRM_MODE_CONNECTOR_DisplayPort) {
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  332  		int ret;
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  333  
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  334  		ret = display_connector_get_supply(pdev, conn, "dp-pwr");
a7afd1756ad7c06 Joe Hattori          2024-12-14  335  		if (ret < 0) {
a7afd1756ad7c06 Joe Hattori          2024-12-14  336  			ret = dev_err_probe(&pdev->dev, ret,
a7afd1756ad7c06 Joe Hattori          2024-12-14  337  					    "failed to get DP PWR regulator\n");
a7afd1756ad7c06 Joe Hattori          2024-12-14  338  			goto err_put;
a7afd1756ad7c06 Joe Hattori          2024-12-14  339  		}
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  340  	}
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  341  
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  342  	/* enable DDC */
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  343  	if (type == DRM_MODE_CONNECTOR_HDMIA) {
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  344  		int ret;
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  345  
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  346  		conn->ddc_en = devm_gpiod_get_optional(&pdev->dev, "ddc-en",
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  347  						       GPIOD_OUT_HIGH);
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  348  
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  349  		if (IS_ERR(conn->ddc_en)) {
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  350  			dev_err(&pdev->dev, "Couldn't get ddc-en gpio\n");
a7afd1756ad7c06 Joe Hattori          2024-12-14  351  			ret = PTR_ERR(conn->ddc_en);
a7afd1756ad7c06 Joe Hattori          2024-12-14  352  			goto err_put;
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  353  		}
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  354  
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  355  		ret = display_connector_get_supply(pdev, conn, "hdmi-pwr");
a7afd1756ad7c06 Joe Hattori          2024-12-14  356  		if (ret < 0) {
a7afd1756ad7c06 Joe Hattori          2024-12-14  357  			ret = dev_err_probe(
a7afd1756ad7c06 Joe Hattori          2024-12-14  358  				&pdev->dev, ret,
a7afd1756ad7c06 Joe Hattori          2024-12-14  359  				"failed to get HDMI +5V Power regulator\n");
a7afd1756ad7c06 Joe Hattori          2024-12-14  360  			goto err_put;
a7afd1756ad7c06 Joe Hattori          2024-12-14  361  		}
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  362  	}
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  363  
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  364  	if (conn->supply) {
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  365  		ret = regulator_enable(conn->supply);
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  366  		if (ret) {
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  367  			dev_err(&pdev->dev, "failed to enable PWR regulator: %d\n", ret);
a7afd1756ad7c06 Joe Hattori          2024-12-14  368  			goto err_put;
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  369  		}
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  370  	}
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  371  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  372  	conn->bridge.funcs = &display_connector_bridge_funcs;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  373  	conn->bridge.of_node = pdev->dev.of_node;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  374  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  375  	if (conn->bridge.ddc)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  376  		conn->bridge.ops |= DRM_BRIDGE_OP_EDID
0c275c30176b2e7 Laurent Pinchart     2020-02-26  377  				 |  DRM_BRIDGE_OP_DETECT;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  378  	if (conn->hpd_gpio)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  379  		conn->bridge.ops |= DRM_BRIDGE_OP_DETECT;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  380  	if (conn->hpd_irq >= 0)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  381  		conn->bridge.ops |= DRM_BRIDGE_OP_HPD;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  382  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  383  	dev_dbg(&pdev->dev,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  384  		"Found %s display connector '%s' %s DDC bus and %s HPD GPIO (ops 0x%x)\n",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  385  		drm_get_connector_type_name(conn->bridge.type),
0c275c30176b2e7 Laurent Pinchart     2020-02-26  386  		label ? label : "<unlabelled>",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  387  		conn->bridge.ddc ? "with" : "without",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  388  		conn->hpd_gpio ? "with" : "without",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  389  		conn->bridge.ops);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  390  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  391  	drm_bridge_add(&conn->bridge);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  392  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  393  	return 0;
a7afd1756ad7c06 Joe Hattori          2024-12-14  394  
a7afd1756ad7c06 Joe Hattori          2024-12-14  395  err_put:
a7afd1756ad7c06 Joe Hattori          2024-12-14  396  	i2c_put_adapter(conn->bridge.ddc);
a7afd1756ad7c06 Joe Hattori          2024-12-14 @397  	return ret;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  398  }
0c275c30176b2e7 Laurent Pinchart     2020-02-26  399  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] drm/bridge: display-connector: implement the error path of .probe()
@ 2024-12-21 13:49 kernel test robot
  0 siblings, 0 replies; 7+ messages in thread
From: kernel test robot @ 2024-12-21 13:49 UTC (permalink / raw)
  To: oe-kbuild; +Cc: lkp, Dan Carpenter

BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
In-Reply-To: <20241214012652.2104807-1-joe@pf.is.s.u-tokyo.ac.jp>
References: <20241214012652.2104807-1-joe@pf.is.s.u-tokyo.ac.jp>
TO: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
TO: andrzej.hajda@intel.com
TO: neil.armstrong@linaro.org
TO: rfoss@kernel.org
TO: Laurent.pinchart@ideasonboard.com
TO: jonas@kwiboo.se
TO: jernej.skrabec@gmail.com
TO: maarten.lankhorst@linux.intel.com
TO: mripard@kernel.org
TO: tzimmermann@suse.de
TO: airlied@gmail.com
TO: simona@ffwll.ch
CC: dri-devel@lists.freedesktop.org
CC: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>

Hi Joe,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on drm-misc/drm-misc-next v6.13-rc3 next-20241220]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Joe-Hattori/drm-bridge-display-connector-implement-the-error-path-of-probe/20241214-230605
base:   linus/master
patch link:    https://lore.kernel.org/r/20241214012652.2104807-1-joe%40pf.is.s.u-tokyo.ac.jp
patch subject: [PATCH v2] drm/bridge: display-connector: implement the error path of .probe()
:::::: branch date: 7 days ago
:::::: commit date: 7 days ago
config: x86_64-randconfig-161-20241220 (https://download.01.org/0day-ci/archive/20241221/202412212129.OT9Bt8p0-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202412212129.OT9Bt8p0-lkp@intel.com/

smatch warnings:
drivers/gpu/drm/bridge/display-connector.c:397 display_connector_probe() error: uninitialized symbol 'ret'.

vim +/ret +397 drivers/gpu/drm/bridge/display-connector.c

6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  204  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  205  static int display_connector_probe(struct platform_device *pdev)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  206  {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  207  	struct display_connector *conn;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  208  	unsigned int type;
189723fbe9aca18 Dan Carpenter        2021-10-13  209  	const char *label = NULL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  210  	int ret;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  211  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  212  	conn = devm_kzalloc(&pdev->dev, sizeof(*conn), GFP_KERNEL);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  213  	if (!conn)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  214  		return -ENOMEM;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  215  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  216  	platform_set_drvdata(pdev, conn);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  217  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  218  	type = (uintptr_t)of_device_get_match_data(&pdev->dev);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  219  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  220  	/* Get the exact connector type. */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  221  	switch (type) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  222  	case DRM_MODE_CONNECTOR_DVII: {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  223  		bool analog, digital;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  224  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  225  		analog = of_property_read_bool(pdev->dev.of_node, "analog");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  226  		digital = of_property_read_bool(pdev->dev.of_node, "digital");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  227  		if (analog && !digital) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  228  			conn->bridge.type = DRM_MODE_CONNECTOR_DVIA;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  229  		} else if (!analog && digital) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  230  			conn->bridge.type = DRM_MODE_CONNECTOR_DVID;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  231  		} else if (analog && digital) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  232  			conn->bridge.type = DRM_MODE_CONNECTOR_DVII;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  233  		} else {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  234  			dev_err(&pdev->dev, "DVI connector with no type\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  235  			return -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  236  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  237  		break;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  238  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  239  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  240  	case DRM_MODE_CONNECTOR_HDMIA: {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  241  		const char *hdmi_type;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  242  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  243  		ret = of_property_read_string(pdev->dev.of_node, "type",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  244  					      &hdmi_type);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  245  		if (ret < 0) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  246  			dev_err(&pdev->dev, "HDMI connector with no type\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  247  			return -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  248  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  249  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  250  		if (!strcmp(hdmi_type, "a") || !strcmp(hdmi_type, "c") ||
0c275c30176b2e7 Laurent Pinchart     2020-02-26  251  		    !strcmp(hdmi_type, "d") || !strcmp(hdmi_type, "e")) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  252  			conn->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  253  		} else if (!strcmp(hdmi_type, "b")) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  254  			conn->bridge.type = DRM_MODE_CONNECTOR_HDMIB;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  255  		} else {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  256  			dev_err(&pdev->dev,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  257  				"Unsupported HDMI connector type '%s'\n",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  258  				hdmi_type);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  259  			return -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  260  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  261  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  262  		break;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  263  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  264  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  265  	default:
0c275c30176b2e7 Laurent Pinchart     2020-02-26  266  		conn->bridge.type = type;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  267  		break;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  268  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  269  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  270  	/* All the supported connector types support interlaced modes. */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  271  	conn->bridge.interlace_allowed = true;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  272  
d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  273  	if (type == DRM_MODE_CONNECTOR_HDMIA ||
d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  274  	    type == DRM_MODE_CONNECTOR_DisplayPort)
d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  275  		conn->bridge.ycbcr_420_allowed = true;
d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  276  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  277  	/* Get the optional connector label. */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  278  	of_property_read_string(pdev->dev.of_node, "label", &label);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  279  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  280  	/*
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  281  	 * Get the HPD GPIO for DVI, HDMI and DP connectors. If the GPIO can provide
0c275c30176b2e7 Laurent Pinchart     2020-02-26  282  	 * edge interrupts, register an interrupt handler.
0c275c30176b2e7 Laurent Pinchart     2020-02-26  283  	 */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  284  	if (type == DRM_MODE_CONNECTOR_DVII ||
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  285  	    type == DRM_MODE_CONNECTOR_HDMIA ||
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  286  	    type == DRM_MODE_CONNECTOR_DisplayPort) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  287  		conn->hpd_gpio = devm_gpiod_get_optional(&pdev->dev, "hpd",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  288  							 GPIOD_IN);
ed8f4e1002781c4 Ye Xingchen          2023-03-22  289  		if (IS_ERR(conn->hpd_gpio))
ed8f4e1002781c4 Ye Xingchen          2023-03-22  290  			return dev_err_probe(&pdev->dev, PTR_ERR(conn->hpd_gpio),
0c275c30176b2e7 Laurent Pinchart     2020-02-26  291  					     "Unable to retrieve HPD GPIO\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  292  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  293  		conn->hpd_irq = gpiod_to_irq(conn->hpd_gpio);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  294  	} else {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  295  		conn->hpd_irq = -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  296  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  297  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  298  	if (conn->hpd_irq >= 0) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  299  		ret = devm_request_threaded_irq(&pdev->dev, conn->hpd_irq,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  300  						NULL, display_connector_hpd_irq,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  301  						IRQF_TRIGGER_RISING |
0c275c30176b2e7 Laurent Pinchart     2020-02-26  302  						IRQF_TRIGGER_FALLING |
0c275c30176b2e7 Laurent Pinchart     2020-02-26  303  						IRQF_ONESHOT,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  304  						"HPD", conn);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  305  		if (ret) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  306  			dev_info(&pdev->dev,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  307  				 "Failed to request HPD edge interrupt, falling back to polling\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  308  			conn->hpd_irq = -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  309  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  310  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  311  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  312  	/* Retrieve the DDC I2C adapter for DVI, HDMI and VGA connectors. */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  313  	if (type == DRM_MODE_CONNECTOR_DVII ||
0c275c30176b2e7 Laurent Pinchart     2020-02-26  314  	    type == DRM_MODE_CONNECTOR_HDMIA ||
0c275c30176b2e7 Laurent Pinchart     2020-02-26  315  	    type == DRM_MODE_CONNECTOR_VGA) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  316  		struct device_node *phandle;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  317  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  318  		phandle = of_parse_phandle(pdev->dev.of_node, "ddc-i2c-bus", 0);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  319  		if (phandle) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  320  			conn->bridge.ddc = of_get_i2c_adapter_by_node(phandle);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  321  			of_node_put(phandle);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  322  			if (!conn->bridge.ddc)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  323  				return -EPROBE_DEFER;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  324  		} else {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  325  			dev_dbg(&pdev->dev,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  326  				"No I2C bus specified, disabling EDID readout\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  327  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  328  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  329  
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  330  	/* Get the DP PWR for DP connector. */
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  331  	if (type == DRM_MODE_CONNECTOR_DisplayPort) {
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  332  		int ret;
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  333  
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  334  		ret = display_connector_get_supply(pdev, conn, "dp-pwr");
a7afd1756ad7c06 Joe Hattori          2024-12-14  335  		if (ret < 0) {
a7afd1756ad7c06 Joe Hattori          2024-12-14  336  			ret = dev_err_probe(&pdev->dev, ret,
a7afd1756ad7c06 Joe Hattori          2024-12-14  337  					    "failed to get DP PWR regulator\n");
a7afd1756ad7c06 Joe Hattori          2024-12-14  338  			goto err_put;
a7afd1756ad7c06 Joe Hattori          2024-12-14  339  		}
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  340  	}
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  341  
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  342  	/* enable DDC */
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  343  	if (type == DRM_MODE_CONNECTOR_HDMIA) {
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  344  		int ret;
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  345  
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  346  		conn->ddc_en = devm_gpiod_get_optional(&pdev->dev, "ddc-en",
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  347  						       GPIOD_OUT_HIGH);
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  348  
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  349  		if (IS_ERR(conn->ddc_en)) {
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  350  			dev_err(&pdev->dev, "Couldn't get ddc-en gpio\n");
a7afd1756ad7c06 Joe Hattori          2024-12-14  351  			ret = PTR_ERR(conn->ddc_en);
a7afd1756ad7c06 Joe Hattori          2024-12-14  352  			goto err_put;
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  353  		}
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  354  
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  355  		ret = display_connector_get_supply(pdev, conn, "hdmi-pwr");
a7afd1756ad7c06 Joe Hattori          2024-12-14  356  		if (ret < 0) {
a7afd1756ad7c06 Joe Hattori          2024-12-14  357  			ret = dev_err_probe(
a7afd1756ad7c06 Joe Hattori          2024-12-14  358  				&pdev->dev, ret,
a7afd1756ad7c06 Joe Hattori          2024-12-14  359  				"failed to get HDMI +5V Power regulator\n");
a7afd1756ad7c06 Joe Hattori          2024-12-14  360  			goto err_put;
a7afd1756ad7c06 Joe Hattori          2024-12-14  361  		}
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  362  	}
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  363  
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  364  	if (conn->supply) {
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  365  		ret = regulator_enable(conn->supply);
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  366  		if (ret) {
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  367  			dev_err(&pdev->dev, "failed to enable PWR regulator: %d\n", ret);
a7afd1756ad7c06 Joe Hattori          2024-12-14  368  			goto err_put;
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  369  		}
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  370  	}
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  371  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  372  	conn->bridge.funcs = &display_connector_bridge_funcs;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  373  	conn->bridge.of_node = pdev->dev.of_node;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  374  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  375  	if (conn->bridge.ddc)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  376  		conn->bridge.ops |= DRM_BRIDGE_OP_EDID
0c275c30176b2e7 Laurent Pinchart     2020-02-26  377  				 |  DRM_BRIDGE_OP_DETECT;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  378  	if (conn->hpd_gpio)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  379  		conn->bridge.ops |= DRM_BRIDGE_OP_DETECT;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  380  	if (conn->hpd_irq >= 0)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  381  		conn->bridge.ops |= DRM_BRIDGE_OP_HPD;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  382  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  383  	dev_dbg(&pdev->dev,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  384  		"Found %s display connector '%s' %s DDC bus and %s HPD GPIO (ops 0x%x)\n",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  385  		drm_get_connector_type_name(conn->bridge.type),
0c275c30176b2e7 Laurent Pinchart     2020-02-26  386  		label ? label : "<unlabelled>",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  387  		conn->bridge.ddc ? "with" : "without",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  388  		conn->hpd_gpio ? "with" : "without",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  389  		conn->bridge.ops);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  390  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  391  	drm_bridge_add(&conn->bridge);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  392  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  393  	return 0;
a7afd1756ad7c06 Joe Hattori          2024-12-14  394  
a7afd1756ad7c06 Joe Hattori          2024-12-14  395  err_put:
a7afd1756ad7c06 Joe Hattori          2024-12-14  396  	i2c_put_adapter(conn->bridge.ddc);
a7afd1756ad7c06 Joe Hattori          2024-12-14 @397  	return ret;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  398  }
0c275c30176b2e7 Laurent Pinchart     2020-02-26  399  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] drm/bridge: display-connector: implement the error path of .probe()
  2024-12-14  1:26 Joe Hattori
  2024-12-14 15:22 ` Dmitry Baryshkov
  2024-12-14 20:39 ` Laurent Pinchart
@ 2025-01-06  9:02 ` Dan Carpenter
  2025-01-31  5:21   ` Joe Hattori
  2 siblings, 1 reply; 7+ messages in thread
From: Dan Carpenter @ 2025-01-06  9:02 UTC (permalink / raw)
  To: oe-kbuild, Joe Hattori, andrzej.hajda, neil.armstrong, rfoss,
	Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
	mripard, tzimmermann, airlied, simona
  Cc: lkp, oe-kbuild-all, dri-devel, Joe Hattori

Hi Joe,

kernel test robot noticed the following build warnings:

https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Joe-Hattori/drm-bridge-display-connector-implement-the-error-path-of-probe/20241214-230605
base:   linus/master
patch link:    https://lore.kernel.org/r/20241214012652.2104807-1-joe%40pf.is.s.u-tokyo.ac.jp
patch subject: [PATCH v2] drm/bridge: display-connector: implement the error path of .probe()
config: x86_64-randconfig-161-20241220 (https://download.01.org/0day-ci/archive/20241221/202412212129.OT9Bt8p0-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202412212129.OT9Bt8p0-lkp@intel.com/

smatch warnings:
drivers/gpu/drm/bridge/display-connector.c:397 display_connector_probe() error: uninitialized symbol 'ret'.

vim +/ret +397 drivers/gpu/drm/bridge/display-connector.c

0c275c30176b2e7 Laurent Pinchart     2020-02-26  205  static int display_connector_probe(struct platform_device *pdev)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  206  {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  207  	struct display_connector *conn;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  208  	unsigned int type;
189723fbe9aca18 Dan Carpenter        2021-10-13  209  	const char *label = NULL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  210  	int ret;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  211  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  212  	conn = devm_kzalloc(&pdev->dev, sizeof(*conn), GFP_KERNEL);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  213  	if (!conn)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  214  		return -ENOMEM;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  215  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  216  	platform_set_drvdata(pdev, conn);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  217  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  218  	type = (uintptr_t)of_device_get_match_data(&pdev->dev);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  219  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  220  	/* Get the exact connector type. */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  221  	switch (type) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  222  	case DRM_MODE_CONNECTOR_DVII: {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  223  		bool analog, digital;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  224  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  225  		analog = of_property_read_bool(pdev->dev.of_node, "analog");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  226  		digital = of_property_read_bool(pdev->dev.of_node, "digital");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  227  		if (analog && !digital) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  228  			conn->bridge.type = DRM_MODE_CONNECTOR_DVIA;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  229  		} else if (!analog && digital) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  230  			conn->bridge.type = DRM_MODE_CONNECTOR_DVID;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  231  		} else if (analog && digital) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  232  			conn->bridge.type = DRM_MODE_CONNECTOR_DVII;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  233  		} else {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  234  			dev_err(&pdev->dev, "DVI connector with no type\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  235  			return -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  236  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  237  		break;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  238  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  239  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  240  	case DRM_MODE_CONNECTOR_HDMIA: {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  241  		const char *hdmi_type;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  242  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  243  		ret = of_property_read_string(pdev->dev.of_node, "type",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  244  					      &hdmi_type);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  245  		if (ret < 0) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  246  			dev_err(&pdev->dev, "HDMI connector with no type\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  247  			return -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  248  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  249  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  250  		if (!strcmp(hdmi_type, "a") || !strcmp(hdmi_type, "c") ||
0c275c30176b2e7 Laurent Pinchart     2020-02-26  251  		    !strcmp(hdmi_type, "d") || !strcmp(hdmi_type, "e")) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  252  			conn->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  253  		} else if (!strcmp(hdmi_type, "b")) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  254  			conn->bridge.type = DRM_MODE_CONNECTOR_HDMIB;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  255  		} else {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  256  			dev_err(&pdev->dev,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  257  				"Unsupported HDMI connector type '%s'\n",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  258  				hdmi_type);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  259  			return -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  260  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  261  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  262  		break;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  263  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  264  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  265  	default:
0c275c30176b2e7 Laurent Pinchart     2020-02-26  266  		conn->bridge.type = type;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  267  		break;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  268  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  269  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  270  	/* All the supported connector types support interlaced modes. */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  271  	conn->bridge.interlace_allowed = true;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  272  
d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  273  	if (type == DRM_MODE_CONNECTOR_HDMIA ||
d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  274  	    type == DRM_MODE_CONNECTOR_DisplayPort)
d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  275  		conn->bridge.ycbcr_420_allowed = true;
d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  276  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  277  	/* Get the optional connector label. */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  278  	of_property_read_string(pdev->dev.of_node, "label", &label);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  279  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  280  	/*
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  281  	 * Get the HPD GPIO for DVI, HDMI and DP connectors. If the GPIO can provide
0c275c30176b2e7 Laurent Pinchart     2020-02-26  282  	 * edge interrupts, register an interrupt handler.
0c275c30176b2e7 Laurent Pinchart     2020-02-26  283  	 */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  284  	if (type == DRM_MODE_CONNECTOR_DVII ||
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  285  	    type == DRM_MODE_CONNECTOR_HDMIA ||
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  286  	    type == DRM_MODE_CONNECTOR_DisplayPort) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  287  		conn->hpd_gpio = devm_gpiod_get_optional(&pdev->dev, "hpd",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  288  							 GPIOD_IN);
ed8f4e1002781c4 Ye Xingchen          2023-03-22  289  		if (IS_ERR(conn->hpd_gpio))
ed8f4e1002781c4 Ye Xingchen          2023-03-22  290  			return dev_err_probe(&pdev->dev, PTR_ERR(conn->hpd_gpio),
0c275c30176b2e7 Laurent Pinchart     2020-02-26  291  					     "Unable to retrieve HPD GPIO\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  292  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  293  		conn->hpd_irq = gpiod_to_irq(conn->hpd_gpio);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  294  	} else {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  295  		conn->hpd_irq = -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  296  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  297  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  298  	if (conn->hpd_irq >= 0) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  299  		ret = devm_request_threaded_irq(&pdev->dev, conn->hpd_irq,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  300  						NULL, display_connector_hpd_irq,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  301  						IRQF_TRIGGER_RISING |
0c275c30176b2e7 Laurent Pinchart     2020-02-26  302  						IRQF_TRIGGER_FALLING |
0c275c30176b2e7 Laurent Pinchart     2020-02-26  303  						IRQF_ONESHOT,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  304  						"HPD", conn);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  305  		if (ret) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  306  			dev_info(&pdev->dev,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  307  				 "Failed to request HPD edge interrupt, falling back to polling\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  308  			conn->hpd_irq = -EINVAL;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  309  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  310  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  311  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  312  	/* Retrieve the DDC I2C adapter for DVI, HDMI and VGA connectors. */
0c275c30176b2e7 Laurent Pinchart     2020-02-26  313  	if (type == DRM_MODE_CONNECTOR_DVII ||
0c275c30176b2e7 Laurent Pinchart     2020-02-26  314  	    type == DRM_MODE_CONNECTOR_HDMIA ||
0c275c30176b2e7 Laurent Pinchart     2020-02-26  315  	    type == DRM_MODE_CONNECTOR_VGA) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  316  		struct device_node *phandle;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  317  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  318  		phandle = of_parse_phandle(pdev->dev.of_node, "ddc-i2c-bus", 0);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  319  		if (phandle) {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  320  			conn->bridge.ddc = of_get_i2c_adapter_by_node(phandle);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  321  			of_node_put(phandle);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  322  			if (!conn->bridge.ddc)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  323  				return -EPROBE_DEFER;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  324  		} else {
0c275c30176b2e7 Laurent Pinchart     2020-02-26  325  			dev_dbg(&pdev->dev,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  326  				"No I2C bus specified, disabling EDID readout\n");
0c275c30176b2e7 Laurent Pinchart     2020-02-26  327  		}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  328  	}
0c275c30176b2e7 Laurent Pinchart     2020-02-26  329  
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  330  	/* Get the DP PWR for DP connector. */
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  331  	if (type == DRM_MODE_CONNECTOR_DisplayPort) {
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  332  		int ret;

Shadow variable.

2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  333  
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  334  		ret = display_connector_get_supply(pdev, conn, "dp-pwr");
a7afd1756ad7c06 Joe Hattori          2024-12-14  335  		if (ret < 0) {
a7afd1756ad7c06 Joe Hattori          2024-12-14  336  			ret = dev_err_probe(&pdev->dev, ret,
a7afd1756ad7c06 Joe Hattori          2024-12-14  337  					    "failed to get DP PWR regulator\n");
a7afd1756ad7c06 Joe Hattori          2024-12-14  338  			goto err_put;
a7afd1756ad7c06 Joe Hattori          2024-12-14  339  		}
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  340  	}
2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  341  
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  342  	/* enable DDC */
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  343  	if (type == DRM_MODE_CONNECTOR_HDMIA) {
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  344  		int ret;

This "ret" shadows an earlier declaration and leads to an error code bug.

I feel like say that ret is one of those variables which should *always*
be declared with function scope even if we don't return the error code.
These sorts of bugs aren't super common.  We probably only get a couple
per year.

6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  345  
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  346  		conn->ddc_en = devm_gpiod_get_optional(&pdev->dev, "ddc-en",
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  347  						       GPIOD_OUT_HIGH);
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  348  
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  349  		if (IS_ERR(conn->ddc_en)) {
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  350  			dev_err(&pdev->dev, "Couldn't get ddc-en gpio\n");
a7afd1756ad7c06 Joe Hattori          2024-12-14  351  			ret = PTR_ERR(conn->ddc_en);
a7afd1756ad7c06 Joe Hattori          2024-12-14  352  			goto err_put;
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  353  		}
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  354  
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  355  		ret = display_connector_get_supply(pdev, conn, "hdmi-pwr");
a7afd1756ad7c06 Joe Hattori          2024-12-14  356  		if (ret < 0) {
a7afd1756ad7c06 Joe Hattori          2024-12-14  357  			ret = dev_err_probe(
a7afd1756ad7c06 Joe Hattori          2024-12-14  358  				&pdev->dev, ret,
a7afd1756ad7c06 Joe Hattori          2024-12-14  359  				"failed to get HDMI +5V Power regulator\n");
a7afd1756ad7c06 Joe Hattori          2024-12-14  360  			goto err_put;
a7afd1756ad7c06 Joe Hattori          2024-12-14  361  		}
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  362  	}
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  363  
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  364  	if (conn->supply) {
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  365  		ret = regulator_enable(conn->supply);
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  366  		if (ret) {
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  367  			dev_err(&pdev->dev, "failed to enable PWR regulator: %d\n", ret);
a7afd1756ad7c06 Joe Hattori          2024-12-14  368  			goto err_put;
6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  369  		}
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  370  	}
6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  371  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  372  	conn->bridge.funcs = &display_connector_bridge_funcs;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  373  	conn->bridge.of_node = pdev->dev.of_node;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  374  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  375  	if (conn->bridge.ddc)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  376  		conn->bridge.ops |= DRM_BRIDGE_OP_EDID
0c275c30176b2e7 Laurent Pinchart     2020-02-26  377  				 |  DRM_BRIDGE_OP_DETECT;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  378  	if (conn->hpd_gpio)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  379  		conn->bridge.ops |= DRM_BRIDGE_OP_DETECT;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  380  	if (conn->hpd_irq >= 0)
0c275c30176b2e7 Laurent Pinchart     2020-02-26  381  		conn->bridge.ops |= DRM_BRIDGE_OP_HPD;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  382  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  383  	dev_dbg(&pdev->dev,
0c275c30176b2e7 Laurent Pinchart     2020-02-26  384  		"Found %s display connector '%s' %s DDC bus and %s HPD GPIO (ops 0x%x)\n",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  385  		drm_get_connector_type_name(conn->bridge.type),
0c275c30176b2e7 Laurent Pinchart     2020-02-26  386  		label ? label : "<unlabelled>",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  387  		conn->bridge.ddc ? "with" : "without",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  388  		conn->hpd_gpio ? "with" : "without",
0c275c30176b2e7 Laurent Pinchart     2020-02-26  389  		conn->bridge.ops);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  390  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  391  	drm_bridge_add(&conn->bridge);
0c275c30176b2e7 Laurent Pinchart     2020-02-26  392  
0c275c30176b2e7 Laurent Pinchart     2020-02-26  393  	return 0;
a7afd1756ad7c06 Joe Hattori          2024-12-14  394  
a7afd1756ad7c06 Joe Hattori          2024-12-14  395  err_put:
a7afd1756ad7c06 Joe Hattori          2024-12-14  396  	i2c_put_adapter(conn->bridge.ddc);
a7afd1756ad7c06 Joe Hattori          2024-12-14 @397  	return ret;
0c275c30176b2e7 Laurent Pinchart     2020-02-26  398  }

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] drm/bridge: display-connector: implement the error path of .probe()
  2025-01-06  9:02 ` Dan Carpenter
@ 2025-01-31  5:21   ` Joe Hattori
  0 siblings, 0 replies; 7+ messages in thread
From: Joe Hattori @ 2025-01-31  5:21 UTC (permalink / raw)
  To: Dan Carpenter, oe-kbuild, andrzej.hajda, neil.armstrong, rfoss,
	Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
	mripard, tzimmermann, airlied, simona
  Cc: lkp, oe-kbuild-all, dri-devel

Hi Dan,

Sorry for the late reply.

On 1/6/25 18:02, Dan Carpenter wrote:
> Hi Joe,
> 
> kernel test robot noticed the following build warnings:
> 
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
> 
> url:    https://github.com/intel-lab-lkp/linux/commits/Joe-Hattori/drm-bridge-display-connector-implement-the-error-path-of-probe/20241214-230605
> base:   linus/master
> patch link:    https://lore.kernel.org/r/20241214012652.2104807-1-joe%40pf.is.s.u-tokyo.ac.jp
> patch subject: [PATCH v2] drm/bridge: display-connector: implement the error path of .probe()
> config: x86_64-randconfig-161-20241220 (https://download.01.org/0day-ci/archive/20241221/202412212129.OT9Bt8p0-lkp@intel.com/config)
> compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
> 
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
> | Closes: https://lore.kernel.org/r/202412212129.OT9Bt8p0-lkp@intel.com/
> 
> smatch warnings:
> drivers/gpu/drm/bridge/display-connector.c:397 display_connector_probe() error: uninitialized symbol 'ret'.
> 
> vim +/ret +397 drivers/gpu/drm/bridge/display-connector.c
> 
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  205  static int display_connector_probe(struct platform_device *pdev)
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  206  {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  207  	struct display_connector *conn;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  208  	unsigned int type;
> 189723fbe9aca18 Dan Carpenter        2021-10-13  209  	const char *label = NULL;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  210  	int ret;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  211
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  212  	conn = devm_kzalloc(&pdev->dev, sizeof(*conn), GFP_KERNEL);
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  213  	if (!conn)
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  214  		return -ENOMEM;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  215
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  216  	platform_set_drvdata(pdev, conn);
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  217
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  218  	type = (uintptr_t)of_device_get_match_data(&pdev->dev);
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  219
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  220  	/* Get the exact connector type. */
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  221  	switch (type) {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  222  	case DRM_MODE_CONNECTOR_DVII: {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  223  		bool analog, digital;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  224
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  225  		analog = of_property_read_bool(pdev->dev.of_node, "analog");
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  226  		digital = of_property_read_bool(pdev->dev.of_node, "digital");
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  227  		if (analog && !digital) {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  228  			conn->bridge.type = DRM_MODE_CONNECTOR_DVIA;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  229  		} else if (!analog && digital) {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  230  			conn->bridge.type = DRM_MODE_CONNECTOR_DVID;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  231  		} else if (analog && digital) {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  232  			conn->bridge.type = DRM_MODE_CONNECTOR_DVII;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  233  		} else {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  234  			dev_err(&pdev->dev, "DVI connector with no type\n");
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  235  			return -EINVAL;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  236  		}
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  237  		break;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  238  	}
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  239
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  240  	case DRM_MODE_CONNECTOR_HDMIA: {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  241  		const char *hdmi_type;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  242
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  243  		ret = of_property_read_string(pdev->dev.of_node, "type",
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  244  					      &hdmi_type);
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  245  		if (ret < 0) {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  246  			dev_err(&pdev->dev, "HDMI connector with no type\n");
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  247  			return -EINVAL;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  248  		}
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  249
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  250  		if (!strcmp(hdmi_type, "a") || !strcmp(hdmi_type, "c") ||
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  251  		    !strcmp(hdmi_type, "d") || !strcmp(hdmi_type, "e")) {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  252  			conn->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  253  		} else if (!strcmp(hdmi_type, "b")) {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  254  			conn->bridge.type = DRM_MODE_CONNECTOR_HDMIB;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  255  		} else {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  256  			dev_err(&pdev->dev,
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  257  				"Unsupported HDMI connector type '%s'\n",
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  258  				hdmi_type);
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  259  			return -EINVAL;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  260  		}
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  261
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  262  		break;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  263  	}
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  264
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  265  	default:
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  266  		conn->bridge.type = type;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  267  		break;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  268  	}
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  269
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  270  	/* All the supported connector types support interlaced modes. */
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  271  	conn->bridge.interlace_allowed = true;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  272
> d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  273  	if (type == DRM_MODE_CONNECTOR_HDMIA ||
> d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  274  	    type == DRM_MODE_CONNECTOR_DisplayPort)
> d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  275  		conn->bridge.ycbcr_420_allowed = true;
> d5cd8280c52bad4 Dmitry Baryshkov     2024-10-19  276
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  277  	/* Get the optional connector label. */
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  278  	of_property_read_string(pdev->dev.of_node, "label", &label);
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  279
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  280  	/*
> 2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  281  	 * Get the HPD GPIO for DVI, HDMI and DP connectors. If the GPIO can provide
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  282  	 * edge interrupts, register an interrupt handler.
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  283  	 */
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  284  	if (type == DRM_MODE_CONNECTOR_DVII ||
> 2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  285  	    type == DRM_MODE_CONNECTOR_HDMIA ||
> 2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  286  	    type == DRM_MODE_CONNECTOR_DisplayPort) {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  287  		conn->hpd_gpio = devm_gpiod_get_optional(&pdev->dev, "hpd",
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  288  							 GPIOD_IN);
> ed8f4e1002781c4 Ye Xingchen          2023-03-22  289  		if (IS_ERR(conn->hpd_gpio))
> ed8f4e1002781c4 Ye Xingchen          2023-03-22  290  			return dev_err_probe(&pdev->dev, PTR_ERR(conn->hpd_gpio),
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  291  					     "Unable to retrieve HPD GPIO\n");
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  292
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  293  		conn->hpd_irq = gpiod_to_irq(conn->hpd_gpio);
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  294  	} else {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  295  		conn->hpd_irq = -EINVAL;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  296  	}
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  297
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  298  	if (conn->hpd_irq >= 0) {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  299  		ret = devm_request_threaded_irq(&pdev->dev, conn->hpd_irq,
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  300  						NULL, display_connector_hpd_irq,
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  301  						IRQF_TRIGGER_RISING |
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  302  						IRQF_TRIGGER_FALLING |
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  303  						IRQF_ONESHOT,
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  304  						"HPD", conn);
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  305  		if (ret) {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  306  			dev_info(&pdev->dev,
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  307  				 "Failed to request HPD edge interrupt, falling back to polling\n");
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  308  			conn->hpd_irq = -EINVAL;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  309  		}
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  310  	}
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  311
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  312  	/* Retrieve the DDC I2C adapter for DVI, HDMI and VGA connectors. */
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  313  	if (type == DRM_MODE_CONNECTOR_DVII ||
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  314  	    type == DRM_MODE_CONNECTOR_HDMIA ||
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  315  	    type == DRM_MODE_CONNECTOR_VGA) {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  316  		struct device_node *phandle;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  317
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  318  		phandle = of_parse_phandle(pdev->dev.of_node, "ddc-i2c-bus", 0);
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  319  		if (phandle) {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  320  			conn->bridge.ddc = of_get_i2c_adapter_by_node(phandle);
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  321  			of_node_put(phandle);
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  322  			if (!conn->bridge.ddc)
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  323  				return -EPROBE_DEFER;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  324  		} else {
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  325  			dev_dbg(&pdev->dev,
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  326  				"No I2C bus specified, disabling EDID readout\n");
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  327  		}
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  328  	}
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  329
> 2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  330  	/* Get the DP PWR for DP connector. */
> 2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  331  	if (type == DRM_MODE_CONNECTOR_DisplayPort) {
> 2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  332  		int ret;
> 
> Shadow variable.
> 
> 2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  333
> 6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  334  		ret = display_connector_get_supply(pdev, conn, "dp-pwr");
> a7afd1756ad7c06 Joe Hattori          2024-12-14  335  		if (ret < 0) {
> a7afd1756ad7c06 Joe Hattori          2024-12-14  336  			ret = dev_err_probe(&pdev->dev, ret,
> a7afd1756ad7c06 Joe Hattori          2024-12-14  337  					    "failed to get DP PWR regulator\n");
> a7afd1756ad7c06 Joe Hattori          2024-12-14  338  			goto err_put;
> a7afd1756ad7c06 Joe Hattori          2024-12-14  339  		}
> 2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  340  	}
> 2e2bf3a5584de24 Tomi Valkeinen       2020-11-30  341
> 6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  342  	/* enable DDC */
> 6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  343  	if (type == DRM_MODE_CONNECTOR_HDMIA) {
> 6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  344  		int ret;
> 
> This "ret" shadows an earlier declaration and leads to an error code bug.
> 
> I feel like say that ret is one of those variables which should *always*
> be declared with function scope even if we don't return the error code.
> These sorts of bugs aren't super common.  We probably only get a couple
> per year.

Thank you for the report. Should be fixed in the V3 patch [1].

[1]: 
https://lore.kernel.org/all/20250131051918.549781-1-joe@pf.is.s.u-tokyo.ac.jp/

> 
> 6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  345
> 6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  346  		conn->ddc_en = devm_gpiod_get_optional(&pdev->dev, "ddc-en",
> 6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  347  						       GPIOD_OUT_HIGH);
> 6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  348
> 6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  349  		if (IS_ERR(conn->ddc_en)) {
> 6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  350  			dev_err(&pdev->dev, "Couldn't get ddc-en gpio\n");
> a7afd1756ad7c06 Joe Hattori          2024-12-14  351  			ret = PTR_ERR(conn->ddc_en);
> a7afd1756ad7c06 Joe Hattori          2024-12-14  352  			goto err_put;
> 6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  353  		}
> 6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  354
> 6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  355  		ret = display_connector_get_supply(pdev, conn, "hdmi-pwr");
> a7afd1756ad7c06 Joe Hattori          2024-12-14  356  		if (ret < 0) {
> a7afd1756ad7c06 Joe Hattori          2024-12-14  357  			ret = dev_err_probe(
> a7afd1756ad7c06 Joe Hattori          2024-12-14  358  				&pdev->dev, ret,
> a7afd1756ad7c06 Joe Hattori          2024-12-14  359  				"failed to get HDMI +5V Power regulator\n");
> a7afd1756ad7c06 Joe Hattori          2024-12-14  360  			goto err_put;
> a7afd1756ad7c06 Joe Hattori          2024-12-14  361  		}
> 6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  362  	}
> 6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  363
> 6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  364  	if (conn->supply) {
> 6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  365  		ret = regulator_enable(conn->supply);
> 6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  366  		if (ret) {
> 6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  367  			dev_err(&pdev->dev, "failed to enable PWR regulator: %d\n", ret);
> a7afd1756ad7c06 Joe Hattori          2024-12-14  368  			goto err_put;
> 6eb6b6f0a012993 Dmitry Baryshkov     2023-05-31  369  		}
> 6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  370  	}
> 6de79dd3a920a13 H. Nikolaus Schaller 2022-04-07  371
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  372  	conn->bridge.funcs = &display_connector_bridge_funcs;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  373  	conn->bridge.of_node = pdev->dev.of_node;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  374
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  375  	if (conn->bridge.ddc)
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  376  		conn->bridge.ops |= DRM_BRIDGE_OP_EDID
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  377  				 |  DRM_BRIDGE_OP_DETECT;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  378  	if (conn->hpd_gpio)
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  379  		conn->bridge.ops |= DRM_BRIDGE_OP_DETECT;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  380  	if (conn->hpd_irq >= 0)
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  381  		conn->bridge.ops |= DRM_BRIDGE_OP_HPD;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  382
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  383  	dev_dbg(&pdev->dev,
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  384  		"Found %s display connector '%s' %s DDC bus and %s HPD GPIO (ops 0x%x)\n",
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  385  		drm_get_connector_type_name(conn->bridge.type),
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  386  		label ? label : "<unlabelled>",
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  387  		conn->bridge.ddc ? "with" : "without",
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  388  		conn->hpd_gpio ? "with" : "without",
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  389  		conn->bridge.ops);
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  390
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  391  	drm_bridge_add(&conn->bridge);
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  392
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  393  	return 0;
> a7afd1756ad7c06 Joe Hattori          2024-12-14  394
> a7afd1756ad7c06 Joe Hattori          2024-12-14  395  err_put:
> a7afd1756ad7c06 Joe Hattori          2024-12-14  396  	i2c_put_adapter(conn->bridge.ddc);
> a7afd1756ad7c06 Joe Hattori          2024-12-14 @397  	return ret;
> 0c275c30176b2e7 Laurent Pinchart     2020-02-26  398  }
> 

Best,
Joe

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-01-31  5:21 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-21  3:39 [PATCH v2] drm/bridge: display-connector: implement the error path of .probe() kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2024-12-21 13:49 kernel test robot
2024-12-14  1:26 Joe Hattori
2024-12-14 15:22 ` Dmitry Baryshkov
2024-12-14 20:39 ` Laurent Pinchart
2025-01-06  9:02 ` Dan Carpenter
2025-01-31  5:21   ` Joe Hattori

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.