lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20181126183942.2631-1-ryans.lee@maximintegrated.com>
Date:   Mon, 26 Nov 2018 18:46:05 +0000
From:   Ryan Lee <RyanS.Lee@...imintegrated.com>
To:     Liam Girdwood <lgirdwood@...il.com>,
        Mark Brown <broonie@...nel.org>,
        Jaroslav Kysela <perex@...ex.cz>,
        Takashi Iwai <tiwai@...e.com>,
        Ryan Lee <RyanS.Lee@...imintegrated.com>,
        Grant Grundler <grundler@...omium.org>,
        Kuninori Morimoto <kuninori.morimoto.gx@...esas.com>,
        Benson Leung <bleung@...omium.org>,
        "alsa-devel@...a-project.org" <alsa-devel@...a-project.org>,
        "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>
Subject: [PATCH] ASoC: max98373: Added max98373_reset for stable amp reset

Signed-off-by: Ryan Lee <ryans.lee@...imintegrated.com>
---
 Changes : Created max98373_reset function to minimize code duplication.
           Changed regmap_write to regmap_update_bits. Other bits except LSB need to be masked.
           Added reset verification step to make sure software reset is completed well. Software reset is done in 10ms in normal case.
           Revision ID is available when the amp is in the idle state which means software reset is completed.
           Software reset will be performed maximum 3 times to avoid amp reset failure. Generally it is done in the first trial.
           sleep time after software reset is increased + 30ms for every retrial. Maximum possible msleep time is 100 ms (initial 10 ms + 30 ms * 3 times).

 sound/soc/codecs/max98373.c | 41 +++++++++++++++++++++++++++++++++++------
 1 file changed, 35 insertions(+), 6 deletions(-)

diff --git a/sound/soc/codecs/max98373.c b/sound/soc/codecs/max98373.c
index a09d013..55af7f02 100644
--- a/sound/soc/codecs/max98373.c
+++ b/sound/soc/codecs/max98373.c
@@ -724,14 +724,45 @@ static struct snd_soc_dai_driver max98373_dai[] = {
 	}
 };
 
+static void max98373_reset(struct max98373_priv *max98373, struct device *dev)
+{
+	int ret, reg, count, delay;
+
+	count = 0;
+	while (true) {
+		/* Software Reset */
+		ret = regmap_update_bits(max98373->regmap,
+			MAX98373_R2000_SW_RESET,
+			MAX98373_SOFT_RESET,
+			MAX98373_SOFT_RESET);
+		if (ret)
+			dev_err(dev, "Reset command failed. (ret:%d)\n", ret);
+
+		delay = 10000 + (count * 30000);
+		usleep_range(delay, delay + 1000);
+
+		/* Software Reset Verification */
+		ret = regmap_read(max98373->regmap,
+			MAX98373_R21FF_REV_ID, &reg);
+		if (!ret) {
+			dev_info(dev, "Reset completed (retry:%d)\n", count);
+			break;
+		}
+
+		if (++count > 3)	{
+			dev_err(dev, "Reset failed. (ret:%d)\n", ret);
+			break;
+		}
+		usleep_range(10000, 11000);
+	}
+}
+
 static int max98373_probe(struct snd_soc_component *component)
 {
 	struct max98373_priv *max98373 = snd_soc_component_get_drvdata(component);
 
 	/* Software Reset */
-	regmap_write(max98373->regmap,
-		MAX98373_R2000_SW_RESET, MAX98373_SOFT_RESET);
-	usleep_range(10000, 11000);
+	max98373_reset(max98373, component->dev);
 
 	/* IV default slot configuration */
 	regmap_write(max98373->regmap,
@@ -818,9 +849,7 @@ static int max98373_resume(struct device *dev)
 {
 	struct max98373_priv *max98373 = dev_get_drvdata(dev);
 
-	regmap_write(max98373->regmap,
-		MAX98373_R2000_SW_RESET, MAX98373_SOFT_RESET);
-	usleep_range(10000, 11000);
+	max98373_reset(max98373, dev);
 	regcache_cache_only(max98373->regmap, false);
 	regcache_sync(max98373->regmap);
 	return 0;
-- 
2.7.4

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