|
@@ -29,24 +29,10 @@
|
|
* plus some generic x86 specific things if generic specifics makes
|
|
* plus some generic x86 specific things if generic specifics makes
|
|
* any sense at all.
|
|
* any sense at all.
|
|
*/
|
|
*/
|
|
|
|
+static void init_8259A(int auto_eoi);
|
|
|
|
|
|
static int i8259A_auto_eoi;
|
|
static int i8259A_auto_eoi;
|
|
DEFINE_RAW_SPINLOCK(i8259A_lock);
|
|
DEFINE_RAW_SPINLOCK(i8259A_lock);
|
|
-static void mask_and_ack_8259A(unsigned int);
|
|
|
|
-static void mask_8259A(void);
|
|
|
|
-static void unmask_8259A(void);
|
|
|
|
-static void disable_8259A_irq(unsigned int irq);
|
|
|
|
-static void enable_8259A_irq(unsigned int irq);
|
|
|
|
-static void init_8259A(int auto_eoi);
|
|
|
|
-static int i8259A_irq_pending(unsigned int irq);
|
|
|
|
-
|
|
|
|
-struct irq_chip i8259A_chip = {
|
|
|
|
- .name = "XT-PIC",
|
|
|
|
- .mask = disable_8259A_irq,
|
|
|
|
- .disable = disable_8259A_irq,
|
|
|
|
- .unmask = enable_8259A_irq,
|
|
|
|
- .mask_ack = mask_and_ack_8259A,
|
|
|
|
-};
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
* 8259A PIC functions to handle ISA devices:
|
|
* 8259A PIC functions to handle ISA devices:
|
|
@@ -68,7 +54,7 @@ unsigned int cached_irq_mask = 0xffff;
|
|
*/
|
|
*/
|
|
unsigned long io_apic_irqs;
|
|
unsigned long io_apic_irqs;
|
|
|
|
|
|
-static void disable_8259A_irq(unsigned int irq)
|
|
|
|
|
|
+static void mask_8259A_irq(unsigned int irq)
|
|
{
|
|
{
|
|
unsigned int mask = 1 << irq;
|
|
unsigned int mask = 1 << irq;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
@@ -82,7 +68,12 @@ static void disable_8259A_irq(unsigned int irq)
|
|
raw_spin_unlock_irqrestore(&i8259A_lock, flags);
|
|
raw_spin_unlock_irqrestore(&i8259A_lock, flags);
|
|
}
|
|
}
|
|
|
|
|
|
-static void enable_8259A_irq(unsigned int irq)
|
|
|
|
|
|
+static void disable_8259A_irq(struct irq_data *data)
|
|
|
|
+{
|
|
|
|
+ mask_8259A_irq(data->irq);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void unmask_8259A_irq(unsigned int irq)
|
|
{
|
|
{
|
|
unsigned int mask = ~(1 << irq);
|
|
unsigned int mask = ~(1 << irq);
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
@@ -96,6 +87,11 @@ static void enable_8259A_irq(unsigned int irq)
|
|
raw_spin_unlock_irqrestore(&i8259A_lock, flags);
|
|
raw_spin_unlock_irqrestore(&i8259A_lock, flags);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void enable_8259A_irq(struct irq_data *data)
|
|
|
|
+{
|
|
|
|
+ unmask_8259A_irq(data->irq);
|
|
|
|
+}
|
|
|
|
+
|
|
static int i8259A_irq_pending(unsigned int irq)
|
|
static int i8259A_irq_pending(unsigned int irq)
|
|
{
|
|
{
|
|
unsigned int mask = 1<<irq;
|
|
unsigned int mask = 1<<irq;
|
|
@@ -117,7 +113,7 @@ static void make_8259A_irq(unsigned int irq)
|
|
disable_irq_nosync(irq);
|
|
disable_irq_nosync(irq);
|
|
io_apic_irqs &= ~(1<<irq);
|
|
io_apic_irqs &= ~(1<<irq);
|
|
set_irq_chip_and_handler_name(irq, &i8259A_chip, handle_level_irq,
|
|
set_irq_chip_and_handler_name(irq, &i8259A_chip, handle_level_irq,
|
|
- "XT");
|
|
|
|
|
|
+ i8259A_chip.name);
|
|
enable_irq(irq);
|
|
enable_irq(irq);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -150,8 +146,9 @@ static inline int i8259A_irq_real(unsigned int irq)
|
|
* first, _then_ send the EOI, and the order of EOI
|
|
* first, _then_ send the EOI, and the order of EOI
|
|
* to the two 8259s is important!
|
|
* to the two 8259s is important!
|
|
*/
|
|
*/
|
|
-static void mask_and_ack_8259A(unsigned int irq)
|
|
|
|
|
|
+static void mask_and_ack_8259A(struct irq_data *data)
|
|
{
|
|
{
|
|
|
|
+ unsigned int irq = data->irq;
|
|
unsigned int irqmask = 1 << irq;
|
|
unsigned int irqmask = 1 << irq;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
|
|
@@ -223,6 +220,14 @@ spurious_8259A_irq:
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+struct irq_chip i8259A_chip = {
|
|
|
|
+ .name = "XT-PIC",
|
|
|
|
+ .irq_mask = disable_8259A_irq,
|
|
|
|
+ .irq_disable = disable_8259A_irq,
|
|
|
|
+ .irq_unmask = enable_8259A_irq,
|
|
|
|
+ .irq_mask_ack = mask_and_ack_8259A,
|
|
|
|
+};
|
|
|
|
+
|
|
static char irq_trigger[2];
|
|
static char irq_trigger[2];
|
|
/**
|
|
/**
|
|
* ELCR registers (0x4d0, 0x4d1) control edge/level of IRQ
|
|
* ELCR registers (0x4d0, 0x4d1) control edge/level of IRQ
|
|
@@ -342,9 +347,9 @@ static void init_8259A(int auto_eoi)
|
|
* In AEOI mode we just have to mask the interrupt
|
|
* In AEOI mode we just have to mask the interrupt
|
|
* when acking.
|
|
* when acking.
|
|
*/
|
|
*/
|
|
- i8259A_chip.mask_ack = disable_8259A_irq;
|
|
|
|
|
|
+ i8259A_chip.irq_mask_ack = disable_8259A_irq;
|
|
else
|
|
else
|
|
- i8259A_chip.mask_ack = mask_and_ack_8259A;
|
|
|
|
|
|
+ i8259A_chip.irq_mask_ack = mask_and_ack_8259A;
|
|
|
|
|
|
udelay(100); /* wait for 8259A to initialize */
|
|
udelay(100); /* wait for 8259A to initialize */
|
|
|
|
|
|
@@ -363,14 +368,6 @@ static void init_8259A(int auto_eoi)
|
|
static void legacy_pic_noop(void) { };
|
|
static void legacy_pic_noop(void) { };
|
|
static void legacy_pic_uint_noop(unsigned int unused) { };
|
|
static void legacy_pic_uint_noop(unsigned int unused) { };
|
|
static void legacy_pic_int_noop(int unused) { };
|
|
static void legacy_pic_int_noop(int unused) { };
|
|
-
|
|
|
|
-static struct irq_chip dummy_pic_chip = {
|
|
|
|
- .name = "dummy pic",
|
|
|
|
- .mask = legacy_pic_uint_noop,
|
|
|
|
- .unmask = legacy_pic_uint_noop,
|
|
|
|
- .disable = legacy_pic_uint_noop,
|
|
|
|
- .mask_ack = legacy_pic_uint_noop,
|
|
|
|
-};
|
|
|
|
static int legacy_pic_irq_pending_noop(unsigned int irq)
|
|
static int legacy_pic_irq_pending_noop(unsigned int irq)
|
|
{
|
|
{
|
|
return 0;
|
|
return 0;
|
|
@@ -378,7 +375,9 @@ static int legacy_pic_irq_pending_noop(unsigned int irq)
|
|
|
|
|
|
struct legacy_pic null_legacy_pic = {
|
|
struct legacy_pic null_legacy_pic = {
|
|
.nr_legacy_irqs = 0,
|
|
.nr_legacy_irqs = 0,
|
|
- .chip = &dummy_pic_chip,
|
|
|
|
|
|
+ .chip = &dummy_irq_chip,
|
|
|
|
+ .mask = legacy_pic_uint_noop,
|
|
|
|
+ .unmask = legacy_pic_uint_noop,
|
|
.mask_all = legacy_pic_noop,
|
|
.mask_all = legacy_pic_noop,
|
|
.restore_mask = legacy_pic_noop,
|
|
.restore_mask = legacy_pic_noop,
|
|
.init = legacy_pic_int_noop,
|
|
.init = legacy_pic_int_noop,
|
|
@@ -389,7 +388,9 @@ struct legacy_pic null_legacy_pic = {
|
|
struct legacy_pic default_legacy_pic = {
|
|
struct legacy_pic default_legacy_pic = {
|
|
.nr_legacy_irqs = NR_IRQS_LEGACY,
|
|
.nr_legacy_irqs = NR_IRQS_LEGACY,
|
|
.chip = &i8259A_chip,
|
|
.chip = &i8259A_chip,
|
|
- .mask_all = mask_8259A,
|
|
|
|
|
|
+ .mask = mask_8259A_irq,
|
|
|
|
+ .unmask = unmask_8259A_irq,
|
|
|
|
+ .mask_all = mask_8259A,
|
|
.restore_mask = unmask_8259A,
|
|
.restore_mask = unmask_8259A,
|
|
.init = init_8259A,
|
|
.init = init_8259A,
|
|
.irq_pending = i8259A_irq_pending,
|
|
.irq_pending = i8259A_irq_pending,
|