aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2017-01-16 13:44:54 -0500
committerMark Brown <broonie@kernel.org>2017-01-17 13:17:20 -0500
commitb03124825b8612bf371e5b4ccc2cd812ed3c2dbb (patch)
tree971eb9bff2cfc0e04f1ab8cbb9ad3d7f1a3cc2c9
parent25014521603f70225c1e6fa232839614f7b4f692 (diff)
spi: pxa2xx: Factor out handle_bad_msg
As suggested by Andy Shevchenko: Decouple this corner cause from the general handling logic in ssp_int. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Reviewed-by: Jarkko Nikula <jarkko.nikula@linux.intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi-pxa2xx.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
index d6239fa718be..8c65bc1823f3 100644
--- a/drivers/spi/spi-pxa2xx.c
+++ b/drivers/spi/spi-pxa2xx.c
@@ -732,6 +732,20 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
732 return IRQ_HANDLED; 732 return IRQ_HANDLED;
733} 733}
734 734
735static void handle_bad_msg(struct driver_data *drv_data)
736{
737 pxa2xx_spi_write(drv_data, SSCR0,
738 pxa2xx_spi_read(drv_data, SSCR0) & ~SSCR0_SSE);
739 pxa2xx_spi_write(drv_data, SSCR1,
740 pxa2xx_spi_read(drv_data, SSCR1) & ~drv_data->int_cr1);
741 if (!pxa25x_ssp_comp(drv_data))
742 pxa2xx_spi_write(drv_data, SSTO, 0);
743 write_SSSR_CS(drv_data, drv_data->clear_sr);
744
745 dev_err(&drv_data->pdev->dev,
746 "bad message state in interrupt handler\n");
747}
748
735static irqreturn_t ssp_int(int irq, void *dev_id) 749static irqreturn_t ssp_int(int irq, void *dev_id)
736{ 750{
737 struct driver_data *drv_data = dev_id; 751 struct driver_data *drv_data = dev_id;
@@ -772,20 +786,7 @@ static irqreturn_t ssp_int(int irq, void *dev_id)
772 return IRQ_NONE; 786 return IRQ_NONE;
773 787
774 if (!drv_data->master->cur_msg) { 788 if (!drv_data->master->cur_msg) {
775 789 handle_bad_msg(drv_data);
776 pxa2xx_spi_write(drv_data, SSCR0,
777 pxa2xx_spi_read(drv_data, SSCR0)
778 & ~SSCR0_SSE);
779 pxa2xx_spi_write(drv_data, SSCR1,
780 pxa2xx_spi_read(drv_data, SSCR1)
781 & ~drv_data->int_cr1);
782 if (!pxa25x_ssp_comp(drv_data))
783 pxa2xx_spi_write(drv_data, SSTO, 0);
784 write_SSSR_CS(drv_data, drv_data->clear_sr);
785
786 dev_err(&drv_data->pdev->dev,
787 "bad message state in interrupt handler\n");
788
789 /* Never fail */ 790 /* Never fail */
790 return IRQ_HANDLED; 791 return IRQ_HANDLED;
791 } 792 }