irqmgr.c

来自「鼎力推荐!本程序是基于嵌入式LUNUX系统开发的源程序代码」· C语言 代码 · 共 114 行

C
114
字号
/* ********************************************************************** *     irqmgr.c - IRQ manager for emu10k1 driver *     Copyright 1999, 2000 Creative Labs, Inc. * ********************************************************************** * *     Date                 Author          Summary of changes *     ----                 ------          ------------------ *     October 20, 1999     Bertrand Lee    base code release * ********************************************************************** * *     This program is free software; you can redistribute it and/or *     modify it under the terms of the GNU General Public License as *     published by the Free Software Foundation; either version 2 of *     the License, or (at your option) any later version. * *     This program is distributed in the hope that it will be useful, *     but WITHOUT ANY WARRANTY; without even the implied warranty of *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *     GNU General Public License for more details. * *     You should have received a copy of the GNU General Public *     License along with this program; if not, write to the Free *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, *     USA. * ********************************************************************** */#include "hwaccess.h"#include "8010.h"#include "cardmi.h"#include "cardmo.h"#include "irqmgr.h"/* Interrupt handler */irqreturn_t emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs){	struct emu10k1_card *card = (struct emu10k1_card *) dev_id;	u32 irqstatus, irqstatus_tmp;	int handled = 0;	DPD(4, "emu10k1_interrupt called, irq =  %u\n", irq);	/*	 ** NOTE :	 ** We do a 'while loop' here cos on certain machines, with both	 ** playback and recording going on at the same time, IRQs will	 ** stop coming in after a while. Checking IPND indeed shows that	 ** there are interrupts pending but the PIC says no IRQs pending.	 ** I suspect that some boards need edge-triggered IRQs but are not	 ** getting that condition if we don't completely clear the IPND	 ** (make sure no more interrupts are pending).	 ** - Eric	 */	while ((irqstatus = inl(card->iobase + IPR))) {		DPD(4, "irq status %#x\n", irqstatus);		irqstatus_tmp = irqstatus;		if (irqstatus & IRQTYPE_TIMER) {			emu10k1_timer_irqhandler(card);			irqstatus &= ~IRQTYPE_TIMER;		}		if (irqstatus & IRQTYPE_DSP) {			emu10k1_dsp_irqhandler(card);			irqstatus &= ~IRQTYPE_DSP;		}		if (irqstatus & IRQTYPE_MPUIN) {			emu10k1_mpuin_irqhandler(card);			irqstatus &= ~IRQTYPE_MPUIN;		}		if (irqstatus & IRQTYPE_MPUOUT) {			emu10k1_mpuout_irqhandler(card);			irqstatus &= ~IRQTYPE_MPUOUT;		}		if (irqstatus & IPR_MUTE) {			emu10k1_mute_irqhandler(card);			irqstatus &=~IPR_MUTE;		}		if (irqstatus & IPR_VOLINCR) {			emu10k1_volincr_irqhandler(card);			irqstatus &=~IPR_VOLINCR;		}		if (irqstatus & IPR_VOLDECR) {			emu10k1_voldecr_irqhandler(card);			irqstatus &=~IPR_VOLDECR;		}		if (irqstatus){			printk(KERN_ERR "emu10k1: Warning, unhandled interrupt: %#08x\n", irqstatus);			//make sure any interrupts we don't handle are disabled:			emu10k1_irq_disable(card, ~(INTE_MIDIRXENABLE | INTE_MIDITXENABLE | INTE_INTERVALTIMERENB |						INTE_VOLDECRENABLE | INTE_VOLINCRENABLE | INTE_MUTEENABLE |						INTE_FXDSPENABLE));		}		/* acknowledge interrupt */		outl(irqstatus_tmp, card->iobase + IPR);		handled = 1;	}	return IRQ_RETVAL(handled);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?