[bug report] ASoC: Intel: mrfld - create separate module for pci part
Dan Carpenter
dan.carpenter at oracle.com
Fri Dec 3 11:13:54 CET 2021
Hello Vinod Koul,
The patch f533a035e4da: "ASoC: Intel: mrfld - create separate module
for pci part" from Nov 4, 2014, leads to the following Smatch static
checker warning:
sound/soc/intel/atom/sst/sst_pci.c:102 sst_platform_get_resources()
warn: resource freed on success: 'ctx->pci'
sound/soc/intel/atom/sst/sst_pci.c
25 static int sst_platform_get_resources(struct intel_sst_drv *ctx)
26 {
27 int ddr_base, ret = 0;
28 struct pci_dev *pci = ctx->pci;
29
30 ret = pci_request_regions(pci, SST_DRV_NAME);
31 if (ret)
32 return ret;
33
34 /* map registers */
35 /* DDR base */
36 if (ctx->dev_id == SST_MRFLD_PCI_ID) {
37 ctx->ddr_base = pci_resource_start(pci, 0);
38 /* check that the relocated IMR base matches with FW Binary */
39 ddr_base = relocate_imr_addr_mrfld(ctx->ddr_base);
40 if (!ctx->pdata->lib_info) {
41 dev_err(ctx->dev, "lib_info pointer NULL\n");
42 ret = -EINVAL;
43 goto do_release_regions;
44 }
45 if (ddr_base != ctx->pdata->lib_info->mod_base) {
46 dev_err(ctx->dev,
47 "FW LSP DDR BASE does not match with IFWI\n");
48 ret = -EINVAL;
49 goto do_release_regions;
50 }
51 ctx->ddr_end = pci_resource_end(pci, 0);
52
53 ctx->ddr = pcim_iomap(pci, 0,
54 pci_resource_len(pci, 0));
55 if (!ctx->ddr) {
56 ret = -EINVAL;
57 goto do_release_regions;
58 }
59 dev_dbg(ctx->dev, "sst: DDR Ptr %p\n", ctx->ddr);
60 } else {
61 ctx->ddr = NULL;
62 }
63 /* SHIM */
64 ctx->shim_phy_add = pci_resource_start(pci, 1);
65 ctx->shim = pcim_iomap(pci, 1, pci_resource_len(pci, 1));
66 if (!ctx->shim) {
67 ret = -EINVAL;
68 goto do_release_regions;
69 }
70 dev_dbg(ctx->dev, "SST Shim Ptr %p\n", ctx->shim);
71
72 /* Shared SRAM */
73 ctx->mailbox_add = pci_resource_start(pci, 2);
74 ctx->mailbox = pcim_iomap(pci, 2, pci_resource_len(pci, 2));
75 if (!ctx->mailbox) {
76 ret = -EINVAL;
77 goto do_release_regions;
78 }
79 dev_dbg(ctx->dev, "SRAM Ptr %p\n", ctx->mailbox);
80
81 /* IRAM */
82 ctx->iram_end = pci_resource_end(pci, 3);
83 ctx->iram_base = pci_resource_start(pci, 3);
84 ctx->iram = pcim_iomap(pci, 3, pci_resource_len(pci, 3));
85 if (!ctx->iram) {
86 ret = -EINVAL;
87 goto do_release_regions;
88 }
89 dev_dbg(ctx->dev, "IRAM Ptr %p\n", ctx->iram);
90
91 /* DRAM */
92 ctx->dram_end = pci_resource_end(pci, 4);
93 ctx->dram_base = pci_resource_start(pci, 4);
94 ctx->dram = pcim_iomap(pci, 4, pci_resource_len(pci, 4));
95 if (!ctx->dram) {
96 ret = -EINVAL;
97 goto do_release_regions;
98 }
99 dev_dbg(ctx->dev, "DRAM Ptr %p\n", ctx->dram);
100 do_release_regions:
101 pci_release_regions(pci);
--> 102 return ret;
103 }
Surely there should be a "return 0;" before the do_release_regions:
label? How does this code work?
regards,
dan carpenter
More information about the Alsa-devel
mailing list