| From c609e88efb0aa91efda4f412722e93aa16cb62ca Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 11 Jan 2021 17:27:40 +0800 |
| Subject: ASoC: rt5682: fix getting the wrong device id when the |
| suspend_stress_test |
| |
| From: Shuming Fan <shumingf@realtek.com> |
| |
| [ Upstream commit 867f8d18df4f5ccd6c2daf4441a6adeca0b9725b ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/soc/codecs/rt5682-sdw.c | 21 ++++++++++++++------- |
| 1 file changed, 14 insertions(+), 7 deletions(-) |
| |
| diff --git a/sound/soc/codecs/rt5682-sdw.c b/sound/soc/codecs/rt5682-sdw.c |
| index 848b79b5a130..5f8867e00923 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); |
| -- |
| 2.30.2 |
| |