Skip to content
Permalink
Browse files
ASoC: qcom: Add support for codec dma driver
Upadate lpass cpu and platform driver to support audio over codec dma
in ADSP bypass use case.

Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
Co-developed-by: Venkata Prasad Potturu <quic_potturu@quicinc.com>
Signed-off-by: Venkata Prasad Potturu <quic_potturu@quicinc.com>
  • Loading branch information
Srinivasa Rao Mandadapu authored and intel-lab-lkp committed Feb 12, 2022
1 parent 90d8b91 commit 81d86e5446d7b811a902e4834e65730b0fb393f5
Show file tree
Hide file tree
Showing 2 changed files with 537 additions and 21 deletions.
@@ -1042,7 +1042,9 @@ static void of_lpass_cpu_parse_dai_data(struct device *dev,
}
if (id == LPASS_DP_RX) {
data->hdmi_port_enable = 1;
} else {
} else if (is_cdc_dma_port(id))
data->codec_dma_enable = 1;
else {
data->mi2s_playback_sd_mode[id] =
of_lpass_cpu_parse_sd_lines(dev, node,
"qcom,playback-sd-lines");
@@ -1057,6 +1059,7 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)
{
struct lpass_data *drvdata;
struct device_node *dsp_of_node;
struct resource *res;
struct lpass_variant *variant;
struct device *dev = &pdev->dev;
const struct of_device_id *match;
@@ -1082,6 +1085,58 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)

of_lpass_cpu_parse_dai_data(dev, drvdata);

drvdata->num_clks = variant->num_clks;
if (drvdata->codec_dma_enable) {
drvdata->rxtx_lpaif =
devm_platform_ioremap_resource_byname(pdev, "lpass-rxtx-lpaif");
if (IS_ERR(drvdata->rxtx_lpaif))
return PTR_ERR(drvdata->rxtx_lpaif);

drvdata->va_lpaif = devm_platform_ioremap_resource_byname(pdev, "lpass-va-lpaif");
if (IS_ERR(drvdata->va_lpaif))
return PTR_ERR(drvdata->va_lpaif);

lpass_rxtx_regmap_config.max_register = LPAIF_CDC_RXTX_WRDMAPER_REG(variant,
variant->rxtx_wrdma_channels +
variant->rxtx_wrdma_channel_start, LPASS_CDC_DMA_TX3);

drvdata->rxtx_lpaif_map = devm_regmap_init_mmio(dev, drvdata->rxtx_lpaif,
&lpass_rxtx_regmap_config);
if (IS_ERR(drvdata->rxtx_lpaif_map)) {
dev_err(dev, "error initializing rxtx regmap: %ld\n",
PTR_ERR(drvdata->rxtx_lpaif_map));
return PTR_ERR(drvdata->rxtx_lpaif_map);
}
lpass_va_regmap_config.max_register = LPAIF_CDC_VA_WRDMAPER_REG(variant,
variant->va_wrdma_channels +
variant->va_wrdma_channel_start, LPASS_CDC_DMA_VA_TX0);

drvdata->va_lpaif_map = devm_regmap_init_mmio(dev, drvdata->va_lpaif,
&lpass_va_regmap_config);
if (IS_ERR(drvdata->va_lpaif_map)) {
dev_err(dev, "error initializing va regmap: %ld\n",
PTR_ERR(drvdata->va_lpaif_map));
return PTR_ERR(drvdata->va_lpaif_map);
}
drvdata->cdc_clks = devm_kcalloc(dev, variant->cdc_dma_num_clks,
sizeof(*drvdata->cdc_clks), GFP_KERNEL);
drvdata->cdc_num_clks = variant->cdc_dma_num_clks;

for (i = 0; i < drvdata->cdc_num_clks; i++)
drvdata->cdc_clks[i].id = variant->cdc_dma_clk_names[i];

ret = devm_clk_bulk_get(dev, drvdata->cdc_num_clks, drvdata->cdc_clks);
if (ret) {
dev_err(dev, "Failed to get clocks %d\n", ret);
return ret;
}

res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lpass-rxtx-cdc-dma-lpm");
drvdata->rxtx_cdc_dma_lpm_buf = res->start;

res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lpass-va-cdc-dma-lpm");
drvdata->va_cdc_dma_lpm_buf = res->start;
}
drvdata->lpaif = devm_platform_ioremap_resource_byname(pdev, "lpass-lpaif");
if (IS_ERR(drvdata->lpaif))
return PTR_ERR(drvdata->lpaif);
@@ -1124,7 +1179,7 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)

for (i = 0; i < variant->num_dai; i++) {
dai_id = variant->dai_driver[i].id;
if (dai_id == LPASS_DP_RX)
if (dai_id == LPASS_DP_RX || is_cdc_dma_port(dai_id))
continue;

drvdata->mi2s_osr_clk[dai_id] = devm_clk_get_optional(dev,

0 comments on commit 81d86e5

Please sign in to comment.