Loading asoc/qcs405.c +87 −7 Original line number Original line Diff line number Diff line Loading @@ -70,8 +70,9 @@ #define WSA8810_NAME_1 "wsa881x.20170211" #define WSA8810_NAME_1 "wsa881x.20170211" #define WSA8810_NAME_2 "wsa881x.20170212" #define WSA8810_NAME_2 "wsa881x.20170212" #define WCN_CDC_SLIM_RX_CH_MAX 2 #define WCN_CDC_SLIM_RX_CH_MAX 2 #define WCN_CDC_SLIM_TX_CH_MAX 3 #define WCN_CDC_SLIM_TX_CH_MAX 4 #define TDM_CHANNEL_MAX 8 #define TDM_CHANNEL_MAX 8 #define BT_SLIM_TX SLIM_TX_9 #define ADSP_STATE_READY_TIMEOUT_MS 3000 #define ADSP_STATE_READY_TIMEOUT_MS 3000 #define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ #define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ Loading @@ -98,6 +99,7 @@ enum { SLIM_TX_6, SLIM_TX_6, SLIM_TX_7, SLIM_TX_7, SLIM_TX_8, SLIM_TX_8, SLIM_TX_9, SLIM_TX_MAX, SLIM_TX_MAX, }; }; Loading Loading @@ -361,6 +363,7 @@ static struct dev_config slim_tx_cfg[] = { [SLIM_TX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [SLIM_TX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, [SLIM_TX_9] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, }; }; /* Default configuration of Codec DMA Interface Tx */ /* Default configuration of Codec DMA Interface Tx */ Loading Loading @@ -524,6 +527,7 @@ static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_sample_rate, slim_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_sink, bt_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text); Loading Loading @@ -1149,6 +1153,68 @@ static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol, return 0; return 0; } } static int msm_bt_sample_rate_sink_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { switch (slim_tx_cfg[BT_SLIM_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__, slim_tx_cfg[BT_SLIM_TX].sample_rate); return 0; } static int msm_bt_sample_rate_sink_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { switch (ucontrol->value.integer.value[0]) { case 1: slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_16KHZ; break; case 2: slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_44P1KHZ; break; case 3: slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_48KHZ; break; case 4: slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_88P2KHZ; break; case 5: slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_96KHZ; break; case 0: default: slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_8KHZ; break; } pr_debug("%s: sample rate = %d, value = %d\n", __func__, slim_tx_cfg[BT_SLIM_TX].sample_rate, ucontrol->value.enumerated.item[0]); return 0; } static int cdc_dma_get_port_idx(struct snd_kcontrol *kcontrol) static int cdc_dma_get_port_idx(struct snd_kcontrol *kcontrol) { { int idx = 0; int idx = 0; Loading Loading @@ -3427,19 +3493,25 @@ static const struct snd_kcontrol_new msm_snd_wsa_controls[] = { }; }; static const struct snd_kcontrol_new msm_snd_controls[] = { static const struct snd_kcontrol_new msm_snd_controls[] = { SOC_ENUM_EXT("BT_TX SampleRate", bt_sample_rate_sink, msm_bt_sample_rate_sink_get, msm_bt_sample_rate_sink_put), SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, msm_bt_sample_rate_get, msm_bt_sample_rate_put), SOC_ENUM_EXT("BT_RX SampleRate", bt_sample_rate, msm_bt_sample_rate_get, msm_bt_sample_rate_put), SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs, proxy_rx_ch_get, proxy_rx_ch_put), SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, usb_audio_rx_ch_get, usb_audio_rx_ch_put), usb_audio_rx_ch_get, usb_audio_rx_ch_put), SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, usb_audio_tx_ch_get, usb_audio_tx_ch_put), usb_audio_tx_ch_get, usb_audio_tx_ch_put), SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs, proxy_rx_ch_get, proxy_rx_ch_put), SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format, SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format, usb_audio_rx_format_get, usb_audio_rx_format_put), usb_audio_rx_format_get, usb_audio_rx_format_put), SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format, SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format, usb_audio_tx_format_get, usb_audio_tx_format_put), usb_audio_tx_format_get, usb_audio_tx_format_put), SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, msm_bt_sample_rate_get, msm_bt_sample_rate_put), SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate, SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate, usb_audio_rx_sample_rate_get, usb_audio_rx_sample_rate_get, usb_audio_rx_sample_rate_put), usb_audio_rx_sample_rate_put), Loading Loading @@ -4108,6 +4180,14 @@ static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, slim_tx_cfg[SLIM_TX_8].channels; slim_tx_cfg[SLIM_TX_8].channels; break; break; case MSM_BACKEND_DAI_SLIMBUS_9_TX: param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, slim_tx_cfg[SLIM_TX_9].bit_format); rate->min = rate->max = slim_tx_cfg[SLIM_TX_9].sample_rate; channels->min = channels->max = slim_tx_cfg[SLIM_TX_9].channels; break; case MSM_BACKEND_DAI_USB_RX: case MSM_BACKEND_DAI_USB_RX: param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, usb_rx_cfg.bit_format); usb_rx_cfg.bit_format); Loading Loading @@ -4853,7 +4933,7 @@ static int msm_wsa_cdc_dma_init(struct snd_soc_pcm_runtime *rtd) static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) { { unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161}; unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161, 162}; struct snd_soc_dai *codec_dai = rtd->codec_dai; struct snd_soc_dai *codec_dai = rtd->codec_dai; return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), Loading Loading
asoc/qcs405.c +87 −7 Original line number Original line Diff line number Diff line Loading @@ -70,8 +70,9 @@ #define WSA8810_NAME_1 "wsa881x.20170211" #define WSA8810_NAME_1 "wsa881x.20170211" #define WSA8810_NAME_2 "wsa881x.20170212" #define WSA8810_NAME_2 "wsa881x.20170212" #define WCN_CDC_SLIM_RX_CH_MAX 2 #define WCN_CDC_SLIM_RX_CH_MAX 2 #define WCN_CDC_SLIM_TX_CH_MAX 3 #define WCN_CDC_SLIM_TX_CH_MAX 4 #define TDM_CHANNEL_MAX 8 #define TDM_CHANNEL_MAX 8 #define BT_SLIM_TX SLIM_TX_9 #define ADSP_STATE_READY_TIMEOUT_MS 3000 #define ADSP_STATE_READY_TIMEOUT_MS 3000 #define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ #define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ Loading @@ -98,6 +99,7 @@ enum { SLIM_TX_6, SLIM_TX_6, SLIM_TX_7, SLIM_TX_7, SLIM_TX_8, SLIM_TX_8, SLIM_TX_9, SLIM_TX_MAX, SLIM_TX_MAX, }; }; Loading Loading @@ -361,6 +363,7 @@ static struct dev_config slim_tx_cfg[] = { [SLIM_TX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [SLIM_TX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, [SLIM_TX_9] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, }; }; /* Default configuration of Codec DMA Interface Tx */ /* Default configuration of Codec DMA Interface Tx */ Loading Loading @@ -524,6 +527,7 @@ static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_sample_rate, slim_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_sink, bt_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text); Loading Loading @@ -1149,6 +1153,68 @@ static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol, return 0; return 0; } } static int msm_bt_sample_rate_sink_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { switch (slim_tx_cfg[BT_SLIM_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__, slim_tx_cfg[BT_SLIM_TX].sample_rate); return 0; } static int msm_bt_sample_rate_sink_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { switch (ucontrol->value.integer.value[0]) { case 1: slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_16KHZ; break; case 2: slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_44P1KHZ; break; case 3: slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_48KHZ; break; case 4: slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_88P2KHZ; break; case 5: slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_96KHZ; break; case 0: default: slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_8KHZ; break; } pr_debug("%s: sample rate = %d, value = %d\n", __func__, slim_tx_cfg[BT_SLIM_TX].sample_rate, ucontrol->value.enumerated.item[0]); return 0; } static int cdc_dma_get_port_idx(struct snd_kcontrol *kcontrol) static int cdc_dma_get_port_idx(struct snd_kcontrol *kcontrol) { { int idx = 0; int idx = 0; Loading Loading @@ -3427,19 +3493,25 @@ static const struct snd_kcontrol_new msm_snd_wsa_controls[] = { }; }; static const struct snd_kcontrol_new msm_snd_controls[] = { static const struct snd_kcontrol_new msm_snd_controls[] = { SOC_ENUM_EXT("BT_TX SampleRate", bt_sample_rate_sink, msm_bt_sample_rate_sink_get, msm_bt_sample_rate_sink_put), SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, msm_bt_sample_rate_get, msm_bt_sample_rate_put), SOC_ENUM_EXT("BT_RX SampleRate", bt_sample_rate, msm_bt_sample_rate_get, msm_bt_sample_rate_put), SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs, proxy_rx_ch_get, proxy_rx_ch_put), SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, usb_audio_rx_ch_get, usb_audio_rx_ch_put), usb_audio_rx_ch_get, usb_audio_rx_ch_put), SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, usb_audio_tx_ch_get, usb_audio_tx_ch_put), usb_audio_tx_ch_get, usb_audio_tx_ch_put), SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs, proxy_rx_ch_get, proxy_rx_ch_put), SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format, SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format, usb_audio_rx_format_get, usb_audio_rx_format_put), usb_audio_rx_format_get, usb_audio_rx_format_put), SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format, SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format, usb_audio_tx_format_get, usb_audio_tx_format_put), usb_audio_tx_format_get, usb_audio_tx_format_put), SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, msm_bt_sample_rate_get, msm_bt_sample_rate_put), SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate, SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate, usb_audio_rx_sample_rate_get, usb_audio_rx_sample_rate_get, usb_audio_rx_sample_rate_put), usb_audio_rx_sample_rate_put), Loading Loading @@ -4108,6 +4180,14 @@ static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, slim_tx_cfg[SLIM_TX_8].channels; slim_tx_cfg[SLIM_TX_8].channels; break; break; case MSM_BACKEND_DAI_SLIMBUS_9_TX: param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, slim_tx_cfg[SLIM_TX_9].bit_format); rate->min = rate->max = slim_tx_cfg[SLIM_TX_9].sample_rate; channels->min = channels->max = slim_tx_cfg[SLIM_TX_9].channels; break; case MSM_BACKEND_DAI_USB_RX: case MSM_BACKEND_DAI_USB_RX: param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, usb_rx_cfg.bit_format); usb_rx_cfg.bit_format); Loading Loading @@ -4853,7 +4933,7 @@ static int msm_wsa_cdc_dma_init(struct snd_soc_pcm_runtime *rtd) static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) { { unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161}; unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161, 162}; struct snd_soc_dai *codec_dai = rtd->codec_dai; struct snd_soc_dai *codec_dai = rtd->codec_dai; return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), Loading