On Wed, Jun 12, 2024 at 05:57:21PM +0100, Srinivas Kandagatla wrote: > 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. > > 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 | 23 +++++++++++++++++++++++ > sound/soc/codecs/lpass-macro-common.h | 35 +++++++++++++++++++++++++++++++++++ > sound/soc/codecs/lpass-va-macro.c | 29 +++++++++++++++++++++++++++++ > 3 files changed, 87 insertions(+) > > diff --git a/sound/soc/codecs/lpass-macro-common.c b/sound/soc/codecs/lpass-macro-common.c > index da1b422250b8..8b038a99a8f9 100644 > --- a/sound/soc/codecs/lpass-macro-common.c > +++ b/sound/soc/codecs/lpass-macro-common.c > @@ -11,6 +11,9 @@ > > #include "lpass-macro-common.h" > > +static DEFINE_MUTEX(lpass_codec_mutex); > +static int lpass_codec_version; > + > struct lpass_macro *lpass_macro_pds_init(struct device *dev) > { > struct lpass_macro *l_pds; > @@ -66,5 +69,25 @@ void lpass_macro_pds_exit(struct lpass_macro *pds) > } > EXPORT_SYMBOL_GPL(lpass_macro_pds_exit); > > +void lpass_macro_set_codec_version(int version) > +{ > + mutex_lock(&lpass_codec_mutex); > + lpass_codec_version = version; > + mutex_unlock(&lpass_codec_mutex); > +} > +EXPORT_SYMBOL_GPL(lpass_macro_set_codec_version); > + > +int lpass_macro_get_codec_version(void) > +{ > + int ver; > + > + mutex_lock(&lpass_codec_mutex); > + ver = lpass_codec_version; > + mutex_unlock(&lpass_codec_mutex); > + > + return ver; > +} > +EXPORT_SYMBOL_GPL(lpass_macro_get_codec_version); > + > 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. I think the kernel should be mostly quiet by default. > +} > + > 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.25.1 > -- With best wishes Dmitry