Loading asoc/sdm660-internal.c +166 −14 Original line number Diff line number Diff line Loading @@ -45,7 +45,8 @@ enum { }; enum { BT_SLIM7, BT_SLIM7_RX, BT_SLIM7_TX, FM_SLIM8, SLIM_MAX, }; Loading Loading @@ -139,7 +140,8 @@ static struct dev_config int_mi2s_cfg[] = { }; static struct dev_config bt_fm_cfg[] = { [BT_SLIM7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [BT_SLIM7_RX] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [BT_SLIM7_TX] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [FM_SLIM8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, }; Loading @@ -154,6 +156,12 @@ static const char *const loopback_mclk_text[] = {"DISABLE", "ENABLE"}; static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_44P1", "KHZ_48", "KHZ_88P2", "KHZ_96"}; static char const *bt_sample_rate_rx_text[] = {"KHZ_8", "KHZ_16", "KHZ_44P1", "KHZ_48", "KHZ_88P2", "KHZ_96"}; static char const *bt_sample_rate_tx_text[] = {"KHZ_8", "KHZ_16", "KHZ_44P1", "KHZ_48", "KHZ_88P2", "KHZ_96"}; static SOC_ENUM_SINGLE_EXT_DECL(int0_mi2s_rx_sample_rate, int_mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(int0_mi2s_rx_chs, int_mi2s_ch_text); Loading @@ -170,6 +178,8 @@ static SOC_ENUM_SINGLE_EXT_DECL(int4_mi2s_rx_format, bit_format_text); static SOC_ENUM_SINGLE_EXT_DECL(int5_mi2s_tx_chs, int_mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(loopback_mclk_en, loopback_mclk_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_rx, bt_sample_rate_rx_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_tx, bt_sample_rate_tx_text); static int msm_dmic_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event); Loading Loading @@ -639,12 +649,18 @@ static int msm_btfm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, switch (dai_link->id) { case MSM_BACKEND_DAI_SLIMBUS_7_RX: param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, bt_fm_cfg[BT_SLIM7_RX].bit_format); rate->min = rate->max = bt_fm_cfg[BT_SLIM7_RX].sample_rate; channels->min = channels->max = bt_fm_cfg[BT_SLIM7_RX].channels; break; case MSM_BACKEND_DAI_SLIMBUS_7_TX: param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, bt_fm_cfg[BT_SLIM7].bit_format); rate->min = rate->max = bt_fm_cfg[BT_SLIM7].sample_rate; bt_fm_cfg[BT_SLIM7_TX].bit_format); rate->min = rate->max = bt_fm_cfg[BT_SLIM7_TX].sample_rate; channels->min = channels->max = bt_fm_cfg[BT_SLIM7].channels; bt_fm_cfg[BT_SLIM7_TX].channels; break; case MSM_BACKEND_DAI_SLIMBUS_8_TX: Loading Loading @@ -849,7 +865,7 @@ static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol, * when used for BT_SCO use case. Return either Rx or Tx sample rate * value. */ switch (bt_fm_cfg[BT_SLIM7].sample_rate) { switch (bt_fm_cfg[BT_SLIM7_RX].sample_rate) { case SAMPLING_RATE_96KHZ: ucontrol->value.integer.value[0] = 5; break; Loading @@ -871,7 +887,7 @@ static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol, break; } pr_debug("%s: sample rate = %d", __func__, bt_fm_cfg[BT_SLIM7].sample_rate); bt_fm_cfg[BT_SLIM7_RX].sample_rate); return 0; } Loading @@ -881,28 +897,158 @@ static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol, { switch (ucontrol->value.integer.value[0]) { case 1: bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_16KHZ; bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_16KHZ; bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_16KHZ; break; case 2: bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_44P1KHZ; bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_44P1KHZ; break; case 3: bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_48KHZ; bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_48KHZ; break; case 4: bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_88P2KHZ; bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_88P2KHZ; break; case 5: bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_96KHZ; bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_96KHZ; break; case 0: default: bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_8KHZ; bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_8KHZ; break; } pr_debug("%s: sample rates: slim7_rx = %d, value = %d\n", __func__, bt_fm_cfg[BT_SLIM7_RX].sample_rate, ucontrol->value.enumerated.item[0]); return 0; } static int msm_bt_sample_rate_rx_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { switch (bt_fm_cfg[BT_SLIM7_RX].sample_rate) { case SAMPLING_RATE_96KHZ: ucontrol->value.integer.value[0] = 5; break; case SAMPLING_RATE_88P2KHZ: ucontrol->value.integer.value[0] = 4; break; case SAMPLING_RATE_48KHZ: ucontrol->value.integer.value[0] = 3; break; case SAMPLING_RATE_44P1KHZ: ucontrol->value.integer.value[0] = 2; break; case SAMPLING_RATE_16KHZ: ucontrol->value.integer.value[0] = 1; break; case SAMPLING_RATE_8KHZ: default: ucontrol->value.integer.value[0] = 0; break; } pr_debug("%s: sample rate = %d", __func__, bt_fm_cfg[BT_SLIM7_RX].sample_rate); return 0; } static int msm_bt_sample_rate_rx_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { switch (ucontrol->value.integer.value[0]) { case 1: bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_16KHZ; break; case 2: bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_44P1KHZ; bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_44P1KHZ; break; case 3: bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_48KHZ; bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_48KHZ; break; case 4: bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_88P2KHZ; bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_88P2KHZ; break; case 5: bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_96KHZ; bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_96KHZ; break; case 0: default: bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_8KHZ; bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_8KHZ; break; } pr_debug("%s: sample rates: slim7_rx = %d, value = %d\n", __func__, bt_fm_cfg[BT_SLIM7].sample_rate, bt_fm_cfg[BT_SLIM7_RX].sample_rate, ucontrol->value.enumerated.item[0]); return 0; } static int msm_bt_sample_rate_tx_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { switch (bt_fm_cfg[BT_SLIM7_TX].sample_rate) { case SAMPLING_RATE_96KHZ: ucontrol->value.integer.value[0] = 5; break; case SAMPLING_RATE_88P2KHZ: ucontrol->value.integer.value[0] = 4; break; case SAMPLING_RATE_48KHZ: ucontrol->value.integer.value[0] = 3; break; case SAMPLING_RATE_44P1KHZ: ucontrol->value.integer.value[0] = 2; break; case SAMPLING_RATE_16KHZ: ucontrol->value.integer.value[0] = 1; break; case SAMPLING_RATE_8KHZ: default: ucontrol->value.integer.value[0] = 0; break; } pr_debug("%s: sample rate = %d", __func__, bt_fm_cfg[BT_SLIM7_TX].sample_rate); return 0; } static int msm_bt_sample_rate_tx_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { switch (ucontrol->value.integer.value[0]) { case 1: bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_16KHZ; break; case 2: bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_44P1KHZ; break; case 3: bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_48KHZ; break; case 4: bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_88P2KHZ; break; case 5: bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_96KHZ; break; case 0: default: bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_8KHZ; break; } pr_debug("%s: sample rates: slim7_tx = %d, value = %d\n", __func__, bt_fm_cfg[BT_SLIM7_TX].sample_rate, ucontrol->value.enumerated.item[0]); return 0; Loading Loading @@ -933,6 +1079,12 @@ static const struct snd_kcontrol_new msm_snd_controls[] = { SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, msm_bt_sample_rate_get, msm_bt_sample_rate_put), SOC_ENUM_EXT("BT SampleRate RX", bt_sample_rate_rx, msm_bt_sample_rate_rx_get, msm_bt_sample_rate_rx_put), SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx, msm_bt_sample_rate_tx_get, msm_bt_sample_rate_tx_put), }; static const struct snd_kcontrol_new msm_loopback_snd_controls[] = { Loading Loading
asoc/sdm660-internal.c +166 −14 Original line number Diff line number Diff line Loading @@ -45,7 +45,8 @@ enum { }; enum { BT_SLIM7, BT_SLIM7_RX, BT_SLIM7_TX, FM_SLIM8, SLIM_MAX, }; Loading Loading @@ -139,7 +140,8 @@ static struct dev_config int_mi2s_cfg[] = { }; static struct dev_config bt_fm_cfg[] = { [BT_SLIM7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [BT_SLIM7_RX] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [BT_SLIM7_TX] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [FM_SLIM8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, }; Loading @@ -154,6 +156,12 @@ static const char *const loopback_mclk_text[] = {"DISABLE", "ENABLE"}; static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_44P1", "KHZ_48", "KHZ_88P2", "KHZ_96"}; static char const *bt_sample_rate_rx_text[] = {"KHZ_8", "KHZ_16", "KHZ_44P1", "KHZ_48", "KHZ_88P2", "KHZ_96"}; static char const *bt_sample_rate_tx_text[] = {"KHZ_8", "KHZ_16", "KHZ_44P1", "KHZ_48", "KHZ_88P2", "KHZ_96"}; static SOC_ENUM_SINGLE_EXT_DECL(int0_mi2s_rx_sample_rate, int_mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(int0_mi2s_rx_chs, int_mi2s_ch_text); Loading @@ -170,6 +178,8 @@ static SOC_ENUM_SINGLE_EXT_DECL(int4_mi2s_rx_format, bit_format_text); static SOC_ENUM_SINGLE_EXT_DECL(int5_mi2s_tx_chs, int_mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(loopback_mclk_en, loopback_mclk_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_rx, bt_sample_rate_rx_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_tx, bt_sample_rate_tx_text); static int msm_dmic_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event); Loading Loading @@ -639,12 +649,18 @@ static int msm_btfm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, switch (dai_link->id) { case MSM_BACKEND_DAI_SLIMBUS_7_RX: param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, bt_fm_cfg[BT_SLIM7_RX].bit_format); rate->min = rate->max = bt_fm_cfg[BT_SLIM7_RX].sample_rate; channels->min = channels->max = bt_fm_cfg[BT_SLIM7_RX].channels; break; case MSM_BACKEND_DAI_SLIMBUS_7_TX: param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, bt_fm_cfg[BT_SLIM7].bit_format); rate->min = rate->max = bt_fm_cfg[BT_SLIM7].sample_rate; bt_fm_cfg[BT_SLIM7_TX].bit_format); rate->min = rate->max = bt_fm_cfg[BT_SLIM7_TX].sample_rate; channels->min = channels->max = bt_fm_cfg[BT_SLIM7].channels; bt_fm_cfg[BT_SLIM7_TX].channels; break; case MSM_BACKEND_DAI_SLIMBUS_8_TX: Loading Loading @@ -849,7 +865,7 @@ static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol, * when used for BT_SCO use case. Return either Rx or Tx sample rate * value. */ switch (bt_fm_cfg[BT_SLIM7].sample_rate) { switch (bt_fm_cfg[BT_SLIM7_RX].sample_rate) { case SAMPLING_RATE_96KHZ: ucontrol->value.integer.value[0] = 5; break; Loading @@ -871,7 +887,7 @@ static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol, break; } pr_debug("%s: sample rate = %d", __func__, bt_fm_cfg[BT_SLIM7].sample_rate); bt_fm_cfg[BT_SLIM7_RX].sample_rate); return 0; } Loading @@ -881,28 +897,158 @@ static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol, { switch (ucontrol->value.integer.value[0]) { case 1: bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_16KHZ; bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_16KHZ; bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_16KHZ; break; case 2: bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_44P1KHZ; bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_44P1KHZ; break; case 3: bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_48KHZ; bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_48KHZ; break; case 4: bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_88P2KHZ; bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_88P2KHZ; break; case 5: bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_96KHZ; bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_96KHZ; break; case 0: default: bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_8KHZ; bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_8KHZ; break; } pr_debug("%s: sample rates: slim7_rx = %d, value = %d\n", __func__, bt_fm_cfg[BT_SLIM7_RX].sample_rate, ucontrol->value.enumerated.item[0]); return 0; } static int msm_bt_sample_rate_rx_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { switch (bt_fm_cfg[BT_SLIM7_RX].sample_rate) { case SAMPLING_RATE_96KHZ: ucontrol->value.integer.value[0] = 5; break; case SAMPLING_RATE_88P2KHZ: ucontrol->value.integer.value[0] = 4; break; case SAMPLING_RATE_48KHZ: ucontrol->value.integer.value[0] = 3; break; case SAMPLING_RATE_44P1KHZ: ucontrol->value.integer.value[0] = 2; break; case SAMPLING_RATE_16KHZ: ucontrol->value.integer.value[0] = 1; break; case SAMPLING_RATE_8KHZ: default: ucontrol->value.integer.value[0] = 0; break; } pr_debug("%s: sample rate = %d", __func__, bt_fm_cfg[BT_SLIM7_RX].sample_rate); return 0; } static int msm_bt_sample_rate_rx_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { switch (ucontrol->value.integer.value[0]) { case 1: bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_16KHZ; break; case 2: bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_44P1KHZ; bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_44P1KHZ; break; case 3: bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_48KHZ; bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_48KHZ; break; case 4: bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_88P2KHZ; bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_88P2KHZ; break; case 5: bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_96KHZ; bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_96KHZ; break; case 0: default: bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_8KHZ; bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_8KHZ; break; } pr_debug("%s: sample rates: slim7_rx = %d, value = %d\n", __func__, bt_fm_cfg[BT_SLIM7].sample_rate, bt_fm_cfg[BT_SLIM7_RX].sample_rate, ucontrol->value.enumerated.item[0]); return 0; } static int msm_bt_sample_rate_tx_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { switch (bt_fm_cfg[BT_SLIM7_TX].sample_rate) { case SAMPLING_RATE_96KHZ: ucontrol->value.integer.value[0] = 5; break; case SAMPLING_RATE_88P2KHZ: ucontrol->value.integer.value[0] = 4; break; case SAMPLING_RATE_48KHZ: ucontrol->value.integer.value[0] = 3; break; case SAMPLING_RATE_44P1KHZ: ucontrol->value.integer.value[0] = 2; break; case SAMPLING_RATE_16KHZ: ucontrol->value.integer.value[0] = 1; break; case SAMPLING_RATE_8KHZ: default: ucontrol->value.integer.value[0] = 0; break; } pr_debug("%s: sample rate = %d", __func__, bt_fm_cfg[BT_SLIM7_TX].sample_rate); return 0; } static int msm_bt_sample_rate_tx_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { switch (ucontrol->value.integer.value[0]) { case 1: bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_16KHZ; break; case 2: bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_44P1KHZ; break; case 3: bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_48KHZ; break; case 4: bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_88P2KHZ; break; case 5: bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_96KHZ; break; case 0: default: bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_8KHZ; break; } pr_debug("%s: sample rates: slim7_tx = %d, value = %d\n", __func__, bt_fm_cfg[BT_SLIM7_TX].sample_rate, ucontrol->value.enumerated.item[0]); return 0; Loading Loading @@ -933,6 +1079,12 @@ static const struct snd_kcontrol_new msm_snd_controls[] = { SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, msm_bt_sample_rate_get, msm_bt_sample_rate_put), SOC_ENUM_EXT("BT SampleRate RX", bt_sample_rate_rx, msm_bt_sample_rate_rx_get, msm_bt_sample_rate_rx_put), SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx, msm_bt_sample_rate_tx_get, msm_bt_sample_rate_tx_put), }; static const struct snd_kcontrol_new msm_loopback_snd_controls[] = { Loading