@@ -854,8 +854,8 @@ static void scp_remove_rpmsg_subdev(struct mtk_scp *scp)
854
854
}
855
855
}
856
856
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 )
859
859
{
860
860
struct device * dev = & pdev -> dev ;
861
861
struct device_node * np = dev -> of_node ;
@@ -867,11 +867,13 @@ static int scp_rproc_init(struct platform_device *pdev,
867
867
868
868
ret = rproc_of_parse_firmware (dev , 0 , & fw_name );
869
869
if (ret < 0 && ret != - EINVAL )
870
- return ret ;
870
+ return ERR_PTR ( ret ) ;
871
871
872
872
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
+ }
875
877
876
878
scp = rproc -> priv ;
877
879
scp -> rproc = rproc ;
@@ -882,20 +884,21 @@ static int scp_rproc_init(struct platform_device *pdev,
882
884
883
885
res = platform_get_resource_byname (pdev , IORESOURCE_MEM , "sram" );
884
886
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
+ }
888
891
889
892
scp -> sram_size = resource_size (res );
890
893
scp -> sram_phys = res -> start ;
891
894
892
895
ret = scp -> data -> scp_clk_get (scp );
893
896
if (ret )
894
- return ret ;
897
+ return ERR_PTR ( ret ) ;
895
898
896
899
ret = scp_map_memory_region (scp );
897
900
if (ret )
898
- return ret ;
901
+ return ERR_PTR ( ret ) ;
899
902
900
903
mutex_init (& scp -> send_lock );
901
904
for (i = 0 ; i < SCP_IPI_MAX ; i ++ )
@@ -922,11 +925,7 @@ static int scp_rproc_init(struct platform_device *pdev,
922
925
goto remove_subdev ;
923
926
}
924
927
925
- ret = rproc_add (rproc );
926
- if (ret )
927
- goto remove_subdev ;
928
-
929
- return 0 ;
928
+ return scp ;
930
929
931
930
remove_subdev :
932
931
scp_remove_rpmsg_subdev (scp );
@@ -937,7 +936,43 @@ static int scp_rproc_init(struct platform_device *pdev,
937
936
mutex_destroy (& scp -> ipi_desc [i ].lock );
938
937
mutex_destroy (& scp -> send_lock );
939
938
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 ;
941
976
}
942
977
943
978
static int scp_probe (struct platform_device * pdev )
@@ -970,7 +1005,9 @@ static int scp_probe(struct platform_device *pdev)
970
1005
scp_cluster -> l1tcm_phys = res -> start ;
971
1006
}
972
1007
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 );
974
1011
if (ret )
975
1012
return ret ;
976
1013
@@ -980,15 +1017,14 @@ static int scp_probe(struct platform_device *pdev)
980
1017
static void scp_remove (struct platform_device * pdev )
981
1018
{
982
1019
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 ;
984
1022
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
+ }
992
1028
}
993
1029
994
1030
static const struct mtk_scp_of_data mt8183_of_data = {
0 commit comments