diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2017-01-16 13:44:54 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-01-17 13:17:20 -0500 |
commit | b03124825b8612bf371e5b4ccc2cd812ed3c2dbb (patch) | |
tree | 971eb9bff2cfc0e04f1ab8cbb9ad3d7f1a3cc2c9 | |
parent | 25014521603f70225c1e6fa232839614f7b4f692 (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.c | 29 |
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 | ||
735 | static 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 | |||
735 | static irqreturn_t ssp_int(int irq, void *dev_id) | 749 | static 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 | } |