static int add_all_attributes()

in sysfs_slave_dpn.c [167:278]


static int add_all_attributes(struct device *dev, int N, int dir)
{
	struct attribute **dpn_attrs;
	struct attribute_group *dpn_group;
	int i = 0;
	int ret;

	/* allocate attributes, last one is NULL */
	dpn_attrs = devm_kcalloc(dev, SDW_DPN_ATTRIBUTES + 1,
				 sizeof(struct attribute *),
				 GFP_KERNEL);
	if (!dpn_attrs)
		return -ENOMEM;

	ret = max_word_attribute_alloc(dev, &dpn_attrs[i++],
				       N, dir, "%d\n");
	if (ret < 0)
		return ret;

	ret = min_word_attribute_alloc(dev, &dpn_attrs[i++],
				       N, dir, "%d\n");
	if (ret < 0)
		return ret;

	ret = words_attribute_alloc(dev, &dpn_attrs[i++],
				    N, dir, "%d\n");
	if (ret < 0)
		return ret;

	ret = type_attribute_alloc(dev, &dpn_attrs[i++],
				   N, dir, "%d\n");
	if (ret < 0)
		return ret;

	ret = max_grouping_attribute_alloc(dev, &dpn_attrs[i++],
					   N, dir, "%d\n");
	if (ret < 0)
		return ret;

	ret = simple_ch_prep_sm_attribute_alloc(dev, &dpn_attrs[i++],
						N, dir, "%d\n");
	if (ret < 0)
		return ret;

	ret = ch_prep_timeout_attribute_alloc(dev, &dpn_attrs[i++],
					      N, dir, "%d\n");
	if (ret < 0)
		return ret;

	ret = imp_def_interrupts_attribute_alloc(dev, &dpn_attrs[i++],
						 N, dir, "0x%x\n");
	if (ret < 0)
		return ret;

	ret = min_ch_attribute_alloc(dev, &dpn_attrs[i++],
				     N, dir, "%d\n");
	if (ret < 0)
		return ret;

	ret = max_ch_attribute_alloc(dev, &dpn_attrs[i++],
				     N, dir, "%d\n");
	if (ret < 0)
		return ret;

	ret = channels_attribute_alloc(dev, &dpn_attrs[i++],
				       N, dir, "%d\n");
	if (ret < 0)
		return ret;

	ret = ch_combinations_attribute_alloc(dev, &dpn_attrs[i++],
					      N, dir, "%d\n");
	if (ret < 0)
		return ret;

	ret = max_async_buffer_attribute_alloc(dev, &dpn_attrs[i++],
					       N, dir, "%d\n");
	if (ret < 0)
		return ret;

	ret = block_pack_mode_attribute_alloc(dev, &dpn_attrs[i++],
					      N, dir, "%d\n");
	if (ret < 0)
		return ret;

	ret = port_encoding_attribute_alloc(dev, &dpn_attrs[i++],
					    N, dir, "%d\n");
	if (ret < 0)
		return ret;

	/* paranoia check for editing mistakes */
	if (i != SDW_DPN_ATTRIBUTES) {
		dev_err(dev, "mismatch in attributes, allocated %d got %d\n",
			SDW_DPN_ATTRIBUTES, i);
		return -EINVAL;
	}

	dpn_group = devm_kzalloc(dev, sizeof(*dpn_group), GFP_KERNEL);
	if (!dpn_group)
		return -ENOMEM;

	dpn_group->attrs = dpn_attrs;
	dpn_group->name = devm_kasprintf(dev, GFP_KERNEL, "dp%d_%s",
					 N, dir ? "src" : "sink");
	if (!dpn_group->name)
		return -ENOMEM;

	ret = devm_device_add_group(dev, dpn_group);
	if (ret < 0)
		return ret;

	return 0;
}