| From 2bbfc3534d454c2e959107c42e2ee89c8df01dec Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 26 Feb 2021 15:00:48 +0100 |
| Subject: spi: rockchip: avoid objtool warning |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| [ Upstream commit e50989527faeafb79f45a0f7529ba8e01dff1fff ] |
| |
| Building this file with clang leads to a an unreachable code path |
| causing a warning from objtool: |
| |
| drivers/spi/spi-rockchip.o: warning: objtool: rockchip_spi_transfer_one()+0x2e0: sibling call from callable instruction with modified stack frame |
| |
| Change the unreachable() into an error return that can be |
| handled if it ever happens, rather than silently crashing |
| the kernel. |
| |
| Fixes: 65498c6ae241 ("spi: rockchip: support 4bit words") |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Acked-by: Pratyush Yadav <p.yadav@ti.com> |
| Link: https://lore.kernel.org/r/20210226140109.3477093-1-arnd@kernel.org |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/spi/spi-rockchip.c | 13 ++++++++++--- |
| 1 file changed, 10 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c |
| index 09d8e92400eb..0e2c377e9e55 100644 |
| --- a/drivers/spi/spi-rockchip.c |
| +++ b/drivers/spi/spi-rockchip.c |
| @@ -476,7 +476,7 @@ static int rockchip_spi_prepare_dma(struct rockchip_spi *rs, |
| return 1; |
| } |
| |
| -static void rockchip_spi_config(struct rockchip_spi *rs, |
| +static int rockchip_spi_config(struct rockchip_spi *rs, |
| struct spi_device *spi, struct spi_transfer *xfer, |
| bool use_dma, bool slave_mode) |
| { |
| @@ -521,7 +521,9 @@ static void rockchip_spi_config(struct rockchip_spi *rs, |
| * ctlr->bits_per_word_mask, so this shouldn't |
| * happen |
| */ |
| - unreachable(); |
| + dev_err(rs->dev, "unknown bits per word: %d\n", |
| + xfer->bits_per_word); |
| + return -EINVAL; |
| } |
| |
| if (use_dma) { |
| @@ -554,6 +556,8 @@ static void rockchip_spi_config(struct rockchip_spi *rs, |
| */ |
| writel_relaxed(2 * DIV_ROUND_UP(rs->freq, 2 * xfer->speed_hz), |
| rs->regs + ROCKCHIP_SPI_BAUDR); |
| + |
| + return 0; |
| } |
| |
| static size_t rockchip_spi_max_transfer_size(struct spi_device *spi) |
| @@ -577,6 +581,7 @@ static int rockchip_spi_transfer_one( |
| struct spi_transfer *xfer) |
| { |
| struct rockchip_spi *rs = spi_controller_get_devdata(ctlr); |
| + int ret; |
| bool use_dma; |
| |
| WARN_ON(readl_relaxed(rs->regs + ROCKCHIP_SPI_SSIENR) && |
| @@ -596,7 +601,9 @@ static int rockchip_spi_transfer_one( |
| |
| use_dma = ctlr->can_dma ? ctlr->can_dma(ctlr, spi, xfer) : false; |
| |
| - rockchip_spi_config(rs, spi, xfer, use_dma, ctlr->slave); |
| + ret = rockchip_spi_config(rs, spi, xfer, use_dma, ctlr->slave); |
| + if (ret) |
| + return ret; |
| |
| if (use_dma) |
| return rockchip_spi_prepare_dma(rs, ctlr, xfer); |
| -- |
| 2.30.2 |
| |