Path: blob/master/arch/m68k/include/asm/atariints.h
10820 views
/*1** atariints.h -- Atari Linux interrupt handling structs and prototypes2**3** Copyright 1994 by Björn Brauel4**5** 5/2/94 Roman Hodek:6** TT interrupt definitions added.7**8** 12/02/96: (Roman)9** Adapted to new int handling scheme (see ataints.c); revised numbering10**11** This file is subject to the terms and conditions of the GNU General Public12** License. See the file COPYING in the main directory of this archive13** for more details.14**15*/1617#ifndef _LINUX_ATARIINTS_H_18#define _LINUX_ATARIINTS_H_1920#include <asm/irq.h>21#include <asm/atarihw.h>2223/*24** Atari Interrupt sources.25**26*/2728#define STMFP_SOURCE_BASE 829#define TTMFP_SOURCE_BASE 2430#define SCC_SOURCE_BASE 4031#define VME_SOURCE_BASE 5632#define VME_MAX_SOURCES 163334#define NUM_ATARI_SOURCES (VME_SOURCE_BASE+VME_MAX_SOURCES-STMFP_SOURCE_BASE)3536/* convert vector number to int source number */37#define IRQ_VECTOR_TO_SOURCE(v) ((v) - ((v) < 0x20 ? 0x18 : (0x40-8)))3839/* convert irq_handler index to vector number */40#define IRQ_SOURCE_TO_VECTOR(i) ((i) + ((i) < 8 ? 0x18 : (0x40-8)))4142/* interrupt service types */43#define IRQ_TYPE_SLOW 044#define IRQ_TYPE_FAST 145#define IRQ_TYPE_PRIO 24647/* ST-MFP interrupts */48#define IRQ_MFP_BUSY (8)49#define IRQ_MFP_DCD (9)50#define IRQ_MFP_CTS (10)51#define IRQ_MFP_GPU (11)52#define IRQ_MFP_TIMD (12)53#define IRQ_MFP_TIMC (13)54#define IRQ_MFP_ACIA (14)55#define IRQ_MFP_FDC (15)56#define IRQ_MFP_ACSI IRQ_MFP_FDC57#define IRQ_MFP_FSCSI IRQ_MFP_FDC58#define IRQ_MFP_IDE IRQ_MFP_FDC59#define IRQ_MFP_TIMB (16)60#define IRQ_MFP_SERERR (17)61#define IRQ_MFP_SEREMPT (18)62#define IRQ_MFP_RECERR (19)63#define IRQ_MFP_RECFULL (20)64#define IRQ_MFP_TIMA (21)65#define IRQ_MFP_RI (22)66#define IRQ_MFP_MMD (23)6768/* TT-MFP interrupts */69#define IRQ_TT_MFP_IO0 (24)70#define IRQ_TT_MFP_IO1 (25)71#define IRQ_TT_MFP_SCC (26)72#define IRQ_TT_MFP_RI (27)73#define IRQ_TT_MFP_TIMD (28)74#define IRQ_TT_MFP_TIMC (29)75#define IRQ_TT_MFP_DRVRDY (30)76#define IRQ_TT_MFP_SCSIDMA (31)77#define IRQ_TT_MFP_TIMB (32)78#define IRQ_TT_MFP_SERERR (33)79#define IRQ_TT_MFP_SEREMPT (34)80#define IRQ_TT_MFP_RECERR (35)81#define IRQ_TT_MFP_RECFULL (36)82#define IRQ_TT_MFP_TIMA (37)83#define IRQ_TT_MFP_RTC (38)84#define IRQ_TT_MFP_SCSI (39)8586/* SCC interrupts */87#define IRQ_SCCB_TX (40)88#define IRQ_SCCB_STAT (42)89#define IRQ_SCCB_RX (44)90#define IRQ_SCCB_SPCOND (46)91#define IRQ_SCCA_TX (48)92#define IRQ_SCCA_STAT (50)93#define IRQ_SCCA_RX (52)94#define IRQ_SCCA_SPCOND (54)959697#define INT_CLK 24576 /* CLK while int_clk =2.456MHz and divide = 100 */98#define INT_TICKS 246 /* to make sched_time = 99.902... HZ */99100101#define MFP_ENABLE 0102#define MFP_PENDING 1103#define MFP_SERVICE 2104#define MFP_MASK 3105106/* Utility functions for setting/clearing bits in the interrupt registers of107* the MFP. 'type' should be constant, if 'irq' is constant, too, code size is108* reduced. set_mfp_bit() is nonsense for PENDING and SERVICE registers. */109110static inline int get_mfp_bit( unsigned irq, int type )111112{ unsigned char mask, *reg;113114mask = 1 << (irq & 7);115reg = (unsigned char *)&st_mfp.int_en_a + type*4 +116((irq & 8) >> 2) + (((irq-8) & 16) << 3);117return( *reg & mask );118}119120static inline void set_mfp_bit( unsigned irq, int type )121122{ unsigned char mask, *reg;123124mask = 1 << (irq & 7);125reg = (unsigned char *)&st_mfp.int_en_a + type*4 +126((irq & 8) >> 2) + (((irq-8) & 16) << 3);127__asm__ __volatile__ ( "orb %0,%1"128: : "di" (mask), "m" (*reg) : "memory" );129}130131static inline void clear_mfp_bit( unsigned irq, int type )132133{ unsigned char mask, *reg;134135mask = ~(1 << (irq & 7));136reg = (unsigned char *)&st_mfp.int_en_a + type*4 +137((irq & 8) >> 2) + (((irq-8) & 16) << 3);138if (type == MFP_PENDING || type == MFP_SERVICE)139__asm__ __volatile__ ( "moveb %0,%1"140: : "di" (mask), "m" (*reg) : "memory" );141else142__asm__ __volatile__ ( "andb %0,%1"143: : "di" (mask), "m" (*reg) : "memory" );144}145146/*147* {en,dis}able_irq have the usual semantics of temporary blocking the148* interrupt, but not losing requests that happen between disabling and149* enabling. This is done with the MFP mask registers.150*/151152static inline void atari_enable_irq( unsigned irq )153154{155if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;156set_mfp_bit( irq, MFP_MASK );157}158159static inline void atari_disable_irq( unsigned irq )160161{162if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;163clear_mfp_bit( irq, MFP_MASK );164}165166/*167* In opposite to {en,dis}able_irq, requests between turn{off,on}_irq are not168* "stored"169*/170171static inline void atari_turnon_irq( unsigned irq )172173{174if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;175set_mfp_bit( irq, MFP_ENABLE );176}177178static inline void atari_turnoff_irq( unsigned irq )179180{181if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;182clear_mfp_bit( irq, MFP_ENABLE );183clear_mfp_bit( irq, MFP_PENDING );184}185186static inline void atari_clear_pending_irq( unsigned irq )187188{189if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;190clear_mfp_bit( irq, MFP_PENDING );191}192193static inline int atari_irq_pending( unsigned irq )194195{196if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return( 0 );197return( get_mfp_bit( irq, MFP_PENDING ) );198}199200unsigned long atari_register_vme_int( void );201void atari_unregister_vme_int( unsigned long );202203#endif /* linux/atariints.h */204205206