Skip to content

Commit f9100e8

Browse files
Vishwaroop AjamieNguyenNVIDIA
authored andcommitted
spi: tegra210-quad: Refactor error handling into helper functions
Extract common cleanup code into dedicated helper functions to simplify the code and improve readability. This refactoring includes: - tegra_qspi_reset(): Device reset and interrupt cleanup - tegra_qspi_dma_stop(): DMA termination and disable - tegra_qspi_pio_stop(): PIO mode disable No functional changes. This is purely a code reorganization to prepare for improved timeout handling in subsequent patches. Signed-off-by: Vishwaroop A <va@nvidia.com> Acked-by: Thierry Reding <treding@nvidia.com> Link: https://patch.msgid.link/20251028155703.4151791-3-va@nvidia.com Signed-off-by: Mark Brown <broonie@kernel.org> (cherry picked from commit 6022eac) Signed-off-by: Carol L Soto <csoto@nvidia.com> Acked-by: Matthew R. Ochs <mochs@nvidia.com> Acked-by: Jamie Nguyen <jamien@nvidia.com> Signed-off-by: Jamie Nguyen <jamien@nvidia.com>
1 parent e4ba614 commit f9100e8

File tree

1 file changed

+44
-40
lines changed

1 file changed

+44
-40
lines changed

drivers/spi/spi-tegra210-quad.c

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,17 +1019,22 @@ static void tegra_qspi_dump_regs(struct tegra_qspi *tqspi)
10191019
tegra_qspi_readl(tqspi, QSPI_FIFO_STATUS));
10201020
}
10211021

1022-
static void tegra_qspi_handle_error(struct tegra_qspi *tqspi)
1022+
static void tegra_qspi_reset(struct tegra_qspi *tqspi)
10231023
{
1024-
dev_err(tqspi->dev, "error in transfer, fifo status 0x%08x\n", tqspi->status_reg);
1025-
tegra_qspi_dump_regs(tqspi);
1026-
tegra_qspi_flush_fifos(tqspi, true);
10271024
if (device_reset(tqspi->dev) < 0) {
10281025
dev_warn_once(tqspi->dev, "device reset failed\n");
10291026
tegra_qspi_mask_clear_irq(tqspi);
10301027
}
10311028
}
10321029

1030+
static void tegra_qspi_handle_error(struct tegra_qspi *tqspi)
1031+
{
1032+
dev_err(tqspi->dev, "error in transfer, fifo status 0x%08x\n", tqspi->status_reg);
1033+
tegra_qspi_dump_regs(tqspi);
1034+
tegra_qspi_flush_fifos(tqspi, true);
1035+
tegra_qspi_reset(tqspi);
1036+
}
1037+
10331038
static void tegra_qspi_transfer_end(struct spi_device *spi)
10341039
{
10351040
struct tegra_qspi *tqspi = spi_controller_get_devdata(spi->controller);
@@ -1074,14 +1079,38 @@ static u32 tegra_qspi_addr_config(bool is_ddr, u8 bus_width, u8 len)
10741079
return addr_config;
10751080
}
10761081

