Add Audio Support for Kaanapali MTP Boards

Merge series from Prasad Kumpatla <prasad.kumpatla@oss.qualcomm.com>:

Add audio support for Kaanapali MTP boards. Introduces supporting
dependencies required to enable audio functionality on MTP platforms.
These changes have been validated on Kaanapali MTP hardware.
This commit is contained in:
Mark Brown 2025-10-17 12:27:42 +01:00
commit 93b2838c6e
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
7 changed files with 68 additions and 26 deletions

View File

@ -20,6 +20,7 @@ properties:
- qcom,sc8280xp-lpass-rx-macro
- items:
- enum:
- qcom,kaanapali-lpass-rx-macro
- qcom,sm8650-lpass-rx-macro
- qcom,sm8750-lpass-rx-macro
- qcom,x1e80100-lpass-rx-macro

View File

@ -21,6 +21,7 @@ properties:
- qcom,sc8280xp-lpass-tx-macro
- items:
- enum:
- qcom,kaanapali-lpass-tx-macro
- qcom,sm8650-lpass-tx-macro
- qcom,sm8750-lpass-tx-macro
- qcom,x1e80100-lpass-tx-macro

View File

@ -21,6 +21,7 @@ properties:
- items:
- enum:
- qcom,glymur-lpass-va-macro
- qcom,kaanapali-lpass-va-macro
- qcom,sm8650-lpass-va-macro
- qcom,sm8750-lpass-va-macro
- qcom,x1e80100-lpass-va-macro

View File

@ -21,6 +21,7 @@ properties:
- items:
- enum:
- qcom,glymur-lpass-wsa-macro
- qcom,kaanapali-lpass-wsa-macro
- qcom,sm8650-lpass-wsa-macro
- qcom,sm8750-lpass-wsa-macro
- qcom,x1e80100-lpass-wsa-macro

View File

@ -23,6 +23,7 @@ properties:
- const: qcom,sdm845-sndcard
- items:
- enum:
- qcom,kaanapali-sndcard
- qcom,sm8550-sndcard
- qcom,sm8650-sndcard
- qcom,sm8750-sndcard

View File

