static int pmc_setup_dev(struct pci_dev *pdev) { struct pmc_dev *pmc = &pmc_device; int ret; /* Obtain ACPI base address */ pci_read_config_dword(pdev, ACPI_BASE_ADDR_OFFSET, &acpi_base_addr); acpi_base_addr &= ACPI_BASE_ADDR_MASK; /* Install power off function */ if (acpi_base_addr != 0 && pm_power_off == NULL) pm_power_off = pmc_power_off; pci_read_config_dword(pdev, PMC_BASE_ADDR_OFFSET, &pmc->base_addr); pmc->base_addr &= PMC_BASE_ADDR_MASK; pmc->regmap = ioremap_nocache(pmc->base_addr, PMC_MMIO_REG_LEN); if (!pmc->regmap) { dev_err(&pdev->dev, "error: ioremap failed\n"); return -ENOMEM; } /* PMC hardware registers setup */ pmc_hw_reg_setup(pmc); ret = pmc_dbgfs_register(pmc, pdev); if (ret) { iounmap(pmc->regmap); } return ret; }
static int pmc_probe(struct pci_dev *pdev, const struct pci_device_id *unused) { struct pmc_dev *pmc; int ret; ret = pci_enable_device(pdev); if (ret < 0) { dev_err(&pdev->dev, "error: could not enable device\n"); goto err_enable_device; } ret = pci_request_regions(pdev, DRIVER_NAME); if (ret) { dev_err(&pdev->dev, "error: could not request PCI region\n"); goto err_request_regions; } pmc = devm_kzalloc(&pdev->dev, sizeof(struct pmc_dev), GFP_KERNEL); if (!pmc) { ret = -ENOMEM; goto err_devm_kzalloc; } pmc->pdev = pci_dev_get(pdev); pci_read_config_dword(pdev, PMC_BASE_ADDR_OFFSET, &pmc->base_addr); pmc->base_addr &= PMC_BASE_ADDR_MASK; pmc->regmap = devm_ioremap_nocache(&pdev->dev, pmc->base_addr, PMC_MMIO_REG_LEN); if (!pmc->regmap) { dev_err(&pdev->dev, "error: ioremap failed\n"); ret = -ENOMEM; goto err_devm_ioremap; } pci_set_drvdata(pdev, pmc); #ifdef CONFIG_DEBUG_FS pmc_dbgfs_register(pmc); #endif /* CONFIG_DEBUG_FS */ /* Install power off function */ pci_read_config_dword(pdev, ACPI_BASE_ADDR_OFFSET, &acpi_base_addr); acpi_base_addr &= ACPI_BASE_ADDR_MASK; if (acpi_base_addr != 0 && pm_power_off == NULL) pm_power_off = pmc_power_off; return 0; err_devm_ioremap: pci_dev_put(pdev); err_devm_kzalloc: pci_release_regions(pdev); err_request_regions: pci_disable_device(pdev); err_enable_device: dev_err(&pdev->dev, "error: probe failed\n"); return ret; }