From 1e32f15ad7eb15d54fc8ea08d08e376d954bcd28 Mon Sep 17 00:00:00 2001 From: Sarath Varma Ganapathiraju Date: Wed, 6 Mar 2024 00:44:03 +0530 Subject: [PATCH] asoc: Add support to read adsp variant and set sndcard name Soundcard name might need to be modified based on adsp sku variants. Add support to read the adsp variant from nvmem and set the soundcard name. Change-Id: I2ab0cef6f90a4dd512f736aa6b4540b21a74e917 Signed-off-by: Sarath Varma Ganapathiraju --- asoc/pineapple.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/asoc/pineapple.c b/asoc/pineapple.c index 593dc6731f..bb8a62f8a3 100644 --- a/asoc/pineapple.c +++ b/asoc/pineapple.c @@ -19,6 +19,7 @@ #include #endif #include +#include #include #include #include @@ -2274,6 +2275,50 @@ void msm_common_set_pdata(struct snd_soc_card *card, pdata->common_pdata = common_pdata; } +static int msm_asoc_parse_soundcard_name(struct platform_device *pdev, + struct snd_soc_card *card) +{ + struct nvmem_cell *cell = NULL; + size_t len = 0; + u32 *buf = NULL; + u32 adsp_var_idx = 0; + int ret = 0; + + /* get adsp variant idx */ + cell = nvmem_cell_get(&pdev->dev, "adsp_variant"); + if (IS_ERR_OR_NULL(cell)) { + dev_dbg(&pdev->dev, "%s: FAILED to get nvmem cell\n", __func__); + goto parse; + } + buf = nvmem_cell_read(cell, &len); + nvmem_cell_put(cell); + if (IS_ERR_OR_NULL(buf)) { + dev_dbg(&pdev->dev, "%s: FAILED to read nvmem cell\n", __func__); + goto parse; + } + if (len <= 0 || len > sizeof(u32)) { + dev_dbg(&pdev->dev, "%s: nvmem cell length out of range: %d\n", + __func__, len); + kfree(buf); + goto parse; + } + + memcpy(&adsp_var_idx, buf, len); + kfree(buf); + +parse: + if (adsp_var_idx) + ret = snd_soc_of_parse_card_name(card, "qcom,sku-model"); + else + ret = snd_soc_of_parse_card_name(card, "qcom,model"); + + if (ret) + dev_err(&pdev->dev, "%s: parse card name failed, err:%d\n", + __func__, ret); + + return ret; +} + static int msm_asoc_machine_probe(struct platform_device *pdev) { struct snd_soc_card *card = NULL; @@ -2328,9 +2373,9 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) platform_set_drvdata(pdev, card); snd_soc_card_set_drvdata(card, pdata); - ret = snd_soc_of_parse_card_name(card, "qcom,model"); + ret = msm_asoc_parse_soundcard_name(pdev, card); if (ret) { - dev_err(&pdev->dev, "%s: parse card name failed, err:%d\n", + dev_err(&pdev->dev, "%s: parse soundcard name failed, err:%d\n", __func__, ret); goto err; }