1 ======================= 2 ASoC Codec Class Driver 3 ======================= 4 5 The codec class driver is generic and hardware 6 the codec, FM, MODEM, BT or external DSP to pr 7 It should contain no code that is specific to 8 All platform and machine specific code should 9 machine drivers respectively. 10 11 Each codec class driver *must* provide the fol 12 13 1. Codec DAI and PCM configuration 14 2. Codec control IO - using RegMap API 15 3. Mixers and audio controls 16 4. Codec audio operations 17 5. DAPM description. 18 6. DAPM event handler. 19 20 Optionally, codec drivers can also provide:- 21 22 7. DAC Digital mute control. 23 24 Its probably best to use this guide in conjunc 25 driver code in sound/soc/codecs/ 26 27 ASoC Codec driver breakdown 28 =========================== 29 30 Codec DAI and PCM configuration 31 ------------------------------- 32 Each codec driver must have a struct snd_soc_d 33 PCM capabilities and operations. This struct i 34 registered with the core by your machine drive 35 36 e.g. 37 :: 38 39 static struct snd_soc_dai_ops wm8731_dai_ops 40 .prepare = wm8731_pcm_prepare, 41 .hw_params = wm8731_hw_params, 42 .shutdown = wm8731_shutdown, 43 .mute_stream = wm8731_mute, 44 .set_sysclk = wm8731_set_dai_syscl 45 .set_fmt = wm8731_set_dai_fmt, 46 }; 47 48 struct snd_soc_dai_driver wm8731_dai = { 49 .name = "wm8731-hifi", 50 .playback = { 51 .stream_name = "Playback", 52 .channels_min = 1, 53 .channels_max = 2, 54 .rates = WM8731_RATES, 55 .formats = WM8731_FORMATS,}, 56 .capture = { 57 .stream_name = "Capture", 58 .channels_min = 1, 59 .channels_max = 2, 60 .rates = WM8731_RATES, 61 .formats = WM8731_FORMATS,}, 62 .ops = &wm8731_dai_ops, 63 .symmetric_rate = 1, 64 }; 65 66 67 Codec control IO 68 ---------------- 69 The codec can usually be controlled via an I2C 70 (AC97 combines control with data in the DAI). 71 Regmap API for all codec IO. Please see includ 72 codec drivers for example regmap usage. 73 74 75 Mixers and audio controls 76 ------------------------- 77 All the codec mixers and audio controls can be 78 macros defined in soc.h. 79 :: 80 81 #define SOC_SINGLE(xname, reg, shift, mask 82 83 Defines a single control as follows:- 84 :: 85 86 xname = Control name e.g. "Playback Volume" 87 reg = codec register 88 shift = control bit(s) offset in register 89 mask = control bit size(s) e.g. mask of 7 = 90 invert = the control is inverted 91 92 Other macros include:- 93 :: 94 95 #define SOC_DOUBLE(xname, reg, shift_left, 96 97 A stereo control 98 :: 99 100 #define SOC_DOUBLE_R(xname, reg_left, reg_ 101 102 A stereo control spanning 2 registers 103 :: 104 105 #define SOC_ENUM_SINGLE(xreg, xshift, xmas 106 107 Defines an single enumerated control as follow 108 :: 109 110 xreg = register 111 xshift = control bit(s) offset in register 112 xmask = control bit(s) size 113 xtexts = pointer to array of strings that d 114 115 #define SOC_ENUM_DOUBLE(xreg, xshift_l, xsh 116 117 Defines a stereo enumerated control 118 119 120 Codec Audio Operations 121 ---------------------- 122 The codec driver also supports the following A 123 :: 124 125 /* SoC audio ops */ 126 struct snd_soc_ops { 127 int (*startup)(struct snd_pcm_substrea 128 void (*shutdown)(struct snd_pcm_substr 129 int (*hw_params)(struct snd_pcm_substr 130 int (*hw_free)(struct snd_pcm_substrea 131 int (*prepare)(struct snd_pcm_substrea 132 }; 133 134 Please refer to the ALSA driver PCM documentat 135 https://www.kernel.org/doc/html/latest/sound/k 136 137 138 DAPM description 139 ---------------- 140 The Dynamic Audio Power Management description 141 components and their relationships and registe 142 Please read dapm.rst for details of building t 143 144 Please also see the examples in other codec dr 145 146 147 DAPM event handler 148 ------------------ 149 This function is a callback that handles codec 150 domain PM calls (e.g. suspend and resume). It 151 to sleep when not in use. 152 153 Power states:- 154 :: 155 156 SNDRV_CTL_POWER_D0: /* full On */ 157 /* vref/mid, clk and osc on, active */ 158 159 SNDRV_CTL_POWER_D1: /* partial On */ 160 SNDRV_CTL_POWER_D2: /* partial On */ 161 162 SNDRV_CTL_POWER_D3hot: /* Off, with po 163 /* everything off except vref/vmid, in 164 165 SNDRV_CTL_POWER_D3cold: /* Everything 166 167 168 Codec DAC digital mute control 169 ------------------------------ 170 Most codecs have a digital mute before the DAC 171 minimise any system noise. The mute stops any 172 entering the DAC. 173 174 A callback can be created that is called by th 175 when the mute is applied or freed. 176 177 i.e. 178 :: 179 180 static int wm8974_mute(struct snd_soc_dai *d 181 { 182 struct snd_soc_component *component = 183 u16 mute_reg = snd_soc_component_read( 184 185 if (mute) 186 snd_soc_component_write(compon 187 else 188 snd_soc_component_write(compon 189 return 0; 190 }
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.