0008-spi-pxa2xx-Prepare-for-edge-triggered-interrupts.patch 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. From 7f9a454ea467bb1ee31cf77ce1c7e0aa1950d6d1 Mon Sep 17 00:00:00 2001
  2. From: Jan Kiszka <jan.kiszka@siemens.com>
  3. Date: Sat, 21 Jan 2017 10:06:38 +0100
  4. Subject: [PATCH 08/27] spi: pxa2xx: Prepare for edge-triggered interrupts
  5. Commit e51e9b93049f624c179bab2c651995bca22b5bb7 upstream.
  6. When using the a device with edge-triggered interrupts, such as MSIs,
  7. the interrupt handler has to ensure that there is a point in time during
  8. its execution where all interrupts sources are silent so that a new
  9. event can trigger a new interrupt again.
  10. This is achieved here by disabling all interrupt sources for a moment
  11. before processing them according to the status register. If a new
  12. interrupt should have arrived after we read the status, it will now
  13. re-trigger the interrupt, even in edge mode.
  14. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
  15. Acked-by: Robert Jarzmik <robert.jarzmik@free.fr>
  16. Signed-off-by: Mark Brown <broonie@kernel.org>
  17. ---
  18. drivers/spi/spi-pxa2xx.c | 3 +++
  19. 1 file changed, 3 insertions(+)
  20. diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
  21. index 904439fa6a00..b52faa295698 100644
  22. --- a/drivers/spi/spi-pxa2xx.c
  23. +++ b/drivers/spi/spi-pxa2xx.c
  24. @@ -730,6 +730,9 @@ static irqreturn_t ssp_int(int irq, void *dev_id)
  25. if (!(status & mask))
  26. return IRQ_NONE;
  27. + pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg & ~drv_data->int_cr1);
  28. + pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg);
  29. +
  30. if (!drv_data->cur_msg) {
  31. handle_bad_msg(drv_data);
  32. /* Never fail */
  33. --
  34. 2.12.0