OSDN Git Service

ASoC: codecs: tfa989x: Add support for tfa9890
authorAlexander Martinz <amartinz@shiftphones.com>
Thu, 2 Jun 2022 16:45:03 +0000 (18:45 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 6 Jun 2022 11:38:37 +0000 (12:38 +0100)
The initialization sequence is taken from the version provided
by the supplier [1].

This allows speakers using the TFA9890 amplifier to work, which are
used by various mobile phones such as the SHIFT6mq.

[1]: https://source.codeaurora.org/external/mas/tfa98xx/tree/src/tfa_init.c?id=d2cd12931fbc48df988b62931fb9960d4e9dc05d#n1827

Signed-off-by: Alexander Martinz <amartinz@shiftphones.com>
Reviewed-by: Stephan Gerhold <stephan@gerhold.net>
Link: https://lore.kernel.org/r/20220602164504.261361-1-amartinz@shiftphones.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/tfa989x.c

index dc86852..8ab2656 100644 (file)
 #define TFA989X_I2S_SEL_REG            0x0a
 #define TFA989X_I2S_SEL_REG_SPKR_MSK   GENMASK(10, 9)  /* speaker impedance */
 #define TFA989X_I2S_SEL_REG_DCFG_MSK   GENMASK(14, 11) /* DCDC compensation */
+#define TFA989X_HIDE_UNHIDE_KEY        0x40
 #define TFA989X_PWM_CONTROL            0x41
 #define TFA989X_CURRENTSENSE1          0x46
 #define TFA989X_CURRENTSENSE2          0x47
 #define TFA989X_CURRENTSENSE3          0x48
 #define TFA989X_CURRENTSENSE4          0x49
 
+#define TFA9890_REVISION               0x80
 #define TFA9895_REVISION               0x12
 #define TFA9897_REVISION               0x97
 
@@ -188,6 +190,33 @@ static struct snd_soc_dai_driver tfa989x_dai = {
        .ops = &tfa989x_dai_ops,
 };
 
+static int tfa9890_init(struct regmap *regmap)
+{
+       int ret;
+
+       /* unhide keys to allow updating them */
+       ret = regmap_write(regmap, TFA989X_HIDE_UNHIDE_KEY, 0x5a6b);
+       if (ret)
+               return ret;
+
+       /* update PLL registers */
+       ret = regmap_set_bits(regmap, 0x59, 0x3);
+       if (ret)
+               return ret;
+
+       /* hide keys again */
+       ret = regmap_write(regmap, TFA989X_HIDE_UNHIDE_KEY, 0x0000);
+       if (ret)
+               return ret;
+
+       return regmap_write(regmap, TFA989X_CURRENTSENSE2, 0x7BE1);
+}
+
+static const struct tfa989x_rev tfa9890_rev = {
+       .rev    = TFA9890_REVISION,
+       .init   = tfa9890_init,
+};
+
 static const struct reg_sequence tfa9895_reg_init[] = {
        /* some other registers must be set for optimal amplifier behaviour */
        { TFA989X_BAT_PROT, 0x13ab },
@@ -376,6 +405,7 @@ static int tfa989x_i2c_probe(struct i2c_client *i2c)
 }
 
 static const struct of_device_id tfa989x_of_match[] = {
+       { .compatible = "nxp,tfa9890", .data = &tfa9890_rev },
        { .compatible = "nxp,tfa9895", .data = &tfa9895_rev },
        { .compatible = "nxp,tfa9897", .data = &tfa9897_rev },
        { }