[PATCH v2] drm/bridge: display-connector: implement the error path of .probe()

Dan Carpenter dan.carpenter at linaro.org
Mon Jan 6 09:02:59 UTC 2025


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 at intel.com>
| Reported-by: Dan Carpenter <dan.carpenter at 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



More information about the dri-devel mailing list