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

Commit 3b3ab735 authored by Honghao Liu's avatar Honghao Liu
Browse files

ASoC: msm: add tdm bit format fixup for auto machine driver



Add tdm bit format fixup for automotive machine driver
due to hw param is not set from userspace for compress
offload playback.

Change-Id: Ife61b3a26228ba6bc4374d9b370eba63a6a5fa1a
Signed-off-by: default avatarHonghao Liu <honghaol@codeaurora.org>
parent d0c9198b
Loading
Loading
Loading
Loading
+655 −4
Original line number Diff line number Diff line
@@ -73,6 +73,27 @@ static int msm_quat_tdm_tx_1_ch = 2;
static int msm_quat_tdm_tx_2_ch = 2;
static int msm_quat_tdm_tx_3_ch = 1;

/* TDM default bit format */
static int msm_tert_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int msm_tert_tdm_rx_1_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int msm_tert_tdm_rx_2_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int msm_tert_tdm_rx_3_bit_format = SNDRV_PCM_FORMAT_S16_LE;

static int msm_tert_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int msm_tert_tdm_tx_1_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int msm_tert_tdm_tx_2_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int msm_tert_tdm_tx_3_bit_format = SNDRV_PCM_FORMAT_S16_LE;

static int msm_quat_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int msm_quat_tdm_rx_1_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int msm_quat_tdm_rx_2_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int msm_quat_tdm_rx_3_bit_format = SNDRV_PCM_FORMAT_S16_LE;

static int msm_quat_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int msm_quat_tdm_tx_1_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int msm_quat_tdm_tx_2_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int msm_quat_tdm_tx_3_bit_format = SNDRV_PCM_FORMAT_S16_LE;

enum {
	QUATERNARY_TDM_RX_0,
	QUATERNARY_TDM_RX_1,
@@ -201,7 +222,9 @@ static unsigned int tdm_slot_offset_adp_mmxf[TDM_MAX][TDM_SLOT_OFFSET_MAX] = {

static char const *hdmi_rx_ch_text[] = {"Two", "Three", "Four", "Five",
					"Six", "Seven", "Eight"};
static char const *rx_bit_format_text[] = {"S16_LE", "S24_LE"};

static char const *hdmi_rx_bit_format_text[] = {"S16_LE", "S24_LE"};

static const char *const proxy_rx_ch_text[] = {"One", "Two", "Three", "Four",
	"Five", "Six", "Seven", "Eight"};

@@ -213,6 +236,8 @@ static const char *const auxpcm_rate_text[] = {"8000", "16000"};
static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four",
	"Five", "Six", "Seven", "Eight"};

static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE"};

static struct afe_clk_set mi2s_tx_clk = {
	AFE_API_VERSION_I2S_CONFIG,
	Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT,
@@ -699,6 +724,550 @@ static int msm_quat_tdm_tx_3_ch_put(struct snd_kcontrol *kcontrol,
	return 0;
}

static int msm_tert_tdm_rx_0_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_tert_tdm_rx_0_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_tert_tdm_rx_0_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_tert_tdm_rx_0_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_tert_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_tert_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_tert_tdm_rx_0_bit_format = %d\n",
		 __func__, msm_tert_tdm_rx_0_bit_format);
	return 0;
}

static int msm_tert_tdm_rx_1_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_tert_tdm_rx_1_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_tert_tdm_rx_1_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_tert_tdm_rx_1_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_tert_tdm_rx_1_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_tert_tdm_rx_1_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_tert_tdm_rx_1_bit_format = %d\n",
		 __func__, msm_tert_tdm_rx_1_bit_format);
	return 0;
}

static int msm_tert_tdm_rx_2_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_tert_tdm_rx_2_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_tert_tdm_rx_2_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_tert_tdm_rx_2_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_tert_tdm_rx_2_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_tert_tdm_rx_2_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_tert_tdm_rx_2_bit_format = %d\n",
		 __func__, msm_tert_tdm_rx_2_bit_format);
	return 0;
}

static int msm_tert_tdm_rx_3_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_tert_tdm_rx_3_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_tert_tdm_rx_3_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_tert_tdm_rx_3_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_tert_tdm_rx_3_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_tert_tdm_rx_3_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_tert_tdm_rx_3_bit_format = %d\n",
		 __func__, msm_tert_tdm_rx_3_bit_format);
	return 0;
}

static int msm_tert_tdm_tx_0_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_tert_tdm_tx_0_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_tert_tdm_tx_0_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_tert_tdm_tx_0_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_tert_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_tert_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_tert_tdm_tx_0_bit_format = %d\n",
		 __func__, msm_tert_tdm_tx_0_bit_format);
	return 0;
}

