1*01d7584cSLiam Girdwood /* 2*01d7584cSLiam Girdwood * linux/sound/soc-dpcm.h -- ALSA SoC Dynamic PCM Support 3*01d7584cSLiam Girdwood * 4*01d7584cSLiam Girdwood * Author: Liam Girdwood <lrg@ti.com> 5*01d7584cSLiam Girdwood * 6*01d7584cSLiam Girdwood * This program is free software; you can redistribute it and/or modify 7*01d7584cSLiam Girdwood * it under the terms of the GNU General Public License version 2 as 8*01d7584cSLiam Girdwood * published by the Free Software Foundation. 9*01d7584cSLiam Girdwood */ 10*01d7584cSLiam Girdwood 11*01d7584cSLiam Girdwood #ifndef __LINUX_SND_SOC_DPCM_H 12*01d7584cSLiam Girdwood #define __LINUX_SND_SOC_DPCM_H 13*01d7584cSLiam Girdwood 14*01d7584cSLiam Girdwood #include <linux/list.h> 15*01d7584cSLiam Girdwood #include <sound/pcm.h> 16*01d7584cSLiam Girdwood 17*01d7584cSLiam Girdwood struct snd_soc_pcm_runtime; 18*01d7584cSLiam Girdwood 19*01d7584cSLiam Girdwood /* 20*01d7584cSLiam Girdwood * Types of runtime_update to perform. e.g. originated from FE PCM ops 21*01d7584cSLiam Girdwood * or audio route changes triggered by muxes/mixers. 22*01d7584cSLiam Girdwood */ 23*01d7584cSLiam Girdwood enum snd_soc_dpcm_update { 24*01d7584cSLiam Girdwood SND_SOC_DPCM_UPDATE_NO = 0, 25*01d7584cSLiam Girdwood SND_SOC_DPCM_UPDATE_BE, 26*01d7584cSLiam Girdwood SND_SOC_DPCM_UPDATE_FE, 27*01d7584cSLiam Girdwood }; 28*01d7584cSLiam Girdwood 29*01d7584cSLiam Girdwood /* 30*01d7584cSLiam Girdwood * Dynamic PCM Frontend -> Backend link management states. 31*01d7584cSLiam Girdwood */ 32*01d7584cSLiam Girdwood enum snd_soc_dpcm_link_state { 33*01d7584cSLiam Girdwood SND_SOC_DPCM_LINK_STATE_NEW = 0, /* newly created link */ 34*01d7584cSLiam Girdwood SND_SOC_DPCM_LINK_STATE_FREE, /* link to be dismantled */ 35*01d7584cSLiam Girdwood }; 36*01d7584cSLiam Girdwood 37*01d7584cSLiam Girdwood /* 38*01d7584cSLiam Girdwood * Dynamic PCM Frontend -> Backend link PCM states. 39*01d7584cSLiam Girdwood */ 40*01d7584cSLiam Girdwood enum snd_soc_dpcm_state { 41*01d7584cSLiam Girdwood SND_SOC_DPCM_STATE_NEW = 0, 42*01d7584cSLiam Girdwood SND_SOC_DPCM_STATE_OPEN, 43*01d7584cSLiam Girdwood SND_SOC_DPCM_STATE_HW_PARAMS, 44*01d7584cSLiam Girdwood SND_SOC_DPCM_STATE_PREPARE, 45*01d7584cSLiam Girdwood SND_SOC_DPCM_STATE_START, 46*01d7584cSLiam Girdwood SND_SOC_DPCM_STATE_STOP, 47*01d7584cSLiam Girdwood SND_SOC_DPCM_STATE_PAUSED, 48*01d7584cSLiam Girdwood SND_SOC_DPCM_STATE_SUSPEND, 49*01d7584cSLiam Girdwood SND_SOC_DPCM_STATE_HW_FREE, 50*01d7584cSLiam Girdwood SND_SOC_DPCM_STATE_CLOSE, 51*01d7584cSLiam Girdwood }; 52*01d7584cSLiam Girdwood 53*01d7584cSLiam Girdwood /* 54*01d7584cSLiam Girdwood * Dynamic PCM trigger ordering. Triggering flexibility is required as some 55*01d7584cSLiam Girdwood * DSPs require triggering before/after their CPU platform and DAIs. 56*01d7584cSLiam Girdwood * 57*01d7584cSLiam Girdwood * i.e. some clients may want to manually order this call in their PCM 58*01d7584cSLiam Girdwood * trigger() whilst others will just use the regular core ordering. 59*01d7584cSLiam Girdwood */ 60*01d7584cSLiam Girdwood enum snd_soc_dpcm_trigger { 61*01d7584cSLiam Girdwood SND_SOC_DPCM_TRIGGER_PRE = 0, 62*01d7584cSLiam Girdwood SND_SOC_DPCM_TRIGGER_POST, 63*01d7584cSLiam Girdwood }; 64*01d7584cSLiam Girdwood 65*01d7584cSLiam Girdwood /* 66*01d7584cSLiam Girdwood * Dynamic PCM link 67*01d7584cSLiam Girdwood * This links together a FE and BE DAI at runtime and stores the link 68*01d7584cSLiam Girdwood * state information and the hw_params configuration. 69*01d7584cSLiam Girdwood */ 70*01d7584cSLiam Girdwood struct snd_soc_dpcm { 71*01d7584cSLiam Girdwood /* FE and BE DAIs*/ 72*01d7584cSLiam Girdwood struct snd_soc_pcm_runtime *be; 73*01d7584cSLiam Girdwood struct snd_soc_pcm_runtime *fe; 74*01d7584cSLiam Girdwood 75*01d7584cSLiam Girdwood /* link state */ 76*01d7584cSLiam Girdwood enum snd_soc_dpcm_link_state state; 77*01d7584cSLiam Girdwood 78*01d7584cSLiam Girdwood /* list of BE and FE for this DPCM link */ 79*01d7584cSLiam Girdwood struct list_head list_be; 80*01d7584cSLiam Girdwood struct list_head list_fe; 81*01d7584cSLiam Girdwood 82*01d7584cSLiam Girdwood /* hw params for this link - may be different for each link */ 83*01d7584cSLiam Girdwood struct snd_pcm_hw_params hw_params; 84*01d7584cSLiam Girdwood }; 85*01d7584cSLiam Girdwood 86*01d7584cSLiam Girdwood /* 87*01d7584cSLiam Girdwood * Dynamic PCM runtime data. 88*01d7584cSLiam Girdwood */ 89*01d7584cSLiam Girdwood struct snd_soc_dpcm_runtime { 90*01d7584cSLiam Girdwood struct list_head be_clients; 91*01d7584cSLiam Girdwood struct list_head fe_clients; 92*01d7584cSLiam Girdwood 93*01d7584cSLiam Girdwood int users; 94*01d7584cSLiam Girdwood struct snd_pcm_runtime *runtime; 95*01d7584cSLiam Girdwood struct snd_pcm_hw_params hw_params; 96*01d7584cSLiam Girdwood 97*01d7584cSLiam Girdwood /* state and update */ 98*01d7584cSLiam Girdwood enum snd_soc_dpcm_update runtime_update; 99*01d7584cSLiam Girdwood enum snd_soc_dpcm_state state; 100*01d7584cSLiam Girdwood }; 101*01d7584cSLiam Girdwood 102*01d7584cSLiam Girdwood /* can this BE stop and free */ 103*01d7584cSLiam Girdwood int snd_soc_dpcm_can_be_free_stop(struct snd_soc_pcm_runtime *fe, 104*01d7584cSLiam Girdwood struct snd_soc_pcm_runtime *be, int stream); 105*01d7584cSLiam Girdwood 106*01d7584cSLiam Girdwood /* can this BE perform a hw_params() */ 107*01d7584cSLiam Girdwood int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe, 108*01d7584cSLiam Girdwood struct snd_soc_pcm_runtime *be, int stream); 109*01d7584cSLiam Girdwood 110*01d7584cSLiam Girdwood /* is the current PCM operation for this FE ? */ 111*01d7584cSLiam Girdwood int snd_soc_dpcm_fe_can_update(struct snd_soc_pcm_runtime *fe, int stream); 112*01d7584cSLiam Girdwood 113*01d7584cSLiam Girdwood /* is the current PCM operation for this BE ? */ 114*01d7584cSLiam Girdwood int snd_soc_dpcm_be_can_update(struct snd_soc_pcm_runtime *fe, 115*01d7584cSLiam Girdwood struct snd_soc_pcm_runtime *be, int stream); 116*01d7584cSLiam Girdwood 117*01d7584cSLiam Girdwood /* get the substream for this BE */ 118*01d7584cSLiam Girdwood struct snd_pcm_substream * 119*01d7584cSLiam Girdwood snd_soc_dpcm_get_substream(struct snd_soc_pcm_runtime *be, int stream); 120*01d7584cSLiam Girdwood 121*01d7584cSLiam Girdwood /* get the BE runtime state */ 122*01d7584cSLiam Girdwood enum snd_soc_dpcm_state 123*01d7584cSLiam Girdwood snd_soc_dpcm_be_get_state(struct snd_soc_pcm_runtime *be, int stream); 124*01d7584cSLiam Girdwood 125*01d7584cSLiam Girdwood /* set the BE runtime state */ 126*01d7584cSLiam Girdwood void snd_soc_dpcm_be_set_state(struct snd_soc_pcm_runtime *be, int stream, 127*01d7584cSLiam Girdwood enum snd_soc_dpcm_state state); 128*01d7584cSLiam Girdwood 129*01d7584cSLiam Girdwood /* internal use only */ 130*01d7584cSLiam Girdwood int soc_dpcm_be_digital_mute(struct snd_soc_pcm_runtime *fe, int mute); 131*01d7584cSLiam Girdwood 132*01d7584cSLiam Girdwood #endif 133