Loading sound/soc/msm/apq8096-auto.c +655 −4 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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"}; Loading @@ -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, Loading Loading @@ -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) { Loading Loading @@ -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", Loading @@ -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; } Loading Loading @@ -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[] = { Loading Loading @@ -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) Loading Loading
sound/soc/msm/apq8096-auto.c +655 −4 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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"}; Loading @@ -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, Loading Loading @@ -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) { Loading Loading @@ -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", Loading @@ -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; } Loading Loading @@ -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[] = { Loading Loading @@ -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) Loading