static int msm_tert_tdm_tx_1_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_tert_tdm_tx_1_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_tert_tdm_tx_1_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_tert_tdm_tx_1_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_tert_tdm_tx_1_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_tert_tdm_tx_1_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_tert_tdm_tx_1_bit_format = %d\n",
		 __func__, msm_tert_tdm_tx_1_bit_format);
	return 0;
}

static int msm_tert_tdm_tx_2_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_tert_tdm_tx_2_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_tert_tdm_tx_2_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_tert_tdm_tx_2_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_tert_tdm_tx_2_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_tert_tdm_tx_2_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_tert_tdm_tx_2_bit_format = %d\n",
		 __func__, msm_tert_tdm_tx_2_bit_format);
	return 0;
}

static int msm_tert_tdm_tx_3_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_tert_tdm_tx_3_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_tert_tdm_tx_3_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_tert_tdm_tx_3_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_tert_tdm_tx_3_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_tert_tdm_tx_3_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_tert_tdm_tx_3_bit_format = %d\n",
		 __func__, msm_tert_tdm_tx_3_bit_format);
	return 0;
}

static int msm_quat_tdm_rx_0_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_quat_tdm_rx_0_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_quat_tdm_rx_0_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_quat_tdm_rx_0_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_quat_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_quat_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_quat_tdm_rx_0_bit_format = %d\n",
		 __func__, msm_quat_tdm_rx_0_bit_format);
	return 0;
}

static int msm_quat_tdm_rx_1_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_quat_tdm_rx_1_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_quat_tdm_rx_1_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_quat_tdm_rx_1_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_quat_tdm_rx_1_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_quat_tdm_rx_1_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_quat_tdm_rx_1_bit_format = %d\n",
		 __func__, msm_quat_tdm_rx_1_bit_format);
	return 0;
}

static int msm_quat_tdm_rx_2_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_quat_tdm_rx_2_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_quat_tdm_rx_2_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_quat_tdm_rx_2_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_quat_tdm_rx_2_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_quat_tdm_rx_2_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_quat_tdm_rx_2_bit_format = %d\n",
		 __func__, msm_quat_tdm_rx_2_bit_format);
	return 0;
}

static int msm_quat_tdm_rx_3_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_quat_tdm_rx_3_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_quat_tdm_rx_3_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_quat_tdm_rx_3_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_quat_tdm_rx_3_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_quat_tdm_rx_3_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_quat_tdm_rx_3_bit_format = %d\n",
		 __func__, msm_quat_tdm_rx_3_bit_format);
	return 0;
}

static int msm_quat_tdm_tx_0_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_quat_tdm_tx_0_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_quat_tdm_tx_0_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_quat_tdm_tx_0_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_quat_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_quat_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_quat_tdm_tx_0_bit_format = %d\n",
		 __func__, msm_quat_tdm_tx_0_bit_format);
	return 0;
}

static int msm_quat_tdm_tx_1_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_quat_tdm_tx_1_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_quat_tdm_tx_1_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_quat_tdm_tx_1_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_quat_tdm_tx_1_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_quat_tdm_tx_1_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_quat_tdm_tx_1_bit_format = %d\n",
		 __func__, msm_quat_tdm_tx_1_bit_format);
	return 0;
}

static int msm_quat_tdm_tx_2_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_quat_tdm_tx_2_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_quat_tdm_tx_2_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_quat_tdm_tx_2_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_quat_tdm_tx_2_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_quat_tdm_tx_2_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_quat_tdm_tx_2_bit_format = %d\n",
		 __func__, msm_quat_tdm_tx_2_bit_format);
	return 0;
}

static int msm_quat_tdm_tx_3_bit_format_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (msm_quat_tdm_tx_3_bit_format) {
	case SNDRV_PCM_FORMAT_S24_LE:
		ucontrol->value.integer.value[0] = 1;
		break;
	case SNDRV_PCM_FORMAT_S16_LE:
	default:
		ucontrol->value.integer.value[0] = 0;
		break;
	}
	pr_debug("%s: msm_quat_tdm_tx_3_bit_format = %ld\n",
		 __func__, ucontrol->value.integer.value[0]);
	return 0;
}

static int msm_quat_tdm_tx_3_bit_format_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	switch (ucontrol->value.integer.value[0]) {
	case 1:
		msm_quat_tdm_tx_3_bit_format = SNDRV_PCM_FORMAT_S24_LE;
		break;
	case 0:
	default:
		msm_quat_tdm_tx_3_bit_format = SNDRV_PCM_FORMAT_S16_LE;
		break;
	}
	pr_debug("%s: msm_quat_tdm_tx_3_bit_format = %d\n",
		 __func__, msm_quat_tdm_tx_3_bit_format);
	return 0;
}

