xref: /OK3568_Linux_fs/kernel/include/uapi/sound/tlv.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *   This program is free software; you can redistribute it and/or modify
4*4882a593Smuzhiyun  *   it under the terms of the GNU General Public License as published by
5*4882a593Smuzhiyun  *   the Free Software Foundation; either version 2 of the License, or
6*4882a593Smuzhiyun  *   (at your option) any later version.
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *   This program is distributed in the hope that it will be useful,
9*4882a593Smuzhiyun  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
10*4882a593Smuzhiyun  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11*4882a593Smuzhiyun  *   GNU General Public License for more details.
12*4882a593Smuzhiyun  */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #ifndef __UAPI_SOUND_TLV_H
15*4882a593Smuzhiyun #define __UAPI_SOUND_TLV_H
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define SNDRV_CTL_TLVT_CONTAINER 0	/* one level down - group of TLVs */
18*4882a593Smuzhiyun #define SNDRV_CTL_TLVT_DB_SCALE	1       /* dB scale */
19*4882a593Smuzhiyun #define SNDRV_CTL_TLVT_DB_LINEAR 2	/* linear volume */
20*4882a593Smuzhiyun #define SNDRV_CTL_TLVT_DB_RANGE 3	/* dB range container */
21*4882a593Smuzhiyun #define SNDRV_CTL_TLVT_DB_MINMAX 4	/* dB scale with min/max */
22*4882a593Smuzhiyun #define SNDRV_CTL_TLVT_DB_MINMAX_MUTE 5	/* dB scale with min/max with mute */
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun /*
25*4882a593Smuzhiyun  * channel-mapping TLV items
26*4882a593Smuzhiyun  *  TLV length must match with num_channels
27*4882a593Smuzhiyun  */
28*4882a593Smuzhiyun #define SNDRV_CTL_TLVT_CHMAP_FIXED	0x101	/* fixed channel position */
29*4882a593Smuzhiyun #define SNDRV_CTL_TLVT_CHMAP_VAR	0x102	/* channels freely swappable */
30*4882a593Smuzhiyun #define SNDRV_CTL_TLVT_CHMAP_PAIRED	0x103	/* pair-wise swappable */
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun /*
33*4882a593Smuzhiyun  * TLV structure is right behind the struct snd_ctl_tlv:
34*4882a593Smuzhiyun  *   unsigned int type  	- see SNDRV_CTL_TLVT_*
35*4882a593Smuzhiyun  *   unsigned int length
36*4882a593Smuzhiyun  *   .... data aligned to sizeof(unsigned int), use
37*4882a593Smuzhiyun  *        block_length = (length + (sizeof(unsigned int) - 1)) &
38*4882a593Smuzhiyun  *                       ~(sizeof(unsigned int) - 1)) ....
39*4882a593Smuzhiyun  */
40*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_ITEM(type, ...) \
41*4882a593Smuzhiyun 	(type), SNDRV_CTL_TLVD_LENGTH(__VA_ARGS__), __VA_ARGS__
42*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_LENGTH(...) \
43*4882a593Smuzhiyun 	((unsigned int)sizeof((const unsigned int[]) { __VA_ARGS__ }))
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /* Accessor offsets for TLV data items */
46*4882a593Smuzhiyun #define SNDRV_CTL_TLVO_TYPE		0
47*4882a593Smuzhiyun #define SNDRV_CTL_TLVO_LEN		1
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_CONTAINER_ITEM(...) \
50*4882a593Smuzhiyun 	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_CONTAINER, __VA_ARGS__)
51*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DECLARE_CONTAINER(name, ...) \
52*4882a593Smuzhiyun 	unsigned int name[] = { \
53*4882a593Smuzhiyun 		SNDRV_CTL_TLVD_CONTAINER_ITEM(__VA_ARGS__) \
54*4882a593Smuzhiyun 	}
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DB_SCALE_MASK	0xffff
57*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DB_SCALE_MUTE	0x10000
58*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \
59*4882a593Smuzhiyun 	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_SCALE, \
60*4882a593Smuzhiyun 			    (min), \
61*4882a593Smuzhiyun 			    ((step) & SNDRV_CTL_TLVD_DB_SCALE_MASK) | \
62*4882a593Smuzhiyun 			     ((mute) ? SNDRV_CTL_TLVD_DB_SCALE_MUTE : 0))
63*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DECLARE_DB_SCALE(name, min, step, mute) \
64*4882a593Smuzhiyun 	unsigned int name[] = { \
65*4882a593Smuzhiyun 		SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \
66*4882a593Smuzhiyun 	}
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* Accessor offsets for min, mute and step items in dB scale type TLV */
69*4882a593Smuzhiyun #define SNDRV_CTL_TLVO_DB_SCALE_MIN		2
70*4882a593Smuzhiyun #define SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP	3
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun /* dB scale specified with min/max values instead of step */
73*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \
74*4882a593Smuzhiyun 	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX, (min_dB), (max_dB))
75*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \
76*4882a593Smuzhiyun 	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX_MUTE, (min_dB), (max_dB))
77*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(name, min_dB, max_dB) \
78*4882a593Smuzhiyun 	unsigned int name[] = { \
79*4882a593Smuzhiyun 		SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \
80*4882a593Smuzhiyun 	}
81*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX_MUTE(name, min_dB, max_dB) \
82*4882a593Smuzhiyun 	unsigned int name[] = { \
83*4882a593Smuzhiyun 		SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \
84*4882a593Smuzhiyun 	}
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun /* Accessor offsets for min, max items in db-minmax types of TLV. */
87*4882a593Smuzhiyun #define SNDRV_CTL_TLVO_DB_MINMAX_MIN	2
88*4882a593Smuzhiyun #define SNDRV_CTL_TLVO_DB_MINMAX_MAX	3
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun /* linear volume between min_dB and max_dB (.01dB unit) */
91*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \
92*4882a593Smuzhiyun 	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_LINEAR, (min_dB), (max_dB))
93*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DECLARE_DB_LINEAR(name, min_dB, max_dB) \
94*4882a593Smuzhiyun 	unsigned int name[] = { \
95*4882a593Smuzhiyun 		SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \
96*4882a593Smuzhiyun 	}
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /* Accessor offsets for min, max items in db-linear type of TLV. */
99*4882a593Smuzhiyun #define SNDRV_CTL_TLVO_DB_LINEAR_MIN	2
100*4882a593Smuzhiyun #define SNDRV_CTL_TLVO_DB_LINEAR_MAX	3
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun /* dB range container:
103*4882a593Smuzhiyun  * Items in dB range container must be ordered by their values and by their
104*4882a593Smuzhiyun  * dB values. This implies that larger values must correspond with larger
105*4882a593Smuzhiyun  * dB values (which is also required for all other mixer controls).
106*4882a593Smuzhiyun  */
107*4882a593Smuzhiyun /* Each item is: <min> <max> <TLV> */
108*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DB_RANGE_ITEM(...) \
109*4882a593Smuzhiyun 	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_RANGE, __VA_ARGS__)
110*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DECLARE_DB_RANGE(name, ...) \
111*4882a593Smuzhiyun 	unsigned int name[] = { \
112*4882a593Smuzhiyun 		SNDRV_CTL_TLVD_DB_RANGE_ITEM(__VA_ARGS__) \
113*4882a593Smuzhiyun 	}
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun #define SNDRV_CTL_TLVD_DB_GAIN_MUTE	-9999999
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun #endif
118