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

Commit 75b82e23 authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Mark Brown
Browse files

spi: sh-msiof: Improve transfer error handling



  - Add a timeout when waiting for the transfer complete interrupt,
  - If sh_msiof_spi_stop() fails, there's no need to clear IER, as the
    interrupt handler has already done that,
  - Propagate transfer failures in sh_msiof_transfer_one().

Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 76c02e71
Loading
Loading
Loading
Loading
+13 −5
Original line number Original line Diff line number Diff line
@@ -575,11 +575,16 @@ static int sh_msiof_spi_txrx_once(struct sh_msiof_spi_priv *p,
	ret = sh_msiof_spi_start(p, rx_buf);
	ret = sh_msiof_spi_start(p, rx_buf);
	if (ret) {
	if (ret) {
		dev_err(&p->pdev->dev, "failed to start hardware\n");
		dev_err(&p->pdev->dev, "failed to start hardware\n");
		goto err;
		goto stop_ier;
	}
	}


	/* wait for tx fifo to be emptied / rx fifo to be filled */
	/* wait for tx fifo to be emptied / rx fifo to be filled */
	wait_for_completion(&p->done);
	ret = wait_for_completion_timeout(&p->done, HZ);
	if (!ret) {
		dev_err(&p->pdev->dev, "PIO timeout\n");
		ret = -ETIMEDOUT;
		goto stop_reset;
	}


	/* read rx fifo */
	/* read rx fifo */
	if (rx_buf)
	if (rx_buf)
@@ -591,12 +596,15 @@ static int sh_msiof_spi_txrx_once(struct sh_msiof_spi_priv *p,
	ret = sh_msiof_spi_stop(p, rx_buf);
	ret = sh_msiof_spi_stop(p, rx_buf);
	if (ret) {
	if (ret) {
		dev_err(&p->pdev->dev, "failed to shut down hardware\n");
		dev_err(&p->pdev->dev, "failed to shut down hardware\n");
		goto err;
		return ret;
	}
	}


	return words;
	return words;


 err:
stop_reset:
	sh_msiof_reset_str(p);
	sh_msiof_spi_stop(p, rx_buf);
stop_ier:
	sh_msiof_write(p, IER, 0);
	sh_msiof_write(p, IER, 0);
	return ret;
	return ret;
}
}
@@ -679,7 +687,7 @@ static int sh_msiof_transfer_one(struct spi_master *master,
					   rx_buf,
					   rx_buf,
					   words, bits);
					   words, bits);
		if (n < 0)
		if (n < 0)
			break;
			return n;


		bytes_done += n * bytes_per_word;
		bytes_done += n * bytes_per_word;
		words -= n;
		words -= n;