static int msm_auxpcm_be_params_fixup(struct snd_soc_pcm_runtime *rtd,
				      struct snd_pcm_hw_params *params)
{
@@ -813,51 +1382,83 @@ static int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
	switch (cpu_dai->id) {
	case AFE_PORT_ID_TERTIARY_TDM_RX:
		channels->min = channels->max = msm_tert_tdm_rx_0_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_tert_tdm_rx_0_bit_format);
		break;
	case AFE_PORT_ID_TERTIARY_TDM_RX_1:
		channels->min = channels->max = msm_tert_tdm_rx_1_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_tert_tdm_rx_1_bit_format);
		break;
	case AFE_PORT_ID_TERTIARY_TDM_RX_2:
		channels->min = channels->max = msm_tert_tdm_rx_2_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_tert_tdm_rx_2_bit_format);
		break;
	case AFE_PORT_ID_TERTIARY_TDM_RX_3:
		channels->min = channels->max = msm_tert_tdm_rx_3_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_tert_tdm_rx_3_bit_format);
		break;
	case AFE_PORT_ID_TERTIARY_TDM_TX:
		channels->min = channels->max = msm_tert_tdm_tx_0_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_tert_tdm_tx_0_bit_format);
		break;
	case AFE_PORT_ID_TERTIARY_TDM_TX_1:
		channels->min = channels->max = msm_tert_tdm_tx_1_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_tert_tdm_tx_1_bit_format);
		break;
	case AFE_PORT_ID_TERTIARY_TDM_TX_2:
		channels->min = channels->max = msm_tert_tdm_tx_2_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_tert_tdm_tx_2_bit_format);
		break;
	case AFE_PORT_ID_TERTIARY_TDM_TX_3:
		channels->min = channels->max = msm_tert_tdm_tx_3_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_tert_tdm_tx_3_bit_format);
		break;
	case AFE_PORT_ID_QUATERNARY_TDM_RX:
		channels->min = channels->max = msm_quat_tdm_rx_0_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_quat_tdm_rx_0_bit_format);
		break;
	case AFE_PORT_ID_QUATERNARY_TDM_RX_1:
		channels->min = channels->max = msm_quat_tdm_rx_1_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_quat_tdm_rx_1_bit_format);
		break;
	case AFE_PORT_ID_QUATERNARY_TDM_RX_2:
		channels->min = channels->max = msm_quat_tdm_rx_2_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_quat_tdm_rx_2_bit_format);
		break;
	case AFE_PORT_ID_QUATERNARY_TDM_RX_3:
		channels->min = channels->max = msm_quat_tdm_rx_3_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_quat_tdm_rx_3_bit_format);
		break;
	case AFE_PORT_ID_QUATERNARY_TDM_TX:
		channels->min = channels->max = msm_quat_tdm_tx_0_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_quat_tdm_tx_0_bit_format);
		break;
	case AFE_PORT_ID_QUATERNARY_TDM_TX_1:
		channels->min = channels->max = msm_quat_tdm_tx_1_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_quat_tdm_tx_1_bit_format);
		break;
	case AFE_PORT_ID_QUATERNARY_TDM_TX_2:
		channels->min = channels->max = msm_quat_tdm_tx_2_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_quat_tdm_tx_2_bit_format);
		break;
	case AFE_PORT_ID_QUATERNARY_TDM_TX_3:
		channels->min = channels->max = msm_quat_tdm_tx_3_ch;
		param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
			msm_quat_tdm_tx_3_bit_format);
		break;
	default:
		pr_err("%s: dai id 0x%x not supported\n",
@@ -866,8 +1467,9 @@ static int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
	}
	rate->min = rate->max = SAMPLING_RATE_48KHZ;

	pr_debug("%s: dai id = 0x%x channels = %d rate = %d\n",
		__func__, cpu_dai->id, channels->max, rate->max);
	pr_debug("%s: dai id = 0x%x channels = %d rate = %d format = 0x%x\n",
		__func__, cpu_dai->id, channels->max, rate->max,
		params_format(params));

	return 0;
}
@@ -1194,10 +1796,11 @@ static struct snd_soc_ops apq8096_tdm_be_ops = {
static const struct soc_enum msm_snd_enum[] = {
	SOC_ENUM_SINGLE_EXT(2, auxpcm_rate_text),
	SOC_ENUM_SINGLE_EXT(7, hdmi_rx_ch_text),
	SOC_ENUM_SINGLE_EXT(2, rx_bit_format_text),
	SOC_ENUM_SINGLE_EXT(2, hdmi_rx_bit_format_text),
	SOC_ENUM_SINGLE_EXT(8, proxy_rx_ch_text),
	SOC_ENUM_SINGLE_EXT(3, hdmi_rx_sample_rate_text),
	SOC_ENUM_SINGLE_EXT(8, tdm_ch_text),
	SOC_ENUM_SINGLE_EXT(2, tdm_bit_format_text),
};

static const struct snd_kcontrol_new msm_snd_controls[] = {
@@ -1243,6 +1846,54 @@ static const struct snd_kcontrol_new msm_snd_controls[] = {
			msm_quat_tdm_tx_2_ch_get, msm_quat_tdm_tx_2_ch_put),
	SOC_ENUM_EXT("QUAT_TDM_TX_3 Channels", msm_snd_enum[5],
			msm_quat_tdm_tx_3_ch_get, msm_quat_tdm_tx_3_ch_put),
	SOC_ENUM_EXT("TERT_TDM_RX_0 Bit Format", msm_snd_enum[6],
			msm_tert_tdm_rx_0_bit_format_get,
			msm_tert_tdm_rx_0_bit_format_put),
	SOC_ENUM_EXT("TERT_TDM_RX_1 Bit Format", msm_snd_enum[6],
			msm_tert_tdm_rx_1_bit_format_get,
			msm_tert_tdm_rx_1_bit_format_put),
	SOC_ENUM_EXT("TERT_TDM_RX_2 Bit Format", msm_snd_enum[6],
			msm_tert_tdm_rx_2_bit_format_get,
			msm_tert_tdm_rx_2_bit_format_put),
	SOC_ENUM_EXT("TERT_TDM_RX_3 Bit Format", msm_snd_enum[6],
			msm_tert_tdm_rx_3_bit_format_get,
			msm_tert_tdm_rx_3_bit_format_put),
	SOC_ENUM_EXT("TERT_TDM_TX_0 Bit Format", msm_snd_enum[6],
			msm_tert_tdm_tx_0_bit_format_get,
			msm_tert_tdm_tx_0_bit_format_put),
	SOC_ENUM_EXT("TERT_TDM_TX_1 Bit Format", msm_snd_enum[6],
			msm_tert_tdm_tx_1_bit_format_get,
			msm_tert_tdm_tx_1_bit_format_put),
	SOC_ENUM_EXT("TERT_TDM_TX_2 Bit Format", msm_snd_enum[6],
			msm_tert_tdm_tx_2_bit_format_get,
			msm_tert_tdm_tx_2_bit_format_put),
	SOC_ENUM_EXT("TERT_TDM_TX_3 Bit Format", msm_snd_enum[6],
			msm_tert_tdm_tx_3_bit_format_get,
			msm_tert_tdm_tx_3_bit_format_put),
	SOC_ENUM_EXT("QUAT_TDM_RX_0 Bit Format", msm_snd_enum[6],
			msm_quat_tdm_rx_0_bit_format_get,
			msm_quat_tdm_rx_0_bit_format_put),
	SOC_ENUM_EXT("QUAT_TDM_RX_1 Bit Format", msm_snd_enum[6],
			msm_quat_tdm_rx_1_bit_format_get,
			msm_quat_tdm_rx_1_bit_format_put),
	SOC_ENUM_EXT("QUAT_TDM_RX_2 Bit Format", msm_snd_enum[6],
			msm_quat_tdm_rx_2_bit_format_get,
			msm_quat_tdm_rx_2_bit_format_put),
	SOC_ENUM_EXT("QUAT_TDM_RX_3 Bit Format", msm_snd_enum[6],
			msm_quat_tdm_rx_3_bit_format_get,
			msm_quat_tdm_rx_3_bit_format_put),
	SOC_ENUM_EXT("QUAT_TDM_TX_0 Bit Format", msm_snd_enum[6],
			msm_quat_tdm_tx_0_bit_format_get,
			msm_quat_tdm_tx_0_bit_format_put),
	SOC_ENUM_EXT("QUAT_TDM_TX_1 Bit Format", msm_snd_enum[6],
			msm_quat_tdm_tx_1_bit_format_get,
			msm_quat_tdm_tx_1_bit_format_put),
	SOC_ENUM_EXT("QUAT_TDM_TX_2 Bit Format", msm_snd_enum[6],
			msm_quat_tdm_tx_2_bit_format_get,
			msm_quat_tdm_tx_2_bit_format_put),
	SOC_ENUM_EXT("QUAT_TDM_TX_3 Bit Format", msm_snd_enum[6],
			msm_quat_tdm_tx_3_bit_format_get,
			msm_quat_tdm_tx_3_bit_format_put),
};

static int apq8096_get_ll_qos_val(struct snd_pcm_runtime *runtime)