@@ -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
814828out :
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