@@ -854,8 +854,8 @@ static void scp_remove_rpmsg_subdev(struct mtk_scp *scp)
854854 }
855855}
856856
857- static int scp_rproc_init (struct platform_device * pdev ,
858- struct mtk_scp_of_cluster * scp_cluster )
857+ static struct mtk_scp * scp_rproc_init (struct platform_device * pdev ,
858+ struct mtk_scp_of_cluster * scp_cluster )
859859{
860860 struct device * dev = & pdev -> dev ;
861861 struct device_node * np = dev -> of_node ;
@@ -867,11 +867,13 @@ static int scp_rproc_init(struct platform_device *pdev,
867867
868868 ret = rproc_of_parse_firmware (dev , 0 , & fw_name );
869869 if (ret < 0 && ret != - EINVAL )
870- return ret ;
870+ return ERR_PTR ( ret ) ;
871871
872872 rproc = devm_rproc_alloc (dev , np -> name , & scp_ops , fw_name , sizeof (* scp ));
873- if (!rproc )
874- return dev_err_probe (dev , - ENOMEM , "unable to allocate remoteproc\n" );
873+ if (!rproc ) {
874+ dev_err (dev , "unable to allocate remoteproc\n" );
875+ return ERR_PTR (- ENOMEM );
876+ }
875877
876878 scp = rproc -> priv ;
877879 scp -> rproc = rproc ;
@@ -882,20 +884,21 @@ static int scp_rproc_init(struct platform_device *pdev,
882884
883885 res = platform_get_resource_byname (pdev , IORESOURCE_MEM , "sram" );
884886 scp -> sram_base = devm_ioremap_resource (dev , res );
885- if (IS_ERR (scp -> sram_base ))
886- return dev_err_probe (dev , PTR_ERR (scp -> sram_base ),
887- "Failed to parse and map sram memory\n" );
887+ if (IS_ERR (scp -> sram_base )) {
888+ dev_err (dev , "Failed to parse and map sram memory\n" );
889+ return ERR_CAST (scp -> sram_base );
890+ }
888891
889892 scp -> sram_size = resource_size (res );
890893 scp -> sram_phys = res -> start ;
891894
892895 ret = scp -> data -> scp_clk_get (scp );
893896 if (ret )
894- return ret ;
897+ return ERR_PTR ( ret ) ;
895898
896899 ret = scp_map_memory_region (scp );
897900 if (ret )
898- return ret ;
901+ return ERR_PTR ( ret ) ;
899902
900903 mutex_init (& scp -> send_lock );
901904 for (i = 0 ; i < SCP_IPI_MAX ; i ++ )
@@ -922,11 +925,7 @@ static int scp_rproc_init(struct platform_device *pdev,
922925 goto remove_subdev ;
923926 }
924927
925- ret = rproc_add (rproc );
926- if (ret )
927- goto remove_subdev ;
928-
929- return 0 ;
928+ return scp ;
930929
931930remove_subdev :
932931 scp_remove_rpmsg_subdev (scp );
@@ -937,7 +936,43 @@ static int scp_rproc_init(struct platform_device *pdev,
937936 mutex_destroy (& scp -> ipi_desc [i ].lock );
938937 mutex_destroy (& scp -> send_lock );
939938
940- return ret ;
939+ return ERR_PTR (ret );
940+ }
941+
942+ static void scp_free (struct mtk_scp * scp )
943+ {
944+ int i ;
945+
946+ scp_remove_rpmsg_subdev (scp );
947+ scp_ipi_unregister (scp , SCP_IPI_INIT );
948+ scp_unmap_memory_region (scp );
949+ for (i = 0 ; i < SCP_IPI_MAX ; i ++ )
950+ mutex_destroy (& scp -> ipi_desc [i ].lock );
951+ mutex_destroy (& scp -> send_lock );
952+ }
953+
954+ static int scp_cluster_init (struct platform_device * pdev ,
955+ struct mtk_scp_of_cluster * scp_cluster )
956+ {
957+ struct device * dev = & pdev -> dev ;
958+ struct list_head * scp_list = & scp_cluster -> mtk_scp_list ;
959+ struct mtk_scp * scp ;
960+ int ret ;
961+
962+ scp = scp_rproc_init (pdev , scp_cluster );
963+ if (IS_ERR (scp ))
964+ return PTR_ERR (scp );
965+
966+ ret = rproc_add (scp -> rproc );
967+ if (ret ) {
968+ dev_err (dev , "Failed to add rproc\n" );
969+ scp_free (scp );
970+ return ret ;
971+ }
972+
973+ list_add_tail (& scp -> elem , scp_list );
974+
975+ return 0 ;
941976}
942977
943978static int scp_probe (struct platform_device * pdev )
@@ -970,7 +1005,9 @@ static int scp_probe(struct platform_device *pdev)
9701005 scp_cluster -> l1tcm_phys = res -> start ;
9711006 }
9721007
973- ret = scp_rproc_init (pdev , scp_cluster );
1008+ INIT_LIST_HEAD (& scp_cluster -> mtk_scp_list );
1009+
1010+ ret = scp_cluster_init (pdev , scp_cluster );
9741011 if (ret )
9751012 return ret ;
9761013
@@ -980,15 +1017,14 @@ static int scp_probe(struct platform_device *pdev)
9801017static void scp_remove (struct platform_device * pdev )
9811018{
9821019 struct mtk_scp * scp = platform_get_drvdata (pdev );
983- int i ;
1020+ struct mtk_scp_of_cluster * scp_cluster = scp -> cluster ;
1021+ struct mtk_scp * temp ;
9841022
985- rproc_del (scp -> rproc );
986- scp_remove_rpmsg_subdev (scp );
987- scp_ipi_unregister (scp , SCP_IPI_INIT );
988- scp_unmap_memory_region (scp );
989- for (i = 0 ; i < SCP_IPI_MAX ; i ++ )
990- mutex_destroy (& scp -> ipi_desc [i ].lock );
991- mutex_destroy (& scp -> send_lock );
1023+ list_for_each_entry_safe_reverse (scp , temp , & scp_cluster -> mtk_scp_list , elem ) {
1024+ list_del (& scp -> elem );
1025+ rproc_del (scp -> rproc );
1026+ scp_free (scp );
1027+ }
9921028}
9931029
9941030static const struct mtk_scp_of_data mt8183_of_data = {
0 commit comments