mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 23:52:08 +02:00
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:
commit
93b2838c6e
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ properties:
|
|||
- const: qcom,sdm845-sndcard
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,kaanapali-sndcard
|
||||
- qcom,sm8550-sndcard
|
||||
- qcom,sm8650-sndcard
|
||||
- qcom,sm8750-sndcard
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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"},
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user