Ejemplo n.º 1
0
int readchar_nonblock()
{
	if(irq_pending() & IRQ_UARTRX)
		return 1;
	else
		return 0;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
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);
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
void mc68681_device::update_interrupts()
{
	duart_base_device::update_interrupts();

	if (!irq_pending())
		m_read_vector = false;  // clear IACK too
}
Ejemplo n.º 6
0
char readchar()
{
	char c;

	while(!(irq_pending() & IRQ_UARTRX));
	irq_ack(IRQ_UARTRX);
	c = CSR_UART_RXTX;
	return c;
}
Ejemplo n.º 7
0
void isr(void)
{
	unsigned int irqs;

	irqs = irq_pending() & irq_getmask();

	if(irqs & (1 << UART_INTERRUPT))
		uart_isr();
}
Ejemplo n.º 8
0
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
}
Ejemplo n.º 9
0
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();
}
Ejemplo n.º 10
0
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
}
Ejemplo n.º 11
0
void writechar(char c)
{
	CSR_UART_RXTX = c;
	while(!(irq_pending() & IRQ_UARTTX));
	irq_ack(IRQ_UARTTX);
}