diff --git a/asoc/codecs/swr-dmic.c b/asoc/codecs/swr-dmic.c index c9d69f293a..20ae002d42 100644 --- a/asoc/codecs/swr-dmic.c +++ b/asoc/codecs/swr-dmic.c @@ -30,6 +30,8 @@ #include "wcd938x/wcd938x.h" #include "swr-dmic.h" +#define NUM_ATTEMPTS 5 + static int swr_master_channel_map[] = { ZERO, SWRM_TX1_CH1, @@ -450,6 +452,7 @@ static int swr_dmic_probe(struct swr_device *pdev) const char *swr_dmic_name_prefix_of = NULL; const char *swr_dmic_codec_name_of = NULL; struct snd_soc_component *component = NULL; + int num_retry = NUM_ATTEMPTS; swr_dmic = devm_kzalloc(&pdev->dev, sizeof(struct swr_dmic_priv), GFP_KERNEL); @@ -512,10 +515,15 @@ static int swr_dmic_probe(struct swr_device *pdev) * as per HW requirement. */ usleep_range(5000, 5010); - ret = swr_get_logical_dev_num(pdev, pdev->addr, &swr_devnum); + do { + /* Add delay for soundwire enumeration */ + usleep_range(100, 110); + ret = swr_get_logical_dev_num(pdev, pdev->addr, &swr_devnum); + } while (ret && --num_retry); + if (ret) { - dev_dbg(&pdev->dev, - "%s get devnum %d for dev addr %lx failed\n", + dev_info(&pdev->dev, + "%s get devnum %d for dev addr %llx failed\n", __func__, swr_devnum, pdev->addr); ret = -EPROBE_DEFER; goto err; @@ -670,7 +678,7 @@ done: static int swr_dmic_reset(struct swr_device *pdev) { struct swr_dmic_priv *swr_dmic; - u8 retry = 5; + u8 retry = NUM_ATTEMPTS; u8 devnum = 0; swr_dmic = swr_get_dev_data(pdev); diff --git a/asoc/codecs/swr-haptics.c b/asoc/codecs/swr-haptics.c index 4b22562912..4e1a576930 100644 --- a/asoc/codecs/swr-haptics.c +++ b/asoc/codecs/swr-haptics.c @@ -314,6 +314,7 @@ static int swr_haptics_probe(struct swr_device *sdev) struct swr_haptics_dev *swr_hap; int rc; u8 devnum; + int retry = 5; swr_hap = devm_kzalloc(&sdev->dev, sizeof(struct swr_haptics_dev), GFP_KERNEL); @@ -346,8 +347,12 @@ static int swr_haptics_probe(struct swr_device *sdev) __func__, rc); goto clean; } + do { + /* Add delay for soundwire enumeration */ + usleep_range(500, 510); + rc = swr_get_logical_dev_num(sdev, sdev->addr, &devnum); + } while (rc && --retry); - rc = swr_get_logical_dev_num(sdev, sdev->addr, &devnum); if (rc) { dev_err(swr_hap->dev, "%s: failed to get devnum for swr-haptics, rc=%d\n", __func__, rc); diff --git a/asoc/codecs/wcd938x/wcd938x-slave.c b/asoc/codecs/wcd938x/wcd938x-slave.c index 75cc7839c6..9ea5bac282 100644 --- a/asoc/codecs/wcd938x/wcd938x-slave.c +++ b/asoc/codecs/wcd938x/wcd938x-slave.c @@ -24,6 +24,8 @@ #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 %lx failed\n", + "%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 7df5f488c2..22bea4cb65 100644 --- a/asoc/codecs/wcd938x/wcd938x.c +++ b/asoc/codecs/wcd938x/wcd938x.c @@ -1992,15 +1992,16 @@ 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 %lx 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; }