From 82b30ba7c49776013a1de4d56f1fe206e9a2dd50 Mon Sep 17 00:00:00 2001 From: Vatsal Bucha Date: Wed, 17 Apr 2019 12:43:54 +0530 Subject: [PATCH] ASoC: Add dailink for lito btfm support As lito uses cherokee for btfm support which uses slimbus. Add respective dailink for wcn btfm support for lito. Also rename sm8250-port-config to kona-port-config. Change-Id: I86d771b5df76a4541b8bf17174c1181d9d94bb52 Signed-off-by: Vatsal Bucha --- ...m8250-port-config.h => kona-port-config.h} | 6 +- asoc/kona.c | 147 +++++++++++++++++- 2 files changed, 148 insertions(+), 5 deletions(-) rename asoc/{sm8250-port-config.h => kona-port-config.h} (95%) diff --git a/asoc/sm8250-port-config.h b/asoc/kona-port-config.h similarity index 95% rename from asoc/sm8250-port-config.h rename to asoc/kona-port-config.h index 503d514ba6fa..0f7379175302 100644 --- a/asoc/sm8250-port-config.h +++ b/asoc/kona-port-config.h @@ -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 @@ -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 */ diff --git a/asoc/kona.c b/asoc/kona.c index 574c652464cd..50a25b17ffe3 100644 --- a/asoc/kona.c +++ b/asoc/kona.c @@ -35,7 +35,7 @@ #include "codecs/bolero/bolero-cdc.h" #include #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 " @@ -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, @@ -137,6 +138,7 @@ enum { }; enum { SLIM_TX_7 = 0, + SLIM_TX_8, SLIM_TX_MAX, }; @@ -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 */ @@ -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); @@ -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) { @@ -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) { @@ -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; @@ -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[] = { @@ -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 */ { @@ -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) @@ -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); @@ -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;