0001
0002 #ifndef _ASM_X86_I8259_H
0003 #define _ASM_X86_I8259_H
0004
0005 #include <linux/delay.h>
0006 #include <asm/io.h>
0007
0008 extern unsigned int cached_irq_mask;
0009
0010 #define __byte(x, y) (((unsigned char *)&(y))[x])
0011 #define cached_master_mask (__byte(0, cached_irq_mask))
0012 #define cached_slave_mask (__byte(1, cached_irq_mask))
0013
0014
0015 #define PIC_MASTER_CMD 0x20
0016 #define PIC_MASTER_IMR 0x21
0017 #define PIC_MASTER_ISR PIC_MASTER_CMD
0018 #define PIC_MASTER_POLL PIC_MASTER_ISR
0019 #define PIC_MASTER_OCW3 PIC_MASTER_ISR
0020 #define PIC_SLAVE_CMD 0xa0
0021 #define PIC_SLAVE_IMR 0xa1
0022 #define PIC_ELCR1 0x4d0
0023 #define PIC_ELCR2 0x4d1
0024
0025
0026 #define PIC_CASCADE_IR 2
0027 #define MASTER_ICW4_DEFAULT 0x01
0028 #define SLAVE_ICW4_DEFAULT 0x01
0029 #define PIC_ICW4_AEOI 2
0030
0031 extern raw_spinlock_t i8259A_lock;
0032
0033
0034 static inline unsigned char inb_pic(unsigned int port)
0035 {
0036 unsigned char value = inb(port);
0037
0038
0039
0040
0041
0042 udelay(2);
0043
0044 return value;
0045 }
0046
0047 static inline void outb_pic(unsigned char value, unsigned int port)
0048 {
0049 outb(value, port);
0050
0051
0052
0053
0054 udelay(2);
0055 }
0056
0057 extern struct irq_chip i8259A_chip;
0058
0059 struct legacy_pic {
0060 int nr_legacy_irqs;
0061 struct irq_chip *chip;
0062 void (*mask)(unsigned int irq);
0063 void (*unmask)(unsigned int irq);
0064 void (*mask_all)(void);
0065 void (*restore_mask)(void);
0066 void (*init)(int auto_eoi);
0067 int (*probe)(void);
0068 int (*irq_pending)(unsigned int irq);
0069 void (*make_irq)(unsigned int irq);
0070 };
0071
0072 extern struct legacy_pic *legacy_pic;
0073 extern struct legacy_pic null_legacy_pic;
0074
0075 static inline bool has_legacy_pic(void)
0076 {
0077 return legacy_pic != &null_legacy_pic;
0078 }
0079
0080 static inline int nr_legacy_irqs(void)
0081 {
0082 return legacy_pic->nr_legacy_irqs;
0083 }
0084
0085 #endif