aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/serial/sh-sci.c
diff options
context:
space:
mode:
authorMichael Trimarchi <trimarchimichael@yahoo.it>2008-10-31 03:10:23 -0400
committerPaul Mundt <lethal@linux-sh.org>2008-10-31 03:10:23 -0400
commita8884e3415c29c58a5875d54c109c4a7fcaa6fb4 (patch)
treedecd6b4aa58b398b6540086342724b5fad546bfb /drivers/serial/sh-sci.c
parent7abc404a5a1e3785749acb8dbfcc558223f78444 (diff)
sh: Fix up the shared IRQ demuxer's control bit testing logic.
Correct the interrupt handler in sh4 serial device, return the correct value and check for what is anabled in the SCSCR register. The sh7722 is broken just sending a break using minicom. Signed-off-by: Michael Trimarchi <trimarchimichael@yahoo.it> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'drivers/serial/sh-sci.c')
-rw-r--r--drivers/serial/sh-sci.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c
index 47816e68c903..5c0f32c7fbf6 100644
--- a/drivers/serial/sh-sci.c
+++ b/drivers/serial/sh-sci.c
@@ -797,26 +797,27 @@ static irqreturn_t sci_br_interrupt(int irq, void *ptr)
797 797
798static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr) 798static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr)
799{ 799{
800 unsigned short ssr_status, scr_status; 800 unsigned short ssr_status, scr_status;
801 struct uart_port *port = ptr; 801 struct uart_port *port = ptr;
802 irqreturn_t ret = IRQ_NONE;
802 803
803 ssr_status = sci_in(port,SCxSR); 804 ssr_status = sci_in(port,SCxSR);
804 scr_status = sci_in(port,SCSCR); 805 scr_status = sci_in(port,SCSCR);
805 806
806 /* Tx Interrupt */ 807 /* Tx Interrupt */
807 if ((ssr_status & 0x0020) && (scr_status & 0x0080)) 808 if ((ssr_status & 0x0020) && (scr_status & SCI_CTRL_FLAGS_TIE))
808 sci_tx_interrupt(irq, ptr); 809 ret = sci_tx_interrupt(irq, ptr);
809 /* Rx Interrupt */ 810 /* Rx Interrupt */
810 if ((ssr_status & 0x0002) && (scr_status & 0x0040)) 811 if ((ssr_status & 0x0002) && (scr_status & SCI_CTRL_FLAGS_RIE))
811 sci_rx_interrupt(irq, ptr); 812 ret = sci_rx_interrupt(irq, ptr);
812 /* Error Interrupt */ 813 /* Error Interrupt */
813 if ((ssr_status & 0x0080) && (scr_status & 0x0400)) 814 if ((ssr_status & 0x0080) && (scr_status & SCI_CTRL_FLAGS_REIE))
814 sci_er_interrupt(irq, ptr); 815 ret = sci_er_interrupt(irq, ptr);
815 /* Break Interrupt */ 816 /* Break Interrupt */
816 if ((ssr_status & 0x0010) && (scr_status & 0x0200)) 817 if ((ssr_status & 0x0010) && (scr_status & SCI_CTRL_FLAGS_REIE))
817 sci_br_interrupt(irq, ptr); 818 ret = sci_br_interrupt(irq, ptr);
818 819
819 return IRQ_HANDLED; 820 return ret;
820} 821}
821 822
822#if defined(CONFIG_CPU_FREQ) && defined(CONFIG_HAVE_CLK) 823#if defined(CONFIG_CPU_FREQ) && defined(CONFIG_HAVE_CLK)