xref: /openbmc/linux/Documentation/sound/soc/dapm.rst (revision 87832e937c808a7ebc41254b408362e3255c87c9)
177190f03STakashi Iwai===================================================
277190f03STakashi IwaiDynamic Audio Power Management for Portable Devices
377190f03STakashi Iwai===================================================
477190f03STakashi Iwai
577190f03STakashi IwaiDescription
677190f03STakashi Iwai===========
777190f03STakashi Iwai
877190f03STakashi IwaiDynamic Audio Power Management (DAPM) is designed to allow portable
977190f03STakashi IwaiLinux devices to use the minimum amount of power within the audio
1077190f03STakashi Iwaisubsystem at all times. It is independent of other kernel PM and as
1177190f03STakashi Iwaisuch, can easily co-exist with the other PM systems.
1277190f03STakashi Iwai
1377190f03STakashi IwaiDAPM is also completely transparent to all user space applications as
1477190f03STakashi Iwaiall power switching is done within the ASoC core. No code changes or
1577190f03STakashi Iwairecompiling are required for user space applications. DAPM makes power
1677190f03STakashi Iwaiswitching decisions based upon any audio stream (capture/playback)
1777190f03STakashi Iwaiactivity and audio mixer settings within the device.
1877190f03STakashi Iwai
1977190f03STakashi IwaiDAPM spans the whole machine. It covers power control within the entire
2077190f03STakashi Iwaiaudio subsystem, this includes internal codec power blocks and machine
2177190f03STakashi Iwailevel power systems.
2277190f03STakashi Iwai
2377190f03STakashi IwaiThere are 4 power domains within DAPM
2477190f03STakashi Iwai
2577190f03STakashi IwaiCodec bias domain
2677190f03STakashi Iwai      VREF, VMID (core codec and audio power)
2777190f03STakashi Iwai
2877190f03STakashi Iwai      Usually controlled at codec probe/remove and suspend/resume, although
2977190f03STakashi Iwai      can be set at stream time if power is not needed for sidetone, etc.
3077190f03STakashi Iwai
3177190f03STakashi IwaiPlatform/Machine domain
3277190f03STakashi Iwai      physically connected inputs and outputs
3377190f03STakashi Iwai
3477190f03STakashi Iwai      Is platform/machine and user action specific, is configured by the
3577190f03STakashi Iwai      machine driver and responds to asynchronous events e.g when HP
3677190f03STakashi Iwai      are inserted
3777190f03STakashi Iwai
3877190f03STakashi IwaiPath domain
3977190f03STakashi Iwai      audio subsystem signal paths
4077190f03STakashi Iwai
4177190f03STakashi Iwai      Automatically set when mixer and mux settings are changed by the user.
4277190f03STakashi Iwai      e.g. alsamixer, amixer.
4377190f03STakashi Iwai
4477190f03STakashi IwaiStream domain
4577190f03STakashi Iwai      DACs and ADCs.
4677190f03STakashi Iwai
4777190f03STakashi Iwai      Enabled and disabled when stream playback/capture is started and
4877190f03STakashi Iwai      stopped respectively. e.g. aplay, arecord.
4977190f03STakashi Iwai
5077190f03STakashi IwaiAll DAPM power switching decisions are made automatically by consulting an audio
5177190f03STakashi Iwairouting map of the whole machine. This map is specific to each machine and
5277190f03STakashi Iwaiconsists of the interconnections between every audio component (including
5377190f03STakashi Iwaiinternal codec components). All audio components that effect power are called
5477190f03STakashi Iwaiwidgets hereafter.
5577190f03STakashi Iwai
5677190f03STakashi Iwai
5777190f03STakashi IwaiDAPM Widgets
5877190f03STakashi Iwai============
5977190f03STakashi Iwai
6077190f03STakashi IwaiAudio DAPM widgets fall into a number of types:-
6177190f03STakashi Iwai
6277190f03STakashi IwaiMixer
6377190f03STakashi Iwai	Mixes several analog signals into a single analog signal.
6477190f03STakashi IwaiMux
6577190f03STakashi Iwai	An analog switch that outputs only one of many inputs.
6677190f03STakashi IwaiPGA
6777190f03STakashi Iwai	A programmable gain amplifier or attenuation widget.
6877190f03STakashi IwaiADC
6977190f03STakashi Iwai	Analog to Digital Converter
7077190f03STakashi IwaiDAC
7177190f03STakashi Iwai	Digital to Analog Converter
7277190f03STakashi IwaiSwitch
7377190f03STakashi Iwai	An analog switch
7477190f03STakashi IwaiInput
7577190f03STakashi Iwai	A codec input pin
7677190f03STakashi IwaiOutput
7777190f03STakashi Iwai	A codec output pin
7877190f03STakashi IwaiHeadphone
7977190f03STakashi Iwai	Headphone (and optional Jack)
8077190f03STakashi IwaiMic
8177190f03STakashi Iwai	Mic (and optional Jack)
8277190f03STakashi IwaiLine
8377190f03STakashi Iwai	Line Input/Output (and optional Jack)
8477190f03STakashi IwaiSpeaker
8577190f03STakashi Iwai	Speaker
8677190f03STakashi IwaiSupply
8777190f03STakashi Iwai	Power or clock supply widget used by other widgets.
8877190f03STakashi IwaiRegulator
8977190f03STakashi Iwai	External regulator that supplies power to audio components.
9077190f03STakashi IwaiClock
9177190f03STakashi Iwai	External clock that supplies clock to audio components.
9277190f03STakashi IwaiAIF IN
9377190f03STakashi Iwai	Audio Interface Input (with TDM slot mask).
9477190f03STakashi IwaiAIF OUT
9577190f03STakashi Iwai	Audio Interface Output (with TDM slot mask).
9677190f03STakashi IwaiSiggen
9777190f03STakashi Iwai	Signal Generator.
9877190f03STakashi IwaiDAI IN
9977190f03STakashi Iwai	Digital Audio Interface Input.
10077190f03STakashi IwaiDAI OUT
10177190f03STakashi Iwai	Digital Audio Interface Output.
10277190f03STakashi IwaiDAI Link
10377190f03STakashi Iwai	DAI Link between two DAI structures
10477190f03STakashi IwaiPre
10577190f03STakashi Iwai	Special PRE widget (exec before all others)
10677190f03STakashi IwaiPost
10777190f03STakashi Iwai	Special POST widget (exec after all others)
1088a70b454SLiam GirdwoodBuffer
1098a70b454SLiam Girdwood	Inter widget audio data buffer within a DSP.
1108a70b454SLiam GirdwoodScheduler
1118a70b454SLiam Girdwood	DSP internal scheduler that schedules component/pipeline processing
1128a70b454SLiam Girdwood	work.
1138a70b454SLiam GirdwoodEffect
1148a70b454SLiam Girdwood	Widget that performs an audio processing effect.
1158a70b454SLiam GirdwoodSRC
1168a70b454SLiam Girdwood	Sample Rate Converter within DSP or CODEC
1178a70b454SLiam GirdwoodASRC
1188a70b454SLiam Girdwood	Asynchronous Sample Rate Converter within DSP or CODEC
1198a70b454SLiam GirdwoodEncoder
1208a70b454SLiam Girdwood	Widget that encodes audio data from one format (usually PCM) to another
1218a70b454SLiam Girdwood	usually more compressed format.
1228a70b454SLiam GirdwoodDecoder
1238a70b454SLiam Girdwood	Widget that decodes audio data from a compressed format to an
1248a70b454SLiam Girdwood	uncompressed format like PCM.
1258a70b454SLiam Girdwood
12677190f03STakashi Iwai
12777190f03STakashi Iwai(Widgets are defined in include/sound/soc-dapm.h)
12877190f03STakashi Iwai
12977190f03STakashi IwaiWidgets can be added to the sound card by any of the component driver types.
13077190f03STakashi IwaiThere are convenience macros defined in soc-dapm.h that can be used to quickly
13177190f03STakashi Iwaibuild a list of widgets of the codecs and machines DAPM widgets.
13277190f03STakashi Iwai
13377190f03STakashi IwaiMost widgets have a name, register, shift and invert. Some widgets have extra
13477190f03STakashi Iwaiparameters for stream name and kcontrols.
13577190f03STakashi Iwai
13677190f03STakashi Iwai
13777190f03STakashi IwaiStream Domain Widgets
13877190f03STakashi Iwai---------------------
13977190f03STakashi Iwai
14077190f03STakashi IwaiStream Widgets relate to the stream power domain and only consist of ADCs
14177190f03STakashi Iwai(analog to digital converters), DACs (digital to analog converters),
14277190f03STakashi IwaiAIF IN and AIF OUT.
14377190f03STakashi Iwai
14477190f03STakashi IwaiStream widgets have the following format:-
14577190f03STakashi Iwai::
14677190f03STakashi Iwai
14777190f03STakashi Iwai  SND_SOC_DAPM_DAC(name, stream name, reg, shift, invert),
14877190f03STakashi Iwai  SND_SOC_DAPM_AIF_IN(name, stream, slot, reg, shift, invert)
14977190f03STakashi Iwai
15077190f03STakashi IwaiNOTE: the stream name must match the corresponding stream name in your codec
15177190f03STakashi Iwaisnd_soc_codec_dai.
15277190f03STakashi Iwai
15377190f03STakashi Iwaie.g. stream widgets for HiFi playback and capture
15477190f03STakashi Iwai::
15577190f03STakashi Iwai
15677190f03STakashi Iwai  SND_SOC_DAPM_DAC("HiFi DAC", "HiFi Playback", REG, 3, 1),
15777190f03STakashi Iwai  SND_SOC_DAPM_ADC("HiFi ADC", "HiFi Capture", REG, 2, 1),
15877190f03STakashi Iwai
15977190f03STakashi Iwaie.g. stream widgets for AIF
16077190f03STakashi Iwai::
16177190f03STakashi Iwai
16277190f03STakashi Iwai  SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
16377190f03STakashi Iwai  SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
16477190f03STakashi Iwai
16577190f03STakashi Iwai
16677190f03STakashi IwaiPath Domain Widgets
16777190f03STakashi Iwai-------------------
16877190f03STakashi Iwai
16977190f03STakashi IwaiPath domain widgets have a ability to control or affect the audio signal or
17077190f03STakashi Iwaiaudio paths within the audio subsystem. They have the following form:-
17177190f03STakashi Iwai::
17277190f03STakashi Iwai
17377190f03STakashi Iwai  SND_SOC_DAPM_PGA(name, reg, shift, invert, controls, num_controls)
17477190f03STakashi Iwai
17577190f03STakashi IwaiAny widget kcontrols can be set using the controls and num_controls members.
17677190f03STakashi Iwai
17777190f03STakashi Iwaie.g. Mixer widget (the kcontrols are declared first)
17877190f03STakashi Iwai::
17977190f03STakashi Iwai
18077190f03STakashi Iwai  /* Output Mixer */
18177190f03STakashi Iwai  static const snd_kcontrol_new_t wm8731_output_mixer_controls[] = {
18277190f03STakashi Iwai  SOC_DAPM_SINGLE("Line Bypass Switch", WM8731_APANA, 3, 1, 0),
18377190f03STakashi Iwai  SOC_DAPM_SINGLE("Mic Sidetone Switch", WM8731_APANA, 5, 1, 0),
18477190f03STakashi Iwai  SOC_DAPM_SINGLE("HiFi Playback Switch", WM8731_APANA, 4, 1, 0),
18577190f03STakashi Iwai  };
18677190f03STakashi Iwai
18777190f03STakashi Iwai  SND_SOC_DAPM_MIXER("Output Mixer", WM8731_PWR, 4, 1, wm8731_output_mixer_controls,
18877190f03STakashi Iwai	ARRAY_SIZE(wm8731_output_mixer_controls)),
18977190f03STakashi Iwai
19077190f03STakashi IwaiIf you don't want the mixer elements prefixed with the name of the mixer widget,
19177190f03STakashi Iwaiyou can use SND_SOC_DAPM_MIXER_NAMED_CTL instead. the parameters are the same
19277190f03STakashi Iwaias for SND_SOC_DAPM_MIXER.
19377190f03STakashi Iwai
19477190f03STakashi Iwai
19577190f03STakashi IwaiMachine domain Widgets
19677190f03STakashi Iwai----------------------
19777190f03STakashi Iwai
19877190f03STakashi IwaiMachine widgets are different from codec widgets in that they don't have a
19977190f03STakashi Iwaicodec register bit associated with them. A machine widget is assigned to each
20077190f03STakashi Iwaimachine audio component (non codec or DSP) that can be independently
20177190f03STakashi Iwaipowered. e.g.
20277190f03STakashi Iwai
20377190f03STakashi Iwai* Speaker Amp
20477190f03STakashi Iwai* Microphone Bias
20577190f03STakashi Iwai* Jack connectors
20677190f03STakashi Iwai
20777190f03STakashi IwaiA machine widget can have an optional call back.
20877190f03STakashi Iwai
20977190f03STakashi Iwaie.g. Jack connector widget for an external Mic that enables Mic Bias
21077190f03STakashi Iwaiwhen the Mic is inserted:-::
21177190f03STakashi Iwai
21277190f03STakashi Iwai  static int spitz_mic_bias(struct snd_soc_dapm_widget* w, int event)
21377190f03STakashi Iwai  {
21477190f03STakashi Iwai	gpio_set_value(SPITZ_GPIO_MIC_BIAS, SND_SOC_DAPM_EVENT_ON(event));
21577190f03STakashi Iwai	return 0;
21677190f03STakashi Iwai  }
21777190f03STakashi Iwai
21877190f03STakashi Iwai  SND_SOC_DAPM_MIC("Mic Jack", spitz_mic_bias),
21977190f03STakashi Iwai
22077190f03STakashi Iwai
22177190f03STakashi IwaiCodec (BIAS) Domain
22277190f03STakashi Iwai-------------------
22377190f03STakashi Iwai
22477190f03STakashi IwaiThe codec bias power domain has no widgets and is handled by the codecs DAPM
22577190f03STakashi Iwaievent handler. This handler is called when the codec powerstate is changed wrt
22677190f03STakashi Iwaito any stream event or by kernel PM events.
22777190f03STakashi Iwai
22877190f03STakashi Iwai
22977190f03STakashi IwaiVirtual Widgets
23077190f03STakashi Iwai---------------
23177190f03STakashi Iwai
23277190f03STakashi IwaiSometimes widgets exist in the codec or machine audio map that don't have any
23377190f03STakashi Iwaicorresponding soft power control. In this case it is necessary to create
23477190f03STakashi Iwaia virtual widget - a widget with no control bits e.g.
23577190f03STakashi Iwai::
23677190f03STakashi Iwai
237*1b7eb3a2SCristian Ciocaltea  SND_SOC_DAPM_MIXER("AC97 Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
23877190f03STakashi Iwai
23977190f03STakashi IwaiThis can be used to merge to signal paths together in software.
24077190f03STakashi Iwai
24177190f03STakashi IwaiAfter all the widgets have been defined, they can then be added to the DAPM
24277190f03STakashi Iwaisubsystem individually with a call to snd_soc_dapm_new_control().
24377190f03STakashi Iwai
24477190f03STakashi Iwai
24577190f03STakashi IwaiCodec/DSP Widget Interconnections
24677190f03STakashi Iwai=================================
24777190f03STakashi Iwai
24877190f03STakashi IwaiWidgets are connected to each other within the codec, platform and machine by
24977190f03STakashi Iwaiaudio paths (called interconnections). Each interconnection must be defined in
25077190f03STakashi Iwaiorder to create a map of all audio paths between widgets.
25177190f03STakashi Iwai
25277190f03STakashi IwaiThis is easiest with a diagram of the codec or DSP (and schematic of the machine
25377190f03STakashi Iwaiaudio system), as it requires joining widgets together via their audio signal
25477190f03STakashi Iwaipaths.
25577190f03STakashi Iwai
25677190f03STakashi Iwaie.g., from the WM8731 output mixer (wm8731.c)
25777190f03STakashi Iwai
25877190f03STakashi IwaiThe WM8731 output mixer has 3 inputs (sources)
25977190f03STakashi Iwai
26077190f03STakashi Iwai1. Line Bypass Input
26177190f03STakashi Iwai2. DAC (HiFi playback)
26277190f03STakashi Iwai3. Mic Sidetone Input
26377190f03STakashi Iwai
26477190f03STakashi IwaiEach input in this example has a kcontrol associated with it (defined in example
26577190f03STakashi Iwaiabove) and is connected to the output mixer via its kcontrol name. We can now
26677190f03STakashi Iwaiconnect the destination widget (wrt audio signal) with its source widgets.
26777190f03STakashi Iwai::
26877190f03STakashi Iwai
26977190f03STakashi Iwai	/* output mixer */
27077190f03STakashi Iwai	{"Output Mixer", "Line Bypass Switch", "Line Input"},
27177190f03STakashi Iwai	{"Output Mixer", "HiFi Playback Switch", "DAC"},
27277190f03STakashi Iwai	{"Output Mixer", "Mic Sidetone Switch", "Mic Bias"},
27377190f03STakashi Iwai
27477190f03STakashi IwaiSo we have :-
27577190f03STakashi Iwai
27677190f03STakashi Iwai* Destination Widget  <=== Path Name <=== Source Widget, or
27777190f03STakashi Iwai* Sink, Path, Source, or
27877190f03STakashi Iwai* ``Output Mixer`` is connected to the ``DAC`` via the ``HiFi Playback Switch``.
27977190f03STakashi Iwai
28077190f03STakashi IwaiWhen there is no path name connecting widgets (e.g. a direct connection) we
28177190f03STakashi Iwaipass NULL for the path name.
28277190f03STakashi Iwai
28377190f03STakashi IwaiInterconnections are created with a call to:-
28477190f03STakashi Iwai::
28577190f03STakashi Iwai
28677190f03STakashi Iwai  snd_soc_dapm_connect_input(codec, sink, path, source);
28777190f03STakashi Iwai
28877190f03STakashi IwaiFinally, snd_soc_dapm_new_widgets(codec) must be called after all widgets and
28977190f03STakashi Iwaiinterconnections have been registered with the core. This causes the core to
29077190f03STakashi Iwaiscan the codec and machine so that the internal DAPM state matches the
29177190f03STakashi Iwaiphysical state of the machine.
29277190f03STakashi Iwai
29377190f03STakashi Iwai
29477190f03STakashi IwaiMachine Widget Interconnections
29577190f03STakashi Iwai-------------------------------
29677190f03STakashi IwaiMachine widget interconnections are created in the same way as codec ones and
29777190f03STakashi Iwaidirectly connect the codec pins to machine level widgets.
29877190f03STakashi Iwai
29977190f03STakashi Iwaie.g. connects the speaker out codec pins to the internal speaker.
30077190f03STakashi Iwai::
30177190f03STakashi Iwai
30277190f03STakashi Iwai	/* ext speaker connected to codec pins LOUT2, ROUT2  */
30377190f03STakashi Iwai	{"Ext Spk", NULL , "ROUT2"},
30477190f03STakashi Iwai	{"Ext Spk", NULL , "LOUT2"},
30577190f03STakashi Iwai
30677190f03STakashi IwaiThis allows the DAPM to power on and off pins that are connected (and in use)
30777190f03STakashi Iwaiand pins that are NC respectively.
30877190f03STakashi Iwai
30977190f03STakashi Iwai
31077190f03STakashi IwaiEndpoint Widgets
31177190f03STakashi Iwai================
31277190f03STakashi IwaiAn endpoint is a start or end point (widget) of an audio signal within the
31377190f03STakashi Iwaimachine and includes the codec. e.g.
31477190f03STakashi Iwai
31577190f03STakashi Iwai* Headphone Jack
31677190f03STakashi Iwai* Internal Speaker
31777190f03STakashi Iwai* Internal Mic
31877190f03STakashi Iwai* Mic Jack
31977190f03STakashi Iwai* Codec Pins
32077190f03STakashi Iwai
32177190f03STakashi IwaiEndpoints are added to the DAPM graph so that their usage can be determined in
32277190f03STakashi Iwaiorder to save power. e.g. NC codecs pins will be switched OFF, unconnected
32377190f03STakashi Iwaijacks can also be switched OFF.
32477190f03STakashi Iwai
32577190f03STakashi Iwai
32677190f03STakashi IwaiDAPM Widget Events
32777190f03STakashi Iwai==================
32877190f03STakashi Iwai
32977190f03STakashi IwaiSome widgets can register their interest with the DAPM core in PM events.
33077190f03STakashi Iwaie.g. A Speaker with an amplifier registers a widget so the amplifier can be
33177190f03STakashi Iwaipowered only when the spk is in use.
33277190f03STakashi Iwai::
33377190f03STakashi Iwai
33477190f03STakashi Iwai  /* turn speaker amplifier on/off depending on use */
33577190f03STakashi Iwai  static int corgi_amp_event(struct snd_soc_dapm_widget *w, int event)
33677190f03STakashi Iwai  {
33777190f03STakashi Iwai	gpio_set_value(CORGI_GPIO_APM_ON, SND_SOC_DAPM_EVENT_ON(event));
33877190f03STakashi Iwai	return 0;
33977190f03STakashi Iwai  }
34077190f03STakashi Iwai
34177190f03STakashi Iwai  /* corgi machine dapm widgets */
34277190f03STakashi Iwai  static const struct snd_soc_dapm_widget wm8731_dapm_widgets =
34377190f03STakashi Iwai	SND_SOC_DAPM_SPK("Ext Spk", corgi_amp_event);
34477190f03STakashi Iwai
34577190f03STakashi IwaiPlease see soc-dapm.h for all other widgets that support events.
34677190f03STakashi Iwai
34777190f03STakashi Iwai
34877190f03STakashi IwaiEvent types
34977190f03STakashi Iwai-----------
35077190f03STakashi Iwai
35177190f03STakashi IwaiThe following event types are supported by event widgets.
35277190f03STakashi Iwai::
35377190f03STakashi Iwai
35477190f03STakashi Iwai  /* dapm event types */
35577190f03STakashi Iwai  #define SND_SOC_DAPM_PRE_PMU	0x1 	/* before widget power up */
35677190f03STakashi Iwai  #define SND_SOC_DAPM_POST_PMU	0x2		/* after widget power up */
35777190f03STakashi Iwai  #define SND_SOC_DAPM_PRE_PMD	0x4 	/* before widget power down */
35877190f03STakashi Iwai  #define SND_SOC_DAPM_POST_PMD	0x8		/* after widget power down */
35977190f03STakashi Iwai  #define SND_SOC_DAPM_PRE_REG	0x10	/* before audio path setup */
36077190f03STakashi Iwai  #define SND_SOC_DAPM_POST_REG	0x20	/* after audio path setup */
361