Message ID | 20240606122559.116698-2-srinivas.kandagatla@linaro.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | ASoC: codecs: lpass: add support for v2.5 rx macro | expand |
On Thu, Jun 06, 2024 at 01:25:58PM +0100, srinivas.kandagatla@linaro.org wrote: > From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> > > 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@linaro.org> > --- > 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 >
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); + 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)); +} + 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,