Skip to content

Commit 83beee5

Browse files
Kuppuswamy Sathyanarayananandy-shev
authored andcommitted
platform/x86: intel_pmc_ipc: Use devm_* calls in driver probe function
This patch cleans up unnecessary free/alloc calls in ipc_plat_probe(), ipc_pci_probe() and ipc_plat_get_res() functions by using devm_* calls. This patch also adds proper error handling for failure cases in ipc_pci_probe() function. Signed-off-by: Kuppuswamy Sathyanarayanan <[email protected]> [andy: fixed style issues, missed devm_free_irq(), removed unnecessary log message] Signed-off-by: Andy Shevchenko <[email protected]>
1 parent ce7c47d commit 83beee5

File tree

1 file changed

+28
-66
lines changed

1 file changed

+28
-66
lines changed

drivers/platform/x86/intel_pmc_ipc.c

Lines changed: 28 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -480,52 +480,39 @@ static irqreturn_t ioc(int irq, void *dev_id)
480480

481481
static int ipc_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
482482
{
483-
resource_size_t pci_resource;
483+
struct intel_pmc_ipc_dev *pmc = &ipcdev;
484484
int ret;
485-
int len;
486485

487-
ipcdev.dev = &pci_dev_get(pdev)->dev;
488-
ipcdev.irq_mode = IPC_TRIGGER_MODE_IRQ;
486+
/* Only one PMC is supported */
487+
if (pmc->dev)
488+
return -EBUSY;
489489

490-
ret = pci_enable_device(pdev);
490+
pmc->irq_mode = IPC_TRIGGER_MODE_IRQ;
491+
492+
ret = pcim_enable_device(pdev);
491493
if (ret)
492494
return ret;
493495

494-
ret = pci_request_regions(pdev, "intel_pmc_ipc");
496+
ret = pcim_iomap_regions(pdev, 1 << 0, pci_name(pdev));
495497
if (ret)
496498
return ret;
497499

498-
pci_resource = pci_resource_start(pdev, 0);
499-
len = pci_resource_len(pdev, 0);
500-
if (!pci_resource || !len) {
501-
dev_err(&pdev->dev, "Failed to get resource\n");
502-
return -ENOMEM;
503-
}
500+
init_completion(&pmc->cmd_complete);
504501

505-
init_completion(&ipcdev.cmd_complete);
502+
pmc->ipc_base = pcim_iomap_table(pdev)[0];
506503

507-
if (request_irq(pdev->irq, ioc, 0, "intel_pmc_ipc", &ipcdev)) {
504+
ret = devm_request_irq(&pdev->dev, pdev->irq, ioc, 0, "intel_pmc_ipc",
505+
pmc);
506+
if (ret) {
508507
dev_err(&pdev->dev, "Failed to request irq\n");
509-
return -EBUSY;
508+
return ret;
510509
}
511510

512-
ipcdev.ipc_base = ioremap_nocache(pci_resource, len);
513-
if (!ipcdev.ipc_base) {
514-
dev_err(&pdev->dev, "Failed to ioremap ipc base\n");
515-
free_irq(pdev->irq, &ipcdev);
516-
ret = -ENOMEM;
517-
}
511+
pmc->dev = &pdev->dev;
518512

519-
return ret;
520-
}
513+
pci_set_drvdata(pdev, pmc);
521514

522-
static void ipc_pci_remove(struct pci_dev *pdev)
523-
{
524-
free_irq(pdev->irq, &ipcdev);
525-
pci_release_regions(pdev);
526-
pci_dev_put(pdev);
527-
iounmap(ipcdev.ipc_base);
528-
ipcdev.dev = NULL;
515+
return 0;
529516
}
530517

531518
static const struct pci_device_id ipc_pci_ids[] = {
@@ -540,7 +527,6 @@ static struct pci_driver ipc_pci_driver = {
540527
.name = "intel_pmc_ipc",
541528
.id_table = ipc_pci_ids,
542529
.probe = ipc_pci_probe,
543-
.remove = ipc_pci_remove,
544530
};
545531

546532
static ssize_t intel_pmc_ipc_simple_cmd_store(struct device *dev,
@@ -850,17 +836,12 @@ static int ipc_plat_get_res(struct platform_device *pdev)
850836
return -ENXIO;
851837
}
852838
size = PLAT_RESOURCE_IPC_SIZE + PLAT_RESOURCE_GCR_SIZE;
839+
res->end = res->start + size - 1;
840+
841+
addr = devm_ioremap_resource(&pdev->dev, res);
842+
if (IS_ERR(addr))
843+
return PTR_ERR(addr);
853844

854-
if (!request_mem_region(res->start, size, pdev->name)) {
855-
dev_err(&pdev->dev, "Failed to request ipc resource\n");
856-
return -EBUSY;
857-
}
858-
addr = ioremap_nocache(res->start, size);
859-
if (!addr) {
860-
dev_err(&pdev->dev, "I/O memory remapping failed\n");
861-
release_mem_region(res->start, size);
862-
return -ENOMEM;
863-
}
864845
ipcdev.ipc_base = addr;
865846

866847
ipcdev.gcr_mem_base = addr + PLAT_RESOURCE_GCR_OFFSET;
@@ -917,7 +898,6 @@ MODULE_DEVICE_TABLE(acpi, ipc_acpi_ids);
917898

918899
static int ipc_plat_probe(struct platform_device *pdev)
919900
{
920-
struct resource *res;
921901
int ret;
922902

923903
ipcdev.dev = &pdev->dev;
@@ -939,11 +919,11 @@ static int ipc_plat_probe(struct platform_device *pdev)
939919
ret = ipc_create_pmc_devices();
940920
if (ret) {
941921
dev_err(&pdev->dev, "Failed to create pmc devices\n");
942-
goto err_device;
922+
return ret;
943923
}
944924

945-
if (request_irq(ipcdev.irq, ioc, IRQF_NO_SUSPEND,
946-
"intel_pmc_ipc", &ipcdev)) {
925+
if (devm_request_irq(&pdev->dev, ipcdev.irq, ioc, IRQF_NO_SUSPEND,
926+
"intel_pmc_ipc", &ipcdev)) {
947927
dev_err(&pdev->dev, "Failed to request irq\n");
948928
ret = -EBUSY;
949929
goto err_irq;
@@ -960,40 +940,22 @@ static int ipc_plat_probe(struct platform_device *pdev)
960940

961941
return 0;
962942
err_sys:
963-
free_irq(ipcdev.irq, &ipcdev);
943+
devm_free_irq(&pdev->dev, ipcdev.irq, &ipcdev);
964944
err_irq:
965945
platform_device_unregister(ipcdev.tco_dev);
966946
platform_device_unregister(ipcdev.punit_dev);
967947
platform_device_unregister(ipcdev.telemetry_dev);
968-
err_device:
969-
iounmap(ipcdev.ipc_base);
970-
res = platform_get_resource(pdev, IORESOURCE_MEM,
971-
PLAT_RESOURCE_IPC_INDEX);
972-
if (res) {
973-
release_mem_region(res->start,
974-
PLAT_RESOURCE_IPC_SIZE +
975-
PLAT_RESOURCE_GCR_SIZE);
976-
}
948+
977949
return ret;
978950
}
979951

980952
static int ipc_plat_remove(struct platform_device *pdev)
981953
{
982-
struct resource *res;
983-
984954
sysfs_remove_group(&pdev->dev.kobj, &intel_ipc_group);
985-
free_irq(ipcdev.irq, &ipcdev);
955+
devm_free_irq(&pdev->dev, ipcdev.irq, &ipcdev);
986956
platform_device_unregister(ipcdev.tco_dev);
987957
platform_device_unregister(ipcdev.punit_dev);
988958
platform_device_unregister(ipcdev.telemetry_dev);
989-
iounmap(ipcdev.ipc_base);
990-
res = platform_get_resource(pdev, IORESOURCE_MEM,
991-
PLAT_RESOURCE_IPC_INDEX);
992-
if (res) {
993-
release_mem_region(res->start,
994-
PLAT_RESOURCE_IPC_SIZE +
995-
PLAT_RESOURCE_GCR_SIZE);
996-
}
997959
ipcdev.dev = NULL;
998960
return 0;
999961
}

0 commit comments

Comments
 (0)