static int cs_dsp_parse_coeff()

in cirrus/cs_dsp.c [1151:1221]


static int cs_dsp_parse_coeff(struct cs_dsp *dsp,
			      const struct wmfw_region *region)
{
	struct cs_dsp_alg_region alg_region = {};
	struct cs_dsp_coeff_parsed_alg alg_blk;
	struct cs_dsp_coeff_parsed_coeff coeff_blk;
	const u8 *data = region->data;
	int i, ret;

	cs_dsp_coeff_parse_alg(dsp, &data, &alg_blk);
	for (i = 0; i < alg_blk.ncoeff; i++) {
		cs_dsp_coeff_parse_coeff(dsp, &data, &coeff_blk);

		switch (coeff_blk.ctl_type) {
		case WMFW_CTL_TYPE_BYTES:
			break;
		case WMFW_CTL_TYPE_ACKED:
			if (coeff_blk.flags & WMFW_CTL_FLAG_SYS)
				continue;	/* ignore */

			ret = cs_dsp_check_coeff_flags(dsp, &coeff_blk,
						       WMFW_CTL_FLAG_VOLATILE |
						       WMFW_CTL_FLAG_WRITEABLE |
						       WMFW_CTL_FLAG_READABLE,
						       0);
			if (ret)
				return -EINVAL;
			break;
		case WMFW_CTL_TYPE_HOSTEVENT:
		case WMFW_CTL_TYPE_FWEVENT:
			ret = cs_dsp_check_coeff_flags(dsp, &coeff_blk,
						       WMFW_CTL_FLAG_SYS |
						       WMFW_CTL_FLAG_VOLATILE |
						       WMFW_CTL_FLAG_WRITEABLE |
						       WMFW_CTL_FLAG_READABLE,
						       0);
			if (ret)
				return -EINVAL;
			break;
		case WMFW_CTL_TYPE_HOST_BUFFER:
			ret = cs_dsp_check_coeff_flags(dsp, &coeff_blk,
						       WMFW_CTL_FLAG_SYS |
						       WMFW_CTL_FLAG_VOLATILE |
						       WMFW_CTL_FLAG_READABLE,
						       0);
			if (ret)
				return -EINVAL;
			break;
		default:
			cs_dsp_err(dsp, "Unknown control type: %d\n",
				   coeff_blk.ctl_type);
			return -EINVAL;
		}

		alg_region.type = coeff_blk.mem_type;
		alg_region.alg = alg_blk.id;

		ret = cs_dsp_create_control(dsp, &alg_region,
					    coeff_blk.offset,
					    coeff_blk.len,
					    coeff_blk.name,
					    coeff_blk.name_len,
					    coeff_blk.flags,
					    coeff_blk.ctl_type);
		if (ret < 0)
			cs_dsp_err(dsp, "Failed to create control: %.*s, %d\n",
				   coeff_blk.name_len, coeff_blk.name, ret);
	}

	return 0;
}