On Fri, Apr 24, 2020 at 06:42:30PM +0800, Dilip Kota wrote:While preparing the patches, i got puzzled to go with separate patches (for threaded interrupts, unified interrupt handler and fixing the register offset) or as a single patch!!.
Synchronize tx, rx and error interrupts by registering to theThis sounds like at least three different changes mixed together in one
same interrupt handler. Interrupt handler will recognize and process
the appropriate interrupt on the basis of interrupt status register.
Also, establish synchronization between the interrupt handler and
transfer operation by taking the locks and registering the interrupt
handler as thread IRQ which avoids the bottom half.
Fixes the wrongly populated interrupt register offsets too.
commit, it makes it quite hard to tell what's going on. If nothing else
the conversion from a workqueue to threaded interrupts should probably
be split out from merging the interrupts.
lantiq_ssc_err_interrupt() getting called, only if LTQ_SPI_IRNEN_E is set in the interrupt status register.
-static irqreturn_t lantiq_ssc_err_interrupt(int irq, void *data)Why drop this?
+static irqreturn_t lantiq_ssc_err_interrupt(struct lantiq_ssc_spi *spi)
{
- struct lantiq_ssc_spi *spi = data;
u32 stat = lantiq_ssc_readl(spi, LTQ_SPI_STAT);
- if (!(stat & LTQ_SPI_STAT_ERRORS))
- return IRQ_NONE;
-
- err = devm_request_irq(dev, rx_irq, lantiq_ssc_xmit_interrupt,It's not clear to me that it's a benefit to combine all the interrupts
- 0, LTQ_SPI_RX_IRQ_NAME, spi);
+ err = devm_request_threaded_irq(dev, rx_irq, NULL, lantiq_ssc_isr,
+ IRQF_ONESHOT, LTQ_SPI_RX_IRQ_NAME, spi);
if (err)
goto err_master_put;
- err = devm_request_irq(dev, tx_irq, lantiq_ssc_xmit_interrupt,
- 0, LTQ_SPI_TX_IRQ_NAME, spi);
+ err = devm_request_threaded_irq(dev, tx_irq, NULL, lantiq_ssc_isr,
+ IRQF_ONESHOT, LTQ_SPI_TX_IRQ_NAME, spi);
if (err)
goto err_master_put;
- err = devm_request_irq(dev, err_irq, lantiq_ssc_err_interrupt,
- 0, LTQ_SPI_ERR_IRQ_NAME, spi);
+ err = devm_request_threaded_irq(dev, err_irq, NULL, lantiq_ssc_isr,
+ IRQF_ONESHOT, LTQ_SPI_ERR_IRQ_NAME, spi);
unconditionally - obviously where they're shared we need to but could
that be accomplished with IRQF_SHARED and even if it can't it seems like
something conditional would be better.