summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorblogic <blogic@3c298f89-4303-0410-b956-a3cf2f4a3e73>2007-12-15 15:32:20 +0000
committerblogic <blogic@3c298f89-4303-0410-b956-a3cf2f4a3e73>2007-12-15 15:32:20 +0000
commit04ea1c319a808a15c7886ff2bb03e5c5cb290d14 (patch)
treedbc8eebe22347f008f0b55745204dac764e69242
parent345bce368bc47c80003442a3f7c82181ddee7e42 (diff)
danube ssc interrupt cleanup
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@9764 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r--target/linux/danube/files/drivers/char/danube_ssc.c117
1 files changed, 12 insertions, 105 deletions
diff --git a/target/linux/danube/files/drivers/char/danube_ssc.c b/target/linux/danube/files/drivers/char/danube_ssc.c
index cd0b4d387..ecaa59486 100644
--- a/target/linux/danube/files/drivers/char/danube_ssc.c
+++ b/target/linux/danube/files/drivers/char/danube_ssc.c
@@ -90,9 +90,6 @@ int ifx_ssc_close (struct inode *, struct file *);
/* other forward declarations */
static unsigned int ifx_ssc_get_kernel_clk (struct ifx_ssc_port *info);
-static void ifx_ssc_rx_int (int, void *, struct pt_regs *);
-static void ifx_ssc_tx_int (int, void *, struct pt_regs *);
-static void ifx_ssc_err_int (int, void *, struct pt_regs *);
#ifdef SSC_FRAME_INT_ENABLE
static void ifx_ssc_frm_int (int, void *, struct pt_regs *);
#endif
@@ -384,24 +381,26 @@ tx_int (struct ifx_ssc_port *info)
} // tx_int
-static void
-ifx_ssc_rx_int (int irq, void *dev_id, struct pt_regs *regs)
+irqreturn_t
+ifx_ssc_rx_int (int irq, void *dev_id)
{
struct ifx_ssc_port *info = (struct ifx_ssc_port *) dev_id;
- //WRITE_PERIPHERAL_REGISTER(IFX_SSC_R_BIT, info->mapbase + IFX_SSC_IRN_CR);
rx_int (info);
+
+ return IRQ_HANDLED;
}
-static void
-ifx_ssc_tx_int (int irq, void *dev_id, struct pt_regs *regs)
+irqreturn_t
+ifx_ssc_tx_int (int irq, void *dev_id)
{
struct ifx_ssc_port *info = (struct ifx_ssc_port *) dev_id;
- //WRITE_PERIPHERAL_REGISTER(IFX_SSC_T_BIT, info->mapbase + IFX_SSC_IRN_CR);
tx_int (info);
+
+ return IRQ_HANDLED;
}
-static void
-ifx_ssc_err_int (int irq, void *dev_id, struct pt_regs *regs)
+irqreturn_t
+ifx_ssc_err_int (int irq, void *dev_id)
{
struct ifx_ssc_port *info = (struct ifx_ssc_port *) dev_id;
unsigned int state;
@@ -441,6 +440,8 @@ ifx_ssc_err_int (int irq, void *dev_id, struct pt_regs *regs)
info->mapbase + IFX_SSC_WHBSTATE);
local_irq_restore (flags);
+
+ return IRQ_HANDLED;
}
#ifdef SSC_FRAME_INT_ENABLE
@@ -746,100 +747,6 @@ ifx_ssc_read_helper (struct ifx_ssc_port *info, char *buf, size_t len,
return (ret_val);
} // ifx_ssc_read_helper
-#if 0
-/* helper routine to handle reads from the kernel or user-space */
-/* appropriate in interrupt context */
-static ssize_t
-ifx_ssc_read_helper (struct ifx_ssc_port *info, char *buf, size_t len,
- int from_kernel)
-{
- ssize_t ret_val;
- unsigned long flags;
- DECLARE_WAITQUEUE (wait, current);
-
- if (info->opts.modeRxTx == IFX_SSC_MODE_TX)
- return -EFAULT;
- local_irq_save (flags);
- info->rxbuf_ptr = info->rxbuf;
- info->rxbuf_end = info->rxbuf + len;
- if (info->opts.modeRxTx == IFX_SSC_MODE_RXTX) {
- if ((info->txbuf == NULL) ||
- (info->txbuf != info->txbuf_ptr) ||
- (info->txbuf_end != len + info->txbuf)) {
- local_irq_restore (flags);
- printk ("IFX SSC - %s: write must be called before calling " "read in combined RX/TX!\n", __FUNCTION__);
- return -EFAULT;
- }
- local_irq_restore (flags);
- /* should enable tx, right? */
- tx_int (info);
- if (!in_irq ()) {
- if (info->txbuf_ptr < info->txbuf_end) {
- ifx_int_wrapper.enable (info->txirq);
- }
- ifx_int_wrapper.enable (info->rxirq);
- }
- }
- else { // rx mode
- local_irq_restore (flags);
- if (READ_PERIPHERAL_REGISTER (info->mapbase + IFX_SSC_RXCNT) &
- IFX_SSC_RXCNT_TODO_MASK)
- return -EBUSY;
- if (!in_irq ()) {
- ifx_int_wrapper.enable (info->rxirq);
- }
-
- if (len < IFX_SSC_RXREQ_BLOCK_SIZE)
- WRITE_PERIPHERAL_REGISTER (len <<
- IFX_SSC_RXREQ_RXCOUNT_OFFSET,
- info->mapbase +
- IFX_SSC_RXREQ);
- else
- WRITE_PERIPHERAL_REGISTER (IFX_SSC_RXREQ_BLOCK_SIZE <<
- IFX_SSC_RXREQ_RXCOUNT_OFFSET,
- info->mapbase +
- IFX_SSC_RXREQ);
- }
- if (in_irq ()) {
- do {
- rx_int (info);
- if (info->opts.modeRxTx == IFX_SSC_MODE_RXTX) {
- tx_int (info);
- }
-
- if (info->rxbuf_ptr >= info->rxbuf_end)
- break;
- } while (1);
- ret_val = info->rxbuf_ptr - info->rxbuf;
- }
- else {
- __add_wait_queue (&info->rwait, &wait);
- set_current_state (TASK_INTERRUPTIBLE);
- // wakeup done in rx_int
-
- do {
- local_irq_save (flags);
- if (info->rxbuf_ptr >= info->rxbuf_end)
- break;
- local_irq_restore (flags);
-
- if (signal_pending (current)) {
- ret_val = -ERESTARTSYS;
- goto out;
- }
- schedule ();
- } while (1);
-
- ret_val = info->rxbuf_ptr - info->rxbuf; // should be equal to len
- local_irq_restore (flags);
-
- out:
- current->state = TASK_RUNNING;
- __remove_wait_queue (&info->rwait, &wait);
- }
- return (ret_val);
-} // ifx_ssc_read_helper
-#endif
/* helper routine to handle writes to the kernel or user-space */
/* info->txbuf has two cases: