diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2011-03-11 07:17:16 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2011-03-12 08:12:00 -0500 |
commit | c60eaf25cd211d2282a6edddb3ce26b1e5795097 (patch) | |
tree | 0488fa2a88af78e765476f43f768e023d5622aa7 | |
parent | 2c778651f73d92edb847e65d371bb29b17c7ca60 (diff) |
x86: ioapic: Simplify irq chip and handler setup
Use pointers instead of ugly multiline if/else constructs.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 48 |
1 files changed, 21 insertions, 27 deletions
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 7a88b04202e2..224edce72b87 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -1242,32 +1242,28 @@ static inline int IO_APIC_irq_trigger(int irq) | |||
1242 | 1242 | ||
1243 | static void ioapic_register_intr(unsigned int irq, unsigned long trigger) | 1243 | static void ioapic_register_intr(unsigned int irq, unsigned long trigger) |
1244 | { | 1244 | { |
1245 | struct irq_chip *chip = &ioapic_chip; | ||
1246 | irq_flow_handler_t hdl; | ||
1247 | bool fasteoi; | ||
1245 | 1248 | ||
1246 | if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || | 1249 | if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || |
1247 | trigger == IOAPIC_LEVEL) | 1250 | trigger == IOAPIC_LEVEL) { |
1248 | irq_set_status_flags(irq, IRQ_LEVEL); | 1251 | irq_set_status_flags(irq, IRQ_LEVEL); |
1249 | else | 1252 | fasteoi = true; |
1253 | } else { | ||
1250 | irq_clear_status_flags(irq, IRQ_LEVEL); | 1254 | irq_clear_status_flags(irq, IRQ_LEVEL); |
1255 | fasteoi = false; | ||
1256 | } | ||
1251 | 1257 | ||
1252 | if (irq_remapped(irq_get_chip_data(irq))) { | 1258 | if (irq_remapped(irq_get_chip_data(irq))) { |
1253 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); | 1259 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); |
1254 | if (trigger) | 1260 | chip = &ir_ioapic_chip; |
1255 | irq_set_chip_and_handler_name(irq, &ir_ioapic_chip, | 1261 | fasteoi = trigger != 0; |
1256 | handle_fasteoi_irq, | ||
1257 | "fasteoi"); | ||
1258 | else | ||
1259 | irq_set_chip_and_handler_name(irq, &ir_ioapic_chip, | ||
1260 | handle_edge_irq, "edge"); | ||
1261 | return; | ||
1262 | } | 1262 | } |
1263 | 1263 | ||
1264 | if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || | 1264 | hdl = fasteoi ? handle_fasteoi_irq : handle_edge_irq; |
1265 | trigger == IOAPIC_LEVEL) | 1265 | irq_set_chip_and_handler_name(irq, chip, hdl, |
1266 | irq_set_chip_and_handler_name(irq, &ioapic_chip, | 1266 | fasteoi ? "fasteoi" : "edge"); |
1267 | handle_fasteoi_irq, "fasteoi"); | ||
1268 | else | ||
1269 | irq_set_chip_and_handler_name(irq, &ioapic_chip, | ||
1270 | handle_edge_irq, "edge"); | ||
1271 | } | 1267 | } |
1272 | 1268 | ||
1273 | static int setup_ioapic_entry(int apic_id, int irq, | 1269 | static int setup_ioapic_entry(int apic_id, int irq, |
@@ -3264,6 +3260,7 @@ static int msi_alloc_irte(struct pci_dev *dev, int irq, int nvec) | |||
3264 | 3260 | ||
3265 | static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq) | 3261 | static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq) |
3266 | { | 3262 | { |
3263 | struct irq_chip *chip = &msi_chip; | ||
3267 | struct msi_msg msg; | 3264 | struct msi_msg msg; |
3268 | int ret; | 3265 | int ret; |
3269 | 3266 | ||
@@ -3276,11 +3273,10 @@ static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq) | |||
3276 | 3273 | ||
3277 | if (irq_remapped(irq_get_chip_data(irq))) { | 3274 | if (irq_remapped(irq_get_chip_data(irq))) { |
3278 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); | 3275 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); |
3279 | irq_set_chip_and_handler_name(irq, &msi_ir_chip, | 3276 | chip = &msi_ir_chip; |
3280 | handle_edge_irq, "edge"); | 3277 | } |
3281 | } else | 3278 | |
3282 | irq_set_chip_and_handler_name(irq, &msi_chip, | 3279 | irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge"); |
3283 | handle_edge_irq, "edge"); | ||
3284 | 3280 | ||
3285 | dev_printk(KERN_DEBUG, &dev->dev, "irq %d for MSI/MSI-X\n", irq); | 3281 | dev_printk(KERN_DEBUG, &dev->dev, "irq %d for MSI/MSI-X\n", irq); |
3286 | 3282 | ||
@@ -3457,6 +3453,7 @@ static struct irq_chip hpet_msi_type = { | |||
3457 | 3453 | ||
3458 | int arch_setup_hpet_msi(unsigned int irq, unsigned int id) | 3454 | int arch_setup_hpet_msi(unsigned int irq, unsigned int id) |
3459 | { | 3455 | { |
3456 | struct irq_chip *chip = &hpet_msi_type; | ||
3460 | struct msi_msg msg; | 3457 | struct msi_msg msg; |
3461 | int ret; | 3458 | int ret; |
3462 | 3459 | ||
@@ -3479,12 +3476,9 @@ int arch_setup_hpet_msi(unsigned int irq, unsigned int id) | |||
3479 | hpet_msi_write(irq_get_handler_data(irq), &msg); | 3476 | hpet_msi_write(irq_get_handler_data(irq), &msg); |
3480 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); | 3477 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); |
3481 | if (irq_remapped(irq_get_chip_data(irq))) | 3478 | if (irq_remapped(irq_get_chip_data(irq))) |
3482 | irq_set_chip_and_handler_name(irq, &ir_hpet_msi_type, | 3479 | chip = &ir_hpet_msi_type; |
3483 | handle_edge_irq, "edge"); | ||
3484 | else | ||
3485 | irq_set_chip_and_handler_name(irq, &hpet_msi_type, | ||
3486 | handle_edge_irq, "edge"); | ||
3487 | 3480 | ||
3481 | irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge"); | ||
3488 | return 0; | 3482 | return 0; |
3489 | } | 3483 | } |
3490 | #endif | 3484 | #endif |