Lines Matching +full:max +full:- +full:by +full:- +full:define
1 /* SPDX-License-Identifier: GPL-2.0
3 * linux/sound/soc.h -- ALSA SoC Layer
11 #define __LINUX_SND_SOC_H
32 #define SOC_DOUBLE_VALUE(xreg, shift_left, shift_right, xmax, xinvert, xautodisable) \
35 .rshift = shift_right, .max = xmax, \
37 #define SOC_DOUBLE_S_VALUE(xreg, shift_left, shift_right, xmin, xmax, xsign_bit, xinvert, xautodisa…
40 .rshift = shift_right, .min = xmin, .max = xmax, \
42 #define SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, xautodisable) \
44 #define SOC_SINGLE_VALUE_EXT(xreg, xmax, xinvert) \
46 {.reg = xreg, .max = xmax, .invert = xinvert})
47 #define SOC_DOUBLE_R_VALUE(xlreg, xrreg, xshift, xmax, xinvert) \
50 .max = xmax, .invert = xinvert})
51 #define SOC_DOUBLE_R_S_VALUE(xlreg, xrreg, xshift, xmin, xmax, xsign_bit, xinvert) \
54 .max = xmax, .min = xmin, .sign_bit = xsign_bit, \
56 #define SOC_DOUBLE_R_RANGE_VALUE(xlreg, xrreg, xshift, xmin, xmax, xinvert) \
59 .min = xmin, .max = xmax, .invert = xinvert})
60 #define SOC_SINGLE(xname, reg, shift, max, invert) \ argument
64 .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
65 #define SOC_SINGLE_RANGE(xname, xreg, xshift, xmin, xmax, xinvert) \
71 .rshift = xshift, .min = xmin, .max = xmax, \
73 #define SOC_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \ argument
80 .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
81 #define SOC_SINGLE_SX_TLV(xname, xreg, xshift, xmin, xmax, tlv_array) \
92 .max = xmax, .min = xmin} }
93 #define SOC_SINGLE_RANGE_TLV(xname, xreg, xshift, xmin, xmax, xinvert, tlv_array) \
102 .rshift = xshift, .min = xmin, .max = xmax, \
104 #define SOC_DOUBLE(xname, reg, shift_left, shift_right, max, invert) \ argument
109 max, invert, 0) }
110 #define SOC_DOUBLE_STS(xname, reg, shift_left, shift_right, max, invert) \ argument
117 max, invert, 0) }
118 #define SOC_DOUBLE_R(xname, reg_left, reg_right, xshift, xmax, xinvert) \
124 #define SOC_DOUBLE_R_RANGE(xname, reg_left, reg_right, xshift, xmin, \
131 #define SOC_DOUBLE_TLV(xname, reg, shift_left, shift_right, max, invert, tlv_array) \ argument
139 max, invert, 0) }
140 #define SOC_DOUBLE_SX_TLV(xname, xreg, shift_left, shift_right, xmin, xmax, tlv_array) \
151 .max = xmax, .min = xmin} }
152 #define SOC_DOUBLE_R_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert, tlv_array) \
161 #define SOC_DOUBLE_R_RANGE_TLV(xname, reg_left, reg_right, xshift, xmin, \
171 #define SOC_DOUBLE_R_SX_TLV(xname, xreg, xrreg, xshift, xmin, xmax, tlv_array) \
182 .max = xmax, .min = xmin} }
183 #define SOC_DOUBLE_R_S_TLV(xname, reg_left, reg_right, xshift, xmin, xmax, xsign_bit, xinvert, tlv_…
192 #define SOC_SINGLE_S_TLV(xname, xreg, xshift, xmin, xmax, xsign_bit, xinvert, tlv_array) \
194 #define SOC_SINGLE_S8_TLV(xname, xreg, xmin, xmax, tlv_array) \
203 .min = xmin, .max = xmax, \
205 #define SOC_DOUBLE_S8_TLV(xname, xreg, xmin, xmax, tlv_array) \
213 #define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xitems, xtexts) \
216 .mask = xitems ? roundup_pow_of_two(xitems) - 1 : 0}
217 #define SOC_ENUM_SINGLE(xreg, xshift, xitems, xtexts) \
219 #define SOC_ENUM_SINGLE_EXT(xitems, xtexts) \
221 #define SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xitems, xtexts, xvalues) \
224 #define SOC_VALUE_ENUM_SINGLE(xreg, xshift, xmask, xitems, xtexts, xvalues) \
226 #define SOC_VALUE_ENUM_SINGLE_AUTODISABLE(xreg, xshift, xmask, xitems, xtexts, xvalues) \
230 #define SOC_ENUM_SINGLE_VIRT(xitems, xtexts) \
232 #define SOC_ENUM(xname, xenum) \
237 #define SOC_SINGLE_EXT(xname, xreg, xshift, xmax, xinvert,\
243 #define SOC_DOUBLE_EXT(xname, reg, shift_left, shift_right, max, invert,\ argument
249 SOC_DOUBLE_VALUE(reg, shift_left, shift_right, max, invert, 0) }
250 #define SOC_DOUBLE_R_EXT(xname, reg_left, reg_right, xshift, xmax, xinvert,\
257 #define SOC_SINGLE_EXT_TLV(xname, xreg, xshift, xmax, xinvert,\
266 #define SOC_SINGLE_RANGE_EXT_TLV(xname, xreg, xshift, xmin, xmax, xinvert, \
276 .rshift = xshift, .min = xmin, .max = xmax, \
278 #define SOC_DOUBLE_EXT_TLV(xname, xreg, shift_left, shift_right, xmax, xinvert,\
288 #define SOC_DOUBLE_R_EXT_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert,\
298 #define SOC_DOUBLE_R_S_EXT_TLV(xname, reg_left, reg_right, xshift, xmin, xmax, \
309 #define SOC_SINGLE_S_EXT_TLV(xname, xreg, xshift, xmin, xmax, \
315 #define SOC_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) \
320 #define SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
325 #define SOC_VALUE_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
328 #define SND_SOC_BYTES(xname, xbase, xregs) \
334 #define SND_SOC_BYTES_E(xname, xbase, xregs, xhandler_get, xhandler_put) \
341 #define SND_SOC_BYTES_MASK(xname, xbase, xregs, xmask) \
352 #define SND_SOC_BYTES_EXT(xname, xcount, xhandler_get, xhandler_put) \
357 {.max = xcount} }
358 #define SND_SOC_BYTES_TLV(xname, xcount, xhandler_get, xhandler_put) \
365 {.max = xcount, .get = xhandler_get, .put = xhandler_put, } }
366 #define SOC_SINGLE_XR_SX(xname, xregbase, xregcount, xnbits, \
373 .invert = xinvert, .min = xmin, .max = xmax} }
375 #define SOC_SINGLE_STROBE(xname, xreg, xshift, xinvert) \
383 #define SOC_ENUM_DOUBLE_DECL(name, xreg, xshift_l, xshift_r, xtexts) \
386 #define SOC_ENUM_SINGLE_DECL(name, xreg, xshift, xtexts) \
388 #define SOC_ENUM_SINGLE_EXT_DECL(name, xtexts) \
390 #define SOC_VALUE_ENUM_DOUBLE_DECL(name, xreg, xshift_l, xshift_r, xmask, xtexts, xvalues) \
393 #define SOC_VALUE_ENUM_SINGLE_DECL(name, xreg, xshift, xmask, xtexts, xvalues) \
396 #define SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(name, xreg, xshift, xmask, xtexts, xvalues) \
400 #define SOC_ENUM_SINGLE_VIRT_DECL(name, xtexts) \
418 #include <sound/soc-dapm.h>
419 #include <sound/soc-dpcm.h>
420 #include <sound/soc-topology.h>
494 snd_soc_runtime_action(rtd, stream, -1); in snd_soc_runtime_deactivate()
571 #define snd_soc_info_bool_ext snd_ctl_boolean_mono_info
576 #define snd_soc_get_volsw_2r snd_soc_get_volsw
577 #define snd_soc_put_volsw_2r snd_soc_put_volsw
589 const char *name, int max);
613 SND_SOC_TRIGGER_ORDER_DEFAULT = 0, /* Link->Component->DAI DAI->Component->Link */
614 SND_SOC_TRIGGER_ORDER_LDC, /* Link->DAI->Component Component->DAI->Link */
626 unsigned int rate_max; /* max rate */
628 unsigned int channels_max; /* max channels */
660 * [dai_link->ch_maps Image sample]
662 *-------------------------
663 * CPU0 <---> Codec0
665 * ch-map[0].cpu = 0 ch-map[0].codec = 0
667 *-------------------------
668 * CPU0 <---> Codec0
669 * CPU1 <---> Codec1
670 * CPU2 <---> Codec2
672 * ch-map[0].cpu = 0 ch-map[0].codec = 0
673 * ch-map[1].cpu = 1 ch-map[1].codec = 1
674 * ch-map[2].cpu = 2 ch-map[2].codec = 2
676 *-------------------------
677 * CPU0 <---> Codec0
678 * CPU1 <-+-> Codec1
679 * CPU2 <-/
681 * ch-map[0].cpu = 0 ch-map[0].codec = 0
682 * ch-map[1].cpu = 1 ch-map[1].codec = 1
683 * ch-map[2].cpu = 2 ch-map[2].codec = 1
685 *-------------------------
686 * CPU0 <---> Codec0
687 * CPU1 <-+-> Codec1
688 * \-> Codec2
690 * ch-map[0].cpu = 0 ch-map[0].codec = 0
691 * ch-map[1].cpu = 1 ch-map[1].codec = 1
692 * ch-map[2].cpu = 1 ch-map[2].codec = 2
702 /* config - must be set by machine driver */
707 * You MAY specify the link's CPU-side device, either by device name,
708 * or by DT/OF node, but not both. If this information is omitted,
709 * the CPU-side DAI is matched using .cpu_dai_name only, which hence
715 * omitted, the CPU-side DAI is matched using .cpu_name/.cpu_of_node
722 * You MUST specify the link's codec, either by device name, or by
729 /* num_ch_maps = max(num_cpu, num_codecs) */
733 * You MAY specify the link's platform/PCM/DMA driver, either by
734 * device name, or by DT/OF node, but not both. Some forms of link
752 /* codec/machine specific init - e.g. add machine controls */
755 /* codec/machine specific exit - dual of init() */
758 /* optional hw_params re-writing for BE and FE sync */
819 return max(link->num_cpus, link->num_codecs); in snd_soc_link_num_ch_map()
824 return &(link)->cpus[n]; in snd_soc_link_to_cpu()
829 return &(link)->codecs[n]; in snd_soc_link_to_codec()
834 return &(link)->platforms[n]; in snd_soc_link_to_platform()
837 #define for_each_link_codecs(link, i, codec) \
839 ((i) < link->num_codecs) && \
843 #define for_each_link_platforms(link, i, platform) \
845 ((i) < link->num_platforms) && \
849 #define for_each_link_cpus(link, i, cpu) \
851 ((i) < link->num_cpus) && \
855 #define for_each_link_ch_maps(link, i, ch_map) \
858 ((ch_map) = link->ch_maps + i)); \
887 * Sample 3 : Define each CPU/Codec/Platform manually
914 #define SND_SOC_DAILINK_REG1(name) SND_SOC_DAILINK_REG3(name##_cpus, name##_codecs, name##_platfor…
915 #define SND_SOC_DAILINK_REG2(cpu, codec) SND_SOC_DAILINK_REG3(cpu, codec, null_dailink_component)
916 #define SND_SOC_DAILINK_REG3(cpu, codec, platform) \
924 #define SND_SOC_DAILINK_REG(...) \
927 #define SND_SOC_DAILINK_DEF(name, def...) \
930 #define SND_SOC_DAILINK_DEFS(name, cpu, codec, platform...) \
935 #define DAILINK_COMP_ARRAY(param...) param
936 #define COMP_EMPTY() { }
937 #define COMP_CPU(_dai) { .dai_name = _dai, }
938 #define COMP_CODEC(_name, _dai) { .name = _name, .dai_name = _dai, }
939 #define COMP_PLATFORM(_name) { .name = _name }
940 #define COMP_AUX(_name) { .name = _name }
941 #define COMP_CODEC_CONF(_name) { .name = _name }
942 #define COMP_DUMMY() /* see snd_soc_fill_dummy_dai() */
950 * specify device either by device name, or by
964 * specify multi-codec either by device name, or by
969 /* codec/machine specific init - e.g. add machine controls */
985 * PCI does not define 0 as invalid, so pci_subsystem_set indicates
1033 /* CPU <--> Codec DAI links */
1056 * Card-specific routes and widgets.
1057 * Note: of_dapm_xxx for Device Tree; Otherwise for driver build-in.
1103 #define for_each_card_prelinks(card, i, link) \
1105 ((i) < (card)->num_links) && ((link) = &(card)->dai_link[i]); \
1107 #define for_each_card_pre_auxs(card, i, aux) \
1109 ((i) < (card)->num_aux_devs) && ((aux) = &(card)->aux_dev[i]); \
1112 #define for_each_card_rtds(card, rtd) \
1113 list_for_each_entry(rtd, &(card)->rtd_list, list)
1114 #define for_each_card_rtds_safe(card, rtd, _rtd) \
1115 list_for_each_entry_safe(rtd, _rtd, &(card)->rtd_list, list)
1117 #define for_each_card_auxs(card, component) \
1118 list_for_each_entry(component, &card->aux_comp_list, card_aux_list)
1119 #define for_each_card_auxs_safe(card, component, _comp) \
1121 &card->aux_comp_list, card_aux_list)
1123 #define for_each_card_components(card, component) \
1124 list_for_each_entry(component, &(card)->component_dev_list, card_list)
1126 #define for_each_card_dapms(card, dapm) \
1127 list_for_each_entry(dapm, &card->dapm_list, list)
1129 #define for_each_card_widgets(card, w)\
1130 list_for_each_entry(w, &card->widgets, list)
1131 #define for_each_card_widgets_safe(card, w, _w) \
1132 list_for_each_entry_safe(w, _w, &card->widgets, list)
1137 return card && card->instantiated; in snd_soc_card_is_instantiated()
1174 unsigned int num; /* 0-based and monotonic increasing */
1194 #define snd_soc_rtd_to_cpu(rtd, n) (rtd)->dais[n]
1195 #define snd_soc_rtd_to_codec(rtd, n) (rtd)->dais[n + (rtd)->dai_link->num_cpus]
1196 #define snd_soc_substream_to_rtd(substream) \
1199 #define for_each_rtd_components(rtd, i, component) \
1201 ((i) < rtd->num_components) && ((component) = rtd->components[i]);\
1203 #define for_each_rtd_cpu_dais(rtd, i, dai) \
1205 ((i) < rtd->dai_link->num_cpus) && ((dai) = snd_soc_rtd_to_cpu(rtd, i)); \
1207 #define for_each_rtd_codec_dais(rtd, i, dai) \
1209 ((i) < rtd->dai_link->num_codecs) && ((dai) = snd_soc_rtd_to_codec(rtd, i)); \
1211 #define for_each_rtd_dais(rtd, i, dai) \
1213 ((i) < (rtd)->dai_link->num_cpus + (rtd)->dai_link->num_codecs) && \
1214 ((dai) = (rtd)->dais[i]); \
1216 #define for_each_rtd_ch_maps(rtd, i, ch_maps) for_each_link_ch_maps(rtd->dai_link, i, ch_maps)
1222 int min, max, platform_max; member
1240 int max; member
1253 long min, max; member
1274 if (mc->reg == mc->rreg && mc->shift == mc->rshift) in snd_soc_volsw_is_stereo()
1277 * mc->reg == mc->rreg && mc->shift != mc->rshift, or in snd_soc_volsw_is_stereo()
1278 * mc->reg != mc->rreg means that the control is in snd_soc_volsw_is_stereo()
1289 if (!e->values) in snd_soc_enum_val_to_item()
1292 for (i = 0; i < e->items; i++) in snd_soc_enum_val_to_item()
1293 if (val == e->values[i]) in snd_soc_enum_val_to_item()
1302 if (!e->values) in snd_soc_enum_item_to_val()
1305 return e->values[item]; in snd_soc_enum_item_to_val()
1309 * snd_soc_kcontrol_component() - Returns the component that registered the
1350 snd_soc_of_parse_node_prefix(card->dev->of_node, in snd_soc_of_parse_audio_prefix()
1366 #define snd_soc_daifmt_parse_clock_provider_as_bitmap(np, prefix) \
1368 #define snd_soc_daifmt_parse_clock_provider_as_phandle \
1370 #define snd_soc_daifmt_parse_clock_provider_as_flag(np, prefix) \
1420 #include <sound/soc-dai.h>
1436 if (dai_link->num_platforms != 1) in snd_soc_fixup_dai_links_platform_name()
1437 return -EINVAL; in snd_soc_fixup_dai_links_platform_name()
1439 if (!dai_link->platforms) in snd_soc_fixup_dai_links_platform_name()
1440 return -EINVAL; in snd_soc_fixup_dai_links_platform_name()
1442 name = devm_kstrdup(card->dev, platform_name, GFP_KERNEL); in snd_soc_fixup_dai_links_platform_name()
1444 return -ENOMEM; in snd_soc_fixup_dai_links_platform_name()
1447 dai_link->platforms->name = name; in snd_soc_fixup_dai_links_platform_name()
1469 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_ROOT); in _snd_soc_dapm_mutex_lock_root_c()
1474 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); in _snd_soc_dapm_mutex_lock_c()
1479 mutex_unlock(&card->dapm_mutex); in _snd_soc_dapm_mutex_unlock_c()
1484 lockdep_assert_held(&card->dapm_mutex); in _snd_soc_dapm_mutex_assert_held_c()
1489 _snd_soc_dapm_mutex_lock_root_c(dapm->card); in _snd_soc_dapm_mutex_lock_root_d()
1494 _snd_soc_dapm_mutex_lock_c(dapm->card); in _snd_soc_dapm_mutex_lock_d()
1499 _snd_soc_dapm_mutex_unlock_c(dapm->card); in _snd_soc_dapm_mutex_unlock_d()
1504 _snd_soc_dapm_mutex_assert_held_c(dapm->card); in _snd_soc_dapm_mutex_assert_held_d()
1507 #define snd_soc_dapm_mutex_lock_root(x) _Generic((x), \
1510 #define snd_soc_dapm_mutex_lock(x) _Generic((x), \
1513 #define snd_soc_dapm_mutex_unlock(x) _Generic((x), \
1516 #define snd_soc_dapm_mutex_assert_held(x) _Generic((x), \
1525 mutex_lock_nested(&card->pcm_mutex, card->pcm_subclass); in _snd_soc_dpcm_mutex_lock_c()
1530 mutex_unlock(&card->pcm_mutex); in _snd_soc_dpcm_mutex_unlock_c()
1535 lockdep_assert_held(&card->pcm_mutex); in _snd_soc_dpcm_mutex_assert_held_c()
1540 _snd_soc_dpcm_mutex_lock_c(rtd->card); in _snd_soc_dpcm_mutex_lock_r()
1545 _snd_soc_dpcm_mutex_unlock_c(rtd->card); in _snd_soc_dpcm_mutex_unlock_r()
1550 _snd_soc_dpcm_mutex_assert_held_c(rtd->card); in _snd_soc_dpcm_mutex_assert_held_r()
1553 #define snd_soc_dpcm_mutex_lock(x) _Generic((x), \
1557 #define snd_soc_dpcm_mutex_unlock(x) _Generic((x), \
1561 #define snd_soc_dpcm_mutex_assert_held(x) _Generic((x), \
1565 #include <sound/soc-component.h>
1566 #include <sound/soc-card.h>
1567 #include <sound/soc-jack.h>