Loading asoc/sm8250-port-config.h→asoc/kona-port-config.h +3 −3 Original line number Diff line number Diff line Loading @@ -3,8 +3,8 @@ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */ #ifndef _SM8250_PORT_CONFIG #define _SM8250_PORT_CONFIG #ifndef _KONA_PORT_CONFIG #define _KONA_PORT_CONFIG #include <soc/swr-common.h> Loading Loading @@ -57,4 +57,4 @@ static struct swr_mstr_port_map sm_port_map[] = { {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, }; #endif /* _SM8250_PORT_CONFIG */ #endif /* _KONA_PORT_CONFIG */ asoc/kona.c +145 −2 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ #include "codecs/bolero/bolero-cdc.h" #include <dt-bindings/sound/audio-codec-port-types.h> #include "codecs/bolero/wsa-macro.h" #include "sm8250-port-config.h" #include "kona-port-config.h" #define DRV_NAME "kona-asoc-snd" #define __CHIPSET__ "KONA " Loading Loading @@ -73,6 +73,7 @@ #define WSA8810_NAME_2 "wsa881x.20170212" #define WCN_CDC_SLIM_RX_CH_MAX 2 #define WCN_CDC_SLIM_TX_CH_MAX 2 #define WCN_CDC_SLIM_TX_CH_MAX_LITO 3 enum { TDM_0 = 0, Loading Loading @@ -137,6 +138,7 @@ enum { }; enum { SLIM_TX_7 = 0, SLIM_TX_8, SLIM_TX_MAX, }; Loading Loading @@ -191,6 +193,7 @@ static struct dev_config slim_rx_cfg[] = { static struct dev_config slim_tx_cfg[] = { [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, }; /* Default configuration of external display BE */ Loading Loading @@ -3632,6 +3635,12 @@ static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, slim_tx_cfg[SLIM_TX_7].channels; break; case MSM_BACKEND_DAI_SLIMBUS_8_TX: rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate; channels->min = channels->max = slim_tx_cfg[SLIM_TX_8].channels; break; case MSM_BACKEND_DAI_AFE_LOOPBACK_TX: param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, afe_loopback_tx_cfg[idx].bit_format); Loading Loading @@ -3991,6 +4000,41 @@ static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) mutex_unlock(&mi2s_intf_conf[index].lock); } static int msm_wcn_hw_params_lito(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *codec_dai = rtd->codec_dai; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_soc_dai_link *dai_link = rtd->dai_link; u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX_LITO]; u32 rx_ch_cnt = 0, tx_ch_cnt = 0; int ret = 0; dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__, codec_dai->name, codec_dai->id); ret = snd_soc_dai_get_channel_map(codec_dai, &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); if (ret) { dev_err(rtd->dev, "%s: failed to get BTFM codec chan map\n, err:%d\n", __func__, ret); goto err; } dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n", __func__, tx_ch_cnt, dai_link->id); ret = snd_soc_dai_set_channel_map(cpu_dai, tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch); if (ret) dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n", __func__, ret); err: return ret; } static int msm_wcn_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { Loading Loading @@ -4047,6 +4091,10 @@ static struct snd_soc_ops msm_wcn_ops = { .hw_params = msm_wcn_hw_params, }; static struct snd_soc_ops msm_wcn_ops_lito = { .hw_params = msm_wcn_hw_params_lito, }; static int msm_dmic_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { Loading Loading @@ -4155,6 +4203,16 @@ static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) tx_ch, ARRAY_SIZE(rx_ch), rx_ch); } static int msm_wcn_init_lito(struct snd_soc_pcm_runtime *rtd) { unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX_LITO] = {159, 160, 161}; struct snd_soc_dai *codec_dai = rtd->codec_dai; return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), tx_ch, ARRAY_SIZE(rx_ch), rx_ch); } static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd) { int ret = -EINVAL; Loading Loading @@ -4897,6 +4955,22 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .ignore_pmdown_time = 1, .id = MSM_FRONTEND_DAI_MULTIMEDIA17, }, {/* hw:x,38 */ .name = "SLIMBUS_8 Hostless", .stream_name = "SLIMBUS_8 Hostless", .cpu_dai_name = "SLIMBUS8_HOSTLESS", .platform_name = "msm-pcm-hostless", .dynamic = 1, .dpcm_capture = 1, .dpcm_playback = 1, .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, .ignore_suspend = 1, .ignore_pmdown_time = 1, .codec_dai_name = "snd-soc-dummy-dai", .codec_name = "snd-soc-dummy", }, }; static struct snd_soc_dai_link msm_common_be_dai_links[] = { Loading Loading @@ -5141,6 +5215,58 @@ static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { }, }; static struct snd_soc_dai_link msm_wcn_btfm_be_dai_links[] = { { .name = LPASS_BE_SLIMBUS_7_RX, .stream_name = "Slimbus7 Playback", .cpu_dai_name = "msm-dai-q6-dev.16398", .platform_name = "msm-pcm-routing", .codec_name = "btfmslim_slave", /* BT codec driver determines capabilities based on * dai name, bt codecdai name should always contains * supported usecase information */ .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_SLIMBUS_7_RX, .be_hw_params_fixup = msm_be_hw_params_fixup, .init = &msm_wcn_init_lito, .ops = &msm_wcn_ops_lito, /* dai link has playback support */ .ignore_pmdown_time = 1, .ignore_suspend = 1, }, { .name = LPASS_BE_SLIMBUS_7_TX, .stream_name = "Slimbus7 Capture", .cpu_dai_name = "msm-dai-q6-dev.16399", .platform_name = "msm-pcm-routing", .codec_name = "btfmslim_slave", .codec_dai_name = "btfm_bt_sco_slim_tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_SLIMBUS_7_TX, .be_hw_params_fixup = msm_be_hw_params_fixup, .ops = &msm_wcn_ops_lito, .ignore_suspend = 1, }, { .name = LPASS_BE_SLIMBUS_8_TX, .stream_name = "Slimbus8 Capture", .cpu_dai_name = "msm-dai-q6-dev.16401", .platform_name = "msm-pcm-routing", .codec_name = "btfmslim_slave", .codec_dai_name = "btfm_fm_slim_tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_SLIMBUS_8_TX, .be_hw_params_fixup = msm_be_hw_params_fixup, .ops = &msm_wcn_ops_lito, .ignore_suspend = 1, }, }; static struct snd_soc_dai_link ext_disp_be_dai_link[] = { /* DISP PORT BACK END DAI Link */ { Loading Loading @@ -5566,7 +5692,8 @@ static struct snd_soc_dai_link msm_kona_dai_links[ ARRAY_SIZE(msm_va_cdc_dma_be_dai_links) + ARRAY_SIZE(ext_disp_be_dai_link) + ARRAY_SIZE(msm_wcn_be_dai_links) + ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link)]; ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link) + ARRAY_SIZE(msm_wcn_btfm_be_dai_links)]; static int msm_populate_dai_link_component_of_node( struct snd_soc_card *card) Loading Loading @@ -5769,6 +5896,7 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) u32 mi2s_audio_intf = 0; u32 auxpcm_audio_intf = 0; u32 val = 0; u32 wcn_btfm_intf = 0; const struct of_device_id *match; match = of_match_node(kona_asoc_machine_of_match, dev->of_node); Loading Loading @@ -5881,6 +6009,21 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) total_links += ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link); } rc = of_property_read_u32(dev->of_node, "qcom,wcn-btfm", &wcn_btfm_intf); if (rc) { dev_dbg(dev, "%s: No DT match wcn btfm interface\n", __func__); } else { if (wcn_btfm_intf) { memcpy(msm_kona_dai_links + total_links, msm_wcn_btfm_be_dai_links, sizeof(msm_wcn_btfm_be_dai_links)); total_links += ARRAY_SIZE(msm_wcn_btfm_be_dai_links); } } dailink = msm_kona_dai_links; } else if(!strcmp(match->data, "stub_codec")) { card = &snd_soc_card_stub_msm; Loading Loading
asoc/sm8250-port-config.h→asoc/kona-port-config.h +3 −3 Original line number Diff line number Diff line Loading @@ -3,8 +3,8 @@ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */ #ifndef _SM8250_PORT_CONFIG #define _SM8250_PORT_CONFIG #ifndef _KONA_PORT_CONFIG #define _KONA_PORT_CONFIG #include <soc/swr-common.h> Loading Loading @@ -57,4 +57,4 @@ static struct swr_mstr_port_map sm_port_map[] = { {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, }; #endif /* _SM8250_PORT_CONFIG */ #endif /* _KONA_PORT_CONFIG */
asoc/kona.c +145 −2 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ #include "codecs/bolero/bolero-cdc.h" #include <dt-bindings/sound/audio-codec-port-types.h> #include "codecs/bolero/wsa-macro.h" #include "sm8250-port-config.h" #include "kona-port-config.h" #define DRV_NAME "kona-asoc-snd" #define __CHIPSET__ "KONA " Loading Loading @@ -73,6 +73,7 @@ #define WSA8810_NAME_2 "wsa881x.20170212" #define WCN_CDC_SLIM_RX_CH_MAX 2 #define WCN_CDC_SLIM_TX_CH_MAX 2 #define WCN_CDC_SLIM_TX_CH_MAX_LITO 3 enum { TDM_0 = 0, Loading Loading @@ -137,6 +138,7 @@ enum { }; enum { SLIM_TX_7 = 0, SLIM_TX_8, SLIM_TX_MAX, }; Loading Loading @@ -191,6 +193,7 @@ static struct dev_config slim_rx_cfg[] = { static struct dev_config slim_tx_cfg[] = { [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, }; /* Default configuration of external display BE */ Loading Loading @@ -3632,6 +3635,12 @@ static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, slim_tx_cfg[SLIM_TX_7].channels; break; case MSM_BACKEND_DAI_SLIMBUS_8_TX: rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate; channels->min = channels->max = slim_tx_cfg[SLIM_TX_8].channels; break; case MSM_BACKEND_DAI_AFE_LOOPBACK_TX: param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, afe_loopback_tx_cfg[idx].bit_format); Loading Loading @@ -3991,6 +4000,41 @@ static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) mutex_unlock(&mi2s_intf_conf[index].lock); } static int msm_wcn_hw_params_lito(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *codec_dai = rtd->codec_dai; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_soc_dai_link *dai_link = rtd->dai_link; u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX_LITO]; u32 rx_ch_cnt = 0, tx_ch_cnt = 0; int ret = 0; dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__, codec_dai->name, codec_dai->id); ret = snd_soc_dai_get_channel_map(codec_dai, &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); if (ret) { dev_err(rtd->dev, "%s: failed to get BTFM codec chan map\n, err:%d\n", __func__, ret); goto err; } dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n", __func__, tx_ch_cnt, dai_link->id); ret = snd_soc_dai_set_channel_map(cpu_dai, tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch); if (ret) dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n", __func__, ret); err: return ret; } static int msm_wcn_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { Loading Loading @@ -4047,6 +4091,10 @@ static struct snd_soc_ops msm_wcn_ops = { .hw_params = msm_wcn_hw_params, }; static struct snd_soc_ops msm_wcn_ops_lito = { .hw_params = msm_wcn_hw_params_lito, }; static int msm_dmic_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { Loading Loading @@ -4155,6 +4203,16 @@ static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) tx_ch, ARRAY_SIZE(rx_ch), rx_ch); } static int msm_wcn_init_lito(struct snd_soc_pcm_runtime *rtd) { unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX_LITO] = {159, 160, 161}; struct snd_soc_dai *codec_dai = rtd->codec_dai; return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), tx_ch, ARRAY_SIZE(rx_ch), rx_ch); } static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd) { int ret = -EINVAL; Loading Loading @@ -4897,6 +4955,22 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .ignore_pmdown_time = 1, .id = MSM_FRONTEND_DAI_MULTIMEDIA17, }, {/* hw:x,38 */ .name = "SLIMBUS_8 Hostless", .stream_name = "SLIMBUS_8 Hostless", .cpu_dai_name = "SLIMBUS8_HOSTLESS", .platform_name = "msm-pcm-hostless", .dynamic = 1, .dpcm_capture = 1, .dpcm_playback = 1, .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, .ignore_suspend = 1, .ignore_pmdown_time = 1, .codec_dai_name = "snd-soc-dummy-dai", .codec_name = "snd-soc-dummy", }, }; static struct snd_soc_dai_link msm_common_be_dai_links[] = { Loading Loading @@ -5141,6 +5215,58 @@ static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { }, }; static struct snd_soc_dai_link msm_wcn_btfm_be_dai_links[] = { { .name = LPASS_BE_SLIMBUS_7_RX, .stream_name = "Slimbus7 Playback", .cpu_dai_name = "msm-dai-q6-dev.16398", .platform_name = "msm-pcm-routing", .codec_name = "btfmslim_slave", /* BT codec driver determines capabilities based on * dai name, bt codecdai name should always contains * supported usecase information */ .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_SLIMBUS_7_RX, .be_hw_params_fixup = msm_be_hw_params_fixup, .init = &msm_wcn_init_lito, .ops = &msm_wcn_ops_lito, /* dai link has playback support */ .ignore_pmdown_time = 1, .ignore_suspend = 1, }, { .name = LPASS_BE_SLIMBUS_7_TX, .stream_name = "Slimbus7 Capture", .cpu_dai_name = "msm-dai-q6-dev.16399", .platform_name = "msm-pcm-routing", .codec_name = "btfmslim_slave", .codec_dai_name = "btfm_bt_sco_slim_tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_SLIMBUS_7_TX, .be_hw_params_fixup = msm_be_hw_params_fixup, .ops = &msm_wcn_ops_lito, .ignore_suspend = 1, }, { .name = LPASS_BE_SLIMBUS_8_TX, .stream_name = "Slimbus8 Capture", .cpu_dai_name = "msm-dai-q6-dev.16401", .platform_name = "msm-pcm-routing", .codec_name = "btfmslim_slave", .codec_dai_name = "btfm_fm_slim_tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_SLIMBUS_8_TX, .be_hw_params_fixup = msm_be_hw_params_fixup, .ops = &msm_wcn_ops_lito, .ignore_suspend = 1, }, }; static struct snd_soc_dai_link ext_disp_be_dai_link[] = { /* DISP PORT BACK END DAI Link */ { Loading Loading @@ -5566,7 +5692,8 @@ static struct snd_soc_dai_link msm_kona_dai_links[ ARRAY_SIZE(msm_va_cdc_dma_be_dai_links) + ARRAY_SIZE(ext_disp_be_dai_link) + ARRAY_SIZE(msm_wcn_be_dai_links) + ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link)]; ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link) + ARRAY_SIZE(msm_wcn_btfm_be_dai_links)]; static int msm_populate_dai_link_component_of_node( struct snd_soc_card *card) Loading Loading @@ -5769,6 +5896,7 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) u32 mi2s_audio_intf = 0; u32 auxpcm_audio_intf = 0; u32 val = 0; u32 wcn_btfm_intf = 0; const struct of_device_id *match; match = of_match_node(kona_asoc_machine_of_match, dev->of_node); Loading Loading @@ -5881,6 +6009,21 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) total_links += ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link); } rc = of_property_read_u32(dev->of_node, "qcom,wcn-btfm", &wcn_btfm_intf); if (rc) { dev_dbg(dev, "%s: No DT match wcn btfm interface\n", __func__); } else { if (wcn_btfm_intf) { memcpy(msm_kona_dai_links + total_links, msm_wcn_btfm_be_dai_links, sizeof(msm_wcn_btfm_be_dai_links)); total_links += ARRAY_SIZE(msm_wcn_btfm_be_dai_links); } } dailink = msm_kona_dai_links; } else if(!strcmp(match->data, "stub_codec")) { card = &snd_soc_card_stub_msm; Loading