Unverified Commit 06afec5c authored by Simon Trimmer's avatar Simon Trimmer Committed by Mark Brown
Browse files

ASoC: cs35l56: Waiting for firmware to boot must be tolerant of I/O errors



Ignore failure to read from the cs35l56 when polling as the device will
NAK i2c accesses until it has booted and this would terminate the poll
of regmap_read_poll_timeout().

Fixes: 8a731fd3 ("ASoC: cs35l56: Move utility functions to shared file")
Signed-off-by: default avatarSimon Trimmer <simont@opensource.cirrus.com>
Signed-off-by: default avatarRichard Fitzgerald <rf@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20230829160433.2647889-1-rf@opensource.cirrus.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent b5f3cec3
Loading
Loading
Loading
Loading
+15 −14
Original line number Diff line number Diff line
@@ -243,26 +243,27 @@ int cs35l56_wait_for_firmware_boot(struct cs35l56_base *cs35l56_base)
{
	unsigned int reg;
	unsigned int val;
	int ret;
	int read_ret, poll_ret;

	if (cs35l56_base->rev < CS35L56_REVID_B0)
		reg = CS35L56_DSP1_HALO_STATE_A1;
	else
		reg = CS35L56_DSP1_HALO_STATE;

	ret = regmap_read_poll_timeout(cs35l56_base->regmap, reg,
				       val,
	/*
	 * This can't be a regmap_read_poll_timeout() because cs35l56 will NAK
	 * I2C until it has booted which would terminate the poll
	 */
	poll_ret = read_poll_timeout(regmap_read, read_ret,
				     (val < 0xFFFF) && (val >= CS35L56_HALO_STATE_BOOT_DONE),
				     CS35L56_HALO_STATE_POLL_US,
				       CS35L56_HALO_STATE_TIMEOUT_US);

	if ((ret < 0) && (ret != -ETIMEDOUT)) {
		dev_err(cs35l56_base->dev, "Failed to read HALO_STATE: %d\n", ret);
		return ret;
	}
				     CS35L56_HALO_STATE_TIMEOUT_US,
				     false,
				     cs35l56_base->regmap, reg, &val);

	if ((ret == -ETIMEDOUT) || (val != CS35L56_HALO_STATE_BOOT_DONE)) {
		dev_err(cs35l56_base->dev, "Firmware boot fail: HALO_STATE=%#x\n", val);
	if (poll_ret) {
		dev_err(cs35l56_base->dev, "Firmware boot timed out(%d): HALO_STATE=%#x\n",
			read_ret, val);
		return -EIO;
	}