Add four speaker support on MI2S secondary block by using I2S SD1 line on gpio52 pin, and add channel map control support in the lpass-cpu audio driver.
Signed-off-by: Srinivasa Rao Mandadapu srivasam@codeaurora.org --- sound/soc/qcom/lpass-cpu.c | 40 ++++++++++++++++++++++++++++++++++- sound/soc/qcom/lpass-sc7180.c | 1 + sound/soc/qcom/lpass.h | 8 ++++++- 3 files changed, 47 insertions(+), 2 deletions(-)
diff --git a/sound/soc/qcom/lpass-cpu.c b/sound/soc/qcom/lpass-cpu.c index c62d2612e8f5..d03cc359983a 100644 --- a/sound/soc/qcom/lpass-cpu.c +++ b/sound/soc/qcom/lpass-cpu.c @@ -324,10 +324,43 @@ const struct snd_soc_dai_ops asoc_qcom_lpass_cpu_dai_ops = { }; EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_dai_ops);
+int lpass_cpu_pcm_new(struct snd_soc_pcm_runtime *rtd, + struct snd_soc_dai *dai) +{ + int ret; + struct snd_soc_dai_driver *drv = dai->driver; + struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai); + + ret = snd_pcm_add_chmap_ctls(rtd->pcm, SNDRV_PCM_STREAM_PLAYBACK, + snd_pcm_alt_chmaps, drv->playback.channels_max, 0, + &drvdata->chmap_info); + if (ret < 0) + return ret; + + return 0; +} +EXPORT_SYMBOL_GPL(lpass_cpu_pcm_new); + int asoc_qcom_lpass_cpu_dai_probe(struct snd_soc_dai *dai) { struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai); - int ret; + struct snd_soc_dai_driver *drv = dai->driver; + int ret, i; + + drvdata->rx_chmap.channels = drv->playback.channels_max; + drvdata->tx_chmap.channels = drv->playback.channels_max; + + if (drv->playback.channels_max == 2) + drvdata->chmap_idx = 1; + else if (drv->playback.channels_max == 4) + drvdata->chmap_idx = 2; + + for (i = 0; i < drv->playback.channels_max; i++) { + drvdata->tx_chmap.map[i] = + snd_pcm_alt_chmaps[drvdata->chmap_idx].map[i]; + drvdata->rx_chmap.map[i] = + snd_pcm_alt_chmaps[drvdata->chmap_idx].map[i]; + }
/* ensure audio hardware is disabled */ ret = regmap_write(drvdata->lpaif_map, @@ -856,6 +889,11 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev) PTR_ERR(drvdata->mi2s_bit_clk[dai_id])); return PTR_ERR(drvdata->mi2s_bit_clk[dai_id]); } + if (drvdata->mi2s_playback_sd_mode[dai_id] == + LPAIF_I2SCTL_MODE_QUAD01) { + variant->dai_driver[dai_id].playback.channels_min = 4; + variant->dai_driver[dai_id].playback.channels_max = 4; + } }
/* Allocation for i2sctl regmap fields */ diff --git a/sound/soc/qcom/lpass-sc7180.c b/sound/soc/qcom/lpass-sc7180.c index 8c168d3c589e..77a556b27cf0 100644 --- a/sound/soc/qcom/lpass-sc7180.c +++ b/sound/soc/qcom/lpass-sc7180.c @@ -58,6 +58,7 @@ static struct snd_soc_dai_driver sc7180_lpass_cpu_dai_driver[] = { }, .probe = &asoc_qcom_lpass_cpu_dai_probe, .ops = &asoc_qcom_lpass_cpu_dai_ops, + .pcm_new = lpass_cpu_pcm_new, }, { .id = LPASS_DP_RX, .name = "Hdmi", diff --git a/sound/soc/qcom/lpass.h b/sound/soc/qcom/lpass.h index 83b2e08ade06..db239ea52946 100644 --- a/sound/soc/qcom/lpass.h +++ b/sound/soc/qcom/lpass.h @@ -110,6 +110,11 @@ struct lpass_data { struct lpass_hdmitx_dmactl *hdmi_tx_dmactl[LPASS_MAX_HDMI_DMA_CHANNELS]; struct lpass_dp_metadata_ctl *meta_ctl; struct lpass_sstream_ctl *sstream_ctl; + /* Channel map information */ + struct snd_pcm_chmap *chmap_info; + struct snd_pcm_chmap_elem rx_chmap; + struct snd_pcm_chmap_elem tx_chmap; + int chmap_idx; };
/* Vairant data per each SOC */ @@ -259,5 +264,6 @@ void asoc_qcom_lpass_cpu_platform_shutdown(struct platform_device *pdev); int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev); int asoc_qcom_lpass_cpu_dai_probe(struct snd_soc_dai *dai); extern const struct snd_soc_dai_ops asoc_qcom_lpass_cpu_dai_ops; - +int lpass_cpu_pcm_new(struct snd_soc_pcm_runtime *rtd, + struct snd_soc_dai *dai); #endif /* __LPASS_H__ */