Messages in this thread | | | Date | Thu, 13 Jan 2022 21:48:33 +0530 | Subject | Re: [PATCH 3/6] ASoC: amd: acp: Add generic PCI driver module for ACP device | From | Ajit Kumar Pandey <> |
| |
On 1/13/2022 8:57 PM, Pierre-Louis Bossart wrote: > [CAUTION: External Email] > >> +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. Thanks .. will fix this in v1 patch chain > >> + >> + 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; >> +}; >
| |