Merge tag 'spi-fix-v6.19-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi

Pull spi fixes from Mark Brown:
"One final batch of fixes for the Tegra SPI drivers, the main one is a
batch of fixes for races with the interrupts in the Tegra210 QSPI
driver that Breno has been working on for a while"

* tag 'spi-fix-v6.19-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
spi: tegra114: Preserve SPI mode bits in def_command1_reg
spi: tegra: Fix a memory leak in tegra_slink_probe()
spi: tegra210-quad: Protect curr_xfer check in IRQ handler
spi: tegra210-quad: Protect curr_xfer clearing in tegra_qspi_non_combined_seq_xfer
spi: tegra210-quad: Protect curr_xfer in tegra_qspi_combined_seq_xfer
spi: tegra210-quad: Protect curr_xfer assignment in tegra_qspi_setup_transfer_one
spi: tegra210-quad: Move curr_xfer read inside spinlock
spi: tegra210-quad: Return IRQ_HANDLED when timeout already processed transfer

+59 -6
+3
drivers/spi/spi-tegra114.c
··· 978 978 if (spi_get_csgpiod(spi, 0)) 979 979 gpiod_set_value(spi_get_csgpiod(spi, 0), 0); 980 980 981 + /* Update default register to include CS polarity and SPI mode */ 981 982 val = tspi->def_command1_reg; 982 983 if (spi->mode & SPI_CS_HIGH) 983 984 val &= ~SPI_CS_POL_INACTIVE(spi_get_chipselect(spi, 0)); 984 985 else 985 986 val |= SPI_CS_POL_INACTIVE(spi_get_chipselect(spi, 0)); 987 + val &= ~SPI_CONTROL_MODE_MASK; 988 + val |= SPI_MODE_SEL(spi->mode & 0x3); 986 989 tspi->def_command1_reg = val; 987 990 tegra_spi_writel(tspi, tspi->def_command1_reg, SPI_COMMAND1); 988 991 spin_unlock_irqrestore(&tspi->lock, flags);
+4 -2
drivers/spi/spi-tegra20-slink.c
··· 1086 1086 reset_control_deassert(tspi->rst); 1087 1087 1088 1088 spi_irq = platform_get_irq(pdev, 0); 1089 - if (spi_irq < 0) 1090 - return spi_irq; 1089 + if (spi_irq < 0) { 1090 + ret = spi_irq; 1091 + goto exit_pm_put; 1092 + } 1091 1093 tspi->irq = spi_irq; 1092 1094 ret = request_threaded_irq(tspi->irq, tegra_slink_isr, 1093 1095 tegra_slink_isr_thread, IRQF_ONESHOT,
+52 -4
drivers/spi/spi-tegra210-quad.c
··· 839 839 u32 command1, command2, speed = t->speed_hz; 840 840 u8 bits_per_word = t->bits_per_word; 841 841 u32 tx_tap = 0, rx_tap = 0; 842 + unsigned long flags; 842 843 int req_mode; 843 844 844 845 if (!has_acpi_companion(tqspi->dev) && speed != tqspi->cur_speed) { ··· 847 846 tqspi->cur_speed = speed; 848 847 } 849 848 849 + spin_lock_irqsave(&tqspi->lock, flags); 850 850 tqspi->cur_pos = 0; 851 851 tqspi->cur_rx_pos = 0; 852 852 tqspi->cur_tx_pos = 0; 853 853 tqspi->curr_xfer = t; 854 + spin_unlock_irqrestore(&tqspi->lock, flags); 854 855 855 856 if (is_first_of_msg) { 856 857 tegra_qspi_mask_clear_irq(tqspi); ··· 1161 1158 u32 address_value = 0; 1162 1159 u32 cmd_config = 0, addr_config = 0; 1163 1160 u8 cmd_value = 0, val = 0; 1161 + unsigned long flags; 1164 1162 1165 1163 /* Enable Combined sequence mode */ 1166 1164 val = tegra_qspi_readl(tqspi, QSPI_GLOBAL_CONFIG); ··· 1265 1261 tegra_qspi_transfer_end(spi); 1266 1262 spi_transfer_delay_exec(xfer); 1267 1263 } 1264 + spin_lock_irqsave(&tqspi->lock, flags); 1268 1265 tqspi->curr_xfer = NULL; 1266 + spin_unlock_irqrestore(&tqspi->lock, flags); 1269 1267 transfer_phase++; 1270 1268 } 1271 1269 ret = 0; 1272 1270 1273 1271 exit: 1272 + spin_lock_irqsave(&tqspi->lock, flags); 1274 1273 tqspi->curr_xfer = NULL; 1274 + spin_unlock_irqrestore(&tqspi->lock, flags); 1275 1275 msg->status = ret; 1276 1276 1277 1277 return ret; ··· 1288 1280 struct spi_transfer *transfer; 1289 1281 bool is_first_msg = true; 1290 1282 int ret = 0, val = 0; 1283 + unsigned long flags; 1291 1284 1292 1285 msg->status = 0; 1293 1286 msg->actual_length = 0; ··· 1369 1360 msg->actual_length += xfer->len + dummy_bytes; 1370 1361 1371 1362 complete_xfer: 1363 + spin_lock_irqsave(&tqspi->lock, flags); 1372 1364 tqspi->curr_xfer = NULL; 1365 + spin_unlock_irqrestore(&tqspi->lock, flags); 1373 1366 1374 1367 if (ret < 0) { 1375 1368 tegra_qspi_transfer_end(spi); ··· 1451 1440 1452 1441 static irqreturn_t handle_cpu_based_xfer(struct tegra_qspi *tqspi) 1453 1442 { 1454 - struct spi_transfer *t = tqspi->curr_xfer; 1443 + struct spi_transfer *t; 1455 1444 unsigned long flags; 1456 1445 1457 1446 spin_lock_irqsave(&tqspi->lock, flags); 1447 + t = tqspi->curr_xfer; 1448 + 1449 + if (!t) { 1450 + spin_unlock_irqrestore(&tqspi->lock, flags); 1451 + return IRQ_HANDLED; 1452 + } 1458 1453 1459 1454 if (tqspi->tx_status || tqspi->rx_status) { 1460 1455 tegra_qspi_handle_error(tqspi); ··· 1491 1474 1492 1475 static irqreturn_t handle_dma_based_xfer(struct tegra_qspi *tqspi) 1493 1476 { 1494 - struct spi_transfer *t = tqspi->curr_xfer; 1477 + struct spi_transfer *t; 1495 1478 unsigned int total_fifo_words; 1496 1479 unsigned long flags; 1497 1480 long wait_status; ··· 1530 1513 } 1531 1514 1532 1515 spin_lock_irqsave(&tqspi->lock, flags); 1516 + t = tqspi->curr_xfer; 1517 + 1518 + if (!t) { 1519 + spin_unlock_irqrestore(&tqspi->lock, flags); 1520 + return IRQ_HANDLED; 1521 + } 1533 1522 1534 1523 if (num_errors) { 1535 1524 tegra_qspi_dma_unmap_xfer(tqspi, t); ··· 1575 1552 static irqreturn_t tegra_qspi_isr_thread(int irq, void *context_data) 1576 1553 { 1577 1554 struct tegra_qspi *tqspi = context_data; 1555 + unsigned long flags; 1556 + u32 status; 1557 + 1558 + /* 1559 + * Read transfer status to check if interrupt was triggered by transfer 1560 + * completion 1561 + */ 1562 + status = tegra_qspi_readl(tqspi, QSPI_TRANS_STATUS); 1578 1563 1579 1564 /* 1580 1565 * Occasionally the IRQ thread takes a long time to wake up (usually 1581 1566 * when the CPU that it's running on is excessively busy) and we have 1582 1567 * already reached the timeout before and cleaned up the timed out 1583 1568 * transfer. Avoid any processing in that case and bail out early. 1569 + * 1570 + * If no transfer is in progress, check if this was a real interrupt 1571 + * that the timeout handler already processed, or a spurious one. 1584 1572 */ 1585 - if (!tqspi->curr_xfer) 1586 - return IRQ_NONE; 1573 + spin_lock_irqsave(&tqspi->lock, flags); 1574 + if (!tqspi->curr_xfer) { 1575 + spin_unlock_irqrestore(&tqspi->lock, flags); 1576 + /* Spurious interrupt - transfer not ready */ 1577 + if (!(status & QSPI_RDY)) 1578 + return IRQ_NONE; 1579 + /* Real interrupt, already handled by timeout path */ 1580 + return IRQ_HANDLED; 1581 + } 1587 1582 1588 1583 tqspi->status_reg = tegra_qspi_readl(tqspi, QSPI_FIFO_STATUS); 1589 1584 ··· 1612 1571 tqspi->rx_status = tqspi->status_reg & (QSPI_RX_FIFO_OVF | QSPI_RX_FIFO_UNF); 1613 1572 1614 1573 tegra_qspi_mask_clear_irq(tqspi); 1574 + spin_unlock_irqrestore(&tqspi->lock, flags); 1615 1575 1576 + /* 1577 + * Lock is released here but handlers safely re-check curr_xfer under 1578 + * lock before dereferencing. 1579 + * DMA handler also needs to sleep in wait_for_completion_*(), which 1580 + * cannot be done while holding spinlock. 1581 + */ 1616 1582 if (!tqspi->is_curr_dma_xfer) 1617 1583 return handle_cpu_based_xfer(tqspi); 1618 1584