Message ID | 20240606122559.116698-1-srinivas.kandagatla@linaro.org |
---|---|
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 >
On 06/06/2024 14:25, srinivas.kandagatla@linaro.org wrote: > From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> > > This patchset adds support to reading codec version and also adds > support for v2.5 codec version in rx macro. > > LPASS 2.5 and up versions have changes in some of the rx blocks which > are required to get headset functional correctly. > > Tested this on SM8450, X13s and x1e80100 crd. > > This changes also fixes issue with sm8450, sm8550, sm8660 and x1e80100. > > @Neil Armstrong can you pl test it on sm8650 > > @Krzysztof Kozlowski can you pl test it on sm8550 > > Thanks, > Srini > > Changes since v1: > - renamed all 2_6 variables with 2.5 > - expanded checks for versions from 2.5 till 2.8 > > Srinivas Kandagatla (2): > ASoC: codecs: lpass-macro: add helpers to get codec version > ASoC: codec: lpass-rx-macro: add suppor for 2.5 codec version > > sound/soc/codecs/lpass-macro-common.c | 14 + > sound/soc/codecs/lpass-macro-common.h | 35 ++ > sound/soc/codecs/lpass-rx-macro.c | 565 +++++++++++++++++++------- > sound/soc/codecs/lpass-va-macro.c | 29 ++ > 4 files changed, 488 insertions(+), 155 deletions(-) > Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-HDK Successfully fixes dual channel output on headset, previously I would only hear sound on a single channel. Thanks, Neil
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> This patchset adds support to reading codec version and also adds support for v2.5 codec version in rx macro. LPASS 2.5 and up versions have changes in some of the rx blocks which are required to get headset functional correctly. Tested this on SM8450, X13s and x1e80100 crd. This changes also fixes issue with sm8450, sm8550, sm8660 and x1e80100. @Neil Armstrong can you pl test it on sm8650 @Krzysztof Kozlowski can you pl test it on sm8550 Thanks, Srini Changes since v1: - renamed all 2_6 variables with 2.5 - expanded checks for versions from 2.5 till 2.8 Srinivas Kandagatla (2): ASoC: codecs: lpass-macro: add helpers to get codec version ASoC: codec: lpass-rx-macro: add suppor for 2.5 codec version sound/soc/codecs/lpass-macro-common.c | 14 + sound/soc/codecs/lpass-macro-common.h | 35 ++ sound/soc/codecs/lpass-rx-macro.c | 565 +++++++++++++++++++------- sound/soc/codecs/lpass-va-macro.c | 29 ++ 4 files changed, 488 insertions(+), 155 deletions(-)