1082+
static void tegra_qspi_dma_stop(struct tegra_qspi *tqspi)
1083+
{
1084+
u32 value;
1085+
1086+
if ((tqspi->cur_direction & DATA_DIR_TX) && tqspi->tx_dma_chan)
1087+
dmaengine_terminate_all(tqspi->tx_dma_chan);
1088+
1089+
if ((tqspi->cur_direction & DATA_DIR_RX) && tqspi->rx_dma_chan)
1090+
dmaengine_terminate_all(tqspi->rx_dma_chan);
1091+
1092+
value = tegra_qspi_readl(tqspi, QSPI_DMA_CTL);
1093+
value &= ~QSPI_DMA_EN;
1094+
tegra_qspi_writel(tqspi, value, QSPI_DMA_CTL);
1095+
}
1096+
1097+
static void tegra_qspi_pio_stop(struct tegra_qspi *tqspi)
1098+
{
1099+
u32 value;
1100+
1101+
value = tegra_qspi_readl(tqspi, QSPI_COMMAND1);
1102+
value &= ~QSPI_PIO;
1103+
tegra_qspi_writel(tqspi, value, QSPI_COMMAND1);
1104+
}
1105+
10771106
static int tegra_qspi_combined_seq_xfer(struct tegra_qspi *tqspi,
10781107
struct spi_message *msg)
10791108
{
10801109
bool is_first_msg = true;
10811110
struct spi_transfer *xfer;
10821111
struct spi_device *spi = msg->spi;
10831112
u8 transfer_phase = 0;
1084-
u32 cmd1 = 0, dma_ctl = 0;
1113+
u32 cmd1 = 0;
10851114
int ret = 0;
10861115
u32 address_value = 0;
10871116
u32 cmd_config = 0, addr_config = 0;
@@ -1150,39 +1179,16 @@ static int tegra_qspi_combined_seq_xfer(struct tegra_qspi *tqspi,
11501179
if (WARN_ON_ONCE(ret == 0)) {
11511180
dev_err_ratelimited(tqspi->dev,
11521181
"QSPI Transfer failed with timeout\n");
1153-
if (tqspi->is_curr_dma_xfer) {
1154-
if ((tqspi->cur_direction & DATA_DIR_TX) &&
1155-
tqspi->tx_dma_chan)
1156-
dmaengine_terminate_all(tqspi->tx_dma_chan);
1157-
if ((tqspi->cur_direction & DATA_DIR_RX) &&
1158-
tqspi->rx_dma_chan)
1159-
dmaengine_terminate_all(tqspi->rx_dma_chan);
1160-
}
11611182

11621183
/* Abort transfer by resetting pio/dma bit */
1163-
if (!tqspi->is_curr_dma_xfer) {
1164-
cmd1 = tegra_qspi_readl
1165-
(tqspi,
1166-
QSPI_COMMAND1);
1167-
cmd1 &= ~QSPI_PIO;
1168-
tegra_qspi_writel
1169-
(tqspi, cmd1,
1170-
QSPI_COMMAND1);
1171-
} else {
1172-
dma_ctl = tegra_qspi_readl
1173-
(tqspi,
1174-
QSPI_DMA_CTL);
1175-
dma_ctl &= ~QSPI_DMA_EN;
1176-
tegra_qspi_writel(tqspi, dma_ctl,
1177-
QSPI_DMA_CTL);
1178-
}
1184+
if (tqspi->is_curr_dma_xfer)
1185+
tegra_qspi_dma_stop(tqspi);
1186+
else
1187+
tegra_qspi_pio_stop(tqspi);
11791188

11801189
/* Reset controller if timeout happens */
1181-
if (device_reset(tqspi->dev) < 0) {
1182-
dev_warn_once(tqspi->dev,
1183-
"device reset failed\n");
1184-
tegra_qspi_mask_clear_irq(tqspi);
1185-
}
1190+
tegra_qspi_reset(tqspi);
1191+
11861192
ret = -EIO;
11871193
goto exit;
11881194
}
@@ -1276,12 +1282,10 @@ static int tegra_qspi_non_combined_seq_xfer(struct tegra_qspi *tqspi,
12761282
QSPI_DMA_TIMEOUT);
12771283
if (WARN_ON(ret == 0)) {
12781284
dev_err(tqspi->dev, "transfer timeout\n");
1279-
if (tqspi->is_curr_dma_xfer) {
1280-
if ((tqspi->cur_direction & DATA_DIR_TX) && tqspi->tx_dma_chan)
1281-
dmaengine_terminate_all(tqspi->tx_dma_chan);
1282-
if ((tqspi->cur_direction & DATA_DIR_RX) && tqspi->rx_dma_chan)
1283-
dmaengine_terminate_all(tqspi->rx_dma_chan);
1284-
}
1285+
1286+
if (tqspi->is_curr_dma_xfer)
1287+
tegra_qspi_dma_stop(tqspi);
1288+
12851289
tegra_qspi_handle_error(tqspi);
12861290
ret = -EIO;
12871291
goto complete_xfer;

0 commit comments

Comments
 (0)