summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeo Chang <YLCHANG2@nuvoton.com>2026-04-08 13:26:39 +0800
committerMark Brown <broonie@kernel.org>2026-04-08 13:01:06 +0100
commitf4c90fb761f696ebbcf1e8fb7f83d83cbb30cb0c (patch)
tree695677571c715117e86e8c81a7a0ae97bc622323
parentc5408d818316061d6063c11a4f47f1ba25a3a708 (diff)
ASoC: nau8325: Add software reset during probe
Currently, the driver only performs a hardware reset during the I2C probe sequence. To ensure all internal states of the codec are properly cleared without affecting the configuration registers, a software reset is also required. According to the hardware specification, writing to the Software Reset register (R01) twice will reset all internal states safely. This patch adds the nau8325_software_reset() function, executes it right after the hardware reset in the probe function, and marks the R01 register as writeable in the regmap configuration. Signed-off-by: Neo Chang <YLCHANG2@nuvoton.com> Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com> Link: https://patch.msgid.link/20260408052639.187149-1-YLCHANG2@nuvoton.com Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/codecs/nau8325.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/sound/soc/codecs/nau8325.c b/sound/soc/codecs/nau8325.c
index e651263a9812..58ef5c493835 100644
--- a/sound/soc/codecs/nau8325.c
+++ b/sound/soc/codecs/nau8325.c
@@ -142,7 +142,7 @@ static bool nau8325_readable_reg(struct device *dev, unsigned int reg)
static bool nau8325_writeable_reg(struct device *dev, unsigned int reg)
{
switch (reg) {
- case NAU8325_R00_HARDWARE_RST:
+ case NAU8325_R00_HARDWARE_RST ... NAU8325_R01_SOFTWARE_RST:
case NAU8325_R03_CLK_CTRL ... NAU8325_R06_INT_CLR_STATUS:
case NAU8325_R09_IRQOUT ... NAU8325_R13_DAC_VOLUME:
case NAU8325_R29_DAC_CTRL1 ... NAU8325_R2A_DAC_CTRL2:
@@ -670,6 +670,12 @@ static void nau8325_reset_chip(struct regmap *regmap)
regmap_write(regmap, NAU8325_R00_HARDWARE_RST, 0x0000);
}
+static void nau8325_software_reset(struct regmap *regmap)
+{
+ regmap_write(regmap, NAU8325_R01_SOFTWARE_RST, 0x0000);
+ regmap_write(regmap, NAU8325_R01_SOFTWARE_RST, 0x0000);
+}
+
static void nau8325_init_regs(struct nau8325 *nau8325)
{
struct regmap *regmap = nau8325->regmap;
@@ -856,6 +862,7 @@ static int nau8325_i2c_probe(struct i2c_client *i2c)
nau8325_print_device_properties(nau8325);
nau8325_reset_chip(nau8325->regmap);
+ nau8325_software_reset(nau8325->regmap);
ret = regmap_read(nau8325->regmap, NAU8325_R02_DEVICE_ID, &value);
if (ret) {
dev_dbg(dev, "Failed to read device id (%d)", ret);