Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f5fadc7 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: audio_acdb: Add support for ULP listen calibration"

parents 6c44220f 7cee9495
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -67,6 +67,12 @@
			(AUDIO_MAX_COMMON_IOCTL_NUM+30), struct hw_delay)
#define AUDIO_SET_HW_DELAY_TX	_IOW(AUDIO_IOCTL_MAGIC, \
			(AUDIO_MAX_COMMON_IOCTL_NUM+31), struct hw_delay)

#define AUDIO_LISTEN_SET_ULP_LSM_CAL		_IOW(AUDIO_IOCTL_MAGIC, \
			(AUDIO_MAX_COMMON_IOCTL_NUM+32), void *)

#define AUDIO_LISTEN_SET_ULP_AFE_CAL		_IOW(AUDIO_IOCTL_MAGIC, \
			(AUDIO_MAX_COMMON_IOCTL_NUM+33), void *)
#define	AUDIO_MAX_ACDB_IOCTL	(AUDIO_MAX_COMMON_IOCTL_NUM+40)

/* ACDB structures */
+103 −0
Original line number Diff line number Diff line
@@ -52,6 +52,12 @@ struct acdb_data {
	/* LSM Cal */
	struct acdb_cal_block		lsm_cal;

	/* ULP Listen AFE cal */
	struct acdb_cal_block		ulp_lsm_cal;

	/* ULP Listen LSM cal */
	struct acdb_cal_block		ulp_afe_cal;

	/* AudProc Cal */
	uint32_t			asm_topology;
	uint32_t			adm_topology[MAX_AUDPROC_TYPES];
@@ -316,6 +322,97 @@ done:
	return result;
}

static int store_ulp_afe_cal(struct cal_block *cal_block)
{
	int rc = 0;

	if (cal_block->cal_offset > acdb_data.mem_len) {
		pr_err("%s: offset %d is > mem_len %llu\n",
			__func__, cal_block->cal_offset,
			acdb_data.mem_len);
		rc = -EINVAL;
		goto done;
	}

	pr_debug("%s: cal_size = %u, cal_offset = %u\n",
		__func__, cal_block->cal_size,
		cal_block->cal_offset);

	acdb_data.ulp_afe_cal.cal_size = cal_block->cal_size;
	acdb_data.ulp_afe_cal.cal_paddr =
		cal_block->cal_offset + acdb_data.paddr;
	acdb_data.ulp_afe_cal.cal_kvaddr =
		cal_block->cal_offset + (u8 *)acdb_data.kvaddr;

done:
	return rc;
}

int get_ulp_afe_cal(struct acdb_cal_block *cal_block)
{
	int rc = 0;

	if (cal_block == NULL) {
		pr_err("ACDB=> NULL pointer sent to %s\n", __func__);
		rc = -EINVAL;
		goto done;
	}

	cal_block->cal_size = acdb_data.ulp_afe_cal.cal_size;
	cal_block->cal_paddr = acdb_data.ulp_afe_cal.cal_paddr;
	cal_block->cal_kvaddr = acdb_data.ulp_afe_cal.cal_kvaddr;

done:
	return rc;
}
EXPORT_SYMBOL(get_ulp_afe_cal);


static int store_ulp_lsm_cal(struct cal_block *cal_block)
{
	int rc = 0;

	if (cal_block->cal_offset > acdb_data.mem_len) {
		pr_err("%s: offset %d is > mem_len %llu\n",
			__func__, cal_block->cal_offset,
			acdb_data.mem_len);
		rc = -EINVAL;
		goto done;
	}

	pr_debug("%s: cal_size = %u, cal_offset = %u\n",
		__func__, cal_block->cal_size,
		cal_block->cal_offset);

	acdb_data.ulp_lsm_cal.cal_size = cal_block->cal_size;
	acdb_data.ulp_lsm_cal.cal_paddr =
		cal_block->cal_offset + acdb_data.paddr;
	acdb_data.ulp_lsm_cal.cal_kvaddr =
		cal_block->cal_offset + (u8 *)acdb_data.kvaddr;

done:
	return rc;
}

int get_ulp_lsm_cal(struct acdb_cal_block *cal_block)
{
	int rc = 0;

	if (cal_block == NULL) {
		pr_err("ACDB=> NULL pointer sent to %s\n", __func__);
		rc = -EINVAL;
		goto done;
	}

	cal_block->cal_size = acdb_data.ulp_lsm_cal.cal_size;
	cal_block->cal_paddr = acdb_data.ulp_lsm_cal.cal_paddr;
	cal_block->cal_kvaddr = acdb_data.ulp_lsm_cal.cal_kvaddr;

done:
	return rc;
}
EXPORT_SYMBOL(get_ulp_lsm_cal);

int get_lsm_cal(struct acdb_cal_block *cal_block)
{
	int result = 0;
@@ -1470,6 +1567,12 @@ static long acdb_ioctl(struct file *f,
	case AUDIO_SET_AANC_CAL:
		result = store_aanc_cal((struct cal_block *)data);
		goto done;
	case AUDIO_LISTEN_SET_ULP_LSM_CAL:
		result = store_ulp_lsm_cal((struct cal_block *) data);
		goto done;
	case AUDIO_LISTEN_SET_ULP_AFE_CAL:
		result = store_ulp_afe_cal((struct cal_block *) data);
		goto done;
	default:
		pr_err("ACDB=> ACDB ioctl not found!\n");
		result = -EFAULT;
+2 −0
Original line number Diff line number Diff line
@@ -65,5 +65,7 @@ int get_sidetone_cal(struct sidetone_cal *cal_data);
int get_spk_protection_cfg(struct msm_spk_prot_cfg *prot_cfg);
int get_aanc_cal(struct acdb_cal_block *cal_block);
int get_hw_delay(int32_t path, struct hw_delay_entry *delay_info);
int get_ulp_lsm_cal(struct acdb_cal_block *cal_block);
int get_ulp_afe_cal(struct acdb_cal_block *cal_block);

#endif