/* * arch/m68k/atari/ataints.c -- Atari Linux interrupt handling code * * 5/2/94 Roman Hodek: * Added support for TT interrupts; setup for TT SCU (may someone has * twiddled there and we won't get the right interrupts :-() * * Major change: The device-independent code in m68k/ints.c didn't know * about non-autovec ints yet. It hardcoded the number of possible ints to * 7 (IRQ1...IRQ7). But the Atari has lots of non-autovec ints! I made the * number of possible ints a constant defined in interrupt.h, which is * 47 for the Atari. So we can call request_irq() for all Atari interrupts * just the normal way. Additionally, all vectors >= 48 are initialized to * call trap() instead of inthandler(). This must be changed here, too. * * 1995-07-16 Lars Brinkhoff <f93labr@dd.chalmers.se>: * Corrected a bug in atari_add_isr() which rejected all SCC * interrupt sources if there were no TT MFP! * * 12/13/95: New interface functions atari_level_triggered_int() and * atari_register_vme_int() as support for level triggered VME interrupts. * * 02/12/96: (Roman) * Total rewrite of Atari interrupt handling, for new scheme see comments * below. * * 1996-09-03 lars brinkhoff <f93labr@dd.chalmers.se>: * Added new function atari_unregister_vme_int(), and * modified atari_register_vme_int() as well as IS_VALID_INTNO() * to work with it. * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive * for more details. *
*/
/* * Atari interrupt handling scheme: * -------------------------------- * * All interrupt source have an internal number (defined in * <asm/atariints.h>): Autovector interrupts are 1..7, then follow ST-MFP, * TT-MFP, SCC, and finally VME interrupts. Vector numbers for the latter can * be allocated by atari_register_vme_int().
*/
/* * Bitmap for free interrupt vector numbers * (new vectors starting from 0x70 can be allocated by * atari_register_vme_int())
*/ staticint free_vme_vec_bitmap;
/* GK: * HBL IRQ handler for Falcon. Nobody needs it :-) * ++andreas: raise ipl to disable further HBLANK interrupts.
*/
asmlinkage void falcon_hblhandler(void); asm(".text\n"
__ALIGN_STR "\n\t" "falcon_hblhandler:\n\t" "orw #0x200,%sp@\n\t"/* set saved ipl to 2 */ "rte");
/* * EtherNAT CPLD interrupt handling * CPLD interrupt register is at phys. 0x80000023 * Need this mapped in at interrupt startup time * Possibly need this mapped on demand anyway - * EtherNAT USB driver needs to disable IRQ before * startup!
*/
m68k_irq_startup(data); /* * map CPLD interrupt register
*/ if (!enat_cpld)
enat_cpld = (unsignedchar *)ioremap((ATARI_ETHERNAT_PHYS_ADDR+0x23), 0x2); /* * do _not_ enable the USB chip interrupt here - causes interrupt storm * and triggers dead interrupt watchdog * Need to reset the USB chip to a sane state in early startup before * removing this hack
*/ if (enat_num == 1)
*enat_cpld |= 1 << enat_num;
/* * void atari_init_IRQ (void) * * Parameters: None * * Returns: Nothing * * This function should be called during kernel startup to initialize * the atari IRQ handling routines.
*/
if (ATARIHW_PRESENT(SCU)) { /* init the SCU if present */
tt_scu.sys_mask = 0x0; /* disable all interrupts */
tt_scu.vme_mask = 0x60; /* enable MFP and SCC ints */
} else { /* If no SCU and no Hades, the HSYNC interrupt needs to be * disabled this way. (Else _inthandler in kernel/sys_call.S * gets overruns)
*/
if (ATARIHW_PRESENT(PCM_8BIT) && ATARIHW_PRESENT(MICROWIRE)) { /* Initialize the LM1992 Sound Controller to enable the PSG sound. This is misplaced here, it should
be in an atasound_init(), that doesn't exist yet. */
atari_microwire_cmd(MW_LM1992_PSG_HIGH);
}
stdma_init();
/* Initialize the PSG: all sounds off, both ports output */
sound_ym.rd_data_reg_sel = 7;
sound_ym.wd_data = 0xff;
/* prepare timer D data for use as poll interrupt */ /* set Timer D data Register - needs to be > 0 */
st_mfp.tim_dt_d = 254; /* < 100 Hz */ /* start timer D, div = 1:100 */
st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 0xf0) | 0x6;
/* request timer D dispatch handler */ if (request_irq(IRQ_MFP_TIMD, mfp_timer_d_handler, IRQF_SHARED,
stmfp_base.name, &stmfp_base))
pr_err("Couldn't register %s interrupt\n", stmfp_base.name);
/* * EtherNAT ethernet / USB interrupt handlers
*/
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.