@@ -684,13 +684,14 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
684
684
const struct of_device_id * of_id = NULL ;
685
685
struct device_node * dn ;
686
686
void __iomem * base ;
687
- int ret , i ;
687
+ int ret , i , s ;
688
688
689
689
/* AON ctrl registers */
690
690
base = brcmstb_ioremap_match (aon_ctrl_dt_ids , 0 , NULL );
691
691
if (IS_ERR (base )) {
692
692
pr_err ("error mapping AON_CTRL\n" );
693
- return PTR_ERR (base );
693
+ ret = PTR_ERR (base );
694
+ goto aon_err ;
694
695
}
695
696
ctrl .aon_ctrl_base = base ;
696
697
@@ -700,8 +701,10 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
700
701
/* Assume standard offset */
701
702
ctrl .aon_sram = ctrl .aon_ctrl_base +
702
703
AON_CTRL_SYSTEM_DATA_RAM_OFS ;
704
+ s = 0 ;
703
705
} else {
704
706
ctrl .aon_sram = base ;
707
+ s = 1 ;
705
708
}
706
709
707
710
writel_relaxed (0 , ctrl .aon_sram + AON_REG_PANIC );
@@ -711,7 +714,8 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
711
714
(const void * * )& ddr_phy_data );
712
715
if (IS_ERR (base )) {
713
716
pr_err ("error mapping DDR PHY\n" );
714
- return PTR_ERR (base );
717
+ ret = PTR_ERR (base );
718
+ goto ddr_phy_err ;
715
719
}
716
720
ctrl .support_warm_boot = ddr_phy_data -> supports_warm_boot ;
717
721
ctrl .pll_status_offset = ddr_phy_data -> pll_status_offset ;
@@ -731,17 +735,20 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
731
735
for_each_matching_node (dn , ddr_shimphy_dt_ids ) {
732
736
i = ctrl .num_memc ;
733
737
if (i >= MAX_NUM_MEMC ) {
738
+ of_node_put (dn );
734
739
pr_warn ("too many MEMCs (max %d)\n" , MAX_NUM_MEMC );
735
740
break ;
736
741
}
737
742
738
743
base = of_io_request_and_map (dn , 0 , dn -> full_name );
739
744
if (IS_ERR (base )) {
745
+ of_node_put (dn );
740
746
if (!ctrl .support_warm_boot )
741
747
break ;
742
748
743
749
pr_err ("error mapping DDR SHIMPHY %d\n" , i );
744
- return PTR_ERR (base );
750
+ ret = PTR_ERR (base );
751
+ goto ddr_shimphy_err ;
745
752
}
746
753
ctrl .memcs [i ].ddr_shimphy_base = base ;
747
754
ctrl .num_memc ++ ;
@@ -752,14 +759,18 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
752
759
for_each_matching_node (dn , brcmstb_memc_of_match ) {
753
760
base = of_iomap (dn , 0 );
754
761
if (!base ) {
762
+ of_node_put (dn );
755
763
pr_err ("error mapping DDR Sequencer %d\n" , i );
756
- return - ENOMEM ;
764
+ ret = - ENOMEM ;
765
+ goto brcmstb_memc_err ;
757
766
}
758
767
759
768
of_id = of_match_node (brcmstb_memc_of_match , dn );
760
769
if (!of_id ) {
761
770
iounmap (base );
762
- return - EINVAL ;
771
+ of_node_put (dn );
772
+ ret = - EINVAL ;
773
+ goto brcmstb_memc_err ;
763
774
}
764
775
765
776
ddr_seq_data = of_id -> data ;
@@ -779,21 +790,24 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
779
790
dn = of_find_matching_node (NULL , sram_dt_ids );
780
791
if (!dn ) {
781
792
pr_err ("SRAM not found\n" );
782
- return - EINVAL ;
793
+ ret = - EINVAL ;
794
+ goto brcmstb_memc_err ;
783
795
}
784
796
785
797
ret = brcmstb_init_sram (dn );
786
798
of_node_put (dn );
787
799
if (ret ) {
788
800
pr_err ("error setting up SRAM for PM\n" );
789
- return ret ;
801
+ goto brcmstb_memc_err ;
790
802
}
791
803
792
804
ctrl .pdev = pdev ;
793
805
794
806
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
+ }
797
811
ctrl .s3_params_pa = dma_map_single (& pdev -> dev , ctrl .s3_params ,
798
812
sizeof (* ctrl .s3_params ),
799
813
DMA_TO_DEVICE );
@@ -813,7 +827,21 @@ static int brcmstb_pm_probe(struct platform_device *pdev)
813
827
814
828
out :
815
829
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 :
817
845
pr_warn ("PM: initialization failed with code %d\n" , ret );
818
846
819
847
return ret ;
0 commit comments