@@ -850,6 +850,10 @@ void icc_node_destroy(int id)
850850
851851 mutex_unlock (& icc_lock );
852852
853+ if (!node )
854+ return ;
855+
856+ kfree (node -> links );
853857 kfree (node );
854858}
855859EXPORT_SYMBOL_GPL (icc_node_destroy );
@@ -1029,54 +1033,68 @@ int icc_nodes_remove(struct icc_provider *provider)
10291033EXPORT_SYMBOL_GPL (icc_nodes_remove );
10301034
10311035/**
1032- * icc_provider_add() - add a new interconnect provider
1033- * @provider: the interconnect provider that will be added into topology
1036+ * icc_provider_init() - initialize a new interconnect provider
1037+ * @provider: the interconnect provider to initialize
1038+ *
1039+ * Must be called before adding nodes to the provider.
1040+ */
1041+ void icc_provider_init (struct icc_provider * provider )
1042+ {
1043+ WARN_ON (!provider -> set );
1044+
1045+ INIT_LIST_HEAD (& provider -> nodes );
1046+ }
1047+ EXPORT_SYMBOL_GPL (icc_provider_init );
1048+
1049+ /**
1050+ * icc_provider_register() - register a new interconnect provider
1051+ * @provider: the interconnect provider to register
10341052 *
10351053 * Return: 0 on success, or an error code otherwise
10361054 */
1037- int icc_provider_add (struct icc_provider * provider )
1055+ int icc_provider_register (struct icc_provider * provider )
10381056{
1039- if (WARN_ON (!provider -> set ))
1040- return - EINVAL ;
10411057 if (WARN_ON (!provider -> xlate && !provider -> xlate_extended ))
10421058 return - EINVAL ;
10431059
10441060 mutex_lock (& icc_lock );
1045-
1046- INIT_LIST_HEAD (& provider -> nodes );
10471061 list_add_tail (& provider -> provider_list , & icc_providers );
1048-
10491062 mutex_unlock (& icc_lock );
10501063
1051- dev_dbg (provider -> dev , "interconnect provider added to topology \n" );
1064+ dev_dbg (provider -> dev , "interconnect provider registered \n" );
10521065
10531066 return 0 ;
10541067}
1055- EXPORT_SYMBOL_GPL (icc_provider_add );
1068+ EXPORT_SYMBOL_GPL (icc_provider_register );
10561069
10571070/**
1058- * icc_provider_del () - delete previously added interconnect provider
1059- * @provider: the interconnect provider that will be removed from topology
1071+ * icc_provider_deregister () - deregister an interconnect provider
1072+ * @provider: the interconnect provider to deregister
10601073 */
1061- void icc_provider_del (struct icc_provider * provider )
1074+ void icc_provider_deregister (struct icc_provider * provider )
10621075{
10631076 mutex_lock (& icc_lock );
1064- if (provider -> users ) {
1065- pr_warn ("interconnect provider still has %d users\n" ,
1066- provider -> users );
1067- mutex_unlock (& icc_lock );
1068- return ;
1069- }
1070-
1071- if (!list_empty (& provider -> nodes )) {
1072- pr_warn ("interconnect provider still has nodes\n" );
1073- mutex_unlock (& icc_lock );
1074- return ;
1075- }
1077+ WARN_ON (provider -> users );
10761078
10771079 list_del (& provider -> provider_list );
10781080 mutex_unlock (& icc_lock );
10791081}
1082+ EXPORT_SYMBOL_GPL (icc_provider_deregister );
1083+
1084+ int icc_provider_add (struct icc_provider * provider )
1085+ {
1086+ icc_provider_init (provider );
1087+
1088+ return icc_provider_register (provider );
1089+ }
1090+ EXPORT_SYMBOL_GPL (icc_provider_add );
1091+
1092+ void icc_provider_del (struct icc_provider * provider )
1093+ {
1094+ WARN_ON (!list_empty (& provider -> nodes ));
1095+
1096+ icc_provider_deregister (provider );
1097+ }
10801098EXPORT_SYMBOL_GPL (icc_provider_del );
10811099
10821100static const struct of_device_id __maybe_unused ignore_list [] = {
0 commit comments