On Tue, Nov 19, 2019 at 03:02:42PM +0530, Ravulapati Vishnu vardhan rao wrote:
static int snd_acp3x_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) {
- int ret;
- u32 addr, val; struct acp3x_dev_data *adata;
- struct platform_device_info pdevinfo;
- struct platform_device_info pdevinfo[ACP3x_DEVS]; unsigned int irqflags;
- int ret, val, i;
val should stay as u32.
u32 addr;
if (pci_enable_device(pci)) { dev_err(&pci->dev, "pci_enable_device failed\n");
@@ -43,7 +43,7 @@ static int snd_acp3x_probe(struct pci_dev *pci, GFP_KERNEL); if (!adata) { ret = -ENOMEM;
goto release_regions;
goto adata_free;
Release regions was the correct label name because if you do the goto then it will call release_regions().
}
/* check for msi interrupt support */ @@ -56,7 +56,8 @@ static int snd_acp3x_probe(struct pci_dev *pci, irqflags = 0;
addr = pci_resource_start(pci, 0);
- adata->acp3x_base = ioremap(addr, pci_resource_len(pci, 0));
- adata->acp3x_base = devm_ioremap(&pci->dev, addr,
if (!adata->acp3x_base) { ret = -ENOMEM; goto release_regions;pci_resource_len(pci, 0));
@@ -68,11 +69,11 @@ static int snd_acp3x_probe(struct pci_dev *pci, switch (val) { case I2S_MODE: adata->res = devm_kzalloc(&pci->dev,
sizeof(struct resource) * 2,
if (!adata->res) { ret = -ENOMEM;sizeof(struct resource) * 4, GFP_KERNEL);
goto unmap_mmio;
goto release_regions;
}
adata->res[0].name = "acp3x_i2s_iomem";
@@ -80,41 +81,68 @@ static int snd_acp3x_probe(struct pci_dev *pci, adata->res[0].start = addr; adata->res[0].end = addr + (ACP3x_REG_END - ACP3x_REG_START);
adata->res[1].name = "acp3x_i2s_irq";
adata->res[1].flags = IORESOURCE_IRQ;
adata->res[1].start = pci->irq;
adata->res[1].end = pci->irq;
adata->res[1].name = "acp3x_i2s_sp";
adata->res[1].flags = IORESOURCE_MEM;
adata->res[1].start = addr + ACP3x_I2STDM_REG_START;
adata->res[1].end = addr + ACP3x_I2STDM_REG_END;
adata->res[2].name = "acp3x_i2s_bt";
adata->res[2].flags = IORESOURCE_MEM;
adata->res[2].start = addr + ACP3x_BT_TDM_REG_START;
adata->res[2].end = addr + ACP3x_BT_TDM_REG_END;
adata->res[3].name = "acp3x_i2s_irq";
adata->res[3].flags = IORESOURCE_IRQ;
adata->res[3].start = pci->irq;
adata->res[3].end = adata->res[3].start;
adata->acp3x_audio_mode = ACP3x_I2S_MODE;
memset(&pdevinfo, 0, sizeof(pdevinfo));
pdevinfo.name = "acp3x_rv_i2s";
pdevinfo.id = 0;
pdevinfo.parent = &pci->dev;
pdevinfo.num_res = 2;
pdevinfo.res = adata->res;
pdevinfo.data = &irqflags;
pdevinfo.size_data = sizeof(irqflags);
adata->pdev = platform_device_register_full(&pdevinfo);
if (IS_ERR(adata->pdev)) {
dev_err(&pci->dev, "cannot register %s device\n",
pdevinfo.name);
ret = PTR_ERR(adata->pdev);
goto unmap_mmio;
pdevinfo[0].name = "acp3x_rv_i2s_dma";
pdevinfo[0].id = 0;
pdevinfo[0].parent = &pci->dev;
pdevinfo[0].num_res = 4;
pdevinfo[0].res = &adata->res[0];
pdevinfo[0].data = &irqflags;
pdevinfo[0].size_data = sizeof(irqflags);
pdevinfo[1].name = "acp3x_i2s_playcap";
pdevinfo[1].id = 0;
pdevinfo[1].parent = &pci->dev;
pdevinfo[1].num_res = 1;
pdevinfo[1].res = &adata->res[1];
pdevinfo[2].name = "acp3x_i2s_playcap";
pdevinfo[2].id = 1;
pdevinfo[2].parent = &pci->dev;
pdevinfo[2].num_res = 1;
pdevinfo[2].res = &adata->res[2];
for (i = 0; i < ACP3x_DEVS ; i++) {
adata->pdev[i] =
platform_device_register_full(&pdevinfo[i]);
if (IS_ERR(adata->pdev[i])) {
dev_err(&pci->dev, "cannot register %s device\n",
pdevinfo[i].name);
ret = PTR_ERR(adata->pdev[i]);
goto unmap_mmio;
} break; default: dev_err(&pci->dev, "Invalid ACP audio mode : %d\n", val); ret = -ENODEV;}
goto unmap_mmio;
} return 0;goto release_regions;
unmap_mmio:
- pci_disable_msi(pci);
- iounmap(adata->acp3x_base);
- if (val == I2S_MODE)
for (i = 0 ; i < ACP3x_DEVS ; i++)
platform_device_unregister(adata->pdev[i]);
This label used to unmap, but now we're using devm_ so it doesn't any more. Change it to unregister_devices or something.
release_regions:
- pci_disable_msi(pci);
This should be "disable_msi" or something.
+adata_free: pci_release_regions(pci);
release_regions:
disable_pci: pci_disable_device(pci);
regards, dan carpenter