@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
// Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
#include <linux/bitfield.h>
#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/init.h>
@ -64,8 +65,15 @@
#define CDC_VA_TOP_CSR_I2S_CLK (0x00A8)
#define CDC_VA_TOP_CSR_I2S_RESET (0x00AC)
#define CDC_VA_TOP_CSR_CORE_ID_0 (0x00C0)
#define CORE_ID_0_REV_MAJ GENMASK(7, 0)
#define CDC_VA_TOP_CSR_CORE_ID_1 (0x00C4)
#define CORE_ID_1_HAS_WSAMACRO BIT(3)
#define CORE_ID_1_HAS_RXMACRO BIT(2)
#define CORE_ID_1_HAS_TXMACRO BIT(1)
#define CORE_ID_1_HAS_VAMACRO BIT(0)
#define CDC_VA_TOP_CSR_CORE_ID_2 (0x00C8)
#define CORE_ID_2_REV_MIN GENMASK(7, 4)
#define CORE_ID_2_REV_STEP GENMASK(3, 0)
#define CDC_VA_TOP_CSR_CORE_ID_3 (0x00CC)
#define CDC_VA_TOP_CSR_SWR_MIC_CTL0 (0x00D0)
#define CDC_VA_TOP_CSR_SWR_MIC_CTL1 (0x00D4)
@ -1462,39 +1470,63 @@ static int va_macro_validate_dmic_sample_rate(u32 dmic_sample_rate,
return dmic_sample_rate;
}
static void va_macro_set_lpass_codec_version(struct va_macro *va)
static int va_macro_set_lpass_codec_version(struct va_macro *va)
{
int core_id_0 = 0, core_id_1 = 0, core_id_2 = 0;
int version = LPASS_CODEC_VERSION_UNKNOWN;
u32 maj, min, step;
u32 val;
regmap_read(va->regmap, CDC_VA_TOP_CSR_CORE_ID_0, &core_id_0);
regmap_read(va->regmap, CDC_VA_TOP_CSR_CORE_ID_1, &core_id_1);
regmap_read(va->regmap, CDC_VA_TOP_CSR_CORE_ID_2, &core_id_2);
regmap_read(va->regmap, CDC_VA_TOP_CSR_CORE_ID_0, &val);
maj = FIELD_GET(CORE_ID_0_REV_MAJ, val);
if ((core_id_0 == 0x01) && (core_id_1 == 0x0F))
regmap_read(va->regmap, CDC_VA_TOP_CSR_CORE_ID_1, &val);
if (!FIELD_GET(CORE_ID_1_HAS_VAMACRO, val)) {
dev_err(va->dev, "This is not a VA macro instance\n");
return -ENODEV;
}
regmap_read(va->regmap, CDC_VA_TOP_CSR_CORE_ID_2, &val);
min = FIELD_GET(CORE_ID_2_REV_MIN, val);
step = FIELD_GET(CORE_ID_2_REV_STEP, val);
if (maj == 1) {
version = LPASS_CODEC_VERSION_2_0;
if ((core_id_0 == 0x02) && (core_id_1 == 0x0F) && core_id_2 == 0x01)
version = LPASS_CODEC_VERSION_2_0;
if ((core_id_0 == 0x02) && (core_id_1 == 0x0E))
version = LPASS_CODEC_VERSION_2_1;
if ((core_id_0 == 0x02) && (core_id_1 == 0x0F) && (core_id_2 == 0x50 || core_id_2 == 0x51))
version = LPASS_CODEC_VERSION_2_5;
if ((core_id_0 == 0x02) && (core_id_1 == 0x0F) && (core_id_2 == 0x60 || core_id_2 == 0x61))
version = LPASS_CODEC_VERSION_2_6;
if ((core_id_0 == 0x02) && (core_id_1 == 0x0F) && (core_id_2 == 0x70 || core_id_2 == 0x71))
version = LPASS_CODEC_VERSION_2_7;
if ((core_id_0 == 0x02) && (core_id_1 == 0x0F) && (core_id_2 == 0x80 || core_id_2 == 0x81))
version = LPASS_CODEC_VERSION_2_8;
if ((core_id_0 == 0x02) && (core_id_1 == 0x0F) && (core_id_2 == 0x90 || core_id_2 == 0x91))
version = LPASS_CODEC_VERSION_2_9;
} else if (maj == 2) {
switch (min) {
case 0:
version = LPASS_CODEC_VERSION_2_0;
break;
case 5:
version = LPASS_CODEC_VERSION_2_5;
break;
case 6:
version = LPASS_CODEC_VERSION_2_6;
break;
case 7:
version = LPASS_CODEC_VERSION_2_7;
break;
case 8:
version = LPASS_CODEC_VERSION_2_8;
break;
case 9:
version = LPASS_CODEC_VERSION_2_9;
break;
default:
break;
}
}
if (version == LPASS_CODEC_VERSION_UNKNOWN)
dev_warn(va->dev, "Unknown Codec version, ID: %02x / %02x / %02x\n",
core_id_0, core_id_1, core_id_2);
if (version == LPASS_CODEC_VERSION_UNKNOWN) {
dev_err(va->dev, "VA Macro v%u.%u.%u is not supported\n",
maj, min, step);
return -EOPNOTSUPP;
}
lpass_macro_set_codec_version(version);
dev_dbg(va->dev, "LPASS Codec Version %s\n", lpass_macro_get_codec_version_string(version));
return 0;
}
static int va_macro_probe(struct platform_device *pdev)
@ -1594,10 +1626,14 @@ static int va_macro_probe(struct platform_device *pdev)
* old version of codecs do not have a reliable way to determine the
* version from registers, get them from soc specific data
*/
if (data->version)
if (data->version) {
lpass_macro_set_codec_version(data->version);
else /* read version from register */
va_macro_set_lpass_codec_version(va);
} else {
/* read version from register */
ret = va_macro_set_lpass_codec_version(va);
if (ret)
return ret;
}
if (va->has_swr_master) {
/* Set default CLK div to 1 */

View File

@ -191,6 +191,7 @@ static int sc8280xp_platform_probe(struct platform_device *pdev)
}
static const struct of_device_id snd_sc8280xp_dt_match[] = {
{.compatible = "qcom,kaanapali-sndcard", "kaanapali"},
{.compatible = "qcom,qcm6490-idp-sndcard", "qcm6490"},
{.compatible = "qcom,qcs6490-rb3gen2-sndcard", "qcs6490"},
{.compatible = "qcom,qcs8275-sndcard", "qcs8300"},