Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3840e289 authored by Shashi Kant Maurya's avatar Shashi Kant Maurya
Browse files

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: default avatarShashi Kant Maurya <smaury@codeaurora.org>
parent a29516b5
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
// 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;
	}

	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;
+7 −8
Original line number Diff line number Diff line
// 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) {
	} 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);
			/* retry after 1ms */
			usleep_range(1000, 1010);
		}
	} while (ret && --num_retry);
	swr_dev->dev_num = devnum;
	return 0;
}