cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

soc-dapm.h (32993B)


      1/* SPDX-License-Identifier: GPL-2.0
      2 *
      3 * linux/sound/soc-dapm.h -- ALSA SoC Dynamic Audio Power Management
      4 *
      5 * Author:	Liam Girdwood
      6 * Created:	Aug 11th 2005
      7 * Copyright:	Wolfson Microelectronics. PLC.
      8 */
      9
     10#ifndef __LINUX_SND_SOC_DAPM_H
     11#define __LINUX_SND_SOC_DAPM_H
     12
     13#include <linux/types.h>
     14#include <sound/control.h>
     15#include <sound/soc-topology.h>
     16#include <sound/asoc.h>
     17
     18struct device;
     19struct snd_soc_pcm_runtime;
     20struct soc_enum;
     21
     22/* widget has no PM register bit */
     23#define SND_SOC_NOPM	-1
     24
     25/*
     26 * SoC dynamic audio power management
     27 *
     28 * We can have up to 4 power domains
     29 *  1. Codec domain - VREF, VMID
     30 *     Usually controlled at codec probe/remove, although can be set
     31 *     at stream time if power is not needed for sidetone, etc.
     32 *  2. Platform/Machine domain - physically connected inputs and outputs
     33 *     Is platform/machine and user action specific, is set in the machine
     34 *     driver and by userspace e.g when HP are inserted
     35 *  3. Path domain - Internal codec path mixers
     36 *     Are automatically set when mixer and mux settings are
     37 *     changed by the user.
     38 *  4. Stream domain - DAC's and ADC's.
     39 *     Enabled when stream playback/capture is started.
     40 */
     41
     42/* codec domain */
     43#define SND_SOC_DAPM_VMID(wname) \
     44{	.id = snd_soc_dapm_vmid, .name = wname, .kcontrol_news = NULL, \
     45	.num_kcontrols = 0}
     46
     47/* platform domain */
     48#define SND_SOC_DAPM_SIGGEN(wname) \
     49{	.id = snd_soc_dapm_siggen, .name = wname, .kcontrol_news = NULL, \
     50	.num_kcontrols = 0, .reg = SND_SOC_NOPM }
     51#define SND_SOC_DAPM_SINK(wname) \
     52{	.id = snd_soc_dapm_sink, .name = wname, .kcontrol_news = NULL, \
     53	.num_kcontrols = 0, .reg = SND_SOC_NOPM }
     54#define SND_SOC_DAPM_INPUT(wname) \
     55{	.id = snd_soc_dapm_input, .name = wname, .kcontrol_news = NULL, \
     56	.num_kcontrols = 0, .reg = SND_SOC_NOPM }
     57#define SND_SOC_DAPM_OUTPUT(wname) \
     58{	.id = snd_soc_dapm_output, .name = wname, .kcontrol_news = NULL, \
     59	.num_kcontrols = 0, .reg = SND_SOC_NOPM }
     60#define SND_SOC_DAPM_MIC(wname, wevent) \
     61{	.id = snd_soc_dapm_mic, .name = wname, .kcontrol_news = NULL, \
     62	.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
     63	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD}
     64#define SND_SOC_DAPM_HP(wname, wevent) \
     65{	.id = snd_soc_dapm_hp, .name = wname, .kcontrol_news = NULL, \
     66	.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
     67	.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
     68#define SND_SOC_DAPM_SPK(wname, wevent) \
     69{	.id = snd_soc_dapm_spk, .name = wname, .kcontrol_news = NULL, \
     70	.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
     71	.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
     72#define SND_SOC_DAPM_LINE(wname, wevent) \
     73{	.id = snd_soc_dapm_line, .name = wname, .kcontrol_news = NULL, \
     74	.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
     75	.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
     76
     77#define SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert) \
     78	.reg = wreg, .mask = 1, .shift = wshift, \
     79	.on_val = winvert ? 0 : 1, .off_val = winvert ? 1 : 0
     80
     81/* path domain */
     82#define SND_SOC_DAPM_PGA(wname, wreg, wshift, winvert,\
     83	 wcontrols, wncontrols) \
     84{	.id = snd_soc_dapm_pga, .name = wname, \
     85	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
     86	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols}
     87#define SND_SOC_DAPM_OUT_DRV(wname, wreg, wshift, winvert,\
     88	 wcontrols, wncontrols) \
     89{	.id = snd_soc_dapm_out_drv, .name = wname, \
     90	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
     91	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols}
     92#define SND_SOC_DAPM_MIXER(wname, wreg, wshift, winvert, \
     93	 wcontrols, wncontrols)\
     94{	.id = snd_soc_dapm_mixer, .name = wname, \
     95	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
     96	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols}
     97#define SND_SOC_DAPM_MIXER_NAMED_CTL(wname, wreg, wshift, winvert, \
     98	 wcontrols, wncontrols)\
     99{       .id = snd_soc_dapm_mixer_named_ctl, .name = wname, \
    100	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    101	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols}
    102/* DEPRECATED: use SND_SOC_DAPM_SUPPLY */
    103#define SND_SOC_DAPM_MICBIAS(wname, wreg, wshift, winvert) \
    104{	.id = snd_soc_dapm_micbias, .name = wname, \
    105	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    106	.kcontrol_news = NULL, .num_kcontrols = 0}
    107#define SND_SOC_DAPM_SWITCH(wname, wreg, wshift, winvert, wcontrols) \
    108{	.id = snd_soc_dapm_switch, .name = wname, \
    109	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    110	.kcontrol_news = wcontrols, .num_kcontrols = 1}
    111#define SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols) \
    112{	.id = snd_soc_dapm_mux, .name = wname, \
    113	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    114	.kcontrol_news = wcontrols, .num_kcontrols = 1}
    115#define SND_SOC_DAPM_DEMUX(wname, wreg, wshift, winvert, wcontrols) \
    116{	.id = snd_soc_dapm_demux, .name = wname, \
    117	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    118	.kcontrol_news = wcontrols, .num_kcontrols = 1}
    119
    120/* Simplified versions of above macros, assuming wncontrols = ARRAY_SIZE(wcontrols) */
    121#define SOC_PGA_ARRAY(wname, wreg, wshift, winvert,\
    122	 wcontrols) \
    123{	.id = snd_soc_dapm_pga, .name = wname, \
    124	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    125	.kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols)}
    126#define SOC_MIXER_ARRAY(wname, wreg, wshift, winvert, \
    127	 wcontrols)\
    128{	.id = snd_soc_dapm_mixer, .name = wname, \
    129	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    130	.kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols)}
    131#define SOC_MIXER_NAMED_CTL_ARRAY(wname, wreg, wshift, winvert, \
    132	 wcontrols)\
    133{       .id = snd_soc_dapm_mixer_named_ctl, .name = wname, \
    134	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    135	.kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols)}
    136
    137/* path domain with event - event handler must return 0 for success */
    138#define SND_SOC_DAPM_PGA_E(wname, wreg, wshift, winvert, wcontrols, \
    139	wncontrols, wevent, wflags) \
    140{	.id = snd_soc_dapm_pga, .name = wname, \
    141	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    142	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols, \
    143	.event = wevent, .event_flags = wflags}
    144#define SND_SOC_DAPM_OUT_DRV_E(wname, wreg, wshift, winvert, wcontrols, \
    145	wncontrols, wevent, wflags) \
    146{	.id = snd_soc_dapm_out_drv, .name = wname, \
    147	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    148	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols, \
    149	.event = wevent, .event_flags = wflags}
    150#define SND_SOC_DAPM_MIXER_E(wname, wreg, wshift, winvert, wcontrols, \
    151	wncontrols, wevent, wflags) \
    152{	.id = snd_soc_dapm_mixer, .name = wname, \
    153	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    154	.kcontrol_news = wcontrols, .num_kcontrols = wncontrols, \
    155	.event = wevent, .event_flags = wflags}
    156#define SND_SOC_DAPM_MIXER_NAMED_CTL_E(wname, wreg, wshift, winvert, \
    157	wcontrols, wncontrols, wevent, wflags) \
    158{       .id = snd_soc_dapm_mixer, .name = wname, \
    159	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    160	.kcontrol_news = wcontrols, \
    161	.num_kcontrols = wncontrols, .event = wevent, .event_flags = wflags}
    162#define SND_SOC_DAPM_SWITCH_E(wname, wreg, wshift, winvert, wcontrols, \
    163	wevent, wflags) \
    164{	.id = snd_soc_dapm_switch, .name = wname, \
    165	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    166	.kcontrol_news = wcontrols, .num_kcontrols = 1, \
    167	.event = wevent, .event_flags = wflags}
    168#define SND_SOC_DAPM_MUX_E(wname, wreg, wshift, winvert, wcontrols, \
    169	wevent, wflags) \
    170{	.id = snd_soc_dapm_mux, .name = wname, \
    171	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    172	.kcontrol_news = wcontrols, .num_kcontrols = 1, \
    173	.event = wevent, .event_flags = wflags}
    174
    175/* additional sequencing control within an event type */
    176#define SND_SOC_DAPM_PGA_S(wname, wsubseq, wreg, wshift, winvert, \
    177	wevent, wflags) \
    178{	.id = snd_soc_dapm_pga, .name = wname, \
    179	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    180	.event = wevent, .event_flags = wflags, \
    181	.subseq = wsubseq}
    182#define SND_SOC_DAPM_SUPPLY_S(wname, wsubseq, wreg, wshift, winvert, wevent, \
    183	wflags)	\
    184{	.id = snd_soc_dapm_supply, .name = wname, \
    185	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    186	.event = wevent, .event_flags = wflags, .subseq = wsubseq}
    187
    188/* Simplified versions of above macros, assuming wncontrols = ARRAY_SIZE(wcontrols) */
    189#define SOC_PGA_E_ARRAY(wname, wreg, wshift, winvert, wcontrols, \
    190	wevent, wflags) \
    191{	.id = snd_soc_dapm_pga, .name = wname, \
    192	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    193	.kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols), \
    194	.event = wevent, .event_flags = wflags}
    195#define SOC_MIXER_E_ARRAY(wname, wreg, wshift, winvert, wcontrols, \
    196	wevent, wflags) \
    197{	.id = snd_soc_dapm_mixer, .name = wname, \
    198	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    199	.kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols), \
    200	.event = wevent, .event_flags = wflags}
    201#define SOC_MIXER_NAMED_CTL_E_ARRAY(wname, wreg, wshift, winvert, \
    202	wcontrols, wevent, wflags) \
    203{       .id = snd_soc_dapm_mixer, .name = wname, \
    204	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    205	.kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols), \
    206	.event = wevent, .event_flags = wflags}
    207
    208/* events that are pre and post DAPM */
    209#define SND_SOC_DAPM_PRE(wname, wevent) \
    210{	.id = snd_soc_dapm_pre, .name = wname, .kcontrol_news = NULL, \
    211	.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
    212	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD}
    213#define SND_SOC_DAPM_POST(wname, wevent) \
    214{	.id = snd_soc_dapm_post, .name = wname, .kcontrol_news = NULL, \
    215	.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
    216	.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD}
    217
    218/* stream domain */
    219#define SND_SOC_DAPM_AIF_IN(wname, stname, wchan, wreg, wshift, winvert) \
    220{	.id = snd_soc_dapm_aif_in, .name = wname, .sname = stname, \
    221	.channel = wchan, SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), }
    222#define SND_SOC_DAPM_AIF_IN_E(wname, stname, wchan, wreg, wshift, winvert, \
    223			      wevent, wflags)				\
    224{	.id = snd_soc_dapm_aif_in, .name = wname, .sname = stname, \
    225	.channel = wchan, SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    226	.event = wevent, .event_flags = wflags }
    227#define SND_SOC_DAPM_AIF_OUT(wname, stname, wchan, wreg, wshift, winvert) \
    228{	.id = snd_soc_dapm_aif_out, .name = wname, .sname = stname, \
    229	.channel = wchan, SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), }
    230#define SND_SOC_DAPM_AIF_OUT_E(wname, stname, wchan, wreg, wshift, winvert, \
    231			     wevent, wflags)				\
    232{	.id = snd_soc_dapm_aif_out, .name = wname, .sname = stname, \
    233	.channel = wchan, SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    234	.event = wevent, .event_flags = wflags }
    235#define SND_SOC_DAPM_DAC(wname, stname, wreg, wshift, winvert) \
    236{	.id = snd_soc_dapm_dac, .name = wname, .sname = stname, \
    237	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert) }
    238#define SND_SOC_DAPM_DAC_E(wname, stname, wreg, wshift, winvert, \
    239			   wevent, wflags)				\
    240{	.id = snd_soc_dapm_dac, .name = wname, .sname = stname, \
    241	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    242	.event = wevent, .event_flags = wflags}
    243
    244#define SND_SOC_DAPM_ADC(wname, stname, wreg, wshift, winvert) \
    245{	.id = snd_soc_dapm_adc, .name = wname, .sname = stname, \
    246	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), }
    247#define SND_SOC_DAPM_ADC_E(wname, stname, wreg, wshift, winvert, \
    248			   wevent, wflags)				\
    249{	.id = snd_soc_dapm_adc, .name = wname, .sname = stname, \
    250	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    251	.event = wevent, .event_flags = wflags}
    252#define SND_SOC_DAPM_CLOCK_SUPPLY(wname) \
    253{	.id = snd_soc_dapm_clock_supply, .name = wname, \
    254	.reg = SND_SOC_NOPM, .event = dapm_clock_event, \
    255	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD }
    256
    257/* generic widgets */
    258#define SND_SOC_DAPM_REG(wid, wname, wreg, wshift, wmask, won_val, woff_val) \
    259{	.id = wid, .name = wname, .kcontrol_news = NULL, .num_kcontrols = 0, \
    260	.reg = wreg, .shift = wshift, .mask = wmask, \
    261	.on_val = won_val, .off_val = woff_val, }
    262#define SND_SOC_DAPM_SUPPLY(wname, wreg, wshift, winvert, wevent, wflags) \
    263{	.id = snd_soc_dapm_supply, .name = wname, \
    264	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    265	.event = wevent, .event_flags = wflags}
    266#define SND_SOC_DAPM_REGULATOR_SUPPLY(wname, wdelay, wflags)	    \
    267{	.id = snd_soc_dapm_regulator_supply, .name = wname, \
    268	.reg = SND_SOC_NOPM, .shift = wdelay, .event = dapm_regulator_event, \
    269	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD, \
    270	.on_val = wflags}
    271#define SND_SOC_DAPM_PINCTRL(wname, active, sleep) \
    272{	.id = snd_soc_dapm_pinctrl, .name = wname, \
    273	.priv = (&(struct snd_soc_dapm_pinctrl_priv) \
    274		{ .active_state = active, .sleep_state = sleep,}), \
    275	.reg = SND_SOC_NOPM, .event = dapm_pinctrl_event, \
    276	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD }
    277
    278
    279
    280/* dapm kcontrol types */
    281#define SOC_DAPM_DOUBLE(xname, reg, lshift, rshift, max, invert) \
    282{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
    283	.info = snd_soc_info_volsw, \
    284	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
    285	.private_value = SOC_DOUBLE_VALUE(reg, lshift, rshift, max, invert, 0) }
    286#define SOC_DAPM_DOUBLE_R(xname, lreg, rreg, shift, max, invert) \
    287{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
    288	.info = snd_soc_info_volsw, \
    289	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
    290	.private_value = SOC_DOUBLE_R_VALUE(lreg, rreg, shift, max, invert) }
    291#define SOC_DAPM_SINGLE(xname, reg, shift, max, invert) \
    292{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
    293	.info = snd_soc_info_volsw, \
    294	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
    295	.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
    296#define SOC_DAPM_SINGLE_AUTODISABLE(xname, reg, shift, max, invert) \
    297{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
    298	.info = snd_soc_info_volsw, \
    299	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
    300	.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 1) }
    301#define SOC_DAPM_SINGLE_VIRT(xname, max) \
    302	SOC_DAPM_SINGLE(xname, SND_SOC_NOPM, 0, max, 0)
    303#define SOC_DAPM_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \
    304{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
    305	.info = snd_soc_info_volsw, \
    306	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\
    307	.tlv.p = (tlv_array), \
    308	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
    309	.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
    310#define SOC_DAPM_SINGLE_TLV_AUTODISABLE(xname, reg, shift, max, invert, tlv_array) \
    311{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
    312	.info = snd_soc_info_volsw, \
    313	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\
    314	.tlv.p = (tlv_array), \
    315	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
    316	.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 1) }
    317#define SOC_DAPM_SINGLE_TLV_VIRT(xname, max, tlv_array) \
    318	SOC_DAPM_SINGLE(xname, SND_SOC_NOPM, 0, max, 0, tlv_array)
    319#define SOC_DAPM_ENUM(xname, xenum) \
    320{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
    321	.info = snd_soc_info_enum_double, \
    322 	.get = snd_soc_dapm_get_enum_double, \
    323 	.put = snd_soc_dapm_put_enum_double, \
    324  	.private_value = (unsigned long)&xenum }
    325#define SOC_DAPM_ENUM_EXT(xname, xenum, xget, xput) \
    326{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
    327	.info = snd_soc_info_enum_double, \
    328	.get = xget, \
    329	.put = xput, \
    330	.private_value = (unsigned long)&xenum }
    331#define SOC_DAPM_PIN_SWITCH(xname) \
    332{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname " Switch", \
    333	.info = snd_soc_dapm_info_pin_switch, \
    334	.get = snd_soc_dapm_get_pin_switch, \
    335	.put = snd_soc_dapm_put_pin_switch, \
    336	.private_value = (unsigned long)xname }
    337
    338/* dapm stream operations */
    339#define SND_SOC_DAPM_STREAM_NOP			0x0
    340#define SND_SOC_DAPM_STREAM_START		0x1
    341#define SND_SOC_DAPM_STREAM_STOP		0x2
    342#define SND_SOC_DAPM_STREAM_SUSPEND		0x4
    343#define SND_SOC_DAPM_STREAM_RESUME		0x8
    344#define SND_SOC_DAPM_STREAM_PAUSE_PUSH	0x10
    345#define SND_SOC_DAPM_STREAM_PAUSE_RELEASE	0x20
    346
    347/* dapm event types */
    348#define SND_SOC_DAPM_PRE_PMU	0x1 	/* before widget power up */
    349#define SND_SOC_DAPM_POST_PMU	0x2		/* after widget power up */
    350#define SND_SOC_DAPM_PRE_PMD	0x4 	/* before widget power down */
    351#define SND_SOC_DAPM_POST_PMD	0x8		/* after widget power down */
    352#define SND_SOC_DAPM_PRE_REG	0x10	/* before audio path setup */
    353#define SND_SOC_DAPM_POST_REG	0x20	/* after audio path setup */
    354#define SND_SOC_DAPM_WILL_PMU   0x40    /* called at start of sequence */
    355#define SND_SOC_DAPM_WILL_PMD   0x80    /* called at start of sequence */
    356#define SND_SOC_DAPM_PRE_POST_PMD \
    357				(SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD)
    358#define SND_SOC_DAPM_PRE_POST_PMU \
    359				(SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU)
    360
    361/* convenience event type detection */
    362#define SND_SOC_DAPM_EVENT_ON(e)	\
    363	(e & (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU))
    364#define SND_SOC_DAPM_EVENT_OFF(e)	\
    365	(e & (SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD))
    366
    367/* regulator widget flags */
    368#define SND_SOC_DAPM_REGULATOR_BYPASS     0x1     /* bypass when disabled */
    369
    370struct snd_soc_dapm_widget;
    371enum snd_soc_dapm_type;
    372struct snd_soc_dapm_path;
    373struct snd_soc_dapm_pin;
    374struct snd_soc_dapm_route;
    375struct snd_soc_dapm_context;
    376struct regulator;
    377struct snd_soc_dapm_widget_list;
    378struct snd_soc_dapm_update;
    379enum snd_soc_dapm_direction;
    380
    381/*
    382 * Bias levels
    383 *
    384 * @ON:      Bias is fully on for audio playback and capture operations.
    385 * @PREPARE: Prepare for audio operations. Called before DAPM switching for
    386 *           stream start and stop operations.
    387 * @STANDBY: Low power standby state when no playback/capture operations are
    388 *           in progress. NOTE: The transition time between STANDBY and ON
    389 *           should be as fast as possible and no longer than 10ms.
    390 * @OFF:     Power Off. No restrictions on transition times.
    391 */
    392enum snd_soc_bias_level {
    393	SND_SOC_BIAS_OFF = 0,
    394	SND_SOC_BIAS_STANDBY = 1,
    395	SND_SOC_BIAS_PREPARE = 2,
    396	SND_SOC_BIAS_ON = 3,
    397};
    398
    399int dapm_regulator_event(struct snd_soc_dapm_widget *w,
    400			 struct snd_kcontrol *kcontrol, int event);
    401int dapm_clock_event(struct snd_soc_dapm_widget *w,
    402			 struct snd_kcontrol *kcontrol, int event);
    403int dapm_pinctrl_event(struct snd_soc_dapm_widget *w,
    404			 struct snd_kcontrol *kcontrol, int event);
    405
    406/* dapm controls */
    407int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
    408	struct snd_ctl_elem_value *ucontrol);
    409int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
    410	struct snd_ctl_elem_value *ucontrol);
    411int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
    412	struct snd_ctl_elem_value *ucontrol);
    413int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
    414	struct snd_ctl_elem_value *ucontrol);
    415int snd_soc_dapm_info_pin_switch(struct snd_kcontrol *kcontrol,
    416	struct snd_ctl_elem_info *uinfo);
    417int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol,
    418	struct snd_ctl_elem_value *uncontrol);
    419int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
    420	struct snd_ctl_elem_value *uncontrol);
    421int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm,
    422	const struct snd_soc_dapm_widget *widget,
    423	int num);
    424struct snd_soc_dapm_widget *snd_soc_dapm_new_control(
    425		struct snd_soc_dapm_context *dapm,
    426		const struct snd_soc_dapm_widget *widget);
    427struct snd_soc_dapm_widget *snd_soc_dapm_new_control_unlocked(
    428		struct snd_soc_dapm_context *dapm,
    429		const struct snd_soc_dapm_widget *widget);
    430int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
    431				 struct snd_soc_dai *dai);
    432void snd_soc_dapm_free_widget(struct snd_soc_dapm_widget *w);
    433int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card);
    434void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card);
    435
    436int snd_soc_dapm_update_dai(struct snd_pcm_substream *substream,
    437			    struct snd_pcm_hw_params *params,
    438			    struct snd_soc_dai *dai);
    439
    440/* dapm path setup */
    441int snd_soc_dapm_new_widgets(struct snd_soc_card *card);
    442void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm);
    443void snd_soc_dapm_init(struct snd_soc_dapm_context *dapm,
    444		       struct snd_soc_card *card,
    445		       struct snd_soc_component *component);
    446int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm,
    447			    const struct snd_soc_dapm_route *route, int num);
    448int snd_soc_dapm_del_routes(struct snd_soc_dapm_context *dapm,
    449			    const struct snd_soc_dapm_route *route, int num);
    450int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm,
    451			     const struct snd_soc_dapm_route *route, int num);
    452void snd_soc_dapm_free_widget(struct snd_soc_dapm_widget *w);
    453void snd_soc_dapm_reset_cache(struct snd_soc_dapm_context *dapm);
    454
    455/* dapm events */
    456void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
    457	int event);
    458void snd_soc_dapm_stream_stop(struct snd_soc_pcm_runtime *rtd, int stream);
    459void snd_soc_dapm_shutdown(struct snd_soc_card *card);
    460
    461/* external DAPM widget events */
    462int snd_soc_dapm_mixer_update_power(struct snd_soc_dapm_context *dapm,
    463		struct snd_kcontrol *kcontrol, int connect,
    464		struct snd_soc_dapm_update *update);
    465int snd_soc_dapm_mux_update_power(struct snd_soc_dapm_context *dapm,
    466		struct snd_kcontrol *kcontrol, int mux, struct soc_enum *e,
    467		struct snd_soc_dapm_update *update);
    468
    469/* dapm sys fs - used by the core */
    470extern struct attribute *soc_dapm_dev_attrs[];
    471void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm,
    472				struct dentry *parent);
    473
    474/* dapm audio pin control and status */
    475int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm,
    476			    const char *pin);
    477int snd_soc_dapm_enable_pin_unlocked(struct snd_soc_dapm_context *dapm,
    478				     const char *pin);
    479int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm,
    480			     const char *pin);
    481int snd_soc_dapm_disable_pin_unlocked(struct snd_soc_dapm_context *dapm,
    482				      const char *pin);
    483int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin);
    484int snd_soc_dapm_nc_pin_unlocked(struct snd_soc_dapm_context *dapm,
    485				 const char *pin);
    486int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm,
    487				const char *pin);
    488int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm);
    489int snd_soc_dapm_sync_unlocked(struct snd_soc_dapm_context *dapm);
    490int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm,
    491				  const char *pin);
    492int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm,
    493					   const char *pin);
    494int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
    495				const char *pin);
    496unsigned int dapm_kcontrol_get_value(const struct snd_kcontrol *kcontrol);
    497
    498/* Mostly internal - should not normally be used */
    499void dapm_mark_endpoints_dirty(struct snd_soc_card *card);
    500
    501/* dapm path query */
    502int snd_soc_dapm_dai_get_connected_widgets(struct snd_soc_dai *dai, int stream,
    503	struct snd_soc_dapm_widget_list **list,
    504	bool (*custom_stop_condition)(struct snd_soc_dapm_widget *,
    505				      enum snd_soc_dapm_direction));
    506void snd_soc_dapm_dai_free_widgets(struct snd_soc_dapm_widget_list **list);
    507
    508struct snd_soc_dapm_context *snd_soc_dapm_kcontrol_dapm(
    509	struct snd_kcontrol *kcontrol);
    510
    511struct snd_soc_dapm_widget *snd_soc_dapm_kcontrol_widget(
    512		struct snd_kcontrol *kcontrol);
    513
    514int snd_soc_dapm_force_bias_level(struct snd_soc_dapm_context *dapm,
    515	enum snd_soc_bias_level level);
    516
    517/* dapm widget types */
    518enum snd_soc_dapm_type {
    519	snd_soc_dapm_input = 0,		/* input pin */
    520	snd_soc_dapm_output,		/* output pin */
    521	snd_soc_dapm_mux,			/* selects 1 analog signal from many inputs */
    522	snd_soc_dapm_demux,			/* connects the input to one of multiple outputs */
    523	snd_soc_dapm_mixer,			/* mixes several analog signals together */
    524	snd_soc_dapm_mixer_named_ctl,		/* mixer with named controls */
    525	snd_soc_dapm_pga,			/* programmable gain/attenuation (volume) */
    526	snd_soc_dapm_out_drv,			/* output driver */
    527	snd_soc_dapm_adc,			/* analog to digital converter */
    528	snd_soc_dapm_dac,			/* digital to analog converter */
    529	snd_soc_dapm_micbias,		/* microphone bias (power) - DEPRECATED: use snd_soc_dapm_supply */
    530	snd_soc_dapm_mic,			/* microphone */
    531	snd_soc_dapm_hp,			/* headphones */
    532	snd_soc_dapm_spk,			/* speaker */
    533	snd_soc_dapm_line,			/* line input/output */
    534	snd_soc_dapm_switch,		/* analog switch */
    535	snd_soc_dapm_vmid,			/* codec bias/vmid - to minimise pops */
    536	snd_soc_dapm_pre,			/* machine specific pre widget - exec first */
    537	snd_soc_dapm_post,			/* machine specific post widget - exec last */
    538	snd_soc_dapm_supply,		/* power/clock supply */
    539	snd_soc_dapm_pinctrl,		/* pinctrl */
    540	snd_soc_dapm_regulator_supply,	/* external regulator */
    541	snd_soc_dapm_clock_supply,	/* external clock */
    542	snd_soc_dapm_aif_in,		/* audio interface input */
    543	snd_soc_dapm_aif_out,		/* audio interface output */
    544	snd_soc_dapm_siggen,		/* signal generator */
    545	snd_soc_dapm_sink,
    546	snd_soc_dapm_dai_in,		/* link to DAI structure */
    547	snd_soc_dapm_dai_out,
    548	snd_soc_dapm_dai_link,		/* link between two DAI structures */
    549	snd_soc_dapm_kcontrol,		/* Auto-disabled kcontrol */
    550	snd_soc_dapm_buffer,		/* DSP/CODEC internal buffer */
    551	snd_soc_dapm_scheduler,		/* DSP/CODEC internal scheduler */
    552	snd_soc_dapm_effect,		/* DSP/CODEC effect component */
    553	snd_soc_dapm_src,		/* DSP/CODEC SRC component */
    554	snd_soc_dapm_asrc,		/* DSP/CODEC ASRC component */
    555	snd_soc_dapm_encoder,		/* FW/SW audio encoder component */
    556	snd_soc_dapm_decoder,		/* FW/SW audio decoder component */
    557
    558	/* Don't edit below this line */
    559	SND_SOC_DAPM_TYPE_COUNT
    560};
    561
    562enum snd_soc_dapm_subclass {
    563	SND_SOC_DAPM_CLASS_INIT		= 0,
    564	SND_SOC_DAPM_CLASS_RUNTIME	= 1,
    565};
    566
    567/*
    568 * DAPM audio route definition.
    569 *
    570 * Defines an audio route originating at source via control and finishing
    571 * at sink.
    572 */
    573struct snd_soc_dapm_route {
    574	const char *sink;
    575	const char *control;
    576	const char *source;
    577
    578	/* Note: currently only supported for links where source is a supply */
    579	int (*connected)(struct snd_soc_dapm_widget *source,
    580			 struct snd_soc_dapm_widget *sink);
    581
    582	struct snd_soc_dobj dobj;
    583};
    584
    585/* dapm audio path between two widgets */
    586struct snd_soc_dapm_path {
    587	const char *name;
    588
    589	/*
    590	 * source (input) and sink (output) widgets
    591	 * The union is for convience, since it is a lot nicer to type
    592	 * p->source, rather than p->node[SND_SOC_DAPM_DIR_IN]
    593	 */
    594	union {
    595		struct {
    596			struct snd_soc_dapm_widget *source;
    597			struct snd_soc_dapm_widget *sink;
    598		};
    599		struct snd_soc_dapm_widget *node[2];
    600	};
    601
    602	/* status */
    603	u32 connect:1;	/* source and sink widgets are connected */
    604	u32 walking:1;  /* path is in the process of being walked */
    605	u32 weak:1;	/* path ignored for power management */
    606	u32 is_supply:1;	/* At least one of the connected widgets is a supply */
    607
    608	int (*connected)(struct snd_soc_dapm_widget *source,
    609			 struct snd_soc_dapm_widget *sink);
    610
    611	struct list_head list_node[2];
    612	struct list_head list_kcontrol;
    613	struct list_head list;
    614};
    615
    616/* dapm widget */
    617struct snd_soc_dapm_widget {
    618	enum snd_soc_dapm_type id;
    619	const char *name;		/* widget name */
    620	const char *sname;	/* stream name */
    621	struct list_head list;
    622	struct snd_soc_dapm_context *dapm;
    623
    624	void *priv;				/* widget specific data */
    625	struct regulator *regulator;		/* attached regulator */
    626	struct pinctrl *pinctrl;		/* attached pinctrl */
    627
    628	/* dapm control */
    629	int reg;				/* negative reg = no direct dapm */
    630	unsigned char shift;			/* bits to shift */
    631	unsigned int mask;			/* non-shifted mask */
    632	unsigned int on_val;			/* on state value */
    633	unsigned int off_val;			/* off state value */
    634	unsigned char power:1;			/* block power status */
    635	unsigned char active:1;			/* active stream on DAC, ADC's */
    636	unsigned char connected:1;		/* connected codec pin */
    637	unsigned char new:1;			/* cnew complete */
    638	unsigned char force:1;			/* force state */
    639	unsigned char ignore_suspend:1;         /* kept enabled over suspend */
    640	unsigned char new_power:1;		/* power from this run */
    641	unsigned char power_checked:1;		/* power checked this run */
    642	unsigned char is_supply:1;		/* Widget is a supply type widget */
    643	unsigned char is_ep:2;			/* Widget is a endpoint type widget */
    644	int subseq;				/* sort within widget type */
    645
    646	int (*power_check)(struct snd_soc_dapm_widget *w);
    647
    648	/* external events */
    649	unsigned short event_flags;		/* flags to specify event types */
    650	int (*event)(struct snd_soc_dapm_widget*, struct snd_kcontrol *, int);
    651
    652	/* kcontrols that relate to this widget */
    653	int num_kcontrols;
    654	const struct snd_kcontrol_new *kcontrol_news;
    655	struct snd_kcontrol **kcontrols;
    656	struct snd_soc_dobj dobj;
    657
    658	/* widget input and output edges */
    659	struct list_head edges[2];
    660
    661	/* used during DAPM updates */
    662	struct list_head work_list;
    663	struct list_head power_list;
    664	struct list_head dirty;
    665	int endpoints[2];
    666
    667	struct clk *clk;
    668
    669	int channel;
    670};
    671
    672struct snd_soc_dapm_update {
    673	struct snd_kcontrol *kcontrol;
    674	int reg;
    675	int mask;
    676	int val;
    677	int reg2;
    678	int mask2;
    679	int val2;
    680	bool has_second_set;
    681};
    682
    683struct snd_soc_dapm_wcache {
    684	struct snd_soc_dapm_widget *widget;
    685};
    686
    687/* DAPM context */
    688struct snd_soc_dapm_context {
    689	enum snd_soc_bias_level bias_level;
    690	unsigned int idle_bias_off:1; /* Use BIAS_OFF instead of STANDBY */
    691	/* Go to BIAS_OFF in suspend if the DAPM context is idle */
    692	unsigned int suspend_bias_off:1;
    693
    694	struct device *dev; /* from parent - for debug */
    695	struct snd_soc_component *component; /* parent component */
    696	struct snd_soc_card *card; /* parent card */
    697
    698	/* used during DAPM updates */
    699	enum snd_soc_bias_level target_bias_level;
    700	struct list_head list;
    701
    702	struct snd_soc_dapm_wcache path_sink_cache;
    703	struct snd_soc_dapm_wcache path_source_cache;
    704
    705#ifdef CONFIG_DEBUG_FS
    706	struct dentry *debugfs_dapm;
    707#endif
    708};
    709
    710/* A list of widgets associated with an object, typically a snd_kcontrol */
    711struct snd_soc_dapm_widget_list {
    712	int num_widgets;
    713	struct snd_soc_dapm_widget *widgets[];
    714};
    715
    716#define for_each_dapm_widgets(list, i, widget)				\
    717	for ((i) = 0;							\
    718	     (i) < list->num_widgets && (widget = list->widgets[i]);	\
    719	     (i)++)
    720
    721struct snd_soc_dapm_stats {
    722	int power_checks;
    723	int path_checks;
    724	int neighbour_checks;
    725};
    726
    727struct snd_soc_dapm_pinctrl_priv {
    728	const char *active_state;
    729	const char *sleep_state;
    730};
    731
    732/**
    733 * snd_soc_dapm_init_bias_level() - Initialize DAPM bias level
    734 * @dapm: The DAPM context to initialize
    735 * @level: The DAPM level to initialize to
    736 *
    737 * This function only sets the driver internal state of the DAPM level and will
    738 * not modify the state of the device. Hence it should not be used during normal
    739 * operation, but only to synchronize the internal state to the device state.
    740 * E.g. during driver probe to set the DAPM level to the one corresponding with
    741 * the power-on reset state of the device.
    742 *
    743 * To change the DAPM state of the device use snd_soc_dapm_set_bias_level().
    744 */
    745static inline void snd_soc_dapm_init_bias_level(
    746	struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level)
    747{
    748	dapm->bias_level = level;
    749}
    750
    751/**
    752 * snd_soc_dapm_get_bias_level() - Get current DAPM bias level
    753 * @dapm: The context for which to get the bias level
    754 *
    755 * Returns: The current bias level of the passed DAPM context.
    756 */
    757static inline enum snd_soc_bias_level snd_soc_dapm_get_bias_level(
    758	struct snd_soc_dapm_context *dapm)
    759{
    760	return dapm->bias_level;
    761}
    762
    763enum snd_soc_dapm_direction {
    764	SND_SOC_DAPM_DIR_IN,
    765	SND_SOC_DAPM_DIR_OUT
    766};
    767
    768#define SND_SOC_DAPM_DIR_TO_EP(x) BIT(x)
    769
    770#define SND_SOC_DAPM_EP_SOURCE SND_SOC_DAPM_DIR_TO_EP(SND_SOC_DAPM_DIR_IN)
    771#define SND_SOC_DAPM_EP_SINK SND_SOC_DAPM_DIR_TO_EP(SND_SOC_DAPM_DIR_OUT)
    772
    773/**
    774 * snd_soc_dapm_widget_for_each_sink_path - Iterates over all paths in the
    775 *   specified direction of a widget
    776 * @w: The widget
    777 * @dir: Whether to iterate over the paths where the specified widget is the
    778 *       incoming or outgoing widgets
    779 * @p: The path iterator variable
    780 */
    781#define snd_soc_dapm_widget_for_each_path(w, dir, p) \
    782	list_for_each_entry(p, &w->edges[dir], list_node[dir])
    783
    784/**
    785 * snd_soc_dapm_widget_for_each_sink_path_safe - Iterates over all paths in the
    786 *   specified direction of a widget
    787 * @w: The widget
    788 * @dir: Whether to iterate over the paths where the specified widget is the
    789 *       incoming or outgoing widgets
    790 * @p: The path iterator variable
    791 * @next_p: Temporary storage for the next path
    792 *
    793 *  This function works like snd_soc_dapm_widget_for_each_sink_path, expect that
    794 *  it is safe to remove the current path from the list while iterating
    795 */
    796#define snd_soc_dapm_widget_for_each_path_safe(w, dir, p, next_p) \
    797	list_for_each_entry_safe(p, next_p, &w->edges[dir], list_node[dir])
    798
    799/**
    800 * snd_soc_dapm_widget_for_each_sink_path - Iterates over all paths leaving a
    801 *  widget
    802 * @w: The widget
    803 * @p: The path iterator variable
    804 */
    805#define snd_soc_dapm_widget_for_each_sink_path(w, p) \
    806	snd_soc_dapm_widget_for_each_path(w, SND_SOC_DAPM_DIR_IN, p)
    807
    808/**
    809 * snd_soc_dapm_widget_for_each_source_path - Iterates over all paths leading to
    810 *  a widget
    811 * @w: The widget
    812 * @p: The path iterator variable
    813 */
    814#define snd_soc_dapm_widget_for_each_source_path(w, p) \
    815	snd_soc_dapm_widget_for_each_path(w, SND_SOC_DAPM_DIR_OUT, p)
    816
    817#endif