]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
ASoC: tlv320aic3x: Fix class-D initialization for tlv320aic3007
authorPrimoz Fiser <primoz.fiser@norik.com>
Thu, 25 Sep 2025 08:59:29 +0000 (10:59 +0200)
committerMark Brown <broonie@kernel.org>
Fri, 26 Sep 2025 00:34:43 +0000 (01:34 +0100)
commit733a763dd8b3ac2858dd238a91bb3a2fdff4739e
treea3b903bb32bc232b99ab3dff19b4b48dbca85cac
parentba0c67d3c4b0ce5ec5e6de35e6433b22eecb1f6a
ASoC: tlv320aic3x: Fix class-D initialization for tlv320aic3007

The problem of having class-D initialization sequence in probe using
regmap_register_patch() is that it will do hardware register writes
immediately after being called as it bypasses regcache. Afterwards, in
aic3x_init() we also perform codec soft reset, rendering class-D init
sequence pointless. This issue is even more apparent when using reset
GPIO line, since in that case class-D amplifier initialization fails
with "Failed to init class D: -5" message as codec is already held in
reset state after requesting the reset GPIO and hence hardware I/O
fails with -EIO errno.

Thus move class-D amplifier initialization sequence from probe function
to aic3x_set_power() just before the usual regcache sync. Use bypassed
regmap_multi_reg_write_bypassed() function to make sure, class-D init
sequence is performed in proper order as described in the datasheet.

Signed-off-by: Primoz Fiser <primoz.fiser@norik.com>
Link: https://patch.msgid.link/20250925085929.2581749-1-primoz.fiser@norik.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/tlv320aic3x.c