13 Jan
2022
13 Jan
'22
5:18 p.m.
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;+};