int cscfg_load_config_sets()

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;
}