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