87 lines · c
1/* SPDX-License-Identifier: GPL-2.0 OR MIT */2 3/*4 * Xen para-virtual sound device5 *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_H12#define __XEN_SND_FRONT_EVTCHNL_H13 14#include <xen/interface/io/sndif.h>15 16struct xen_snd_front_info;17 18/* Timeout in ms to wait for backend to respond. */19#define VSND_WAIT_BACK_MS 300020 21enum xen_snd_front_evtchnl_state {22 EVTCHNL_STATE_DISCONNECTED,23 EVTCHNL_STATE_CONNECTED,24};25 26enum xen_snd_front_evtchnl_type {27 EVTCHNL_TYPE_REQ,28 EVTCHNL_TYPE_EVT,29};30 31struct 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 67struct xen_snd_front_evtchnl_pair {68 struct xen_snd_front_evtchnl req;69 struct xen_snd_front_evtchnl evt;70};71 72int xen_snd_front_evtchnl_create_all(struct xen_snd_front_info *front_info,73 int num_streams);74 75void xen_snd_front_evtchnl_free_all(struct xen_snd_front_info *front_info);76 77int xen_snd_front_evtchnl_publish_all(struct xen_snd_front_info *front_info);78 79void xen_snd_front_evtchnl_flush(struct xen_snd_front_evtchnl *evtchnl);80 81void xen_snd_front_evtchnl_pair_set_connected(struct xen_snd_front_evtchnl_pair *evt_pair,82 bool is_connected);83 84void xen_snd_front_evtchnl_pair_clear(struct xen_snd_front_evtchnl_pair *evt_pair);85 86#endif /* __XEN_SND_FRONT_EVTCHNL_H */87