mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
ASoC: qcom: sdm845: add support to DB845c and Lenovo Yoga
This patch adds support to Lenovo Yoga c630 compatible strings and related setup to the sound machine driver. Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> Link: https://lore.kernel.org/r/20191219103153.14875-12-srinivas.kandagatla@linaro.org Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
834d899794
commit
5caf64c633
1 changed files with 85 additions and 1 deletions
|
@ -24,6 +24,9 @@
|
|||
#define RIGHT_SPK_TDM_TX_MASK 0xC0
|
||||
#define SPK_TDM_RX_MASK 0x03
|
||||
#define NUM_TDM_SLOTS 8
|
||||
#define SLIM_MAX_TX_PORTS 16
|
||||
#define SLIM_MAX_RX_PORTS 16
|
||||
#define WCD934X_DEFAULT_MCLK_RATE 9600000
|
||||
|
||||
struct sdm845_snd_data {
|
||||
struct snd_soc_jack jack;
|
||||
|
@ -36,6 +39,39 @@ struct sdm845_snd_data {
|
|||
|
||||
static unsigned int tdm_slot_offset[8] = {0, 4, 8, 12, 16, 20, 24, 28};
|
||||
|
||||
static int sdm845_slim_snd_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_dai_link *dai_link = rtd->dai_link;
|
||||
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||
u32 rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS];
|
||||
u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
|
||||
int ret = 0, i;
|
||||
|
||||
for (i = 0 ; i < dai_link->num_codecs; i++) {
|
||||
ret = snd_soc_dai_get_channel_map(rtd->codec_dais[i],
|
||||
&tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
|
||||
|
||||
if (ret != 0 && ret != -ENOTSUPP) {
|
||||
pr_err("failed to get codec chan map, err:%d\n", ret);
|
||||
return ret;
|
||||
} else if (ret == -ENOTSUPP) {
|
||||
/* Ignore unsupported */
|
||||
continue;
|
||||
}
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
ret = snd_soc_dai_set_channel_map(cpu_dai, 0, NULL,
|
||||
rx_ch_cnt, rx_ch);
|
||||
else
|
||||
ret = snd_soc_dai_set_channel_map(cpu_dai, tx_ch_cnt,
|
||||
tx_ch, 0, NULL);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sdm845_tdm_snd_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
|
@ -151,6 +187,11 @@ static int sdm845_snd_hw_params(struct snd_pcm_substream *substream,
|
|||
case QUATERNARY_TDM_TX_0:
|
||||
ret = sdm845_tdm_snd_hw_params(substream, params);
|
||||
break;
|
||||
case SLIMBUS_0_RX...SLIMBUS_6_TX:
|
||||
ret = sdm845_slim_snd_hw_params(substream, params);
|
||||
break;
|
||||
case QUATERNARY_MI2S_RX:
|
||||
break;
|
||||
default:
|
||||
pr_err("%s: invalid dai id 0x%x\n", __func__, cpu_dai->id);
|
||||
break;
|
||||
|
@ -173,7 +214,20 @@ static int sdm845_dai_init(struct snd_soc_pcm_runtime *rtd)
|
|||
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||
struct sdm845_snd_data *pdata = snd_soc_card_get_drvdata(card);
|
||||
struct snd_jack *jack;
|
||||
int rval;
|
||||
struct snd_soc_dai_link *dai_link = rtd->dai_link;
|
||||
/*
|
||||
* Codec SLIMBUS configuration
|
||||
* RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8, RX9, RX10, RX11, RX12, RX13
|
||||
* TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13
|
||||
* TX14, TX15, TX16
|
||||
*/
|
||||
unsigned int rx_ch[SLIM_MAX_RX_PORTS] = {144, 145, 146, 147, 148, 149,
|
||||
150, 151, 152, 153, 154, 155, 156};
|
||||
unsigned int tx_ch[SLIM_MAX_TX_PORTS] = {128, 129, 130, 131, 132, 133,
|
||||
134, 135, 136, 137, 138, 139,
|
||||
140, 141, 142, 143};
|
||||
int rval, i;
|
||||
|
||||
|
||||
if (!pdata->jack_setup) {
|
||||
rval = snd_soc_card_jack_new(card, "Headset Jack",
|
||||
|
@ -211,6 +265,21 @@ static int sdm845_dai_init(struct snd_soc_pcm_runtime *rtd)
|
|||
return rval;
|
||||
}
|
||||
break;
|
||||
case SLIMBUS_0_RX...SLIMBUS_6_TX:
|
||||
for (i = 0 ; i < dai_link->num_codecs; i++) {
|
||||
rval = snd_soc_dai_set_channel_map(rtd->codec_dais[i],
|
||||
ARRAY_SIZE(tx_ch),
|
||||
tx_ch,
|
||||
ARRAY_SIZE(rx_ch),
|
||||
rx_ch);
|
||||
if (rval != 0 && rval != -ENOTSUPP)
|
||||
return rval;
|
||||
|
||||
snd_soc_dai_set_sysclk(rtd->codec_dais[i], 0,
|
||||
WCD934X_DEFAULT_MCLK_RATE,
|
||||
SNDRV_PCM_STREAM_PLAYBACK);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -256,6 +325,14 @@ static int sdm845_snd_startup(struct snd_pcm_substream *substream)
|
|||
}
|
||||
snd_soc_dai_set_fmt(cpu_dai, fmt);
|
||||
snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt);
|
||||
break;
|
||||
case QUATERNARY_MI2S_RX:
|
||||
snd_soc_dai_set_sysclk(cpu_dai,
|
||||
Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT,
|
||||
MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK);
|
||||
snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS);
|
||||
|
||||
|
||||
break;
|
||||
|
||||
case QUATERNARY_TDM_RX_0:
|
||||
|
@ -294,6 +371,8 @@ static int sdm845_snd_startup(struct snd_pcm_substream *substream)
|
|||
}
|
||||
}
|
||||
break;
|
||||
case SLIMBUS_0_RX...SLIMBUS_6_TX:
|
||||
break;
|
||||
|
||||
default:
|
||||
pr_err("%s: invalid dai id 0x%x\n", __func__, cpu_dai->id);
|
||||
|
@ -338,6 +417,9 @@ static void sdm845_snd_shutdown(struct snd_pcm_substream *substream)
|
|||
0, SNDRV_PCM_STREAM_PLAYBACK);
|
||||
}
|
||||
break;
|
||||
case SLIMBUS_0_RX...SLIMBUS_6_TX:
|
||||
case QUATERNARY_MI2S_RX:
|
||||
break;
|
||||
|
||||
default:
|
||||
pr_err("%s: invalid dai id 0x%x\n", __func__, cpu_dai->id);
|
||||
|
@ -451,6 +533,8 @@ static int sdm845_snd_platform_remove(struct platform_device *pdev)
|
|||
|
||||
static const struct of_device_id sdm845_snd_device_id[] = {
|
||||
{ .compatible = "qcom,sdm845-sndcard" },
|
||||
{ .compatible = "qcom,db845c-sndcard" },
|
||||
{ .compatible = "lenovo,yoga-c630-sndcard" },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sdm845_snd_device_id);
|
||||
|
|
Loading…
Reference in a new issue