drivers/irqchip/irq-qcom-mpm.c:441 qcom_mpm_probe() warn: missing unwind goto?
From: Dan Carpenter
Date: Fri Jun 26 2026 - 05:50:15 EST
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 4edcdefd4083ae04b1a5656f4be6cd83ae919ef4
commit: 1e3e330c07076a0582385bbea029c9cc918fa30d irqchip: Pass platform device to platform drivers
config: arm64-randconfig-r072-20260626 (https://download.01.org/0day-ci/archive/20260626/202606261634.IxvXG6n2-lkp@xxxxxxxxx/config)
compiler: clang version 23.0.0git (https://github.com/llvm/llvm-project 6cc609bb250b21b47fc7d394b4019101e9983597)
smatch: v0.5.0-9185-gbcc58b9c
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
| Fixes: 1e3e330c0707 ("irqchip: Pass platform device to platform drivers")
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Reported-by: Dan Carpenter <error27@xxxxxxxxx>
| Closes: https://lore.kernel.org/r/202606261634.IxvXG6n2-lkp@xxxxxxxxx/
smatch warnings:
drivers/irqchip/irq-qcom-mpm.c:441 qcom_mpm_probe() warn: missing unwind goto?
vim +441 drivers/irqchip/irq-qcom-mpm.c
1e3e330c07076a Johan Hovold 2025-10-13 323 static int qcom_mpm_probe(struct platform_device *pdev, struct device_node *parent)
a6199bb514d8a6 Shawn Guo 2022-03-08 324 {
1e3e330c07076a Johan Hovold 2025-10-13 325 struct device_node *np = pdev->dev.of_node;
a6199bb514d8a6 Shawn Guo 2022-03-08 326 struct device *dev = &pdev->dev;
a6199bb514d8a6 Shawn Guo 2022-03-08 327 struct irq_domain *parent_domain;
a6199bb514d8a6 Shawn Guo 2022-03-08 328 struct generic_pm_domain *genpd;
221b110d87c2d3 Konrad Dybcio 2023-11-27 329 struct device_node *msgram_np;
a6199bb514d8a6 Shawn Guo 2022-03-08 330 struct qcom_mpm_priv *priv;
a6199bb514d8a6 Shawn Guo 2022-03-08 331 unsigned int pin_cnt;
221b110d87c2d3 Konrad Dybcio 2023-11-27 332 struct resource res;
a6199bb514d8a6 Shawn Guo 2022-03-08 333 int i, irq;
a6199bb514d8a6 Shawn Guo 2022-03-08 334 int ret;
a6199bb514d8a6 Shawn Guo 2022-03-08 335
a6199bb514d8a6 Shawn Guo 2022-03-08 336 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
a6199bb514d8a6 Shawn Guo 2022-03-08 337 if (!priv)
a6199bb514d8a6 Shawn Guo 2022-03-08 338 return -ENOMEM;
a6199bb514d8a6 Shawn Guo 2022-03-08 339
a6199bb514d8a6 Shawn Guo 2022-03-08 340 ret = of_property_read_u32(np, "qcom,mpm-pin-count", &pin_cnt);
a6199bb514d8a6 Shawn Guo 2022-03-08 341 if (ret) {
a6199bb514d8a6 Shawn Guo 2022-03-08 342 dev_err(dev, "failed to read qcom,mpm-pin-count: %d\n", ret);
a6199bb514d8a6 Shawn Guo 2022-03-08 343 return ret;
a6199bb514d8a6 Shawn Guo 2022-03-08 344 }
a6199bb514d8a6 Shawn Guo 2022-03-08 345
a6199bb514d8a6 Shawn Guo 2022-03-08 346 priv->reg_stride = DIV_ROUND_UP(pin_cnt, 32);
a6199bb514d8a6 Shawn Guo 2022-03-08 347
a6199bb514d8a6 Shawn Guo 2022-03-08 348 ret = of_property_count_u32_elems(np, "qcom,mpm-pin-map");
a6199bb514d8a6 Shawn Guo 2022-03-08 349 if (ret < 0) {
a6199bb514d8a6 Shawn Guo 2022-03-08 350 dev_err(dev, "failed to read qcom,mpm-pin-map: %d\n", ret);
a6199bb514d8a6 Shawn Guo 2022-03-08 351 return ret;
a6199bb514d8a6 Shawn Guo 2022-03-08 352 }
a6199bb514d8a6 Shawn Guo 2022-03-08 353
a6199bb514d8a6 Shawn Guo 2022-03-08 354 if (ret % 2) {
a6199bb514d8a6 Shawn Guo 2022-03-08 355 dev_err(dev, "invalid qcom,mpm-pin-map\n");
a6199bb514d8a6 Shawn Guo 2022-03-08 356 return -EINVAL;
a6199bb514d8a6 Shawn Guo 2022-03-08 357 }
a6199bb514d8a6 Shawn Guo 2022-03-08 358
a6199bb514d8a6 Shawn Guo 2022-03-08 359 priv->map_cnt = ret / 2;
a6199bb514d8a6 Shawn Guo 2022-03-08 360 priv->maps = devm_kcalloc(dev, priv->map_cnt, sizeof(*priv->maps),
a6199bb514d8a6 Shawn Guo 2022-03-08 361 GFP_KERNEL);
a6199bb514d8a6 Shawn Guo 2022-03-08 362 if (!priv->maps)
a6199bb514d8a6 Shawn Guo 2022-03-08 363 return -ENOMEM;
a6199bb514d8a6 Shawn Guo 2022-03-08 364
a6199bb514d8a6 Shawn Guo 2022-03-08 365 for (i = 0; i < priv->map_cnt; i++) {
a6199bb514d8a6 Shawn Guo 2022-03-08 366 u32 pin, hwirq;
a6199bb514d8a6 Shawn Guo 2022-03-08 367
a6199bb514d8a6 Shawn Guo 2022-03-08 368 of_property_read_u32_index(np, "qcom,mpm-pin-map", i * 2, &pin);
a6199bb514d8a6 Shawn Guo 2022-03-08 369 of_property_read_u32_index(np, "qcom,mpm-pin-map", i * 2 + 1, &hwirq);
a6199bb514d8a6 Shawn Guo 2022-03-08 370
a6199bb514d8a6 Shawn Guo 2022-03-08 371 if (gic_hwirq_is_mapped(priv->maps, i, hwirq)) {
a6199bb514d8a6 Shawn Guo 2022-03-08 372 dev_warn(dev, "failed to map pin %d as GIC hwirq %d is already mapped\n",
a6199bb514d8a6 Shawn Guo 2022-03-08 373 pin, hwirq);
a6199bb514d8a6 Shawn Guo 2022-03-08 374 continue;
a6199bb514d8a6 Shawn Guo 2022-03-08 375 }
a6199bb514d8a6 Shawn Guo 2022-03-08 376
a6199bb514d8a6 Shawn Guo 2022-03-08 377 priv->maps[i].pin = pin;
a6199bb514d8a6 Shawn Guo 2022-03-08 378 priv->maps[i].hwirq = hwirq;
a6199bb514d8a6 Shawn Guo 2022-03-08 379 }
a6199bb514d8a6 Shawn Guo 2022-03-08 380
a6199bb514d8a6 Shawn Guo 2022-03-08 381 raw_spin_lock_init(&priv->lock);
a6199bb514d8a6 Shawn Guo 2022-03-08 382
221b110d87c2d3 Konrad Dybcio 2023-11-27 383 /* If we have a handle to an RPM message ram partition, use it. */
221b110d87c2d3 Konrad Dybcio 2023-11-27 384 msgram_np = of_parse_phandle(np, "qcom,rpm-msg-ram", 0);
221b110d87c2d3 Konrad Dybcio 2023-11-27 385 if (msgram_np) {
221b110d87c2d3 Konrad Dybcio 2023-11-27 386 ret = of_address_to_resource(msgram_np, 0, &res);
221b110d87c2d3 Konrad Dybcio 2023-11-27 387 if (ret) {
221b110d87c2d3 Konrad Dybcio 2023-11-27 388 of_node_put(msgram_np);
221b110d87c2d3 Konrad Dybcio 2023-11-27 389 return ret;
221b110d87c2d3 Konrad Dybcio 2023-11-27 390 }
221b110d87c2d3 Konrad Dybcio 2023-11-27 391
221b110d87c2d3 Konrad Dybcio 2023-11-27 392 /* Don't use devm_ioremap_resource, as we're accessing a shared region. */
221b110d87c2d3 Konrad Dybcio 2023-11-27 393 priv->base = devm_ioremap(dev, res.start, resource_size(&res));
221b110d87c2d3 Konrad Dybcio 2023-11-27 394 of_node_put(msgram_np);
8ad032cc8c499a Dan Carpenter 2024-02-01 395 if (!priv->base)
8ad032cc8c499a Dan Carpenter 2024-02-01 396 return -ENOMEM;
221b110d87c2d3 Konrad Dybcio 2023-11-27 397 } else {
221b110d87c2d3 Konrad Dybcio 2023-11-27 398 /* Otherwise, fall back to simple MMIO. */
a6199bb514d8a6 Shawn Guo 2022-03-08 399 priv->base = devm_platform_ioremap_resource(pdev, 0);
76ff614a79152c Yang Yingliang 2022-03-16 400 if (IS_ERR(priv->base))
a6199bb514d8a6 Shawn Guo 2022-03-08 401 return PTR_ERR(priv->base);
221b110d87c2d3 Konrad Dybcio 2023-11-27 402 }
a6199bb514d8a6 Shawn Guo 2022-03-08 403
a6199bb514d8a6 Shawn Guo 2022-03-08 404 for (i = 0; i < priv->reg_stride; i++) {
a6199bb514d8a6 Shawn Guo 2022-03-08 405 qcom_mpm_write(priv, MPM_REG_ENABLE, i, 0);
a6199bb514d8a6 Shawn Guo 2022-03-08 406 qcom_mpm_write(priv, MPM_REG_FALLING_EDGE, i, 0);
a6199bb514d8a6 Shawn Guo 2022-03-08 407 qcom_mpm_write(priv, MPM_REG_RISING_EDGE, i, 0);
a6199bb514d8a6 Shawn Guo 2022-03-08 408 qcom_mpm_write(priv, MPM_REG_POLARITY, i, 0);
a6199bb514d8a6 Shawn Guo 2022-03-08 409 qcom_mpm_write(priv, MPM_REG_STATUS, i, 0);
a6199bb514d8a6 Shawn Guo 2022-03-08 410 }
a6199bb514d8a6 Shawn Guo 2022-03-08 411
a6199bb514d8a6 Shawn Guo 2022-03-08 412 irq = platform_get_irq(pdev, 0);
a6199bb514d8a6 Shawn Guo 2022-03-08 413 if (irq < 0)
a6199bb514d8a6 Shawn Guo 2022-03-08 414 return irq;
a6199bb514d8a6 Shawn Guo 2022-03-08 415
a6199bb514d8a6 Shawn Guo 2022-03-08 416 genpd = &priv->genpd;
a6199bb514d8a6 Shawn Guo 2022-03-08 417 genpd->flags = GENPD_FLAG_IRQ_SAFE;
a6199bb514d8a6 Shawn Guo 2022-03-08 418 genpd->power_off = mpm_pd_power_off;
a6199bb514d8a6 Shawn Guo 2022-03-08 419
a6199bb514d8a6 Shawn Guo 2022-03-08 420 genpd->name = devm_kasprintf(dev, GFP_KERNEL, "%s", dev_name(dev));
a6199bb514d8a6 Shawn Guo 2022-03-08 421 if (!genpd->name)
a6199bb514d8a6 Shawn Guo 2022-03-08 422 return -ENOMEM;
a6199bb514d8a6 Shawn Guo 2022-03-08 423
a6199bb514d8a6 Shawn Guo 2022-03-08 424 ret = pm_genpd_init(genpd, NULL, false);
a6199bb514d8a6 Shawn Guo 2022-03-08 425 if (ret) {
a6199bb514d8a6 Shawn Guo 2022-03-08 426 dev_err(dev, "failed to init genpd: %d\n", ret);
a6199bb514d8a6 Shawn Guo 2022-03-08 427 return ret;
a6199bb514d8a6 Shawn Guo 2022-03-08 428 }
a6199bb514d8a6 Shawn Guo 2022-03-08 429
a6199bb514d8a6 Shawn Guo 2022-03-08 430 ret = of_genpd_add_provider_simple(np, genpd);
a6199bb514d8a6 Shawn Guo 2022-03-08 431 if (ret) {
a6199bb514d8a6 Shawn Guo 2022-03-08 432 dev_err(dev, "failed to add genpd provider: %d\n", ret);
a6199bb514d8a6 Shawn Guo 2022-03-08 433 goto remove_genpd;
a6199bb514d8a6 Shawn Guo 2022-03-08 434 }
a6199bb514d8a6 Shawn Guo 2022-03-08 435
a6199bb514d8a6 Shawn Guo 2022-03-08 436 priv->mbox_client.dev = dev;
a6199bb514d8a6 Shawn Guo 2022-03-08 437 priv->mbox_chan = mbox_request_channel(&priv->mbox_client, 0);
a6199bb514d8a6 Shawn Guo 2022-03-08 438 if (IS_ERR(priv->mbox_chan)) {
a6199bb514d8a6 Shawn Guo 2022-03-08 439 ret = PTR_ERR(priv->mbox_chan);
a6199bb514d8a6 Shawn Guo 2022-03-08 440 dev_err(dev, "failed to acquire IPC channel: %d\n", ret);
a6199bb514d8a6 Shawn Guo 2022-03-08 @441 return ret;
goto remove_genpd?
a6199bb514d8a6 Shawn Guo 2022-03-08 442 }
a6199bb514d8a6 Shawn Guo 2022-03-08 443
a6199bb514d8a6 Shawn Guo 2022-03-08 444 parent_domain = irq_find_host(parent);
a6199bb514d8a6 Shawn Guo 2022-03-08 445 if (!parent_domain) {
a6199bb514d8a6 Shawn Guo 2022-03-08 446 dev_err(dev, "failed to find MPM parent domain\n");
a6199bb514d8a6 Shawn Guo 2022-03-08 447 ret = -ENXIO;
a6199bb514d8a6 Shawn Guo 2022-03-08 448 goto free_mbox;
a6199bb514d8a6 Shawn Guo 2022-03-08 449 }
a6199bb514d8a6 Shawn Guo 2022-03-08 450
a6199bb514d8a6 Shawn Guo 2022-03-08 451 priv->domain = irq_domain_create_hierarchy(parent_domain,
a6199bb514d8a6 Shawn Guo 2022-03-08 452 IRQ_DOMAIN_FLAG_QCOM_MPM_WAKEUP, pin_cnt,
87228532e7e968 Jiri Slaby (SUSE 2025-03-19 453) of_fwnode_handle(np), &qcom_mpm_ops, priv);
a6199bb514d8a6 Shawn Guo 2022-03-08 454 if (!priv->domain) {
a6199bb514d8a6 Shawn Guo 2022-03-08 455 dev_err(dev, "failed to create MPM domain\n");
a6199bb514d8a6 Shawn Guo 2022-03-08 456 ret = -ENOMEM;
a6199bb514d8a6 Shawn Guo 2022-03-08 457 goto free_mbox;
a6199bb514d8a6 Shawn Guo 2022-03-08 458 }
a6199bb514d8a6 Shawn Guo 2022-03-08 459
a6199bb514d8a6 Shawn Guo 2022-03-08 460 irq_domain_update_bus_token(priv->domain, DOMAIN_BUS_WAKEUP);
a6199bb514d8a6 Shawn Guo 2022-03-08 461
a6199bb514d8a6 Shawn Guo 2022-03-08 462 ret = devm_request_irq(dev, irq, qcom_mpm_handler, IRQF_NO_SUSPEND,
a6199bb514d8a6 Shawn Guo 2022-03-08 463 "qcom_mpm", priv);
a6199bb514d8a6 Shawn Guo 2022-03-08 464 if (ret) {
a6199bb514d8a6 Shawn Guo 2022-03-08 465 dev_err(dev, "failed to request irq: %d\n", ret);
a6199bb514d8a6 Shawn Guo 2022-03-08 466 goto remove_domain;
a6199bb514d8a6 Shawn Guo 2022-03-08 467 }
a6199bb514d8a6 Shawn Guo 2022-03-08 468
a6199bb514d8a6 Shawn Guo 2022-03-08 469 return 0;
a6199bb514d8a6 Shawn Guo 2022-03-08 470
a6199bb514d8a6 Shawn Guo 2022-03-08 471 remove_domain:
a6199bb514d8a6 Shawn Guo 2022-03-08 472 irq_domain_remove(priv->domain);
a6199bb514d8a6 Shawn Guo 2022-03-08 473 free_mbox:
a6199bb514d8a6 Shawn Guo 2022-03-08 474 mbox_free_channel(priv->mbox_chan);
a6199bb514d8a6 Shawn Guo 2022-03-08 475 remove_genpd:
a6199bb514d8a6 Shawn Guo 2022-03-08 476 pm_genpd_remove(genpd);
a6199bb514d8a6 Shawn Guo 2022-03-08 477 return ret;
a6199bb514d8a6 Shawn Guo 2022-03-08 478 }
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki