[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