Commit | Line | Data |
---|---|---|
611e097d CB |
1 | /* |
2 | * Copyright IBM Corp. 2001,2008 | |
3 | * | |
4 | * This file contains the IRQ specific code for hvc_console | |
5 | * | |
6 | */ | |
7 | ||
8 | #include <linux/interrupt.h> | |
9 | ||
10 | #include "hvc_console.h" | |
11 | ||
12 | static irqreturn_t hvc_handle_interrupt(int irq, void *dev_instance) | |
13 | { | |
14 | /* if hvc_poll request a repoll, then kick the hvcd thread */ | |
15 | if (hvc_poll(dev_instance)) | |
16 | hvc_kick(); | |
17 | return IRQ_HANDLED; | |
18 | } | |
19 | ||
20 | /* | |
21 | * For IRQ based systems these callbacks can be used | |
22 | */ | |
23 | int notifier_add_irq(struct hvc_struct *hp, int irq) | |
24 | { | |
25 | int rc; | |
26 | ||
27 | if (!irq) { | |
28 | hp->irq_requested = 0; | |
29 | return 0; | |
30 | } | |
31 | rc = request_irq(irq, hvc_handle_interrupt, IRQF_DISABLED, | |
32 | "hvc_console", hp); | |
33 | if (!rc) | |
34 | hp->irq_requested = 1; | |
35 | return rc; | |
36 | } | |
37 | ||
38 | void notifier_del_irq(struct hvc_struct *hp, int irq) | |
39 | { | |
c21f7a52 | 40 | if (!hp->irq_requested) |
611e097d CB |
41 | return; |
42 | free_irq(irq, hp); | |
43 | hp->irq_requested = 0; | |
44 | } | |
fc362e2e HB |
45 | |
46 | void notifier_hangup_irq(struct hvc_struct *hp, int irq) | |
47 | { | |
48 | notifier_del_irq(hp, irq); | |
49 | } |