int readchar_nonblock() { if(irq_pending() & IRQ_UARTRX) return 1; else return 0; }
static int sis1100_read_irqdata(struct sis1100_softc* sc, struct sis1100_fdata* fd, size_t count, size_t* count_read, void __user *data, int nonblocking) { struct sis1100_irq_get2 get; int res, version=1; /* count too small? */ if (count<sizeof(struct sis1100_irq_get)) return EINVAL; /* count large enough for sis1100_irq_get2? */ if (count>=sizeof(struct sis1100_irq_get2)) version=2; if (nonblocking && !irq_pending(sc, fd, fd->owned_irqs)) return EAGAIN; get.irq_mask=fd->owned_irqs; res=sis1100_irq_wait(fd, &get); if (res) { pINFO(sc, "read_irqdata: res=%d", res); return res; } count=version==1? sizeof(struct sis1100_irq_get):sizeof(struct sis1100_irq_get2); if (COPY_TO_USER(data, &get, count)) return EFAULT; *count_read=count; return 0; }
void isr(void) { unsigned int irqs; irqs = irq_pending() & irq_getmask(); if(irqs & IRQ_UART) uart_isr(); if(irqs & IRQ_TIMER0) time_isr(); if(irqs & IRQ_AC97CRREQUEST) snd_isr_crrequest(); if(irqs & IRQ_AC97CRREPLY) snd_isr_crreply(); if(irqs & IRQ_AC97DMAR) snd_isr_dmar(); if(irqs & IRQ_AC97DMAW) snd_isr_dmaw(); if(irqs & IRQ_TMU) tmu_isr(); if(irqs & IRQ_PFPU) pfpu_isr(); irq_ack(irqs); }
static int pm_go_sleep(int arg) { unsigned long flags; sleep_jiffy = 0; #ifdef CONFIG_NO_USB_SUSPEND_RESUME return 0; #endif if ((can_sleep && (!ipc_is_active()) && (!periodic_wake)) || arg) { local_irq_save(flags); if (pm_send_all(PM_SUSPEND, (void *)3) == 0) { ezx_i2c_pm_suspend(); wmmx_ohci_suspend_call(); if (!irq_pending()) { if(usb_host_suspended) UP3OCR = 0x3; pm_do_suspend(CPUMODE_SLEEP); clear_dpcsr(); } APM_DPRINTK("resume\n"); ezx_i2c_pm_resume(); pm_send_all(PM_RESUME, (void *)0); check_wakeup(); } local_irq_restore(flags); } return 0; }
void mc68681_device::update_interrupts() { duart_base_device::update_interrupts(); if (!irq_pending()) m_read_vector = false; // clear IACK too }
char readchar() { char c; while(!(irq_pending() & IRQ_UARTRX)); irq_ack(IRQ_UARTRX); c = CSR_UART_RXTX; return c; }
void isr(void) { unsigned int irqs; irqs = irq_pending() & irq_getmask(); if(irqs & (1 << UART_INTERRUPT)) uart_isr(); }
void isr(void) { unsigned int irqs; irqs = irq_pending() & irq_getmask(); if(irqs & IRQ_UART) uart_isr(); #ifdef FIXME if(irqs & IRQ_TMU) tmu_isr(); if(irqs & IRQ_USB) usb_isr(); #endif }
void isr() { unsigned int irqs; cpustats_enter(); irqs = irq_pending() & irq_getmask(); if(irqs & IRQ_UARTRX) uart_isr_rx(); if(irqs & IRQ_UARTTX) uart_isr_tx(); if(irqs & IRQ_TIMER0) time_isr(); if(irqs & IRQ_AC97CRREQUEST) snd_isr_crrequest(); if(irqs & IRQ_AC97CRREPLY) snd_isr_crreply(); if(irqs & IRQ_AC97DMAR) snd_isr_dmar(); if(irqs & IRQ_AC97DMAW) snd_isr_dmaw(); if(irqs & IRQ_PFPU) pfpu_isr(); if(irqs & IRQ_TMU) tmu_isr(); if(irqs & IRQ_USB) usb_isr(); cpustats_leave(); }
static void _sis1100_irq_thread(struct sis1100_softc* sc, enum handlercomm command) { u_int32_t new_irqs=0; int i; mutex_lock(&sc->sem_irqinfo); if (command&handlercomm_doorbell) { DECLARE_SPINLOCKFLAGS(flags) u_int32_t doorbell; SPIN_LOCK_IRQSAVE(sc->lock_doorbell, flags); doorbell=sc->doorbell; sc->doorbell=0; SPIN_UNLOCK_IRQRESTORE(sc->lock_doorbell, flags); switch (sc->remote_hw) { case sis1100_hw_vme: new_irqs|=sis3100rem_irq_handler(sc, doorbell); break; case sis1100_hw_camac: new_irqs|=sis5100rem_irq_handler(sc, doorbell); break; case sis1100_hw_pci: /* do nothing */ break; case sis1100_hw_lvd: new_irqs|=zellvd_rem_irq_handler(sc, doorbell); break; case sis1100_hw_pandapixel: new_irqs|=pandapixel_rem_irq_handler(sc, doorbell); break; case sis1100_hw_psf4ad: /* do nothing */ case sis1100_hw_invalid: /* do nothing */ break; } } if (command&handlercomm_lemo) { new_irqs|=sis1100_lemo_handler(sc); } if (command&handlercomm_mbx0) { new_irqs|=sis1100_mbox0_handler(sc); } /* this is called from sis1100_link_up_handler for both 'UP' and 'DOWN' of link one second after status change */ if (command&handlercomm_up) { new_irqs|=sis1100_synch_handler(sc); } if (command&handlercomm_ddma) { new_irqs|=sis1100_ddma_handler(sc); } sc->pending_irqs|=new_irqs; mutex_unlock(&sc->sem_irqinfo); /* inform processes via signal if requested */ mutex_lock(&sc->sem_fdata); for (i=0; i<sis1100_MINORUTMASK+1; i++) { if (sc->fdata[i]) { struct sis1100_fdata* fd=sc->fdata[i]; if (fd->sig>0 && ((new_irqs & fd->owned_irqs)|| (fd->old_remote_hw!=sc->remote_hw))) { int res; /* XXXY muss raus */ pERROR(sc, "irq_pending=%d pending_irqs=0x%x", irq_pending(sc, fd, fd->owned_irqs), sc->pending_irqs); pERROR(sc, "sig=%d new_irqs=0x%x owned_irqs=0x%x", fd->sig, new_irqs, fd->owned_irqs); pERROR(sc, "old_remote_hw=%d remote_hw=%d", fd->old_remote_hw, sc->remote_hw); /* XXXY muss raus */ pERROR(sc, "send sig to %d", pid_nr(fd->pid)); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) res=kill_proc(fd->pid, fd->sig, 1); #else res=kill_pid(fd->pid, fd->sig, 1); #endif if (res) pINFO(sc, "send sig %d to %u: res=%d", fd->sig, pid_nr(fd->pid), res); } } } mutex_unlock(&sc->sem_fdata); /* wake up processes waiting in sis1100_irq_wait or doing select */ #ifdef __NetBSD__ wakeup(&sc->remoteirq_wait); selwakeup(&sc->sel); #elif __linux__ wake_up_interruptible(&sc->remoteirq_wait); #endif }
void writechar(char c) { CSR_UART_RXTX = c; while(!(irq_pending() & IRQ_UARTTX)); irq_ack(IRQ_UARTTX); }