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

Commit 7cee9495 authored by Bhalchandra Gajare's avatar Bhalchandra Gajare
Browse files

msm: audio_acdb: Add support for ULP listen calibration



Ultra Low Power listen (ULP) and Lower Power listen calibration could
possibly be different. Add support for ULP listen calibration for the
listen driver to use this calibration.

Change-Id: I2c966cc7196e2371fe81c50a58988a9f90e39e5a
Signed-off-by: default avatarBhalchandra Gajare <gajare@codeaurora.org>
parent 2f04273d
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