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 <vbucha@codeaurora.org>
This commit is contained in:
@@ -3,8 +3,8 @@
|
|||||||
* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _SM8250_PORT_CONFIG
|
#ifndef _KONA_PORT_CONFIG
|
||||||
#define _SM8250_PORT_CONFIG
|
#define _KONA_PORT_CONFIG
|
||||||
|
|
||||||
#include <soc/swr-common.h>
|
#include <soc/swr-common.h>
|
||||||
|
|
||||||
@@ -57,4 +57,4 @@ static struct swr_mstr_port_map sm_port_map[] = {
|
|||||||
{WSA_MACRO, SWR_UC0, wsa_frame_params_default},
|
{WSA_MACRO, SWR_UC0, wsa_frame_params_default},
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _SM8250_PORT_CONFIG */
|
#endif /* _KONA_PORT_CONFIG */
|
||||||
147
asoc/kona.c
147
asoc/kona.c
@@ -35,7 +35,7 @@
|
|||||||
#include "codecs/bolero/bolero-cdc.h"
|
#include "codecs/bolero/bolero-cdc.h"
|
||||||
#include <dt-bindings/sound/audio-codec-port-types.h>
|
#include <dt-bindings/sound/audio-codec-port-types.h>
|
||||||
#include "codecs/bolero/wsa-macro.h"
|
#include "codecs/bolero/wsa-macro.h"
|
||||||
#include "sm8250-port-config.h"
|
#include "kona-port-config.h"
|
||||||
|
|
||||||
#define DRV_NAME "kona-asoc-snd"
|
#define DRV_NAME "kona-asoc-snd"
|
||||||
#define __CHIPSET__ "KONA "
|
#define __CHIPSET__ "KONA "
|
||||||
@@ -73,6 +73,7 @@
|
|||||||
#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 2
|
#define WCN_CDC_SLIM_TX_CH_MAX 2
|
||||||
|
#define WCN_CDC_SLIM_TX_CH_MAX_LITO 3
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
TDM_0 = 0,
|
TDM_0 = 0,
|
||||||
@@ -137,6 +138,7 @@ enum {
|
|||||||
};
|
};
|
||||||
enum {
|
enum {
|
||||||
SLIM_TX_7 = 0,
|
SLIM_TX_7 = 0,
|
||||||
|
SLIM_TX_8,
|
||||||
SLIM_TX_MAX,
|
SLIM_TX_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -191,6 +193,7 @@ static struct dev_config slim_rx_cfg[] = {
|
|||||||
|
|
||||||
static struct dev_config slim_tx_cfg[] = {
|
static struct dev_config slim_tx_cfg[] = {
|
||||||
[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},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Default configuration of external display BE */
|
/* 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;
|
slim_tx_cfg[SLIM_TX_7].channels;
|
||||||
break;
|
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:
|
case MSM_BACKEND_DAI_AFE_LOOPBACK_TX:
|
||||||
param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
|
param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
|
||||||
afe_loopback_tx_cfg[idx].bit_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);
|
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,
|
static int msm_wcn_hw_params(struct snd_pcm_substream *substream,
|
||||||
struct snd_pcm_hw_params *params)
|
struct snd_pcm_hw_params *params)
|
||||||
{
|
{
|
||||||
@@ -4047,6 +4091,10 @@ static struct snd_soc_ops msm_wcn_ops = {
|
|||||||
.hw_params = msm_wcn_hw_params,
|
.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,
|
static int msm_dmic_event(struct snd_soc_dapm_widget *w,
|
||||||
struct snd_kcontrol *kcontrol, int event)
|
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);
|
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)
|
static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd)
|
||||||
{
|
{
|
||||||
int ret = -EINVAL;
|
int ret = -EINVAL;
|
||||||
@@ -4897,6 +4955,22 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = {
|
|||||||
.ignore_pmdown_time = 1,
|
.ignore_pmdown_time = 1,
|
||||||
.id = MSM_FRONTEND_DAI_MULTIMEDIA17,
|
.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[] = {
|
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[] = {
|
static struct snd_soc_dai_link ext_disp_be_dai_link[] = {
|
||||||
/* DISP PORT BACK END 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(msm_va_cdc_dma_be_dai_links) +
|
||||||
ARRAY_SIZE(ext_disp_be_dai_link) +
|
ARRAY_SIZE(ext_disp_be_dai_link) +
|
||||||
ARRAY_SIZE(msm_wcn_be_dai_links) +
|
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(
|
static int msm_populate_dai_link_component_of_node(
|
||||||
struct snd_soc_card *card)
|
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 mi2s_audio_intf = 0;
|
||||||
u32 auxpcm_audio_intf = 0;
|
u32 auxpcm_audio_intf = 0;
|
||||||
u32 val = 0;
|
u32 val = 0;
|
||||||
|
u32 wcn_btfm_intf = 0;
|
||||||
const struct of_device_id *match;
|
const struct of_device_id *match;
|
||||||
|
|
||||||
match = of_match_node(kona_asoc_machine_of_match, dev->of_node);
|
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 +=
|
total_links +=
|
||||||
ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link);
|
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;
|
dailink = msm_kona_dai_links;
|
||||||
} else if(!strcmp(match->data, "stub_codec")) {
|
} else if(!strcmp(match->data, "stub_codec")) {
|
||||||
card = &snd_soc_card_stub_msm;
|
card = &snd_soc_card_stub_msm;
|
||||||
|
|||||||
Reference in New Issue
Block a user