1e2be04c7SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ 2932ae880SLiam Girdwood 3932ae880SLiam Girdwood #ifndef __UAPI_SOUND_TLV_H 4932ae880SLiam Girdwood #define __UAPI_SOUND_TLV_H 5932ae880SLiam Girdwood 6932ae880SLiam Girdwood #define SNDRV_CTL_TLVT_CONTAINER 0 /* one level down - group of TLVs */ 7932ae880SLiam Girdwood #define SNDRV_CTL_TLVT_DB_SCALE 1 /* dB scale */ 8932ae880SLiam Girdwood #define SNDRV_CTL_TLVT_DB_LINEAR 2 /* linear volume */ 9932ae880SLiam Girdwood #define SNDRV_CTL_TLVT_DB_RANGE 3 /* dB range container */ 10932ae880SLiam Girdwood #define SNDRV_CTL_TLVT_DB_MINMAX 4 /* dB scale with min/max */ 11932ae880SLiam Girdwood #define SNDRV_CTL_TLVT_DB_MINMAX_MUTE 5 /* dB scale with min/max with mute */ 12932ae880SLiam Girdwood 13932ae880SLiam Girdwood /* 14932ae880SLiam Girdwood * channel-mapping TLV items 15932ae880SLiam Girdwood * TLV length must match with num_channels 16932ae880SLiam Girdwood */ 17932ae880SLiam Girdwood #define SNDRV_CTL_TLVT_CHMAP_FIXED 0x101 /* fixed channel position */ 18932ae880SLiam Girdwood #define SNDRV_CTL_TLVT_CHMAP_VAR 0x102 /* channels freely swappable */ 19932ae880SLiam Girdwood #define SNDRV_CTL_TLVT_CHMAP_PAIRED 0x103 /* pair-wise swappable */ 20932ae880SLiam Girdwood 21398fa4dbSTakashi Sakamoto /* 22398fa4dbSTakashi Sakamoto * TLV structure is right behind the struct snd_ctl_tlv: 23398fa4dbSTakashi Sakamoto * unsigned int type - see SNDRV_CTL_TLVT_* 24398fa4dbSTakashi Sakamoto * unsigned int length 25398fa4dbSTakashi Sakamoto * .... data aligned to sizeof(unsigned int), use 26398fa4dbSTakashi Sakamoto * block_length = (length + (sizeof(unsigned int) - 1)) & 27398fa4dbSTakashi Sakamoto * ~(sizeof(unsigned int) - 1)) .... 28398fa4dbSTakashi Sakamoto */ 2946e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_ITEM(type, ...) \ 3046e860f7STakashi Sakamoto (type), SNDRV_CTL_TLVD_LENGTH(__VA_ARGS__), __VA_ARGS__ 3146e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_LENGTH(...) \ 32398fa4dbSTakashi Sakamoto ((unsigned int)sizeof((const unsigned int[]) { __VA_ARGS__ })) 33398fa4dbSTakashi Sakamoto 3408f9f448SRanjani Sridharan /* Accessor offsets for TLV data items */ 3508f9f448SRanjani Sridharan #define SNDRV_CTL_TLVO_TYPE 0 3608f9f448SRanjani Sridharan #define SNDRV_CTL_TLVO_LEN 1 3708f9f448SRanjani Sridharan 3846e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_CONTAINER_ITEM(...) \ 3946e860f7STakashi Sakamoto SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_CONTAINER, __VA_ARGS__) 4046e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DECLARE_CONTAINER(name, ...) \ 4146e860f7STakashi Sakamoto unsigned int name[] = { \ 4246e860f7STakashi Sakamoto SNDRV_CTL_TLVD_CONTAINER_ITEM(__VA_ARGS__) \ 4346e860f7STakashi Sakamoto } 44398fa4dbSTakashi Sakamoto 4546e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DB_SCALE_MASK 0xffff 4646e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DB_SCALE_MUTE 0x10000 4746e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \ 4846e860f7STakashi Sakamoto SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_SCALE, \ 49398fa4dbSTakashi Sakamoto (min), \ 5046e860f7STakashi Sakamoto ((step) & SNDRV_CTL_TLVD_DB_SCALE_MASK) | \ 5146e860f7STakashi Sakamoto ((mute) ? SNDRV_CTL_TLVD_DB_SCALE_MUTE : 0)) 5246e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DECLARE_DB_SCALE(name, min, step, mute) \ 5346e860f7STakashi Sakamoto unsigned int name[] = { \ 5446e860f7STakashi Sakamoto SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \ 5546e860f7STakashi Sakamoto } 56398fa4dbSTakashi Sakamoto 5708f9f448SRanjani Sridharan /* Accessor offsets for min, mute and step items in dB scale type TLV */ 5808f9f448SRanjani Sridharan #define SNDRV_CTL_TLVO_DB_SCALE_MIN 2 5908f9f448SRanjani Sridharan #define SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP 3 6008f9f448SRanjani Sridharan 61398fa4dbSTakashi Sakamoto /* dB scale specified with min/max values instead of step */ 6246e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \ 6346e860f7STakashi Sakamoto SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX, (min_dB), (max_dB)) 6446e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \ 6546e860f7STakashi Sakamoto SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX_MUTE, (min_dB), (max_dB)) 6646e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(name, min_dB, max_dB) \ 6746e860f7STakashi Sakamoto unsigned int name[] = { \ 6846e860f7STakashi Sakamoto SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \ 6946e860f7STakashi Sakamoto } 7046e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX_MUTE(name, min_dB, max_dB) \ 7146e860f7STakashi Sakamoto unsigned int name[] = { \ 7246e860f7STakashi Sakamoto SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \ 7346e860f7STakashi Sakamoto } 74398fa4dbSTakashi Sakamoto 75*e6f32bf4STakashi Sakamoto /* Accessor offsets for min, max items in db-minmax types of TLV. */ 76*e6f32bf4STakashi Sakamoto #define SNDRV_CTL_TLVO_DB_MINMAX_MIN 2 77*e6f32bf4STakashi Sakamoto #define SNDRV_CTL_TLVO_DB_MINMAX_MAX 3 78*e6f32bf4STakashi Sakamoto 79398fa4dbSTakashi Sakamoto /* linear volume between min_dB and max_dB (.01dB unit) */ 8046e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \ 8146e860f7STakashi Sakamoto SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_LINEAR, (min_dB), (max_dB)) 8246e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DECLARE_DB_LINEAR(name, min_dB, max_dB) \ 8346e860f7STakashi Sakamoto unsigned int name[] = { \ 8446e860f7STakashi Sakamoto SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \ 8546e860f7STakashi Sakamoto } 86398fa4dbSTakashi Sakamoto 87*e6f32bf4STakashi Sakamoto /* Accessor offsets for min, max items in db-linear type of TLV. */ 88*e6f32bf4STakashi Sakamoto #define SNDRV_CTL_TLVO_DB_LINEAR_MIN 2 89*e6f32bf4STakashi Sakamoto #define SNDRV_CTL_TLVO_DB_LINEAR_MAX 3 90*e6f32bf4STakashi Sakamoto 91398fa4dbSTakashi Sakamoto /* dB range container: 92398fa4dbSTakashi Sakamoto * Items in dB range container must be ordered by their values and by their 93398fa4dbSTakashi Sakamoto * dB values. This implies that larger values must correspond with larger 94398fa4dbSTakashi Sakamoto * dB values (which is also required for all other mixer controls). 95398fa4dbSTakashi Sakamoto */ 96398fa4dbSTakashi Sakamoto /* Each item is: <min> <max> <TLV> */ 9746e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DB_RANGE_ITEM(...) \ 9846e860f7STakashi Sakamoto SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_RANGE, __VA_ARGS__) 9946e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DECLARE_DB_RANGE(name, ...) \ 10046e860f7STakashi Sakamoto unsigned int name[] = { \ 10146e860f7STakashi Sakamoto SNDRV_CTL_TLVD_DB_RANGE_ITEM(__VA_ARGS__) \ 10246e860f7STakashi Sakamoto } 103398fa4dbSTakashi Sakamoto 10446e860f7STakashi Sakamoto #define SNDRV_CTL_TLVD_DB_GAIN_MUTE -9999999 105398fa4dbSTakashi Sakamoto 106932ae880SLiam Girdwood #endif 107