xref: /openbmc/linux/arch/m68k/include/asm/atariints.h (revision 87511d09)
149148020SSam Ravnborg /*
249148020SSam Ravnborg ** atariints.h -- Atari Linux interrupt handling structs and prototypes
349148020SSam Ravnborg **
449148020SSam Ravnborg ** Copyright 1994 by Björn Brauel
549148020SSam Ravnborg **
649148020SSam Ravnborg ** 5/2/94 Roman Hodek:
749148020SSam Ravnborg **   TT interrupt definitions added.
849148020SSam Ravnborg **
949148020SSam Ravnborg ** 12/02/96: (Roman)
1049148020SSam Ravnborg **   Adapted to new int handling scheme (see ataints.c); revised numbering
1149148020SSam Ravnborg **
1249148020SSam Ravnborg ** This file is subject to the terms and conditions of the GNU General Public
1349148020SSam Ravnborg ** License.  See the file COPYING in the main directory of this archive
1449148020SSam Ravnborg ** for more details.
1549148020SSam Ravnborg **
1649148020SSam Ravnborg */
1749148020SSam Ravnborg 
1849148020SSam Ravnborg #ifndef _LINUX_ATARIINTS_H_
1949148020SSam Ravnborg #define _LINUX_ATARIINTS_H_
2049148020SSam Ravnborg 
2149148020SSam Ravnborg #include <asm/irq.h>
2249148020SSam Ravnborg #include <asm/atarihw.h>
2349148020SSam Ravnborg 
2449148020SSam Ravnborg /*
2549148020SSam Ravnborg ** Atari Interrupt sources.
2649148020SSam Ravnborg **
2749148020SSam Ravnborg */
2849148020SSam Ravnborg 
2949148020SSam Ravnborg #define STMFP_SOURCE_BASE  8
3049148020SSam Ravnborg #define TTMFP_SOURCE_BASE  24
3149148020SSam Ravnborg #define SCC_SOURCE_BASE    40
3249148020SSam Ravnborg #define VME_SOURCE_BASE    56
3349148020SSam Ravnborg #define VME_MAX_SOURCES    16
3449148020SSam Ravnborg 
35736b24dbSMichael Schmitz #define NUM_ATARI_SOURCES  141
3649148020SSam Ravnborg 
3749148020SSam Ravnborg /* convert vector number to int source number */
3849148020SSam Ravnborg #define IRQ_VECTOR_TO_SOURCE(v)	((v) - ((v) < 0x20 ? 0x18 : (0x40-8)))
3949148020SSam Ravnborg 
4049148020SSam Ravnborg /* convert irq_handler index to vector number */
4149148020SSam Ravnborg #define IRQ_SOURCE_TO_VECTOR(i)	((i) + ((i) < 8 ? 0x18 : (0x40-8)))
4249148020SSam Ravnborg 
4349148020SSam Ravnborg /* ST-MFP interrupts */
4449148020SSam Ravnborg #define IRQ_MFP_BUSY      (8)
4549148020SSam Ravnborg #define IRQ_MFP_DCD       (9)
4649148020SSam Ravnborg #define IRQ_MFP_CTS	  (10)
4749148020SSam Ravnborg #define IRQ_MFP_GPU	  (11)
4849148020SSam Ravnborg #define IRQ_MFP_TIMD      (12)
4949148020SSam Ravnborg #define IRQ_MFP_TIMC	  (13)
5049148020SSam Ravnborg #define IRQ_MFP_ACIA	  (14)
5149148020SSam Ravnborg #define IRQ_MFP_FDC       (15)
5249148020SSam Ravnborg #define IRQ_MFP_ACSI      IRQ_MFP_FDC
5349148020SSam Ravnborg #define IRQ_MFP_FSCSI     IRQ_MFP_FDC
5449148020SSam Ravnborg #define IRQ_MFP_IDE       IRQ_MFP_FDC
5549148020SSam Ravnborg #define IRQ_MFP_TIMB      (16)
5649148020SSam Ravnborg #define IRQ_MFP_SERERR    (17)
5749148020SSam Ravnborg #define IRQ_MFP_SEREMPT   (18)
5849148020SSam Ravnborg #define IRQ_MFP_RECERR    (19)
5949148020SSam Ravnborg #define IRQ_MFP_RECFULL   (20)
6049148020SSam Ravnborg #define IRQ_MFP_TIMA      (21)
6149148020SSam Ravnborg #define IRQ_MFP_RI        (22)
6249148020SSam Ravnborg #define IRQ_MFP_MMD       (23)
6349148020SSam Ravnborg 
6449148020SSam Ravnborg /* TT-MFP interrupts */
6549148020SSam Ravnborg #define IRQ_TT_MFP_IO0       (24)
6649148020SSam Ravnborg #define IRQ_TT_MFP_IO1       (25)
6749148020SSam Ravnborg #define IRQ_TT_MFP_SCC	     (26)
6849148020SSam Ravnborg #define IRQ_TT_MFP_RI	     (27)
6949148020SSam Ravnborg #define IRQ_TT_MFP_TIMD      (28)
7049148020SSam Ravnborg #define IRQ_TT_MFP_TIMC	     (29)
7149148020SSam Ravnborg #define IRQ_TT_MFP_DRVRDY    (30)
7249148020SSam Ravnborg #define IRQ_TT_MFP_SCSIDMA   (31)
7349148020SSam Ravnborg #define IRQ_TT_MFP_TIMB      (32)
7449148020SSam Ravnborg #define IRQ_TT_MFP_SERERR    (33)
7549148020SSam Ravnborg #define IRQ_TT_MFP_SEREMPT   (34)
7649148020SSam Ravnborg #define IRQ_TT_MFP_RECERR    (35)
7749148020SSam Ravnborg #define IRQ_TT_MFP_RECFULL   (36)
7849148020SSam Ravnborg #define IRQ_TT_MFP_TIMA      (37)
7949148020SSam Ravnborg #define IRQ_TT_MFP_RTC       (38)
8049148020SSam Ravnborg #define IRQ_TT_MFP_SCSI      (39)
8149148020SSam Ravnborg 
8249148020SSam Ravnborg /* SCC interrupts */
8349148020SSam Ravnborg #define IRQ_SCCB_TX	     (40)
8449148020SSam Ravnborg #define IRQ_SCCB_STAT	     (42)
8549148020SSam Ravnborg #define IRQ_SCCB_RX	     (44)
8649148020SSam Ravnborg #define IRQ_SCCB_SPCOND	     (46)
8749148020SSam Ravnborg #define IRQ_SCCA_TX	     (48)
8849148020SSam Ravnborg #define IRQ_SCCA_STAT	     (50)
8949148020SSam Ravnborg #define IRQ_SCCA_RX	     (52)
9049148020SSam Ravnborg #define IRQ_SCCA_SPCOND	     (54)
9149148020SSam Ravnborg 
92b1ae432cSMichael Schmitz /* shared MFP timer D interrupts - hires timer for EtherNEC et al. */
93b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER1       (64)
94b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER2       (65)
95b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER3       (66)
96b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER4       (67)
97b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER5       (68)
98b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER6       (69)
99b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER7       (70)
100b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER8       (71)
10149148020SSam Ravnborg 
10249148020SSam Ravnborg #define INT_CLK   24576	    /* CLK while int_clk =2.456MHz and divide = 100 */
10349148020SSam Ravnborg #define INT_TICKS 246	    /* to make sched_time = 99.902... HZ */
10449148020SSam Ravnborg 
10549148020SSam Ravnborg 
10649148020SSam Ravnborg #define MFP_ENABLE	0
10749148020SSam Ravnborg #define MFP_PENDING	1
10849148020SSam Ravnborg #define MFP_SERVICE	2
10949148020SSam Ravnborg #define MFP_MASK	3
11049148020SSam Ravnborg 
11149148020SSam Ravnborg /* Utility functions for setting/clearing bits in the interrupt registers of
11249148020SSam Ravnborg  * the MFP. 'type' should be constant, if 'irq' is constant, too, code size is
11349148020SSam Ravnborg  * reduced. set_mfp_bit() is nonsense for PENDING and SERVICE registers. */
11449148020SSam Ravnborg 
get_mfp_bit(unsigned irq,int type)11549148020SSam Ravnborg static inline int get_mfp_bit( unsigned irq, int type )
11649148020SSam Ravnborg 
11749148020SSam Ravnborg {	unsigned char	mask, *reg;
11849148020SSam Ravnborg 
11949148020SSam Ravnborg 	mask = 1 << (irq & 7);
1203d92e8f3SGeert Uytterhoeven 	reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
12149148020SSam Ravnborg 		  ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
12249148020SSam Ravnborg 	return( *reg & mask );
12349148020SSam Ravnborg }
12449148020SSam Ravnborg 
set_mfp_bit(unsigned irq,int type)12549148020SSam Ravnborg static inline void set_mfp_bit( unsigned irq, int type )
12649148020SSam Ravnborg 
12749148020SSam Ravnborg {	unsigned char	mask, *reg;
12849148020SSam Ravnborg 
12949148020SSam Ravnborg 	mask = 1 << (irq & 7);
1303d92e8f3SGeert Uytterhoeven 	reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
13149148020SSam Ravnborg 		  ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
13249148020SSam Ravnborg 	__asm__ __volatile__ ( "orb %0,%1"
13349148020SSam Ravnborg 			      : : "di" (mask), "m" (*reg) : "memory" );
13449148020SSam Ravnborg }
13549148020SSam Ravnborg 
clear_mfp_bit(unsigned irq,int type)13649148020SSam Ravnborg static inline void clear_mfp_bit( unsigned irq, int type )
13749148020SSam Ravnborg 
13849148020SSam Ravnborg {	unsigned char	mask, *reg;
13949148020SSam Ravnborg 
14049148020SSam Ravnborg 	mask = ~(1 << (irq & 7));
1413d92e8f3SGeert Uytterhoeven 	reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
14249148020SSam Ravnborg 		  ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
14349148020SSam Ravnborg 	if (type == MFP_PENDING || type == MFP_SERVICE)
14449148020SSam Ravnborg 		__asm__ __volatile__ ( "moveb %0,%1"
14549148020SSam Ravnborg 				      : : "di" (mask), "m" (*reg) : "memory" );
14649148020SSam Ravnborg 	else
14749148020SSam Ravnborg 		__asm__ __volatile__ ( "andb %0,%1"
14849148020SSam Ravnborg 				      : : "di" (mask), "m" (*reg) : "memory" );
14949148020SSam Ravnborg }
15049148020SSam Ravnborg 
15149148020SSam Ravnborg /*
15249148020SSam Ravnborg  * {en,dis}able_irq have the usual semantics of temporary blocking the
15325985edcSLucas De Marchi  * interrupt, but not losing requests that happen between disabling and
15449148020SSam Ravnborg  * enabling. This is done with the MFP mask registers.
15549148020SSam Ravnborg  */
15649148020SSam Ravnborg 
atari_enable_irq(unsigned irq)15749148020SSam Ravnborg static inline void atari_enable_irq( unsigned irq )
15849148020SSam Ravnborg 
15949148020SSam Ravnborg {
16049148020SSam Ravnborg 	if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
16149148020SSam Ravnborg 	set_mfp_bit( irq, MFP_MASK );
16249148020SSam Ravnborg }
16349148020SSam Ravnborg 
atari_disable_irq(unsigned irq)16449148020SSam Ravnborg static inline void atari_disable_irq( unsigned irq )
16549148020SSam Ravnborg 
16649148020SSam Ravnborg {
16749148020SSam Ravnborg 	if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
16849148020SSam Ravnborg 	clear_mfp_bit( irq, MFP_MASK );
16949148020SSam Ravnborg }
17049148020SSam Ravnborg 
17149148020SSam Ravnborg /*
17249148020SSam Ravnborg  * In opposite to {en,dis}able_irq, requests between turn{off,on}_irq are not
17349148020SSam Ravnborg  * "stored"
17449148020SSam Ravnborg  */
17549148020SSam Ravnborg 
atari_turnon_irq(unsigned irq)17649148020SSam Ravnborg static inline void atari_turnon_irq( unsigned irq )
17749148020SSam Ravnborg 
17849148020SSam Ravnborg {
17949148020SSam Ravnborg 	if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
18049148020SSam Ravnborg 	set_mfp_bit( irq, MFP_ENABLE );
18149148020SSam Ravnborg }
18249148020SSam Ravnborg 
atari_turnoff_irq(unsigned irq)18349148020SSam Ravnborg static inline void atari_turnoff_irq( unsigned irq )
18449148020SSam Ravnborg 
18549148020SSam Ravnborg {
18649148020SSam Ravnborg 	if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
18749148020SSam Ravnborg 	clear_mfp_bit( irq, MFP_ENABLE );
18849148020SSam Ravnborg 	clear_mfp_bit( irq, MFP_PENDING );
18949148020SSam Ravnborg }
19049148020SSam Ravnborg 
atari_clear_pending_irq(unsigned irq)19149148020SSam Ravnborg static inline void atari_clear_pending_irq( unsigned irq )
19249148020SSam Ravnborg 
19349148020SSam Ravnborg {
19449148020SSam Ravnborg 	if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
19549148020SSam Ravnborg 	clear_mfp_bit( irq, MFP_PENDING );
19649148020SSam Ravnborg }
19749148020SSam Ravnborg 
atari_irq_pending(unsigned irq)19849148020SSam Ravnborg static inline int atari_irq_pending( unsigned irq )
19949148020SSam Ravnborg 
20049148020SSam Ravnborg {
20149148020SSam Ravnborg 	if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return( 0 );
20249148020SSam Ravnborg 	return( get_mfp_bit( irq, MFP_PENDING ) );
20349148020SSam Ravnborg }
20449148020SSam Ravnborg 
20544883eb0SGeert Uytterhoeven unsigned int atari_register_vme_int(void);
20644883eb0SGeert Uytterhoeven void atari_unregister_vme_int(unsigned int);
20749148020SSam Ravnborg 
20849148020SSam Ravnborg #endif /* linux/atariints.h */
209