sound/soc/codecs/aw88395/aw88395_lib.c

Source file repositories/reference/linux-study-clean/sound/soc/codecs/aw88395/aw88395_lib.c

File Facts

System
Linux kernel
Corpus path
sound/soc/codecs/aw88395/aw88395_lib.c
Extension
.c
Size
34452 bytes
Lines
1174
Domain
Driver Families
Bucket
sound/soc
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (ret < 0) {
			dev_err(aw_dev->dev, "aw_bin_parse check sum data error\n");
			return ret;
		}
		ret = aw_check_data_version(aw_dev, bin, i);
		if (ret < 0) {
			dev_err(aw_dev->dev, "aw_bin_parse check data version error\n");
			return ret;
		}
		if (bin->header_info[i].bin_data_ver == DATA_VERSION_V1) {
			switch (bin->header_info[i].bin_data_type) {
			case DATA_TYPE_REGISTER:
				ret = aw_check_register_num(aw_dev, bin, i);
				break;
			case DATA_TYPE_DSP_REG:
				ret = aw_check_dsp_reg_num(aw_dev, bin, i);
				break;
			case DATA_TYPE_SOC_APP:
				ret = aw_check_soc_app_num(aw_dev, bin, i);
				break;
			default:
				bin->header_info[i].valid_data_len =
						bin->header_info[i].bin_data_len;
				ret = 0;
				break;
			}
			if (ret < 0)
				return ret;
		}
	}

	return 0;
}

static int aw_dev_parse_raw_reg(unsigned char *data, unsigned int data_len,
		struct aw_prof_desc *prof_desc)
{
	prof_desc->sec_desc[AW88395_DATA_TYPE_REG].data = data;
	prof_desc->sec_desc[AW88395_DATA_TYPE_REG].len = data_len;

	prof_desc->prof_st = AW88395_PROFILE_OK;

	return 0;
}

static int aw_dev_parse_raw_dsp_cfg(unsigned char *data, unsigned int data_len,
		struct aw_prof_desc *prof_desc)
{
	if (data_len & 0x01)
		return -EINVAL;

	swab16_array((u16 *)data, data_len >> 1);

	prof_desc->sec_desc[AW88395_DATA_TYPE_DSP_CFG].data = data;
	prof_desc->sec_desc[AW88395_DATA_TYPE_DSP_CFG].len = data_len;

	prof_desc->prof_st = AW88395_PROFILE_OK;

	return 0;
}

static int aw_dev_parse_raw_dsp_fw(unsigned char *data,	unsigned int data_len,
		struct aw_prof_desc *prof_desc)
{
	if (data_len & 0x01)
		return -EINVAL;

	swab16_array((u16 *)data, data_len >> 1);

	prof_desc->sec_desc[AW88395_DATA_TYPE_DSP_FW].data = data;
	prof_desc->sec_desc[AW88395_DATA_TYPE_DSP_FW].len = data_len;

	prof_desc->prof_st = AW88395_PROFILE_OK;

	return 0;
}

static int aw_dev_prof_parse_multi_bin(struct aw_device *aw_dev, unsigned char *data,
				unsigned int data_len, struct aw_prof_desc *prof_desc)
{
	int ret;
	int i;

	struct aw_bin *aw_bin __free(kfree) = kzalloc(data_len + sizeof(struct aw_bin),
						     GFP_KERNEL);
	if (!aw_bin)
		return -ENOMEM;

	aw_bin->info.len = data_len;
	memcpy(aw_bin->info.data, data, data_len);

Annotation

Implementation Notes