> +static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) > +{ > + struct platform_device_info pdevinfo; > + struct device *dev = &pci->dev; > + const struct resource *res_acp; > + struct acp_chip_info *chip; > + struct resource *res; > + unsigned int flag, addr, num_res, i; > + int ret; > + > + flag = snd_amd_acp_find_config(pci); > + if (flag != FLAG_AMD_LEGACY) > + return -ENODEV; > + > + chip = devm_kzalloc(&pci->dev, sizeof(*chip), GFP_KERNEL); > + if (!chip) > + return -ENOMEM; > + > + if (pci_enable_device(pci)) { > + dev_err(&pci->dev, "pci_enable_device failed\n"); > + return -ENODEV; > + } > + > + ret = pci_request_regions(pci, "AMD ACP3x audio"); > + if (ret < 0) { > + dev_err(&pci->dev, "pci_request_regions failed\n"); > + return -ENOMEM; > + } > + > + pci_set_master(pci); > + > + switch (pci->revision) { > + case 0x01: > + res_acp = acp3x_res; > + num_res = ARRAY_SIZE(acp3x_res); > + chip->name = "acp_asoc_renoir"; > + chip->acp_rev = ACP3X_DEV; > + break; > + default: > + dev_err(dev, "Unsupported device revision:0x%x\n", pci->revision); > + return -EINVAL; > + } > + > + dmic_dev = platform_device_register_data(dev, "dmic-codec", PLATFORM_DEVID_NONE, NULL, 0); > + if (IS_ERR(dmic_dev)) { > + dev_err(dev, "failed to create DMIC device\n"); > + return PTR_ERR(dmic_dev); > + } Past this point, any error handling needs to use platform_device_unregister(dmic_dev); ... > + addr = pci_resource_start(pci, 0); > + chip->base = devm_ioremap(&pci->dev, addr, pci_resource_len(pci, 0)); > + > + res = devm_kzalloc(&pci->dev, sizeof(struct resource) * num_res, GFP_KERNEL); > + if (!res) > + return -ENOMEM; ...which is missed here. > + > + for (i = 0; i < num_res; i++, res_acp++) { > + res[i].name = res_acp->name; > + res[i].flags = res_acp->flags; > + res[i].start = addr + res_acp->start; > + res[i].end = addr + res_acp->end; > + if (res_acp->flags == IORESOURCE_IRQ) { > + res[i].start = pci->irq; > + res[i].end = res[i].start; > + } > + } > + > + memset(&pdevinfo, 0, sizeof(pdevinfo)); > + > + pdevinfo.name = chip->name; > + pdevinfo.id = 0; > + pdevinfo.parent = &pci->dev; > + pdevinfo.num_res = num_res; > + pdevinfo.res = &res[0]; > + pdevinfo.data = chip; > + pdevinfo.size_data = sizeof(*chip); > + > + pdev = platform_device_register_full(&pdevinfo); > + if (IS_ERR(pdev)) { > + dev_err(&pci->dev, "cannot register %s device\n", pdevinfo.name); > + platform_device_unregister(dmic_dev); > + ret = PTR_ERR(pdev); > + } > + > + return ret; > +};