summaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/rt5682-sdw.c
diff options
context:
space:
mode:
authorShuming Fan <shumingf@realtek.com>2021-01-11 10:27:40 +0100
committerMark Brown <broonie@kernel.org>2021-01-11 15:03:51 +0100
commit867f8d18df4f5ccd6c2daf4441a6adeca0b9725b (patch)
tree3b2308432c602c000c6ee12942b6ccd38f152573 /sound/soc/codecs/rt5682-sdw.c
parentASoC: es8328: Remove redundant null check before clk_disable_unprepare (diff)
downloadlinux-867f8d18df4f5ccd6c2daf4441a6adeca0b9725b.tar.xz
linux-867f8d18df4f5ccd6c2daf4441a6adeca0b9725b.zip
ASoC: rt5682: fix getting the wrong device id when the suspend_stress_test
This patch will be the workaround to fix getting the wrong device ID on the rare chance. It seems like something unstable when the system resumes. e.g. the bus clock This patch tries to read the device ID to check several times. After the test, the driver will get the correct device ID the second time. Signed-off-by: Shuming Fan <shumingf@realtek.com> Link: https://lore.kernel.org/r/20210111092740.9128-1-shumingf@realtek.com Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound/soc/codecs/rt5682-sdw.c')
-rw-r--r--sound/soc/codecs/rt5682-sdw.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/sound/soc/codecs/rt5682-sdw.c b/sound/soc/codecs/rt5682-sdw.c
index 4d707e854875..69f046bba67a 100644
--- a/sound/soc/codecs/rt5682-sdw.c
+++ b/sound/soc/codecs/rt5682-sdw.c
@@ -375,18 +375,12 @@ static int rt5682_sdw_init(struct device *dev, struct regmap *regmap,
static int rt5682_io_init(struct device *dev, struct sdw_slave *slave)
{
struct rt5682_priv *rt5682 = dev_get_drvdata(dev);
- int ret = 0;
+ int ret = 0, loop = 10;
unsigned int val;
if (rt5682->hw_init)
return 0;
- regmap_read(rt5682->regmap, RT5682_DEVICE_ID, &val);
- if (val != DEVICE_ID) {
- dev_err(dev, "Device with ID register %x is not rt5682\n", val);
- return -ENODEV;
- }
-
/*
* PM runtime is only enabled when a Slave reports as Attached
*/
@@ -406,6 +400,19 @@ static int rt5682_io_init(struct device *dev, struct sdw_slave *slave)
pm_runtime_get_noresume(&slave->dev);
+ while (loop > 0) {
+ regmap_read(rt5682->regmap, RT5682_DEVICE_ID, &val);
+ if (val == DEVICE_ID)
+ break;
+ dev_warn(dev, "Device with ID register %x is not rt5682\n", val);
+ usleep_range(30000, 30005);
+ loop--;
+ }
+ if (val != DEVICE_ID) {
+ dev_err(dev, "Device with ID register %x is not rt5682\n", val);
+ return -ENODEV;
+ }
+
if (rt5682->first_hw_init) {
regcache_cache_only(rt5682->regmap, false);
regcache_cache_bypass(rt5682->regmap, true);