Unverified Commit ef6c3209 authored by Alexander Martinz's avatar Alexander Martinz Committed by Mark Brown
Browse files

ASoC: codecs: tfa989x: Add support for tfa9890

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: default avatarAlexander Martinz <amartinz@shiftphones.com>
Reviewed-by: default avatarStephan Gerhold <stephan@gerhold.net>
Link: https://lore.kernel.org/r/20220602164504.261361-1-amartinz@shiftphones.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent aa7407f8
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -40,12 +40,14 @@
#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 },
	{ }