Skip to content

Commit

Permalink
ASoC: qcom: sdm845: add support to DB845c and Lenovo Yoga
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Srinivas Kandagatla authored and Mark Brown committed Dec 25, 2019
1 parent 834d899 commit 5caf64c
Showing 1 changed file with 85 additions and 1 deletion.
86 changes: 85 additions & 1 deletion sound/soc/qcom/sdm845.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
{
Expand Down Expand Up @@ -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;
Expand All @@ -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",
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 5caf64c

Please sign in to comment.