Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spmi: Use devm_spmi_controller_alloc()

Convert to the device-managed version of spmi_controller_alloc() and
simplify the excess error handling code.

Signed-off-by: Fei Shao <fshao@chromium.org>
Link: https://lore.kernel.org/r/20230824104101.4083400-3-fshao@chromium.org
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Link: https://lore.kernel.org/r/20231206231733.4031901-5-sboyd@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Fei Shao and committed by
Greg Kroah-Hartman
ffdfbafd b6e53731

+46 -89
+7 -15
drivers/spmi/hisi-spmi-controller.c
··· 267 267 struct resource *iores; 268 268 int ret; 269 269 270 - ctrl = spmi_controller_alloc(&pdev->dev, sizeof(*spmi_controller)); 271 - if (!ctrl) { 270 + ctrl = devm_spmi_controller_alloc(&pdev->dev, sizeof(*spmi_controller)); 271 + if (IS_ERR(ctrl)) { 272 272 dev_err(&pdev->dev, "can not allocate spmi_controller data\n"); 273 - return -ENOMEM; 273 + return PTR_ERR(ctrl); 274 274 } 275 275 spmi_controller = spmi_controller_get_drvdata(ctrl); 276 276 spmi_controller->controller = ctrl; ··· 278 278 iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); 279 279 if (!iores) { 280 280 dev_err(&pdev->dev, "can not get resource!\n"); 281 - ret = -EINVAL; 282 - goto err_put_controller; 281 + return -EINVAL; 283 282 } 284 283 285 284 spmi_controller->base = devm_ioremap(&pdev->dev, iores->start, 286 285 resource_size(iores)); 287 286 if (!spmi_controller->base) { 288 287 dev_err(&pdev->dev, "can not remap base addr!\n"); 289 - ret = -EADDRNOTAVAIL; 290 - goto err_put_controller; 288 + return -EADDRNOTAVAIL; 291 289 } 292 290 293 291 ret = of_property_read_u32(pdev->dev.of_node, "hisilicon,spmi-channel", 294 292 &spmi_controller->channel); 295 293 if (ret) { 296 294 dev_err(&pdev->dev, "can not get channel\n"); 297 - ret = -ENODEV; 298 - goto err_put_controller; 295 + return -ENODEV; 299 296 } 300 297 301 298 platform_set_drvdata(pdev, spmi_controller); ··· 311 314 ret = spmi_controller_add(ctrl); 312 315 if (ret) { 313 316 dev_err(&pdev->dev, "spmi_controller_add failed with error %d!\n", ret); 314 - goto err_put_controller; 317 + return ret; 315 318 } 316 319 317 320 return 0; 318 - 319 - err_put_controller: 320 - spmi_controller_put(ctrl); 321 - return ret; 322 321 } 323 322 324 323 static void spmi_del_controller(struct platform_device *pdev) ··· 322 329 struct spmi_controller *ctrl = platform_get_drvdata(pdev); 323 330 324 331 spmi_controller_remove(ctrl); 325 - spmi_controller_put(ctrl); 326 332 } 327 333 328 334 static const struct of_device_id spmi_controller_match_table[] = {
+9 -17
drivers/spmi/spmi-mtk-pmif.c
··· 447 447 int err, i; 448 448 u32 chan_offset; 449 449 450 - ctrl = spmi_controller_alloc(&pdev->dev, sizeof(*arb)); 451 - if (!ctrl) 452 - return -ENOMEM; 450 + ctrl = devm_spmi_controller_alloc(&pdev->dev, sizeof(*arb)); 451 + if (IS_ERR(ctrl)) 452 + return PTR_ERR(ctrl); 453 453 454 454 arb = spmi_controller_get_drvdata(ctrl); 455 455 arb->data = device_get_match_data(&pdev->dev); 456 456 if (!arb->data) { 457 - err = -EINVAL; 458 457 dev_err(&pdev->dev, "Cannot get drv_data\n"); 459 - goto err_put_ctrl; 458 + return -EINVAL; 460 459 } 461 460 462 461 arb->base = devm_platform_ioremap_resource_byname(pdev, "pmif"); 463 - if (IS_ERR(arb->base)) { 464 - err = PTR_ERR(arb->base); 465 - goto err_put_ctrl; 466 - } 462 + if (IS_ERR(arb->base)) 463 + return PTR_ERR(arb->base); 467 464 468 465 arb->spmimst_base = devm_platform_ioremap_resource_byname(pdev, "spmimst"); 469 - if (IS_ERR(arb->spmimst_base)) { 470 - err = PTR_ERR(arb->spmimst_base); 471 - goto err_put_ctrl; 472 - } 466 + if (IS_ERR(arb->spmimst_base)) 467 + return PTR_ERR(arb->spmimst_base); 473 468 474 469 arb->nclks = ARRAY_SIZE(pmif_clock_names); 475 470 for (i = 0; i < arb->nclks; i++) ··· 473 478 err = clk_bulk_get(&pdev->dev, arb->nclks, arb->clks); 474 479 if (err) { 475 480 dev_err(&pdev->dev, "Failed to get clocks: %d\n", err); 476 - goto err_put_ctrl; 481 + return err; 477 482 } 478 483 479 484 err = clk_bulk_prepare_enable(arb->nclks, arb->clks); ··· 507 512 clk_bulk_disable_unprepare(arb->nclks, arb->clks); 508 513 err_put_clks: 509 514 clk_bulk_put(arb->nclks, arb->clks); 510 - err_put_ctrl: 511 - spmi_controller_put(ctrl); 512 515 return err; 513 516 } 514 517 ··· 518 525 clk_bulk_disable_unprepare(arb->nclks, arb->clks); 519 526 clk_bulk_put(arb->nclks, arb->clks); 520 527 spmi_controller_remove(ctrl); 521 - spmi_controller_put(ctrl); 522 528 } 523 529 524 530 static const struct of_device_id mtk_spmi_match_table[] = {
+30 -57
drivers/spmi/spmi-pmic-arb.c
··· 1443 1443 u32 channel, ee, hw_ver; 1444 1444 int err; 1445 1445 1446 - ctrl = spmi_controller_alloc(&pdev->dev, sizeof(*pmic_arb)); 1447 - if (!ctrl) 1448 - return -ENOMEM; 1446 + ctrl = devm_spmi_controller_alloc(&pdev->dev, sizeof(*pmic_arb)); 1447 + if (IS_ERR(ctrl)) 1448 + return PTR_ERR(ctrl); 1449 1449 1450 1450 pmic_arb = spmi_controller_get_drvdata(ctrl); 1451 1451 pmic_arb->spmic = ctrl; ··· 1462 1462 */ 1463 1463 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "core"); 1464 1464 core = devm_ioremap(&ctrl->dev, res->start, resource_size(res)); 1465 - if (IS_ERR(core)) { 1466 - err = PTR_ERR(core); 1467 - goto err_put_ctrl; 1468 - } 1465 + if (IS_ERR(core)) 1466 + return PTR_ERR(core); 1469 1467 1470 1468 pmic_arb->core_size = resource_size(res); 1471 1469 1472 1470 pmic_arb->ppid_to_apid = devm_kcalloc(&ctrl->dev, PMIC_ARB_MAX_PPID, 1473 1471 sizeof(*pmic_arb->ppid_to_apid), 1474 1472 GFP_KERNEL); 1475 - if (!pmic_arb->ppid_to_apid) { 1476 - err = -ENOMEM; 1477 - goto err_put_ctrl; 1478 - } 1473 + if (!pmic_arb->ppid_to_apid) 1474 + return -ENOMEM; 1479 1475 1480 1476 hw_ver = readl_relaxed(core + PMIC_ARB_VERSION); 1481 1477 ··· 1495 1499 "obsrvr"); 1496 1500 pmic_arb->rd_base = devm_ioremap(&ctrl->dev, res->start, 1497 1501 resource_size(res)); 1498 - if (IS_ERR(pmic_arb->rd_base)) { 1499 - err = PTR_ERR(pmic_arb->rd_base); 1500 - goto err_put_ctrl; 1501 - } 1502 + if (IS_ERR(pmic_arb->rd_base)) 1503 + return PTR_ERR(pmic_arb->rd_base); 1502 1504 1503 1505 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, 1504 1506 "chnls"); 1505 1507 pmic_arb->wr_base = devm_ioremap(&ctrl->dev, res->start, 1506 1508 resource_size(res)); 1507 - if (IS_ERR(pmic_arb->wr_base)) { 1508 - err = PTR_ERR(pmic_arb->wr_base); 1509 - goto err_put_ctrl; 1510 - } 1509 + if (IS_ERR(pmic_arb->wr_base)) 1510 + return PTR_ERR(pmic_arb->wr_base); 1511 1511 } 1512 1512 1513 1513 pmic_arb->max_periphs = PMIC_ARB_MAX_PERIPHS; ··· 1514 1522 of_property_read_u32(pdev->dev.of_node, "qcom,bus-id", 1515 1523 &pmic_arb->bus_instance); 1516 1524 if (pmic_arb->bus_instance > 1) { 1517 - err = -EINVAL; 1518 1525 dev_err(&pdev->dev, "invalid bus instance (%u) specified\n", 1519 1526 pmic_arb->bus_instance); 1520 - goto err_put_ctrl; 1527 + return -EINVAL; 1521 1528 } 1522 1529 1523 1530 if (pmic_arb->bus_instance == 0) { ··· 1534 1543 } 1535 1544 1536 1545 if (pmic_arb->base_apid + pmic_arb->apid_count > pmic_arb->max_periphs) { 1537 - err = -EINVAL; 1538 1546 dev_err(&pdev->dev, "Unsupported APID count %d detected\n", 1539 1547 pmic_arb->base_apid + pmic_arb->apid_count); 1540 - goto err_put_ctrl; 1548 + return -EINVAL; 1541 1549 } 1542 1550 } else if (hw_ver >= PMIC_ARB_VERSION_V5_MIN) { 1543 1551 pmic_arb->base_apid = 0; ··· 1544 1554 PMIC_ARB_FEATURES_PERIPH_MASK; 1545 1555 1546 1556 if (pmic_arb->apid_count > pmic_arb->max_periphs) { 1547 - err = -EINVAL; 1548 1557 dev_err(&pdev->dev, "Unsupported APID count %d detected\n", 1549 1558 pmic_arb->apid_count); 1550 - goto err_put_ctrl; 1559 + return -EINVAL; 1551 1560 } 1552 1561 } 1553 1562 1554 1563 pmic_arb->apid_data = devm_kcalloc(&ctrl->dev, pmic_arb->max_periphs, 1555 1564 sizeof(*pmic_arb->apid_data), 1556 1565 GFP_KERNEL); 1557 - if (!pmic_arb->apid_data) { 1558 - err = -ENOMEM; 1559 - goto err_put_ctrl; 1560 - } 1566 + if (!pmic_arb->apid_data) 1567 + return -ENOMEM; 1561 1568 1562 1569 dev_info(&ctrl->dev, "PMIC arbiter version %s (0x%x)\n", 1563 1570 pmic_arb->ver_ops->ver_str, hw_ver); 1564 1571 1565 1572 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "intr"); 1566 1573 pmic_arb->intr = devm_ioremap_resource(&ctrl->dev, res); 1567 - if (IS_ERR(pmic_arb->intr)) { 1568 - err = PTR_ERR(pmic_arb->intr); 1569 - goto err_put_ctrl; 1570 - } 1574 + if (IS_ERR(pmic_arb->intr)) 1575 + return PTR_ERR(pmic_arb->intr); 1571 1576 1572 1577 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cnfg"); 1573 1578 pmic_arb->cnfg = devm_ioremap_resource(&ctrl->dev, res); 1574 - if (IS_ERR(pmic_arb->cnfg)) { 1575 - err = PTR_ERR(pmic_arb->cnfg); 1576 - goto err_put_ctrl; 1577 - } 1579 + if (IS_ERR(pmic_arb->cnfg)) 1580 + return PTR_ERR(pmic_arb->cnfg); 1578 1581 1579 1582 pmic_arb->irq = platform_get_irq_byname(pdev, "periph_irq"); 1580 - if (pmic_arb->irq < 0) { 1581 - err = pmic_arb->irq; 1582 - goto err_put_ctrl; 1583 - } 1583 + if (pmic_arb->irq < 0) 1584 + return pmic_arb->irq; 1584 1585 1585 1586 err = of_property_read_u32(pdev->dev.of_node, "qcom,channel", &channel); 1586 1587 if (err) { 1587 1588 dev_err(&pdev->dev, "channel unspecified.\n"); 1588 - goto err_put_ctrl; 1589 + return err; 1589 1590 } 1590 1591 1591 1592 if (channel > 5) { 1592 1593 dev_err(&pdev->dev, "invalid channel (%u) specified.\n", 1593 1594 channel); 1594 - err = -EINVAL; 1595 - goto err_put_ctrl; 1595 + return -EINVAL; 1596 1596 } 1597 1597 1598 1598 pmic_arb->channel = channel; ··· 1590 1610 err = of_property_read_u32(pdev->dev.of_node, "qcom,ee", &ee); 1591 1611 if (err) { 1592 1612 dev_err(&pdev->dev, "EE unspecified.\n"); 1593 - goto err_put_ctrl; 1613 + return err; 1594 1614 } 1595 1615 1596 1616 if (ee > 5) { 1597 1617 dev_err(&pdev->dev, "invalid EE (%u) specified\n", ee); 1598 - err = -EINVAL; 1599 - goto err_put_ctrl; 1618 + return -EINVAL; 1600 1619 } 1601 1620 1602 1621 pmic_arb->ee = ee; 1603 1622 mapping_table = devm_kcalloc(&ctrl->dev, pmic_arb->max_periphs, 1604 1623 sizeof(*mapping_table), GFP_KERNEL); 1605 - if (!mapping_table) { 1606 - err = -ENOMEM; 1607 - goto err_put_ctrl; 1608 - } 1624 + if (!mapping_table) 1625 + return -ENOMEM; 1609 1626 1610 1627 pmic_arb->mapping_table = mapping_table; 1611 1628 /* Initialize max_apid/min_apid to the opposite bounds, during ··· 1622 1645 if (err) { 1623 1646 dev_err(&pdev->dev, "could not read APID->PPID mapping table, rc= %d\n", 1624 1647 err); 1625 - goto err_put_ctrl; 1648 + return err; 1626 1649 } 1627 1650 } 1628 1651 ··· 1631 1654 &pmic_arb_irq_domain_ops, pmic_arb); 1632 1655 if (!pmic_arb->domain) { 1633 1656 dev_err(&pdev->dev, "unable to create irq_domain\n"); 1634 - err = -ENOMEM; 1635 - goto err_put_ctrl; 1657 + return -ENOMEM; 1636 1658 } 1637 1659 1638 1660 irq_set_chained_handler_and_data(pmic_arb->irq, pmic_arb_chained_irq, ··· 1645 1669 err_domain_remove: 1646 1670 irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL); 1647 1671 irq_domain_remove(pmic_arb->domain); 1648 - err_put_ctrl: 1649 - spmi_controller_put(ctrl); 1650 1672 return err; 1651 1673 } 1652 1674 ··· 1655 1681 spmi_controller_remove(ctrl); 1656 1682 irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL); 1657 1683 irq_domain_remove(pmic_arb->domain); 1658 - spmi_controller_put(ctrl); 1659 1684 } 1660 1685 1661 1686 static const struct of_device_id spmi_pmic_arb_match_table[] = {