lkml.org 
[lkml]   [2015]   [Sep]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.1 086/102] spi/spi-xilinx: Fix spurious IRQ ACK on irq mode
    Date
    4.1-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>

    commit 74346841e6f5df5f7b83d5904435d273c507dba6 upstream.

    The ACK of an inexistent IRQ can trigger an spurious IRQ that breaks the
    txrx logic. This has been observed on axi_quad_spi:3.2 core.

    This patch only ACKs IRQs that have not been Acknowledge jet.

    Reported-by: Edward Kigwana <ekigwana@scires.com>
    Tested-by: Edward Kigwana <ekigwana@scires.com>
    Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/spi/spi-xilinx.c | 16 ++++++++++------
    1 file changed, 10 insertions(+), 6 deletions(-)

    --- a/drivers/spi/spi-xilinx.c
    +++ b/drivers/spi/spi-xilinx.c
    @@ -249,19 +249,23 @@ static int xilinx_spi_txrx_bufs(struct s
    xspi->tx_ptr = t->tx_buf;
    xspi->rx_ptr = t->rx_buf;
    remaining_words = t->len / xspi->bytes_per_word;
    - reinit_completion(&xspi->done);

    if (xspi->irq >= 0 && remaining_words > xspi->buffer_size) {
    + u32 isr;
    use_irq = true;
    - xspi->write_fn(XSPI_INTR_TX_EMPTY,
    - xspi->regs + XIPIF_V123B_IISR_OFFSET);
    - /* Enable the global IPIF interrupt */
    - xspi->write_fn(XIPIF_V123B_GINTR_ENABLE,
    - xspi->regs + XIPIF_V123B_DGIER_OFFSET);
    /* Inhibit irq to avoid spurious irqs on tx_empty*/
    cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET);
    xspi->write_fn(cr | XSPI_CR_TRANS_INHIBIT,
    xspi->regs + XSPI_CR_OFFSET);
    + /* ACK old irqs (if any) */
    + isr = xspi->read_fn(xspi->regs + XIPIF_V123B_IISR_OFFSET);
    + if (isr)
    + xspi->write_fn(isr,
    + xspi->regs + XIPIF_V123B_IISR_OFFSET);
    + /* Enable the global IPIF interrupt */
    + xspi->write_fn(XIPIF_V123B_GINTR_ENABLE,
    + xspi->regs + XIPIF_V123B_DGIER_OFFSET);
    + reinit_completion(&xspi->done);
    }

    while (remaining_words) {



    \
     
     \ /
      Last update: 2015-09-19 20:41    [W:4.135 / U:0.236 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site