[PATCH v2] drm/bridge: display-connector: implement the error path of .probe()
Joe Hattori
joe at pf.is.s.u-tokyo.ac.jp
Fri Jan 31 05:21:43 UTC 2025
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 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.
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
More information about the dri-devel
mailing list