diff options
author | Shashi Kant Maurya <smaury@codeaurora.org> | 2021-03-25 14:38:29 +0530 |
---|---|---|
committer | Shashi Kant Maurya <smaury@codeaurora.org> | 2021-07-01 14:10:47 +0530 |
commit | 3840e289c3650efa91a824ffd300ce0a99e62b56 (patch) | |
tree | 0e3139337e639424d6c80dba8dcbecda05a0e613 | |
parent | a29516b5faaaa52101d75df2da0097c68f2376f5 (diff) | |
download | msm-extra-3840e289c3650efa91a824ffd300ce0a99e62b56.tar.gz |
asoc: codecs: retry for soundwire slave enumeration
Retry for soundwire slave enumeration during bootup before
EPROBE_DEFER to avoid soundcard enumeration failures.
Change-Id: I083ec76fc84a2b367f93a2dc166a1419a75ff8b4
Signed-off-by: Shashi Kant Maurya <smaury@codeaurora.org>
-rw-r--r-- | asoc/codecs/wcd938x/wcd938x-slave.c | 13 | ||||
-rw-r--r-- | asoc/codecs/wcd938x/wcd938x.c | 15 |
2 files changed, 18 insertions, 10 deletions
diff --git a/asoc/codecs/wcd938x/wcd938x-slave.c b/asoc/codecs/wcd938x/wcd938x-slave.c index 1f83b4ce..13f159c0 100644 --- a/asoc/codecs/wcd938x/wcd938x-slave.c +++ b/asoc/codecs/wcd938x/wcd938x-slave.c @@ -1,9 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. */ #include <linux/module.h> +#include <linux/delay.h> #include <linux/slab.h> #include <linux/platform_device.h> #include <linux/device.h> @@ -24,6 +25,7 @@ #define SWR_SLV_MAX_DEVICES 2 #endif /* CONFIG_DEBUG_FS */ +#define SWR_MAX_RETRY 5 struct wcd938x_slave_priv { struct swr_device *swr_slave; #ifdef CONFIG_DEBUG_FS @@ -278,17 +280,24 @@ static int wcd938x_slave_bind(struct device *dev, int ret = 0; uint8_t devnum = 0; struct swr_device *pdev = to_swr_device(dev); + int retry = SWR_MAX_RETRY; if (!pdev) { pr_err("%s: invalid swr device handle\n", __func__); return -EINVAL; } - ret = swr_get_logical_dev_num(pdev, pdev->addr, &devnum); + do { + /* Add delay for soundwire enumeration */ + usleep_range(100, 110); + ret = swr_get_logical_dev_num(pdev, pdev->addr, &devnum); + } while (ret && --retry); + if (ret) { dev_dbg(&pdev->dev, "%s get devnum %d for dev addr %llx failed\n", __func__, devnum, pdev->addr); + ret = -EPROBE_DEFER; return ret; } pdev->dev_num = devnum; diff --git a/asoc/codecs/wcd938x/wcd938x.c b/asoc/codecs/wcd938x/wcd938x.c index 9207bbd2..0b46a7e2 100644 --- a/asoc/codecs/wcd938x/wcd938x.c +++ b/asoc/codecs/wcd938x/wcd938x.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. */ #include <linux/module.h> @@ -1976,15 +1976,14 @@ static int wcd938x_get_logical_addr(struct swr_device *swr_dev) int num_retry = NUM_ATTEMPTS; do { + /* retry after 1ms */ + usleep_range(1000, 1010); ret = swr_get_logical_dev_num(swr_dev, swr_dev->addr, &devnum); - if (ret) { - dev_err(&swr_dev->dev, - "%s get devnum %d for dev addr %llx failed\n", - __func__, devnum, swr_dev->addr); - /* retry after 1ms */ - usleep_range(1000, 1010); - } } while (ret && --num_retry); + if (ret) + dev_err(&swr_dev->dev, + "%s get devnum %d for dev addr %llx failed\n", + __func__, devnum, swr_dev->addr); swr_dev->dev_num = devnum; return 0; } |