Re: [PATCH v2 1/2] ASoC: codecs: lpass-macro: add helpers to get codec version

From: Dmitry Baryshkov
Date: Fri Jun 07 2024 - 06:58:51 EST


On Thu, Jun 06, 2024 at 01:25:58PM +0100, srinivas.kandagatla@xxxxxxxxxx wrote:
> From: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx>
>
> LPASS Digital codec have changes in register layout across multiple
> versions. Add a proper way read the codec version allowint all the lpass
> macro drivers (tx, rx, wsa, va) to configure the registers correctly.
>
> LPASS VA macro has the required registers to read the codec version.
> Read the the version and make it available to other lpass codec macros
> using the common helper functions.
>
> Existing method of using LPASS IP version is not accurate as the same
> the codec versioning is totally independent of LPASS IP block versions.

So it's possible for two platforms have the same LPASS IP version, but
different codec versions?

>
> These helper functions should be able to provide a convient way to get
> the codec version, and will help scale the drivers in right direction.
>
> Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx>
> ---
> sound/soc/codecs/lpass-macro-common.c | 14 +++++++++++
> sound/soc/codecs/lpass-macro-common.h | 35 +++++++++++++++++++++++++++
> sound/soc/codecs/lpass-va-macro.c | 29 ++++++++++++++++++++++
> 3 files changed, 78 insertions(+)
>
> diff --git a/sound/soc/codecs/lpass-macro-common.c b/sound/soc/codecs/lpass-macro-common.c
> index da1b422250b8..a640bf88a6cd 100644
> --- a/sound/soc/codecs/lpass-macro-common.c
> +++ b/sound/soc/codecs/lpass-macro-common.c
> @@ -11,6 +11,8 @@
>
> #include "lpass-macro-common.h"
>
> +static int lpass_codec_version;
> +
> struct lpass_macro *lpass_macro_pds_init(struct device *dev)
> {
> struct lpass_macro *l_pds;
> @@ -66,5 +68,17 @@ void lpass_macro_pds_exit(struct lpass_macro *pds)
> }
> EXPORT_SYMBOL_GPL(lpass_macro_pds_exit);
>
> +void lpass_macro_set_codec_version(int version)
> +{
> + lpass_codec_version = version;
> +}
> +EXPORT_SYMBOL_GPL(lpass_macro_set_codec_version);
> +
> +int lpass_macro_get_codec_version(void)
> +{
> + return lpass_codec_version;
> +}
> +EXPORT_SYMBOL_GPL(lpass_macro_get_codec_version);

Is it really just a global variable, no locking, no device?

> +
> MODULE_DESCRIPTION("Common macro driver");
> MODULE_LICENSE("GPL");
> diff --git a/sound/soc/codecs/lpass-macro-common.h b/sound/soc/codecs/lpass-macro-common.h
> index d98718b3dc4b..f6f1bfe8eb77 100644
> --- a/sound/soc/codecs/lpass-macro-common.h
> +++ b/sound/soc/codecs/lpass-macro-common.h
> @@ -18,6 +18,18 @@ enum lpass_version {
> LPASS_VER_11_0_0,
> };
>
> +enum lpass_codec_version {
> + LPASS_CODEC_VERSION_1_0 = 1,
> + LPASS_CODEC_VERSION_1_1,
> + LPASS_CODEC_VERSION_1_2,
> + LPASS_CODEC_VERSION_2_0,
> + LPASS_CODEC_VERSION_2_1,
> + LPASS_CODEC_VERSION_2_5,
> + LPASS_CODEC_VERSION_2_6,
> + LPASS_CODEC_VERSION_2_7,
> + LPASS_CODEC_VERSION_2_8,
> +};
> +
> struct lpass_macro {
> struct device *macro_pd;
> struct device *dcodec_pd;
> @@ -25,5 +37,28 @@ struct lpass_macro {
>
> struct lpass_macro *lpass_macro_pds_init(struct device *dev);
> void lpass_macro_pds_exit(struct lpass_macro *pds);
> +void lpass_macro_set_codec_version(int version);
> +int lpass_macro_get_codec_version(void);
> +
> +static inline const char *lpass_macro_get_codec_version_string(int version)
> +{
> + switch (version) {
> + case LPASS_CODEC_VERSION_2_0:
> + return "v2.0";
> + case LPASS_CODEC_VERSION_2_1:
> + return "v2.1";
> + case LPASS_CODEC_VERSION_2_5:
> + return "v2.5";
> + case LPASS_CODEC_VERSION_2_6:
> + return "v2.6";
> + case LPASS_CODEC_VERSION_2_7:
> + return "v2.7";
> + case LPASS_CODEC_VERSION_2_8:
> + return "v2.8";
> + default:
> + break;
> + }
> + return "NA";
> +}
>
> #endif /* __LPASS_MACRO_COMMON_H__ */
> diff --git a/sound/soc/codecs/lpass-va-macro.c b/sound/soc/codecs/lpass-va-macro.c
> index 6eceeff10bf6..0ae9e6377e3a 100644
> --- a/sound/soc/codecs/lpass-va-macro.c
> +++ b/sound/soc/codecs/lpass-va-macro.c
> @@ -1461,6 +1461,33 @@ 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)
> +{
> + int core_id_0 = 0, core_id_1 = 0, core_id_2 = 0, version;
> +
> + 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);
> +
> + if ((core_id_0 == 0x01) && (core_id_1 == 0x0F))
> + 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;
> +
> + lpass_macro_set_codec_version(version);
> +
> + dev_info(va->dev, "LPASS Codec Version %s\n",
> + lpass_macro_get_codec_version_string(version));

dev_dbg, please.

> +}
> +
> static int va_macro_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> @@ -1554,6 +1581,8 @@ static int va_macro_probe(struct platform_device *pdev)
> goto err_npl;
> }
>
> + va_macro_set_lpass_codec_version(va);
> +
> if (va->has_swr_master) {
> /* Set default CLK div to 1 */
> regmap_update_bits(va->regmap, CDC_VA_TOP_CSR_SWR_MIC_CTL0,
> --
> 2.21.0
>

--
With best wishes
Dmitry