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