xref: /linux/include/uapi/sound/tlv.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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