mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08:00
spi: xilinx: add force_irq for QSPI mode
Xilinx PG158 page 80 [1] states that master transaction inhibit bit must be set to properly setup the transaction in QSPI mode. Add the force_irq flag to follow this sequence. [1] https://docs.xilinx.com/r/en-US/pg153-axi-quad-spi/Dual/Quad-SPI-Mode-Transactions Signed-off-by: Vadim Fedorenko <vadfed@meta.com> Link: https://lore.kernel.org/r/20230214135928.1253205-1-vadfed@meta.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
e976222544
commit
1dd46599f8
@ -83,7 +83,7 @@ struct xilinx_spi {
|
|||||||
void __iomem *regs; /* virt. address of the control registers */
|
void __iomem *regs; /* virt. address of the control registers */
|
||||||
|
|
||||||
int irq;
|
int irq;
|
||||||
|
bool force_irq; /* force irq to setup master inhibit */
|
||||||
u8 *rx_ptr; /* pointer in the Tx buffer */
|
u8 *rx_ptr; /* pointer in the Tx buffer */
|
||||||
const u8 *tx_ptr; /* pointer in the Rx buffer */
|
const u8 *tx_ptr; /* pointer in the Rx buffer */
|
||||||
u8 bytes_per_word;
|
u8 bytes_per_word;
|
||||||
@ -248,7 +248,8 @@ static int xilinx_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
|
|||||||
xspi->rx_ptr = t->rx_buf;
|
xspi->rx_ptr = t->rx_buf;
|
||||||
remaining_words = t->len / xspi->bytes_per_word;
|
remaining_words = t->len / xspi->bytes_per_word;
|
||||||
|
|
||||||
if (xspi->irq >= 0 && remaining_words > xspi->buffer_size) {
|
if (xspi->irq >= 0 &&
|
||||||
|
(xspi->force_irq || remaining_words > xspi->buffer_size)) {
|
||||||
u32 isr;
|
u32 isr;
|
||||||
use_irq = true;
|
use_irq = true;
|
||||||
/* Inhibit irq to avoid spurious irqs on tx_empty*/
|
/* Inhibit irq to avoid spurious irqs on tx_empty*/
|
||||||
@ -393,6 +394,7 @@ static int xilinx_spi_probe(struct platform_device *pdev)
|
|||||||
struct resource *res;
|
struct resource *res;
|
||||||
int ret, num_cs = 0, bits_per_word;
|
int ret, num_cs = 0, bits_per_word;
|
||||||
struct spi_master *master;
|
struct spi_master *master;
|
||||||
|
bool force_irq = false;
|
||||||
u32 tmp;
|
u32 tmp;
|
||||||
u8 i;
|
u8 i;
|
||||||
|
|
||||||
@ -400,6 +402,7 @@ static int xilinx_spi_probe(struct platform_device *pdev)
|
|||||||
if (pdata) {
|
if (pdata) {
|
||||||
num_cs = pdata->num_chipselect;
|
num_cs = pdata->num_chipselect;
|
||||||
bits_per_word = pdata->bits_per_word;
|
bits_per_word = pdata->bits_per_word;
|
||||||
|
force_irq = pdata->force_irq;
|
||||||
} else {
|
} else {
|
||||||
of_property_read_u32(pdev->dev.of_node, "xlnx,num-ss-bits",
|
of_property_read_u32(pdev->dev.of_node, "xlnx,num-ss-bits",
|
||||||
&num_cs);
|
&num_cs);
|
||||||
@ -477,6 +480,8 @@ static int xilinx_spi_probe(struct platform_device *pdev)
|
|||||||
dev_name(&pdev->dev), xspi);
|
dev_name(&pdev->dev), xspi);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
xspi->force_irq = force_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SPI controller initializations */
|
/* SPI controller initializations */
|
||||||
|
@ -15,6 +15,7 @@ struct xspi_platform_data {
|
|||||||
u8 bits_per_word;
|
u8 bits_per_word;
|
||||||
struct spi_board_info *devices;
|
struct spi_board_info *devices;
|
||||||
u8 num_devices;
|
u8 num_devices;
|
||||||
|
bool force_irq;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __LINUX_SPI_XILINX_SPI_H */
|
#endif /* __LINUX_SPI_XILINX_SPI_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user