Merge tag 'asoc-fix-v5.14-rc2' of https://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / arch / um / include / shared / irq_kern.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
4  */
5
6 #ifndef __IRQ_KERN_H__
7 #define __IRQ_KERN_H__
8
9 #include <linux/interrupt.h>
10 #include <linux/time-internal.h>
11 #include <asm/ptrace.h>
12 #include "irq_user.h"
13
14 #define UM_IRQ_ALLOC    -1
15
16 int um_request_irq(int irq, int fd, enum um_irq_type type,
17                    irq_handler_t handler, unsigned long irqflags,
18                    const char *devname, void *dev_id);
19
20 #ifdef CONFIG_UML_TIME_TRAVEL_SUPPORT
21 /**
22  * um_request_irq_tt - request an IRQ with timetravel handler
23  *
24  * @irq: the IRQ number, or %UM_IRQ_ALLOC
25  * @fd: The file descriptor to request an IRQ for
26  * @type: read or write
27  * @handler: the (generic style) IRQ handler
28  * @irqflags: Linux IRQ flags
29  * @devname: name for this to show
30  * @dev_id: data pointer to pass to the IRQ handler
31  * @timetravel_handler: the timetravel interrupt handler, invoked with the IRQ
32  *      number, fd, dev_id and time-travel event pointer.
33  *
34  * Returns: The interrupt number assigned or a negative error.
35  *
36  * Note that the timetravel handler is invoked only if the time_travel_mode is
37  * %TT_MODE_EXTERNAL, and then it is invoked even while the system is suspended!
38  * This function must call time_travel_add_irq_event() for the event passed with
39  * an appropriate delay, before sending an ACK on the socket it was invoked for.
40  *
41  * If this was called while the system is suspended, then adding the event will
42  * cause the system to resume.
43  *
44  * Since this function will almost certainly have to handle the FD's condition,
45  * a read will consume the message, and after that it is up to the code using
46  * it to pass such a message to the @handler in whichever way it can.
47  *
48  * If time_travel_mode is not %TT_MODE_EXTERNAL the @timetravel_handler will
49  * not be invoked at all and the @handler must handle the FD becoming
50  * readable (or writable) instead. Use um_irq_timetravel_handler_used() to
51  * distinguish these cases.
52  *
53  * See virtio_uml.c for an example.
54  */
55 int um_request_irq_tt(int irq, int fd, enum um_irq_type type,
56                       irq_handler_t handler, unsigned long irqflags,
57                       const char *devname, void *dev_id,
58                       void (*timetravel_handler)(int, int, void *,
59                                                  struct time_travel_event *));
60 #else
61 static inline
62 int um_request_irq_tt(int irq, int fd, enum um_irq_type type,
63                       irq_handler_t handler, unsigned long irqflags,
64                       const char *devname, void *dev_id,
65                       void (*timetravel_handler)(int, int, void *,
66                                                  struct time_travel_event *))
67 {
68         return um_request_irq(irq, fd, type, handler, irqflags,
69                               devname, dev_id);
70 }
71 #endif
72
73 static inline bool um_irq_timetravel_handler_used(void)
74 {
75         return time_travel_mode == TT_MODE_EXTERNAL;
76 }
77
78 void um_free_irq(int irq, void *dev_id);
79 #endif