Skip to content

Commit 49f6d09

Browse files
committed
Merge tag 'arm-soc/for-6.0/drivers-fixes' of https://github.com/Broadcom/stblinux into arm/fixes
This pull request contains Broadcom SoCs driver fixes for 6.0, please pull the following: - Liang fixes the legacy Broadcom STB ARM system suspend/resume code error paths that were leaking ioremap() and other of_* operations * tag 'arm-soc/for-6.0/drivers-fixes' of https://github.com/Broadcom/stblinux: soc: brcmstb: pm-arm: Fix refcount leak and __iomem leak bugs Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnd Bergmann <[email protected]>
2 parents 06f0696 + 1085f50 commit 49f6d09

File tree

1 file changed

+39
-11
lines changed

1 file changed

+39
-11
lines changed

drivers/soc/bcm/brcmstb/pm/pm-arm.c

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -684,13 +684,14 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
684684
const struct of_device_id *of_id = NULL;
685685
struct device_node *dn;
686686
void __iomem *base;
687-
int ret, i;
687+
int ret, i, s;
688688

689689
/* AON ctrl registers */
690690
base = brcmstb_ioremap_match(aon_ctrl_dt_ids, 0, NULL);
691691
if (IS_ERR(base)) {
692692
pr_err("error mapping AON_CTRL\n");
693-
return PTR_ERR(base);
693+
ret = PTR_ERR(base);
694+
goto aon_err;
694695
}
695696
ctrl.aon_ctrl_base = base;
696697

@@ -700,8 +701,10 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
700701
/* Assume standard offset */
701702
ctrl.aon_sram = ctrl.aon_ctrl_base +
702703
AON_CTRL_SYSTEM_DATA_RAM_OFS;
704+
s = 0;
703705
} else {
704706
ctrl.aon_sram = base;
707+
s = 1;
705708
}
706709

707710
writel_relaxed(0, ctrl.aon_sram + AON_REG_PANIC);
@@ -711,7 +714,8 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
711714
(const void **)&ddr_phy_data);
712715
if (IS_ERR(base)) {
713716
pr_err("error mapping DDR PHY\n");
714-
return PTR_ERR(base);
717+
ret = PTR_ERR(base);
718+
goto ddr_phy_err;
715719
}
716720
ctrl.support_warm_boot = ddr_phy_data->supports_warm_boot;
717721
ctrl.pll_status_offset = ddr_phy_data->pll_status_offset;
@@ -731,17 +735,20 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
731735
for_each_matching_node(dn, ddr_shimphy_dt_ids) {
732736
i = ctrl.num_memc;
733737
if (i >= MAX_NUM_MEMC) {
738+
of_node_put(dn);
734739
pr_warn("too many MEMCs (max %d)\n", MAX_NUM_MEMC);
735740
break;
736741
}
737742

738743
base = of_io_request_and_map(dn, 0, dn->full_name);
739744
if (IS_ERR(base)) {
745+
of_node_put(dn);
740746
if (!ctrl.support_warm_boot)
741747
break;
742748

743749
pr_err("error mapping DDR SHIMPHY %d\n", i);
744-
return PTR_ERR(base);
750+
ret = PTR_ERR(base);
751+
goto ddr_shimphy_err;
745752
}
746753
ctrl.memcs[i].ddr_shimphy_base = base;
747754
ctrl.num_memc++;
@@ -752,14 +759,18 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
752759
for_each_matching_node(dn, brcmstb_memc_of_match) {
753760
base = of_iomap(dn, 0);
754761
if (!base) {
762+
of_node_put(dn);
755763
pr_err("error mapping DDR Sequencer %d\n", i);
756-
return -ENOMEM;
764+
ret = -ENOMEM;
765+
goto brcmstb_memc_err;
757766
}
758767

759768
of_id = of_match_node(brcmstb_memc_of_match, dn);
760769
if (!of_id) {
761770
iounmap(base);
762-
return -EINVAL;
771+
of_node_put(dn);
772+
ret = -EINVAL;
773+
goto brcmstb_memc_err;
763774
}
764775

765776
ddr_seq_data = of_id->data;
@@ -779,21 +790,24 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
779790
dn = of_find_matching_node(NULL, sram_dt_ids);
780791
if (!dn) {
781792
pr_err("SRAM not found\n");
782-
return -EINVAL;
793+
ret = -EINVAL;
794+
goto brcmstb_memc_err;
783795
}
784796

785797
ret = brcmstb_init_sram(dn);
786798
of_node_put(dn);
787799
if (ret) {
788800
pr_err("error setting up SRAM for PM\n");
789-
return ret;
801+
goto brcmstb_memc_err;
790802
}
791803

792804
ctrl.pdev = pdev;
793805

794806
ctrl.s3_params = kmalloc(sizeof(*ctrl.s3_params), GFP_KERNEL);
795-
if (!ctrl.s3_params)
796-
return -ENOMEM;
807+
if (!ctrl.s3_params) {
808+
ret = -ENOMEM;
809+
goto s3_params_err;
810+
}
797811
ctrl.s3_params_pa = dma_map_single(&pdev->dev, ctrl.s3_params,
798812
sizeof(*ctrl.s3_params),
799813
DMA_TO_DEVICE);
@@ -813,7 +827,21 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
813827

814828
out:
815829
kfree(ctrl.s3_params);
816-
830+
s3_params_err:
831+
iounmap(ctrl.boot_sram);
832+
brcmstb_memc_err:
833+
for (i--; i >= 0; i--)
834+
iounmap(ctrl.memcs[i].ddr_ctrl);
835+
ddr_shimphy_err:
836+
for (i = 0; i < ctrl.num_memc; i++)
837+
iounmap(ctrl.memcs[i].ddr_shimphy_base);
838+
839+
iounmap(ctrl.memcs[0].ddr_phy_base);
840+
ddr_phy_err:
841+
iounmap(ctrl.aon_ctrl_base);
842+
if (s)
843+
iounmap(ctrl.aon_sram);
844+
aon_err:
817845
pr_warn("PM: initialization failed with code %d\n", ret);
818846

819847
return ret;

0 commit comments

Comments
 (0)