Merge tag 'block-6.9-20240315' of git://git.kernel.dk/linux
[linux-2.6-block.git] / include / uapi / linux / virtio_snd.h
index dfe49547a7b04d6aa7e9cb474a0f103b2cd2b043..5f4100c2cf04cb44494fec115b70095f530b42c2 100644 (file)
@@ -7,6 +7,14 @@
 
 #include <linux/virtio_types.h>
 
+/*******************************************************************************
+ * FEATURE BITS
+ */
+enum {
+       /* device supports control elements */
+       VIRTIO_SND_F_CTLS = 0
+};
+
 /*******************************************************************************
  * CONFIGURATION SPACE
  */
@@ -17,6 +25,8 @@ struct virtio_snd_config {
        __le32 streams;
        /* # of available channel maps */
        __le32 chmaps;
+       /* # of available control elements */
+       __le32 controls;
 };
 
 enum {
@@ -55,6 +65,15 @@ enum {
        /* channel map control request types */
        VIRTIO_SND_R_CHMAP_INFO = 0x0200,
 
+       /* control element request types */
+       VIRTIO_SND_R_CTL_INFO = 0x0300,
+       VIRTIO_SND_R_CTL_ENUM_ITEMS,
+       VIRTIO_SND_R_CTL_READ,
+       VIRTIO_SND_R_CTL_WRITE,
+       VIRTIO_SND_R_CTL_TLV_READ,
+       VIRTIO_SND_R_CTL_TLV_WRITE,
+       VIRTIO_SND_R_CTL_TLV_COMMAND,
+
        /* jack event types */
        VIRTIO_SND_EVT_JACK_CONNECTED = 0x1000,
        VIRTIO_SND_EVT_JACK_DISCONNECTED,
@@ -63,6 +82,9 @@ enum {
        VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED = 0x1100,
        VIRTIO_SND_EVT_PCM_XRUN,
 
+       /* control element event types */
+       VIRTIO_SND_EVT_CTL_NOTIFY = 0x1200,
+
        /* common status codes */
        VIRTIO_SND_S_OK = 0x8000,
        VIRTIO_SND_S_BAD_MSG,
@@ -331,4 +353,136 @@ struct virtio_snd_chmap_info {
        __u8 positions[VIRTIO_SND_CHMAP_MAX_SIZE];
 };
 
+/*******************************************************************************
+ * CONTROL ELEMENTS MESSAGES
+ */
+struct virtio_snd_ctl_hdr {
+       /* VIRTIO_SND_R_CTL_XXX */
+       struct virtio_snd_hdr hdr;
+       /* 0 ... virtio_snd_config::controls - 1 */
+       __le32 control_id;
+};
+
+/* supported roles for control elements */
+enum {
+       VIRTIO_SND_CTL_ROLE_UNDEFINED = 0,
+       VIRTIO_SND_CTL_ROLE_VOLUME,
+       VIRTIO_SND_CTL_ROLE_MUTE,
+       VIRTIO_SND_CTL_ROLE_GAIN
+};
+
+/* supported value types for control elements */
+enum {
+       VIRTIO_SND_CTL_TYPE_BOOLEAN = 0,
+       VIRTIO_SND_CTL_TYPE_INTEGER,
+       VIRTIO_SND_CTL_TYPE_INTEGER64,
+       VIRTIO_SND_CTL_TYPE_ENUMERATED,
+       VIRTIO_SND_CTL_TYPE_BYTES,
+       VIRTIO_SND_CTL_TYPE_IEC958
+};
+
+/* supported access rights for control elements */
+enum {
+       VIRTIO_SND_CTL_ACCESS_READ = 0,
+       VIRTIO_SND_CTL_ACCESS_WRITE,
+       VIRTIO_SND_CTL_ACCESS_VOLATILE,
+       VIRTIO_SND_CTL_ACCESS_INACTIVE,
+       VIRTIO_SND_CTL_ACCESS_TLV_READ,
+       VIRTIO_SND_CTL_ACCESS_TLV_WRITE,
+       VIRTIO_SND_CTL_ACCESS_TLV_COMMAND
+};
+
+struct virtio_snd_ctl_info {
+       /* common header */
+       struct virtio_snd_info hdr;
+       /* element role (VIRTIO_SND_CTL_ROLE_XXX) */
+       __le32 role;
+       /* element value type (VIRTIO_SND_CTL_TYPE_XXX) */
+       __le32 type;
+       /* element access right bit map (1 << VIRTIO_SND_CTL_ACCESS_XXX) */
+       __le32 access;
+       /* # of members in the element value */
+       __le32 count;
+       /* index for an element with a non-unique name */
+       __le32 index;
+       /* name identifier string for the element */
+       __u8 name[44];
+       /* additional information about the element's value */
+       union {
+               /* VIRTIO_SND_CTL_TYPE_INTEGER */
+               struct {
+                       /* minimum supported value */
+                       __le32 min;
+                       /* maximum supported value */
+                       __le32 max;
+                       /* fixed step size for value (0 = variable size) */
+                       __le32 step;
+               } integer;
+               /* VIRTIO_SND_CTL_TYPE_INTEGER64 */
+               struct {
+                       /* minimum supported value */
+                       __le64 min;
+                       /* maximum supported value */
+                       __le64 max;
+                       /* fixed step size for value (0 = variable size) */
+                       __le64 step;
+               } integer64;
+               /* VIRTIO_SND_CTL_TYPE_ENUMERATED */
+               struct {
+                       /* # of options supported for value */
+                       __le32 items;
+               } enumerated;
+       } value;
+};
+
+struct virtio_snd_ctl_enum_item {
+       /* option name */
+       __u8 item[64];
+};
+
+struct virtio_snd_ctl_iec958 {
+       /* AES/IEC958 channel status bits */
+       __u8 status[24];
+       /* AES/IEC958 subcode bits */
+       __u8 subcode[147];
+       /* nothing */
+       __u8 pad;
+       /* AES/IEC958 subframe bits */
+       __u8 dig_subframe[4];
+};
+
+struct virtio_snd_ctl_value {
+       union {
+               /* VIRTIO_SND_CTL_TYPE_BOOLEAN|INTEGER value */
+               __le32 integer[128];
+               /* VIRTIO_SND_CTL_TYPE_INTEGER64 value */
+               __le64 integer64[64];
+               /* VIRTIO_SND_CTL_TYPE_ENUMERATED value (option indexes) */
+               __le32 enumerated[128];
+               /* VIRTIO_SND_CTL_TYPE_BYTES value */
+               __u8 bytes[512];
+               /* VIRTIO_SND_CTL_TYPE_IEC958 value */
+               struct virtio_snd_ctl_iec958 iec958;
+       } value;
+};
+
+/* supported event reason types */
+enum {
+       /* element's value has changed */
+       VIRTIO_SND_CTL_EVT_MASK_VALUE = 0,
+       /* element's information has changed */
+       VIRTIO_SND_CTL_EVT_MASK_INFO,
+       /* element's metadata has changed */
+       VIRTIO_SND_CTL_EVT_MASK_TLV
+};
+
+struct virtio_snd_ctl_event {
+       /* VIRTIO_SND_EVT_CTL_NOTIFY */
+       struct virtio_snd_hdr hdr;
+       /* 0 ... virtio_snd_config::controls - 1 */
+       __le16 control_id;
+       /* event reason bit map (1 << VIRTIO_SND_CTL_EVT_MASK_XXX) */
+       __le16 mask;
+};
+
 #endif /* VIRTIO_SND_IF_H */