1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /* SPDX-License-Identifier: GPL-2.0 OR MIT */
- /*
- * Xen para-virtual sound device
- *
- * Copyright (C) 2016-2018 EPAM Systems Inc.
- *
- * Author: Oleksandr Andrushchenko <[email protected]>
- */
- #ifndef __XEN_SND_FRONT_EVTCHNL_H
- #define __XEN_SND_FRONT_EVTCHNL_H
- #include <xen/interface/io/sndif.h>
- struct xen_snd_front_info;
- /* Timeout in ms to wait for backend to respond. */
- #define VSND_WAIT_BACK_MS 3000
- enum xen_snd_front_evtchnl_state {
- EVTCHNL_STATE_DISCONNECTED,
- EVTCHNL_STATE_CONNECTED,
- };
- enum xen_snd_front_evtchnl_type {
- EVTCHNL_TYPE_REQ,
- EVTCHNL_TYPE_EVT,
- };
- struct xen_snd_front_evtchnl {
- struct xen_snd_front_info *front_info;
- int gref;
- int port;
- int irq;
- int index;
- /* State of the event channel. */
- enum xen_snd_front_evtchnl_state state;
- enum xen_snd_front_evtchnl_type type;
- /* Either response id or incoming event id. */
- u16 evt_id;
- /* Next request id or next expected event id. */
- u16 evt_next_id;
- /* Shared ring access lock. */
- struct mutex ring_io_lock;
- union {
- struct {
- struct xen_sndif_front_ring ring;
- struct completion completion;
- /* Serializer for backend IO: request/response. */
- struct mutex req_io_lock;
- /* Latest response status. */
- int resp_status;
- union {
- struct xensnd_query_hw_param hw_param;
- } resp;
- } req;
- struct {
- struct xensnd_event_page *page;
- /* This is needed to handle XENSND_EVT_CUR_POS event. */
- struct snd_pcm_substream *substream;
- } evt;
- } u;
- };
- struct xen_snd_front_evtchnl_pair {
- struct xen_snd_front_evtchnl req;
- struct xen_snd_front_evtchnl evt;
- };
- int xen_snd_front_evtchnl_create_all(struct xen_snd_front_info *front_info,
- int num_streams);
- void xen_snd_front_evtchnl_free_all(struct xen_snd_front_info *front_info);
- int xen_snd_front_evtchnl_publish_all(struct xen_snd_front_info *front_info);
- void xen_snd_front_evtchnl_flush(struct xen_snd_front_evtchnl *evtchnl);
- void xen_snd_front_evtchnl_pair_set_connected(struct xen_snd_front_evtchnl_pair *evt_pair,
- bool is_connected);
- void xen_snd_front_evtchnl_pair_clear(struct xen_snd_front_evtchnl_pair *evt_pair);
- #endif /* __XEN_SND_FRONT_EVTCHNL_H */
|