Changeset 9764


Ignore:
Timestamp:
2007-12-15T16:32:20+01:00 (8 years ago)
Author:
blogic
Message:

danube ssc interrupt cleanup

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/danube/files/drivers/char/danube_ssc.c

    r9761 r9764  
    9191/* other forward declarations */ 
    9292static unsigned int ifx_ssc_get_kernel_clk (struct ifx_ssc_port *info); 
    93 static void ifx_ssc_rx_int (int, void *, struct pt_regs *); 
    94 static void ifx_ssc_tx_int (int, void *, struct pt_regs *); 
    95 static void ifx_ssc_err_int (int, void *, struct pt_regs *); 
    9693#ifdef SSC_FRAME_INT_ENABLE 
    9794static void ifx_ssc_frm_int (int, void *, struct pt_regs *); 
     
    385382}                               // tx_int 
    386383 
    387 static void 
    388 ifx_ssc_rx_int (int irq, void *dev_id, struct pt_regs *regs) 
     384irqreturn_t 
     385ifx_ssc_rx_int (int irq, void *dev_id) 
    389386{ 
    390387        struct ifx_ssc_port *info = (struct ifx_ssc_port *) dev_id; 
    391         //WRITE_PERIPHERAL_REGISTER(IFX_SSC_R_BIT, info->mapbase + IFX_SSC_IRN_CR); 
    392388        rx_int (info); 
     389 
     390        return IRQ_HANDLED; 
    393391} 
    394392 
    395 static void 
    396 ifx_ssc_tx_int (int irq, void *dev_id, struct pt_regs *regs) 
     393irqreturn_t 
     394ifx_ssc_tx_int (int irq, void *dev_id) 
    397395{ 
    398396        struct ifx_ssc_port *info = (struct ifx_ssc_port *) dev_id; 
    399         //WRITE_PERIPHERAL_REGISTER(IFX_SSC_T_BIT, info->mapbase + IFX_SSC_IRN_CR); 
    400397        tx_int (info); 
     398 
     399        return IRQ_HANDLED; 
    401400} 
    402401 
    403 static void 
    404 ifx_ssc_err_int (int irq, void *dev_id, struct pt_regs *regs) 
     402irqreturn_t 
     403ifx_ssc_err_int (int irq, void *dev_id) 
    405404{ 
    406405        struct ifx_ssc_port *info = (struct ifx_ssc_port *) dev_id; 
     
    442441 
    443442        local_irq_restore (flags); 
     443 
     444        return IRQ_HANDLED; 
    444445} 
    445446 
     
    747748}                               // ifx_ssc_read_helper 
    748749 
    749 #if 0 
    750 /* helper routine to handle reads from the kernel or user-space */ 
    751 /* appropriate in interrupt context */ 
    752 static ssize_t 
    753 ifx_ssc_read_helper (struct ifx_ssc_port *info, char *buf, size_t len, 
    754                      int from_kernel) 
    755 { 
    756         ssize_t ret_val; 
    757         unsigned long flags; 
    758         DECLARE_WAITQUEUE (wait, current); 
    759  
    760         if (info->opts.modeRxTx == IFX_SSC_MODE_TX) 
    761                 return -EFAULT; 
    762         local_irq_save (flags); 
    763         info->rxbuf_ptr = info->rxbuf; 
    764         info->rxbuf_end = info->rxbuf + len; 
    765         if (info->opts.modeRxTx == IFX_SSC_MODE_RXTX) { 
    766                 if ((info->txbuf == NULL) || 
    767                     (info->txbuf != info->txbuf_ptr) || 
    768                     (info->txbuf_end != len + info->txbuf)) { 
    769                         local_irq_restore (flags); 
    770                         printk ("IFX SSC - %s: write must be called before calling " "read in combined RX/TX!\n", __FUNCTION__); 
    771                         return -EFAULT; 
    772                 } 
    773                 local_irq_restore (flags); 
    774                 /* should enable tx, right? */ 
    775                 tx_int (info); 
    776                 if (!in_irq ()) { 
    777                         if (info->txbuf_ptr < info->txbuf_end) { 
    778                                 ifx_int_wrapper.enable (info->txirq); 
    779                         } 
    780                         ifx_int_wrapper.enable (info->rxirq); 
    781                 } 
    782         } 
    783         else {                  // rx mode 
    784                 local_irq_restore (flags); 
    785                 if (READ_PERIPHERAL_REGISTER (info->mapbase + IFX_SSC_RXCNT) & 
    786                     IFX_SSC_RXCNT_TODO_MASK) 
    787                         return -EBUSY; 
    788                 if (!in_irq ()) { 
    789                         ifx_int_wrapper.enable (info->rxirq); 
    790                 } 
    791  
    792                 if (len < IFX_SSC_RXREQ_BLOCK_SIZE) 
    793                         WRITE_PERIPHERAL_REGISTER (len << 
    794                                                    IFX_SSC_RXREQ_RXCOUNT_OFFSET, 
    795                                                    info->mapbase + 
    796                                                    IFX_SSC_RXREQ); 
    797                 else 
    798                         WRITE_PERIPHERAL_REGISTER (IFX_SSC_RXREQ_BLOCK_SIZE << 
    799                                                    IFX_SSC_RXREQ_RXCOUNT_OFFSET, 
    800                                                    info->mapbase + 
    801                                                    IFX_SSC_RXREQ); 
    802         } 
    803         if (in_irq ()) { 
    804                 do { 
    805                         rx_int (info); 
    806                         if (info->opts.modeRxTx == IFX_SSC_MODE_RXTX) { 
    807                                 tx_int (info); 
    808                         } 
    809  
    810                         if (info->rxbuf_ptr >= info->rxbuf_end) 
    811                                 break; 
    812                 } while (1); 
    813                 ret_val = info->rxbuf_ptr - info->rxbuf; 
    814         } 
    815         else { 
    816                 __add_wait_queue (&info->rwait, &wait); 
    817                 set_current_state (TASK_INTERRUPTIBLE); 
    818                 // wakeup done in rx_int 
    819  
    820                 do { 
    821                         local_irq_save (flags); 
    822                         if (info->rxbuf_ptr >= info->rxbuf_end) 
    823                                 break; 
    824                         local_irq_restore (flags); 
    825  
    826                         if (signal_pending (current)) { 
    827                                 ret_val = -ERESTARTSYS; 
    828                                 goto out; 
    829                         } 
    830                         schedule (); 
    831                 } while (1); 
    832  
    833                 ret_val = info->rxbuf_ptr - info->rxbuf;        // should be equal to len 
    834                 local_irq_restore (flags); 
    835  
    836               out: 
    837                 current->state = TASK_RUNNING; 
    838                 __remove_wait_queue (&info->rwait, &wait); 
    839         } 
    840         return (ret_val); 
    841 }                               // ifx_ssc_read_helper 
    842 #endif 
    843750 
    844751/* helper routine to handle writes to the kernel or user-space */ 
Note: See TracChangeset for help on using the changeset viewer.