* 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* [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-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.