afs: Provide a splice-read wrapper
[linux-block.git] / sound / xen / xen_snd_front_evtchnl.h
1 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
2
3 /*
4  * Xen para-virtual sound device
5  *
6  * Copyright (C) 2016-2018 EPAM Systems Inc.
7  *
8  * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
9  */
10
11 #ifndef __XEN_SND_FRONT_EVTCHNL_H
12 #define __XEN_SND_FRONT_EVTCHNL_H
13
14 #include <xen/interface/io/sndif.h>
15
16 struct xen_snd_front_info;
17
18 /* Timeout in ms to wait for backend to respond. */
19 #define VSND_WAIT_BACK_MS       3000
20
21 enum xen_snd_front_evtchnl_state {
22         EVTCHNL_STATE_DISCONNECTED,
23         EVTCHNL_STATE_CONNECTED,
24 };
25
26 enum xen_snd_front_evtchnl_type {
27         EVTCHNL_TYPE_REQ,
28         EVTCHNL_TYPE_EVT,
29 };
30
31 struct xen_snd_front_evtchnl {
32         struct xen_snd_front_info *front_info;
33         int gref;
34         int port;
35         int irq;
36         int index;
37         /* State of the event channel. */
38         enum xen_snd_front_evtchnl_state state;
39         enum xen_snd_front_evtchnl_type type;
40         /* Either response id or incoming event id. */
41         u16 evt_id;
42         /* Next request id or next expected event id. */
43         u16 evt_next_id;
44         /* Shared ring access lock. */
45         struct mutex ring_io_lock;
46         union {
47                 struct {
48                         struct xen_sndif_front_ring ring;
49                         struct completion completion;
50                         /* Serializer for backend IO: request/response. */
51                         struct mutex req_io_lock;
52
53                         /* Latest response status. */
54                         int resp_status;
55                         union {
56                                 struct xensnd_query_hw_param hw_param;
57                         } resp;
58                 } req;
59                 struct {
60                         struct xensnd_event_page *page;
61                         /* This is needed to handle XENSND_EVT_CUR_POS event. */
62                         struct snd_pcm_substream *substream;
63                 } evt;
64         } u;
65 };
66
67 struct xen_snd_front_evtchnl_pair {
68         struct xen_snd_front_evtchnl req;
69         struct xen_snd_front_evtchnl evt;
70 };
71
72 int xen_snd_front_evtchnl_create_all(struct xen_snd_front_info *front_info,
73                                      int num_streams);
74
75 void xen_snd_front_evtchnl_free_all(struct xen_snd_front_info *front_info);
76
77 int xen_snd_front_evtchnl_publish_all(struct xen_snd_front_info *front_info);
78
79 void xen_snd_front_evtchnl_flush(struct xen_snd_front_evtchnl *evtchnl);
80
81 void xen_snd_front_evtchnl_pair_set_connected(struct xen_snd_front_evtchnl_pair *evt_pair,
82                                               bool is_connected);
83
84 void xen_snd_front_evtchnl_pair_clear(struct xen_snd_front_evtchnl_pair *evt_pair);
85
86 #endif /* __XEN_SND_FRONT_EVTCHNL_H */