in coresight/coresight-syscfg.c [475:532]
int cscfg_load_config_sets(struct cscfg_config_desc **config_descs,
struct cscfg_feature_desc **feat_descs,
struct cscfg_load_owner_info *owner_info)
{
int err = 0, i = 0;
mutex_lock(&cscfg_mutex);
/* load features first */
if (feat_descs) {
while (feat_descs[i]) {
err = cscfg_load_feat(feat_descs[i]);
if (!err)
err = cscfg_configfs_add_feature(feat_descs[i]);
if (err) {
pr_err("coresight-syscfg: Failed to load feature %s\n",
feat_descs[i]->name);
cscfg_unload_owned_cfgs_feats(owner_info);
goto exit_unlock;
}
feat_descs[i]->load_owner = owner_info;
i++;
}
}
/* next any configurations to check feature dependencies */
i = 0;
if (config_descs) {
while (config_descs[i]) {
err = cscfg_load_config(config_descs[i]);
if (!err)
err = cscfg_configfs_add_config(config_descs[i]);
if (err) {
pr_err("coresight-syscfg: Failed to load configuration %s\n",
config_descs[i]->name);
cscfg_unload_owned_cfgs_feats(owner_info);
goto exit_unlock;
}
config_descs[i]->load_owner = owner_info;
i++;
}
}
/* add the load owner to the load order list */
list_add_tail(&owner_info->item, &cscfg_mgr->load_order_list);
if (!list_is_singular(&cscfg_mgr->load_order_list)) {
/* lock previous item in load order list */
err = cscfg_owner_get(list_prev_entry(owner_info, item));
if (err) {
cscfg_unload_owned_cfgs_feats(owner_info);
list_del(&owner_info->item);
}
}
exit_unlock:
mutex_unlock(&cscfg_mutex);
return err;
}