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@xxxxxxxxx/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@xxxxxxxxx> | Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx> | Closes: https://lore.kernel.org/r/202412212129.OT9Bt8p0-lkp@xxxxxxxxx/ 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