| OLD | NEW |
| 1 /* | 1 /* |
| 2 * wm8994.c -- WM8994 ALSA SoC Audio driver | 2 * wm8994.c -- WM8994 ALSA SoC Audio driver |
| 3 * | 3 * |
| 4 * Copyright 2009 Wolfson Microelectronics plc | 4 * Copyright 2009 Wolfson Microelectronics plc |
| 5 * | 5 * |
| 6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> | 6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> |
| 7 * | 7 * |
| 8 * | 8 * |
| 9 * This program is free software; you can redistribute it and/or modify | 9 * This program is free software; you can redistribute it and/or modify |
| 10 * it under the terms of the GNU General Public License version 2 as | 10 * it under the terms of the GNU General Public License version 2 as |
| 11 * published by the Free Software Foundation. | 11 * published by the Free Software Foundation. |
| 12 */ | 12 */ |
| 13 | 13 |
| 14 #include <linux/module.h> | 14 #include <linux/module.h> |
| 15 #include <linux/moduleparam.h> | 15 #include <linux/moduleparam.h> |
| 16 #include <linux/init.h> | 16 #include <linux/init.h> |
| 17 #include <linux/delay.h> | 17 #include <linux/delay.h> |
| 18 #include <linux/pm.h> | 18 #include <linux/pm.h> |
| 19 #include <linux/i2c.h> | 19 #include <linux/i2c.h> |
| 20 #include <linux/platform_device.h> | 20 #include <linux/platform_device.h> |
| 21 #include <linux/pm_runtime.h> |
| 21 #include <linux/regulator/consumer.h> | 22 #include <linux/regulator/consumer.h> |
| 22 #include <linux/slab.h> | 23 #include <linux/slab.h> |
| 23 #include <sound/core.h> | 24 #include <sound/core.h> |
| 25 #include <sound/jack.h> |
| 24 #include <sound/pcm.h> | 26 #include <sound/pcm.h> |
| 25 #include <sound/pcm_params.h> | 27 #include <sound/pcm_params.h> |
| 26 #include <sound/soc.h> | 28 #include <sound/soc.h> |
| 27 #include <sound/soc-dapm.h> | |
| 28 #include <sound/initval.h> | 29 #include <sound/initval.h> |
| 29 #include <sound/tlv.h> | 30 #include <sound/tlv.h> |
| 31 #include <trace/events/asoc.h> |
| 30 | 32 |
| 31 #include <linux/mfd/wm8994/core.h> | 33 #include <linux/mfd/wm8994/core.h> |
| 32 #include <linux/mfd/wm8994/registers.h> | 34 #include <linux/mfd/wm8994/registers.h> |
| 33 #include <linux/mfd/wm8994/pdata.h> | 35 #include <linux/mfd/wm8994/pdata.h> |
| 34 #include <linux/mfd/wm8994/gpio.h> | 36 #include <linux/mfd/wm8994/gpio.h> |
| 35 | 37 |
| 36 #include "wm8994.h" | 38 #include "wm8994.h" |
| 37 #include "wm_hubs.h" | 39 #include "wm_hubs.h" |
| 38 | 40 |
| 39 struct fll_config { | 41 struct fll_config { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 50 WM8994_AIF1_DRC2_1, | 52 WM8994_AIF1_DRC2_1, |
| 51 WM8994_AIF2_DRC_1, | 53 WM8994_AIF2_DRC_1, |
| 52 }; | 54 }; |
| 53 | 55 |
| 54 static int wm8994_retune_mobile_base[] = { | 56 static int wm8994_retune_mobile_base[] = { |
| 55 WM8994_AIF1_DAC1_EQ_GAINS_1, | 57 WM8994_AIF1_DAC1_EQ_GAINS_1, |
| 56 WM8994_AIF1_DAC2_EQ_GAINS_1, | 58 WM8994_AIF1_DAC2_EQ_GAINS_1, |
| 57 WM8994_AIF2_EQ_GAINS_1, | 59 WM8994_AIF2_EQ_GAINS_1, |
| 58 }; | 60 }; |
| 59 | 61 |
| 60 #define WM8994_REG_CACHE_SIZE 0x621 | |
| 61 | |
| 62 struct wm8994_micdet { | 62 struct wm8994_micdet { |
| 63 struct snd_soc_jack *jack; | 63 struct snd_soc_jack *jack; |
| 64 int det; | 64 int det; |
| 65 int shrt; | 65 int shrt; |
| 66 }; | 66 }; |
| 67 | 67 |
| 68 /* codec private data */ | 68 /* codec private data */ |
| 69 struct wm8994_priv { | 69 struct wm8994_priv { |
| 70 struct wm_hubs_data hubs; | 70 struct wm_hubs_data hubs; |
| 71 enum snd_soc_control_type control_type; | 71 enum snd_soc_control_type control_type; |
| 72 void *control_data; | 72 void *control_data; |
| 73 struct snd_soc_codec *codec; | 73 struct snd_soc_codec *codec; |
| 74 u16 reg_cache[WM8994_REG_CACHE_SIZE + 1]; | |
| 75 int sysclk[2]; | 74 int sysclk[2]; |
| 76 int sysclk_rate[2]; | 75 int sysclk_rate[2]; |
| 77 int mclk[2]; | 76 int mclk[2]; |
| 78 int aifclk[2]; | 77 int aifclk[2]; |
| 79 struct fll_config fll[2], fll_suspend[2]; | 78 struct fll_config fll[2], fll_suspend[2]; |
| 80 | 79 |
| 81 int dac_rates[2]; | 80 int dac_rates[2]; |
| 82 int lrclk_shared[2]; | 81 int lrclk_shared[2]; |
| 83 | 82 |
| 83 int mbc_ena[3]; |
| 84 |
| 84 /* Platform dependant DRC configuration */ | 85 /* Platform dependant DRC configuration */ |
| 85 const char **drc_texts; | 86 const char **drc_texts; |
| 86 int drc_cfg[WM8994_NUM_DRC]; | 87 int drc_cfg[WM8994_NUM_DRC]; |
| 87 struct soc_enum drc_enum; | 88 struct soc_enum drc_enum; |
| 88 | 89 |
| 89 /* Platform dependant ReTune mobile configuration */ | 90 /* Platform dependant ReTune mobile configuration */ |
| 90 int num_retune_mobile_texts; | 91 int num_retune_mobile_texts; |
| 91 const char **retune_mobile_texts; | 92 const char **retune_mobile_texts; |
| 92 int retune_mobile_cfg[WM8994_NUM_EQ]; | 93 int retune_mobile_cfg[WM8994_NUM_EQ]; |
| 93 struct soc_enum retune_mobile_enum; | 94 struct soc_enum retune_mobile_enum; |
| 94 | 95 |
| 96 /* Platform dependant MBC configuration */ |
| 97 int mbc_cfg; |
| 98 const char **mbc_texts; |
| 99 struct soc_enum mbc_enum; |
| 100 |
| 95 struct wm8994_micdet micdet[2]; | 101 struct wm8994_micdet micdet[2]; |
| 96 | 102 |
| 103 wm8958_micdet_cb jack_cb; |
| 104 void *jack_cb_data; |
| 105 bool jack_is_mic; |
| 106 bool jack_is_video; |
| 107 |
| 97 int revision; | 108 int revision; |
| 98 struct wm8994_pdata *pdata; | 109 struct wm8994_pdata *pdata; |
| 110 |
| 111 unsigned int aif1clk_enable:1; |
| 112 unsigned int aif2clk_enable:1; |
| 99 }; | 113 }; |
| 100 | 114 |
| 101 static const struct { | 115 static int wm8994_readable(struct snd_soc_codec *codec, unsigned int reg) |
| 102 unsigned short readable; /* Mask of readable bits */ | |
| 103 unsigned short writable; /* Mask of writable bits */ | |
| 104 } access_masks[] = { | |
| 105 { 0xFFFF, 0xFFFF }, /* R0 - Software Reset */ | |
| 106 { 0x3B37, 0x3B37 }, /* R1 - Power Management (1) */ | |
| 107 { 0x6BF0, 0x6BF0 }, /* R2 - Power Management (2) */ | |
| 108 { 0x3FF0, 0x3FF0 }, /* R3 - Power Management (3) */ | |
| 109 { 0x3F3F, 0x3F3F }, /* R4 - Power Management (4) */ | |
| 110 { 0x3F0F, 0x3F0F }, /* R5 - Power Management (5) */ | |
| 111 { 0x003F, 0x003F }, /* R6 - Power Management (6) */ | |
| 112 { 0x0000, 0x0000 }, /* R7 */ | |
| 113 { 0x0000, 0x0000 }, /* R8 */ | |
| 114 { 0x0000, 0x0000 }, /* R9 */ | |
| 115 { 0x0000, 0x0000 }, /* R10 */ | |
| 116 { 0x0000, 0x0000 }, /* R11 */ | |
| 117 { 0x0000, 0x0000 }, /* R12 */ | |
| 118 { 0x0000, 0x0000 }, /* R13 */ | |
| 119 { 0x0000, 0x0000 }, /* R14 */ | |
| 120 { 0x0000, 0x0000 }, /* R15 */ | |
| 121 { 0x0000, 0x0000 }, /* R16 */ | |
| 122 { 0x0000, 0x0000 }, /* R17 */ | |
| 123 { 0x0000, 0x0000 }, /* R18 */ | |
| 124 { 0x0000, 0x0000 }, /* R19 */ | |
| 125 { 0x0000, 0x0000 }, /* R20 */ | |
| 126 { 0x01C0, 0x01C0 }, /* R21 - Input Mixer (1) */ | |
| 127 { 0x0000, 0x0000 }, /* R22 */ | |
| 128 { 0x0000, 0x0000 }, /* R23 */ | |
| 129 { 0x00DF, 0x01DF }, /* R24 - Left Line Input 1&2 Volume */ | |
| 130 { 0x00DF, 0x01DF }, /* R25 - Left Line Input 3&4 Volume */ | |
| 131 { 0x00DF, 0x01DF }, /* R26 - Right Line Input 1&2 Volume */ | |
| 132 { 0x00DF, 0x01DF }, /* R27 - Right Line Input 3&4 Volume */ | |
| 133 { 0x00FF, 0x01FF }, /* R28 - Left Output Volume */ | |
| 134 { 0x00FF, 0x01FF }, /* R29 - Right Output Volume */ | |
| 135 { 0x0077, 0x0077 }, /* R30 - Line Outputs Volume */ | |
| 136 { 0x0030, 0x0030 }, /* R31 - HPOUT2 Volume */ | |
| 137 { 0x00FF, 0x01FF }, /* R32 - Left OPGA Volume */ | |
| 138 { 0x00FF, 0x01FF }, /* R33 - Right OPGA Volume */ | |
| 139 { 0x007F, 0x007F }, /* R34 - SPKMIXL Attenuation */ | |
| 140 { 0x017F, 0x017F }, /* R35 - SPKMIXR Attenuation */ | |
| 141 { 0x003F, 0x003F }, /* R36 - SPKOUT Mixers */ | |
| 142 { 0x003F, 0x003F }, /* R37 - ClassD */ | |
| 143 { 0x00FF, 0x01FF }, /* R38 - Speaker Volume Left */ | |
| 144 { 0x00FF, 0x01FF }, /* R39 - Speaker Volume Right */ | |
| 145 { 0x00FF, 0x00FF }, /* R40 - Input Mixer (2) */ | |
| 146 { 0x01B7, 0x01B7 }, /* R41 - Input Mixer (3) */ | |
| 147 { 0x01B7, 0x01B7 }, /* R42 - Input Mixer (4) */ | |
| 148 { 0x01C7, 0x01C7 }, /* R43 - Input Mixer (5) */ | |
| 149 { 0x01C7, 0x01C7 }, /* R44 - Input Mixer (6) */ | |
| 150 { 0x01FF, 0x01FF }, /* R45 - Output Mixer (1) */ | |
| 151 { 0x01FF, 0x01FF }, /* R46 - Output Mixer (2) */ | |
| 152 { 0x0FFF, 0x0FFF }, /* R47 - Output Mixer (3) */ | |
| 153 { 0x0FFF, 0x0FFF }, /* R48 - Output Mixer (4) */ | |
| 154 { 0x0FFF, 0x0FFF }, /* R49 - Output Mixer (5) */ | |
| 155 { 0x0FFF, 0x0FFF }, /* R50 - Output Mixer (6) */ | |
| 156 { 0x0038, 0x0038 }, /* R51 - HPOUT2 Mixer */ | |
| 157 { 0x0077, 0x0077 }, /* R52 - Line Mixer (1) */ | |
| 158 { 0x0077, 0x0077 }, /* R53 - Line Mixer (2) */ | |
| 159 { 0x03FF, 0x03FF }, /* R54 - Speaker Mixer */ | |
| 160 { 0x00C1, 0x00C1 }, /* R55 - Additional Control */ | |
| 161 { 0x00F0, 0x00F0 }, /* R56 - AntiPOP (1) */ | |
| 162 { 0x01EF, 0x01EF }, /* R57 - AntiPOP (2) */ | |
| 163 { 0x00FF, 0x00FF }, /* R58 - MICBIAS */ | |
| 164 { 0x000F, 0x000F }, /* R59 - LDO 1 */ | |
| 165 { 0x0007, 0x0007 }, /* R60 - LDO 2 */ | |
| 166 { 0x0000, 0x0000 }, /* R61 */ | |
| 167 { 0x0000, 0x0000 }, /* R62 */ | |
| 168 { 0x0000, 0x0000 }, /* R63 */ | |
| 169 { 0x0000, 0x0000 }, /* R64 */ | |
| 170 { 0x0000, 0x0000 }, /* R65 */ | |
| 171 { 0x0000, 0x0000 }, /* R66 */ | |
| 172 { 0x0000, 0x0000 }, /* R67 */ | |
| 173 { 0x0000, 0x0000 }, /* R68 */ | |
| 174 { 0x0000, 0x0000 }, /* R69 */ | |
| 175 { 0x0000, 0x0000 }, /* R70 */ | |
| 176 { 0x0000, 0x0000 }, /* R71 */ | |
| 177 { 0x0000, 0x0000 }, /* R72 */ | |
| 178 { 0x0000, 0x0000 }, /* R73 */ | |
| 179 { 0x0000, 0x0000 }, /* R74 */ | |
| 180 { 0x0000, 0x0000 }, /* R75 */ | |
| 181 { 0x8000, 0x8000 }, /* R76 - Charge Pump (1) */ | |
| 182 { 0x0000, 0x0000 }, /* R77 */ | |
| 183 { 0x0000, 0x0000 }, /* R78 */ | |
| 184 { 0x0000, 0x0000 }, /* R79 */ | |
| 185 { 0x0000, 0x0000 }, /* R80 */ | |
| 186 { 0x0301, 0x0301 }, /* R81 - Class W (1) */ | |
| 187 { 0x0000, 0x0000 }, /* R82 */ | |
| 188 { 0x0000, 0x0000 }, /* R83 */ | |
| 189 { 0x333F, 0x333F }, /* R84 - DC Servo (1) */ | |
| 190 { 0x0FEF, 0x0FEF }, /* R85 - DC Servo (2) */ | |
| 191 { 0x0000, 0x0000 }, /* R86 */ | |
| 192 { 0xFFFF, 0xFFFF }, /* R87 - DC Servo (4) */ | |
| 193 { 0x0333, 0x0000 }, /* R88 - DC Servo Readback */ | |
| 194 { 0x0000, 0x0000 }, /* R89 */ | |
| 195 { 0x0000, 0x0000 }, /* R90 */ | |
| 196 { 0x0000, 0x0000 }, /* R91 */ | |
| 197 { 0x0000, 0x0000 }, /* R92 */ | |
| 198 { 0x0000, 0x0000 }, /* R93 */ | |
| 199 { 0x0000, 0x0000 }, /* R94 */ | |
| 200 { 0x0000, 0x0000 }, /* R95 */ | |
| 201 { 0x00EE, 0x00EE }, /* R96 - Analogue HP (1) */ | |
| 202 { 0x0000, 0x0000 }, /* R97 */ | |
| 203 { 0x0000, 0x0000 }, /* R98 */ | |
| 204 { 0x0000, 0x0000 }, /* R99 */ | |
| 205 { 0x0000, 0x0000 }, /* R100 */ | |
| 206 { 0x0000, 0x0000 }, /* R101 */ | |
| 207 { 0x0000, 0x0000 }, /* R102 */ | |
| 208 { 0x0000, 0x0000 }, /* R103 */ | |
| 209 { 0x0000, 0x0000 }, /* R104 */ | |
| 210 { 0x0000, 0x0000 }, /* R105 */ | |
| 211 { 0x0000, 0x0000 }, /* R106 */ | |
| 212 { 0x0000, 0x0000 }, /* R107 */ | |
| 213 { 0x0000, 0x0000 }, /* R108 */ | |
| 214 { 0x0000, 0x0000 }, /* R109 */ | |
| 215 { 0x0000, 0x0000 }, /* R110 */ | |
| 216 { 0x0000, 0x0000 }, /* R111 */ | |
| 217 { 0x0000, 0x0000 }, /* R112 */ | |
| 218 { 0x0000, 0x0000 }, /* R113 */ | |
| 219 { 0x0000, 0x0000 }, /* R114 */ | |
| 220 { 0x0000, 0x0000 }, /* R115 */ | |
| 221 { 0x0000, 0x0000 }, /* R116 */ | |
| 222 { 0x0000, 0x0000 }, /* R117 */ | |
| 223 { 0x0000, 0x0000 }, /* R118 */ | |
| 224 { 0x0000, 0x0000 }, /* R119 */ | |
| 225 { 0x0000, 0x0000 }, /* R120 */ | |
| 226 { 0x0000, 0x0000 }, /* R121 */ | |
| 227 { 0x0000, 0x0000 }, /* R122 */ | |
| 228 { 0x0000, 0x0000 }, /* R123 */ | |
| 229 { 0x0000, 0x0000 }, /* R124 */ | |
| 230 { 0x0000, 0x0000 }, /* R125 */ | |
| 231 { 0x0000, 0x0000 }, /* R126 */ | |
| 232 { 0x0000, 0x0000 }, /* R127 */ | |
| 233 { 0x0000, 0x0000 }, /* R128 */ | |
| 234 { 0x0000, 0x0000 }, /* R129 */ | |
| 235 { 0x0000, 0x0000 }, /* R130 */ | |
| 236 { 0x0000, 0x0000 }, /* R131 */ | |
| 237 { 0x0000, 0x0000 }, /* R132 */ | |
| 238 { 0x0000, 0x0000 }, /* R133 */ | |
| 239 { 0x0000, 0x0000 }, /* R134 */ | |
| 240 { 0x0000, 0x0000 }, /* R135 */ | |
| 241 { 0x0000, 0x0000 }, /* R136 */ | |
| 242 { 0x0000, 0x0000 }, /* R137 */ | |
| 243 { 0x0000, 0x0000 }, /* R138 */ | |
| 244 { 0x0000, 0x0000 }, /* R139 */ | |
| 245 { 0x0000, 0x0000 }, /* R140 */ | |
| 246 { 0x0000, 0x0000 }, /* R141 */ | |
| 247 { 0x0000, 0x0000 }, /* R142 */ | |
| 248 { 0x0000, 0x0000 }, /* R143 */ | |
| 249 { 0x0000, 0x0000 }, /* R144 */ | |
| 250 { 0x0000, 0x0000 }, /* R145 */ | |
| 251 { 0x0000, 0x0000 }, /* R146 */ | |
| 252 { 0x0000, 0x0000 }, /* R147 */ | |
| 253 { 0x0000, 0x0000 }, /* R148 */ | |
| 254 { 0x0000, 0x0000 }, /* R149 */ | |
| 255 { 0x0000, 0x0000 }, /* R150 */ | |
| 256 { 0x0000, 0x0000 }, /* R151 */ | |
| 257 { 0x0000, 0x0000 }, /* R152 */ | |
| 258 { 0x0000, 0x0000 }, /* R153 */ | |
| 259 { 0x0000, 0x0000 }, /* R154 */ | |
| 260 { 0x0000, 0x0000 }, /* R155 */ | |
| 261 { 0x0000, 0x0000 }, /* R156 */ | |
| 262 { 0x0000, 0x0000 }, /* R157 */ | |
| 263 { 0x0000, 0x0000 }, /* R158 */ | |
| 264 { 0x0000, 0x0000 }, /* R159 */ | |
| 265 { 0x0000, 0x0000 }, /* R160 */ | |
| 266 { 0x0000, 0x0000 }, /* R161 */ | |
| 267 { 0x0000, 0x0000 }, /* R162 */ | |
| 268 { 0x0000, 0x0000 }, /* R163 */ | |
| 269 { 0x0000, 0x0000 }, /* R164 */ | |
| 270 { 0x0000, 0x0000 }, /* R165 */ | |
| 271 { 0x0000, 0x0000 }, /* R166 */ | |
| 272 { 0x0000, 0x0000 }, /* R167 */ | |
| 273 { 0x0000, 0x0000 }, /* R168 */ | |
| 274 { 0x0000, 0x0000 }, /* R169 */ | |
| 275 { 0x0000, 0x0000 }, /* R170 */ | |
| 276 { 0x0000, 0x0000 }, /* R171 */ | |
| 277 { 0x0000, 0x0000 }, /* R172 */ | |
| 278 { 0x0000, 0x0000 }, /* R173 */ | |
| 279 { 0x0000, 0x0000 }, /* R174 */ | |
| 280 { 0x0000, 0x0000 }, /* R175 */ | |
| 281 { 0x0000, 0x0000 }, /* R176 */ | |
| 282 { 0x0000, 0x0000 }, /* R177 */ | |
| 283 { 0x0000, 0x0000 }, /* R178 */ | |
| 284 { 0x0000, 0x0000 }, /* R179 */ | |
| 285 { 0x0000, 0x0000 }, /* R180 */ | |
| 286 { 0x0000, 0x0000 }, /* R181 */ | |
| 287 { 0x0000, 0x0000 }, /* R182 */ | |
| 288 { 0x0000, 0x0000 }, /* R183 */ | |
| 289 { 0x0000, 0x0000 }, /* R184 */ | |
| 290 { 0x0000, 0x0000 }, /* R185 */ | |
| 291 { 0x0000, 0x0000 }, /* R186 */ | |
| 292 { 0x0000, 0x0000 }, /* R187 */ | |
| 293 { 0x0000, 0x0000 }, /* R188 */ | |
| 294 { 0x0000, 0x0000 }, /* R189 */ | |
| 295 { 0x0000, 0x0000 }, /* R190 */ | |
| 296 { 0x0000, 0x0000 }, /* R191 */ | |
| 297 { 0x0000, 0x0000 }, /* R192 */ | |
| 298 { 0x0000, 0x0000 }, /* R193 */ | |
| 299 { 0x0000, 0x0000 }, /* R194 */ | |
| 300 { 0x0000, 0x0000 }, /* R195 */ | |
| 301 { 0x0000, 0x0000 }, /* R196 */ | |
| 302 { 0x0000, 0x0000 }, /* R197 */ | |
| 303 { 0x0000, 0x0000 }, /* R198 */ | |
| 304 { 0x0000, 0x0000 }, /* R199 */ | |
| 305 { 0x0000, 0x0000 }, /* R200 */ | |
| 306 { 0x0000, 0x0000 }, /* R201 */ | |
| 307 { 0x0000, 0x0000 }, /* R202 */ | |
| 308 { 0x0000, 0x0000 }, /* R203 */ | |
| 309 { 0x0000, 0x0000 }, /* R204 */ | |
| 310 { 0x0000, 0x0000 }, /* R205 */ | |
| 311 { 0x0000, 0x0000 }, /* R206 */ | |
| 312 { 0x0000, 0x0000 }, /* R207 */ | |
| 313 { 0x0000, 0x0000 }, /* R208 */ | |
| 314 { 0x0000, 0x0000 }, /* R209 */ | |
| 315 { 0x0000, 0x0000 }, /* R210 */ | |
| 316 { 0x0000, 0x0000 }, /* R211 */ | |
| 317 { 0x0000, 0x0000 }, /* R212 */ | |
| 318 { 0x0000, 0x0000 }, /* R213 */ | |
| 319 { 0x0000, 0x0000 }, /* R214 */ | |
| 320 { 0x0000, 0x0000 }, /* R215 */ | |
| 321 { 0x0000, 0x0000 }, /* R216 */ | |
| 322 { 0x0000, 0x0000 }, /* R217 */ | |
| 323 { 0x0000, 0x0000 }, /* R218 */ | |
| 324 { 0x0000, 0x0000 }, /* R219 */ | |
| 325 { 0x0000, 0x0000 }, /* R220 */ | |
| 326 { 0x0000, 0x0000 }, /* R221 */ | |
| 327 { 0x0000, 0x0000 }, /* R222 */ | |
| 328 { 0x0000, 0x0000 }, /* R223 */ | |
| 329 { 0x0000, 0x0000 }, /* R224 */ | |
| 330 { 0x0000, 0x0000 }, /* R225 */ | |
| 331 { 0x0000, 0x0000 }, /* R226 */ | |
| 332 { 0x0000, 0x0000 }, /* R227 */ | |
| 333 { 0x0000, 0x0000 }, /* R228 */ | |
| 334 { 0x0000, 0x0000 }, /* R229 */ | |
| 335 { 0x0000, 0x0000 }, /* R230 */ | |
| 336 { 0x0000, 0x0000 }, /* R231 */ | |
| 337 { 0x0000, 0x0000 }, /* R232 */ | |
| 338 { 0x0000, 0x0000 }, /* R233 */ | |
| 339 { 0x0000, 0x0000 }, /* R234 */ | |
| 340 { 0x0000, 0x0000 }, /* R235 */ | |
| 341 { 0x0000, 0x0000 }, /* R236 */ | |
| 342 { 0x0000, 0x0000 }, /* R237 */ | |
| 343 { 0x0000, 0x0000 }, /* R238 */ | |
| 344 { 0x0000, 0x0000 }, /* R239 */ | |
| 345 { 0x0000, 0x0000 }, /* R240 */ | |
| 346 { 0x0000, 0x0000 }, /* R241 */ | |
| 347 { 0x0000, 0x0000 }, /* R242 */ | |
| 348 { 0x0000, 0x0000 }, /* R243 */ | |
| 349 { 0x0000, 0x0000 }, /* R244 */ | |
| 350 { 0x0000, 0x0000 }, /* R245 */ | |
| 351 { 0x0000, 0x0000 }, /* R246 */ | |
| 352 { 0x0000, 0x0000 }, /* R247 */ | |
| 353 { 0x0000, 0x0000 }, /* R248 */ | |
| 354 { 0x0000, 0x0000 }, /* R249 */ | |
| 355 { 0x0000, 0x0000 }, /* R250 */ | |
| 356 { 0x0000, 0x0000 }, /* R251 */ | |
| 357 { 0x0000, 0x0000 }, /* R252 */ | |
| 358 { 0x0000, 0x0000 }, /* R253 */ | |
| 359 { 0x0000, 0x0000 }, /* R254 */ | |
| 360 { 0x0000, 0x0000 }, /* R255 */ | |
| 361 { 0x000F, 0x0000 }, /* R256 - Chip Revision */ | |
| 362 { 0x0074, 0x0074 }, /* R257 - Control Interface */ | |
| 363 { 0x0000, 0x0000 }, /* R258 */ | |
| 364 { 0x0000, 0x0000 }, /* R259 */ | |
| 365 { 0x0000, 0x0000 }, /* R260 */ | |
| 366 { 0x0000, 0x0000 }, /* R261 */ | |
| 367 { 0x0000, 0x0000 }, /* R262 */ | |
| 368 { 0x0000, 0x0000 }, /* R263 */ | |
| 369 { 0x0000, 0x0000 }, /* R264 */ | |
| 370 { 0x0000, 0x0000 }, /* R265 */ | |
| 371 { 0x0000, 0x0000 }, /* R266 */ | |
| 372 { 0x0000, 0x0000 }, /* R267 */ | |
| 373 { 0x0000, 0x0000 }, /* R268 */ | |
| 374 { 0x0000, 0x0000 }, /* R269 */ | |
| 375 { 0x0000, 0x0000 }, /* R270 */ | |
| 376 { 0x0000, 0x0000 }, /* R271 */ | |
| 377 { 0x807F, 0x837F }, /* R272 - Write Sequencer Ctrl (1) */ | |
| 378 { 0x017F, 0x0000 }, /* R273 - Write Sequencer Ctrl (2) */ | |
| 379 { 0x0000, 0x0000 }, /* R274 */ | |
| 380 { 0x0000, 0x0000 }, /* R275 */ | |
| 381 { 0x0000, 0x0000 }, /* R276 */ | |
| 382 { 0x0000, 0x0000 }, /* R277 */ | |
| 383 { 0x0000, 0x0000 }, /* R278 */ | |
| 384 { 0x0000, 0x0000 }, /* R279 */ | |
| 385 { 0x0000, 0x0000 }, /* R280 */ | |
| 386 { 0x0000, 0x0000 }, /* R281 */ | |
| 387 { 0x0000, 0x0000 }, /* R282 */ | |
| 388 { 0x0000, 0x0000 }, /* R283 */ | |
| 389 { 0x0000, 0x0000 }, /* R284 */ | |
| 390 { 0x0000, 0x0000 }, /* R285 */ | |
| 391 { 0x0000, 0x0000 }, /* R286 */ | |
| 392 { 0x0000, 0x0000 }, /* R287 */ | |
| 393 { 0x0000, 0x0000 }, /* R288 */ | |
| 394 { 0x0000, 0x0000 }, /* R289 */ | |
| 395 { 0x0000, 0x0000 }, /* R290 */ | |
| 396 { 0x0000, 0x0000 }, /* R291 */ | |
| 397 { 0x0000, 0x0000 }, /* R292 */ | |
| 398 { 0x0000, 0x0000 }, /* R293 */ | |
| 399 { 0x0000, 0x0000 }, /* R294 */ | |
| 400 { 0x0000, 0x0000 }, /* R295 */ | |
| 401 { 0x0000, 0x0000 }, /* R296 */ | |
| 402 { 0x0000, 0x0000 }, /* R297 */ | |
| 403 { 0x0000, 0x0000 }, /* R298 */ | |
| 404 { 0x0000, 0x0000 }, /* R299 */ | |
| 405 { 0x0000, 0x0000 }, /* R300 */ | |
| 406 { 0x0000, 0x0000 }, /* R301 */ | |
| 407 { 0x0000, 0x0000 }, /* R302 */ | |
| 408 { 0x0000, 0x0000 }, /* R303 */ | |
| 409 { 0x0000, 0x0000 }, /* R304 */ | |
| 410 { 0x0000, 0x0000 }, /* R305 */ | |
| 411 { 0x0000, 0x0000 }, /* R306 */ | |
| 412 { 0x0000, 0x0000 }, /* R307 */ | |
| 413 { 0x0000, 0x0000 }, /* R308 */ | |
| 414 { 0x0000, 0x0000 }, /* R309 */ | |
| 415 { 0x0000, 0x0000 }, /* R310 */ | |
| 416 { 0x0000, 0x0000 }, /* R311 */ | |
| 417 { 0x0000, 0x0000 }, /* R312 */ | |
| 418 { 0x0000, 0x0000 }, /* R313 */ | |
| 419 { 0x0000, 0x0000 }, /* R314 */ | |
| 420 { 0x0000, 0x0000 }, /* R315 */ | |
| 421 { 0x0000, 0x0000 }, /* R316 */ | |
| 422 { 0x0000, 0x0000 }, /* R317 */ | |
| 423 { 0x0000, 0x0000 }, /* R318 */ | |
| 424 { 0x0000, 0x0000 }, /* R319 */ | |
| 425 { 0x0000, 0x0000 }, /* R320 */ | |
| 426 { 0x0000, 0x0000 }, /* R321 */ | |
| 427 { 0x0000, 0x0000 }, /* R322 */ | |
| 428 { 0x0000, 0x0000 }, /* R323 */ | |
| 429 { 0x0000, 0x0000 }, /* R324 */ | |
| 430 { 0x0000, 0x0000 }, /* R325 */ | |
| 431 { 0x0000, 0x0000 }, /* R326 */ | |
| 432 { 0x0000, 0x0000 }, /* R327 */ | |
| 433 { 0x0000, 0x0000 }, /* R328 */ | |
| 434 { 0x0000, 0x0000 }, /* R329 */ | |
| 435 { 0x0000, 0x0000 }, /* R330 */ | |
| 436 { 0x0000, 0x0000 }, /* R331 */ | |
| 437 { 0x0000, 0x0000 }, /* R332 */ | |
| 438 { 0x0000, 0x0000 }, /* R333 */ | |
| 439 { 0x0000, 0x0000 }, /* R334 */ | |
| 440 { 0x0000, 0x0000 }, /* R335 */ | |
| 441 { 0x0000, 0x0000 }, /* R336 */ | |
| 442 { 0x0000, 0x0000 }, /* R337 */ | |
| 443 { 0x0000, 0x0000 }, /* R338 */ | |
| 444 { 0x0000, 0x0000 }, /* R339 */ | |
| 445 { 0x0000, 0x0000 }, /* R340 */ | |
| 446 { 0x0000, 0x0000 }, /* R341 */ | |
| 447 { 0x0000, 0x0000 }, /* R342 */ | |
| 448 { 0x0000, 0x0000 }, /* R343 */ | |
| 449 { 0x0000, 0x0000 }, /* R344 */ | |
| 450 { 0x0000, 0x0000 }, /* R345 */ | |
| 451 { 0x0000, 0x0000 }, /* R346 */ | |
| 452 { 0x0000, 0x0000 }, /* R347 */ | |
| 453 { 0x0000, 0x0000 }, /* R348 */ | |
| 454 { 0x0000, 0x0000 }, /* R349 */ | |
| 455 { 0x0000, 0x0000 }, /* R350 */ | |
| 456 { 0x0000, 0x0000 }, /* R351 */ | |
| 457 { 0x0000, 0x0000 }, /* R352 */ | |
| 458 { 0x0000, 0x0000 }, /* R353 */ | |
| 459 { 0x0000, 0x0000 }, /* R354 */ | |
| 460 { 0x0000, 0x0000 }, /* R355 */ | |
| 461 { 0x0000, 0x0000 }, /* R356 */ | |
| 462 { 0x0000, 0x0000 }, /* R357 */ | |
| 463 { 0x0000, 0x0000 }, /* R358 */ | |
| 464 { 0x0000, 0x0000 }, /* R359 */ | |
| 465 { 0x0000, 0x0000 }, /* R360 */ | |
| 466 { 0x0000, 0x0000 }, /* R361 */ | |
| 467 { 0x0000, 0x0000 }, /* R362 */ | |
| 468 { 0x0000, 0x0000 }, /* R363 */ | |
| 469 { 0x0000, 0x0000 }, /* R364 */ | |
| 470 { 0x0000, 0x0000 }, /* R365 */ | |
| 471 { 0x0000, 0x0000 }, /* R366 */ | |
| 472 { 0x0000, 0x0000 }, /* R367 */ | |
| 473 { 0x0000, 0x0000 }, /* R368 */ | |
| 474 { 0x0000, 0x0000 }, /* R369 */ | |
| 475 { 0x0000, 0x0000 }, /* R370 */ | |
| 476 { 0x0000, 0x0000 }, /* R371 */ | |
| 477 { 0x0000, 0x0000 }, /* R372 */ | |
| 478 { 0x0000, 0x0000 }, /* R373 */ | |
| 479 { 0x0000, 0x0000 }, /* R374 */ | |
| 480 { 0x0000, 0x0000 }, /* R375 */ | |
| 481 { 0x0000, 0x0000 }, /* R376 */ | |
| 482 { 0x0000, 0x0000 }, /* R377 */ | |
| 483 { 0x0000, 0x0000 }, /* R378 */ | |
| 484 { 0x0000, 0x0000 }, /* R379 */ | |
| 485 { 0x0000, 0x0000 }, /* R380 */ | |
| 486 { 0x0000, 0x0000 }, /* R381 */ | |
| 487 { 0x0000, 0x0000 }, /* R382 */ | |
| 488 { 0x0000, 0x0000 }, /* R383 */ | |
| 489 { 0x0000, 0x0000 }, /* R384 */ | |
| 490 { 0x0000, 0x0000 }, /* R385 */ | |
| 491 { 0x0000, 0x0000 }, /* R386 */ | |
| 492 { 0x0000, 0x0000 }, /* R387 */ | |
| 493 { 0x0000, 0x0000 }, /* R388 */ | |
| 494 { 0x0000, 0x0000 }, /* R389 */ | |
| 495 { 0x0000, 0x0000 }, /* R390 */ | |
| 496 { 0x0000, 0x0000 }, /* R391 */ | |
| 497 { 0x0000, 0x0000 }, /* R392 */ | |
| 498 { 0x0000, 0x0000 }, /* R393 */ | |
| 499 { 0x0000, 0x0000 }, /* R394 */ | |
| 500 { 0x0000, 0x0000 }, /* R395 */ | |
| 501 { 0x0000, 0x0000 }, /* R396 */ | |
| 502 { 0x0000, 0x0000 }, /* R397 */ | |
| 503 { 0x0000, 0x0000 }, /* R398 */ | |
| 504 { 0x0000, 0x0000 }, /* R399 */ | |
| 505 { 0x0000, 0x0000 }, /* R400 */ | |
| 506 { 0x0000, 0x0000 }, /* R401 */ | |
| 507 { 0x0000, 0x0000 }, /* R402 */ | |
| 508 { 0x0000, 0x0000 }, /* R403 */ | |
| 509 { 0x0000, 0x0000 }, /* R404 */ | |
| 510 { 0x0000, 0x0000 }, /* R405 */ | |
| 511 { 0x0000, 0x0000 }, /* R406 */ | |
| 512 { 0x0000, 0x0000 }, /* R407 */ | |
| 513 { 0x0000, 0x0000 }, /* R408 */ | |
| 514 { 0x0000, 0x0000 }, /* R409 */ | |
| 515 { 0x0000, 0x0000 }, /* R410 */ | |
| 516 { 0x0000, 0x0000 }, /* R411 */ | |
| 517 { 0x0000, 0x0000 }, /* R412 */ | |
| 518 { 0x0000, 0x0000 }, /* R413 */ | |
| 519 { 0x0000, 0x0000 }, /* R414 */ | |
| 520 { 0x0000, 0x0000 }, /* R415 */ | |
| 521 { 0x0000, 0x0000 }, /* R416 */ | |
| 522 { 0x0000, 0x0000 }, /* R417 */ | |
| 523 { 0x0000, 0x0000 }, /* R418 */ | |
| 524 { 0x0000, 0x0000 }, /* R419 */ | |
| 525 { 0x0000, 0x0000 }, /* R420 */ | |
| 526 { 0x0000, 0x0000 }, /* R421 */ | |
| 527 { 0x0000, 0x0000 }, /* R422 */ | |
| 528 { 0x0000, 0x0000 }, /* R423 */ | |
| 529 { 0x0000, 0x0000 }, /* R424 */ | |
| 530 { 0x0000, 0x0000 }, /* R425 */ | |
| 531 { 0x0000, 0x0000 }, /* R426 */ | |
| 532 { 0x0000, 0x0000 }, /* R427 */ | |
| 533 { 0x0000, 0x0000 }, /* R428 */ | |
| 534 { 0x0000, 0x0000 }, /* R429 */ | |
| 535 { 0x0000, 0x0000 }, /* R430 */ | |
| 536 { 0x0000, 0x0000 }, /* R431 */ | |
| 537 { 0x0000, 0x0000 }, /* R432 */ | |
| 538 { 0x0000, 0x0000 }, /* R433 */ | |
| 539 { 0x0000, 0x0000 }, /* R434 */ | |
| 540 { 0x0000, 0x0000 }, /* R435 */ | |
| 541 { 0x0000, 0x0000 }, /* R436 */ | |
| 542 { 0x0000, 0x0000 }, /* R437 */ | |
| 543 { 0x0000, 0x0000 }, /* R438 */ | |
| 544 { 0x0000, 0x0000 }, /* R439 */ | |
| 545 { 0x0000, 0x0000 }, /* R440 */ | |
| 546 { 0x0000, 0x0000 }, /* R441 */ | |
| 547 { 0x0000, 0x0000 }, /* R442 */ | |
| 548 { 0x0000, 0x0000 }, /* R443 */ | |
| 549 { 0x0000, 0x0000 }, /* R444 */ | |
| 550 { 0x0000, 0x0000 }, /* R445 */ | |
| 551 { 0x0000, 0x0000 }, /* R446 */ | |
| 552 { 0x0000, 0x0000 }, /* R447 */ | |
| 553 { 0x0000, 0x0000 }, /* R448 */ | |
| 554 { 0x0000, 0x0000 }, /* R449 */ | |
| 555 { 0x0000, 0x0000 }, /* R450 */ | |
| 556 { 0x0000, 0x0000 }, /* R451 */ | |
| 557 { 0x0000, 0x0000 }, /* R452 */ | |
| 558 { 0x0000, 0x0000 }, /* R453 */ | |
| 559 { 0x0000, 0x0000 }, /* R454 */ | |
| 560 { 0x0000, 0x0000 }, /* R455 */ | |
| 561 { 0x0000, 0x0000 }, /* R456 */ | |
| 562 { 0x0000, 0x0000 }, /* R457 */ | |
| 563 { 0x0000, 0x0000 }, /* R458 */ | |
| 564 { 0x0000, 0x0000 }, /* R459 */ | |
| 565 { 0x0000, 0x0000 }, /* R460 */ | |
| 566 { 0x0000, 0x0000 }, /* R461 */ | |
| 567 { 0x0000, 0x0000 }, /* R462 */ | |
| 568 { 0x0000, 0x0000 }, /* R463 */ | |
| 569 { 0x0000, 0x0000 }, /* R464 */ | |
| 570 { 0x0000, 0x0000 }, /* R465 */ | |
| 571 { 0x0000, 0x0000 }, /* R466 */ | |
| 572 { 0x0000, 0x0000 }, /* R467 */ | |
| 573 { 0x0000, 0x0000 }, /* R468 */ | |
| 574 { 0x0000, 0x0000 }, /* R469 */ | |
| 575 { 0x0000, 0x0000 }, /* R470 */ | |
| 576 { 0x0000, 0x0000 }, /* R471 */ | |
| 577 { 0x0000, 0x0000 }, /* R472 */ | |
| 578 { 0x0000, 0x0000 }, /* R473 */ | |
| 579 { 0x0000, 0x0000 }, /* R474 */ | |
| 580 { 0x0000, 0x0000 }, /* R475 */ | |
| 581 { 0x0000, 0x0000 }, /* R476 */ | |
| 582 { 0x0000, 0x0000 }, /* R477 */ | |
| 583 { 0x0000, 0x0000 }, /* R478 */ | |
| 584 { 0x0000, 0x0000 }, /* R479 */ | |
| 585 { 0x0000, 0x0000 }, /* R480 */ | |
| 586 { 0x0000, 0x0000 }, /* R481 */ | |
| 587 { 0x0000, 0x0000 }, /* R482 */ | |
| 588 { 0x0000, 0x0000 }, /* R483 */ | |
| 589 { 0x0000, 0x0000 }, /* R484 */ | |
| 590 { 0x0000, 0x0000 }, /* R485 */ | |
| 591 { 0x0000, 0x0000 }, /* R486 */ | |
| 592 { 0x0000, 0x0000 }, /* R487 */ | |
| 593 { 0x0000, 0x0000 }, /* R488 */ | |
| 594 { 0x0000, 0x0000 }, /* R489 */ | |
| 595 { 0x0000, 0x0000 }, /* R490 */ | |
| 596 { 0x0000, 0x0000 }, /* R491 */ | |
| 597 { 0x0000, 0x0000 }, /* R492 */ | |
| 598 { 0x0000, 0x0000 }, /* R493 */ | |
| 599 { 0x0000, 0x0000 }, /* R494 */ | |
| 600 { 0x0000, 0x0000 }, /* R495 */ | |
| 601 { 0x0000, 0x0000 }, /* R496 */ | |
| 602 { 0x0000, 0x0000 }, /* R497 */ | |
| 603 { 0x0000, 0x0000 }, /* R498 */ | |
| 604 { 0x0000, 0x0000 }, /* R499 */ | |
| 605 { 0x0000, 0x0000 }, /* R500 */ | |
| 606 { 0x0000, 0x0000 }, /* R501 */ | |
| 607 { 0x0000, 0x0000 }, /* R502 */ | |
| 608 { 0x0000, 0x0000 }, /* R503 */ | |
| 609 { 0x0000, 0x0000 }, /* R504 */ | |
| 610 { 0x0000, 0x0000 }, /* R505 */ | |
| 611 { 0x0000, 0x0000 }, /* R506 */ | |
| 612 { 0x0000, 0x0000 }, /* R507 */ | |
| 613 { 0x0000, 0x0000 }, /* R508 */ | |
| 614 { 0x0000, 0x0000 }, /* R509 */ | |
| 615 { 0x0000, 0x0000 }, /* R510 */ | |
| 616 { 0x0000, 0x0000 }, /* R511 */ | |
| 617 { 0x001F, 0x001F }, /* R512 - AIF1 Clocking (1) */ | |
| 618 { 0x003F, 0x003F }, /* R513 - AIF1 Clocking (2) */ | |
| 619 { 0x0000, 0x0000 }, /* R514 */ | |
| 620 { 0x0000, 0x0000 }, /* R515 */ | |
| 621 { 0x001F, 0x001F }, /* R516 - AIF2 Clocking (1) */ | |
| 622 { 0x003F, 0x003F }, /* R517 - AIF2 Clocking (2) */ | |
| 623 { 0x0000, 0x0000 }, /* R518 */ | |
| 624 { 0x0000, 0x0000 }, /* R519 */ | |
| 625 { 0x001F, 0x001F }, /* R520 - Clocking (1) */ | |
| 626 { 0x0777, 0x0777 }, /* R521 - Clocking (2) */ | |
| 627 { 0x0000, 0x0000 }, /* R522 */ | |
| 628 { 0x0000, 0x0000 }, /* R523 */ | |
| 629 { 0x0000, 0x0000 }, /* R524 */ | |
| 630 { 0x0000, 0x0000 }, /* R525 */ | |
| 631 { 0x0000, 0x0000 }, /* R526 */ | |
| 632 { 0x0000, 0x0000 }, /* R527 */ | |
| 633 { 0x00FF, 0x00FF }, /* R528 - AIF1 Rate */ | |
| 634 { 0x00FF, 0x00FF }, /* R529 - AIF2 Rate */ | |
| 635 { 0x000F, 0x0000 }, /* R530 - Rate Status */ | |
| 636 { 0x0000, 0x0000 }, /* R531 */ | |
| 637 { 0x0000, 0x0000 }, /* R532 */ | |
| 638 { 0x0000, 0x0000 }, /* R533 */ | |
| 639 { 0x0000, 0x0000 }, /* R534 */ | |
| 640 { 0x0000, 0x0000 }, /* R535 */ | |
| 641 { 0x0000, 0x0000 }, /* R536 */ | |
| 642 { 0x0000, 0x0000 }, /* R537 */ | |
| 643 { 0x0000, 0x0000 }, /* R538 */ | |
| 644 { 0x0000, 0x0000 }, /* R539 */ | |
| 645 { 0x0000, 0x0000 }, /* R540 */ | |
| 646 { 0x0000, 0x0000 }, /* R541 */ | |
| 647 { 0x0000, 0x0000 }, /* R542 */ | |
| 648 { 0x0000, 0x0000 }, /* R543 */ | |
| 649 { 0x0007, 0x0007 }, /* R544 - FLL1 Control (1) */ | |
| 650 { 0x3F77, 0x3F77 }, /* R545 - FLL1 Control (2) */ | |
| 651 { 0xFFFF, 0xFFFF }, /* R546 - FLL1 Control (3) */ | |
| 652 { 0x7FEF, 0x7FEF }, /* R547 - FLL1 Control (4) */ | |
| 653 { 0x1FDB, 0x1FDB }, /* R548 - FLL1 Control (5) */ | |
| 654 { 0x0000, 0x0000 }, /* R549 */ | |
| 655 { 0x0000, 0x0000 }, /* R550 */ | |
| 656 { 0x0000, 0x0000 }, /* R551 */ | |
| 657 { 0x0000, 0x0000 }, /* R552 */ | |
| 658 { 0x0000, 0x0000 }, /* R553 */ | |
| 659 { 0x0000, 0x0000 }, /* R554 */ | |
| 660 { 0x0000, 0x0000 }, /* R555 */ | |
| 661 { 0x0000, 0x0000 }, /* R556 */ | |
| 662 { 0x0000, 0x0000 }, /* R557 */ | |
| 663 { 0x0000, 0x0000 }, /* R558 */ | |
| 664 { 0x0000, 0x0000 }, /* R559 */ | |
| 665 { 0x0000, 0x0000 }, /* R560 */ | |
| 666 { 0x0000, 0x0000 }, /* R561 */ | |
| 667 { 0x0000, 0x0000 }, /* R562 */ | |
| 668 { 0x0000, 0x0000 }, /* R563 */ | |
| 669 { 0x0000, 0x0000 }, /* R564 */ | |
| 670 { 0x0000, 0x0000 }, /* R565 */ | |
| 671 { 0x0000, 0x0000 }, /* R566 */ | |
| 672 { 0x0000, 0x0000 }, /* R567 */ | |
| 673 { 0x0000, 0x0000 }, /* R568 */ | |
| 674 { 0x0000, 0x0000 }, /* R569 */ | |
| 675 { 0x0000, 0x0000 }, /* R570 */ | |
| 676 { 0x0000, 0x0000 }, /* R571 */ | |
| 677 { 0x0000, 0x0000 }, /* R572 */ | |
| 678 { 0x0000, 0x0000 }, /* R573 */ | |
| 679 { 0x0000, 0x0000 }, /* R574 */ | |
| 680 { 0x0000, 0x0000 }, /* R575 */ | |
| 681 { 0x0007, 0x0007 }, /* R576 - FLL2 Control (1) */ | |
| 682 { 0x3F77, 0x3F77 }, /* R577 - FLL2 Control (2) */ | |
| 683 { 0xFFFF, 0xFFFF }, /* R578 - FLL2 Control (3) */ | |
| 684 { 0x7FEF, 0x7FEF }, /* R579 - FLL2 Control (4) */ | |
| 685 { 0x1FDB, 0x1FDB }, /* R580 - FLL2 Control (5) */ | |
| 686 { 0x0000, 0x0000 }, /* R581 */ | |
| 687 { 0x0000, 0x0000 }, /* R582 */ | |
| 688 { 0x0000, 0x0000 }, /* R583 */ | |
| 689 { 0x0000, 0x0000 }, /* R584 */ | |
| 690 { 0x0000, 0x0000 }, /* R585 */ | |
| 691 { 0x0000, 0x0000 }, /* R586 */ | |
| 692 { 0x0000, 0x0000 }, /* R587 */ | |
| 693 { 0x0000, 0x0000 }, /* R588 */ | |
| 694 { 0x0000, 0x0000 }, /* R589 */ | |
| 695 { 0x0000, 0x0000 }, /* R590 */ | |
| 696 { 0x0000, 0x0000 }, /* R591 */ | |
| 697 { 0x0000, 0x0000 }, /* R592 */ | |
| 698 { 0x0000, 0x0000 }, /* R593 */ | |
| 699 { 0x0000, 0x0000 }, /* R594 */ | |
| 700 { 0x0000, 0x0000 }, /* R595 */ | |
| 701 { 0x0000, 0x0000 }, /* R596 */ | |
| 702 { 0x0000, 0x0000 }, /* R597 */ | |
| 703 { 0x0000, 0x0000 }, /* R598 */ | |
| 704 { 0x0000, 0x0000 }, /* R599 */ | |
| 705 { 0x0000, 0x0000 }, /* R600 */ | |
| 706 { 0x0000, 0x0000 }, /* R601 */ | |
| 707 { 0x0000, 0x0000 }, /* R602 */ | |
| 708 { 0x0000, 0x0000 }, /* R603 */ | |
| 709 { 0x0000, 0x0000 }, /* R604 */ | |
| 710 { 0x0000, 0x0000 }, /* R605 */ | |
| 711 { 0x0000, 0x0000 }, /* R606 */ | |
| 712 { 0x0000, 0x0000 }, /* R607 */ | |
| 713 { 0x0000, 0x0000 }, /* R608 */ | |
| 714 { 0x0000, 0x0000 }, /* R609 */ | |
| 715 { 0x0000, 0x0000 }, /* R610 */ | |
| 716 { 0x0000, 0x0000 }, /* R611 */ | |
| 717 { 0x0000, 0x0000 }, /* R612 */ | |
| 718 { 0x0000, 0x0000 }, /* R613 */ | |
| 719 { 0x0000, 0x0000 }, /* R614 */ | |
| 720 { 0x0000, 0x0000 }, /* R615 */ | |
| 721 { 0x0000, 0x0000 }, /* R616 */ | |
| 722 { 0x0000, 0x0000 }, /* R617 */ | |
| 723 { 0x0000, 0x0000 }, /* R618 */ | |
| 724 { 0x0000, 0x0000 }, /* R619 */ | |
| 725 { 0x0000, 0x0000 }, /* R620 */ | |
| 726 { 0x0000, 0x0000 }, /* R621 */ | |
| 727 { 0x0000, 0x0000 }, /* R622 */ | |
| 728 { 0x0000, 0x0000 }, /* R623 */ | |
| 729 { 0x0000, 0x0000 }, /* R624 */ | |
| 730 { 0x0000, 0x0000 }, /* R625 */ | |
| 731 { 0x0000, 0x0000 }, /* R626 */ | |
| 732 { 0x0000, 0x0000 }, /* R627 */ | |
| 733 { 0x0000, 0x0000 }, /* R628 */ | |
| 734 { 0x0000, 0x0000 }, /* R629 */ | |
| 735 { 0x0000, 0x0000 }, /* R630 */ | |
| 736 { 0x0000, 0x0000 }, /* R631 */ | |
| 737 { 0x0000, 0x0000 }, /* R632 */ | |
| 738 { 0x0000, 0x0000 }, /* R633 */ | |
| 739 { 0x0000, 0x0000 }, /* R634 */ | |
| 740 { 0x0000, 0x0000 }, /* R635 */ | |
| 741 { 0x0000, 0x0000 }, /* R636 */ | |
| 742 { 0x0000, 0x0000 }, /* R637 */ | |
| 743 { 0x0000, 0x0000 }, /* R638 */ | |
| 744 { 0x0000, 0x0000 }, /* R639 */ | |
| 745 { 0x0000, 0x0000 }, /* R640 */ | |
| 746 { 0x0000, 0x0000 }, /* R641 */ | |
| 747 { 0x0000, 0x0000 }, /* R642 */ | |
| 748 { 0x0000, 0x0000 }, /* R643 */ | |
| 749 { 0x0000, 0x0000 }, /* R644 */ | |
| 750 { 0x0000, 0x0000 }, /* R645 */ | |
| 751 { 0x0000, 0x0000 }, /* R646 */ | |
| 752 { 0x0000, 0x0000 }, /* R647 */ | |
| 753 { 0x0000, 0x0000 }, /* R648 */ | |
| 754 { 0x0000, 0x0000 }, /* R649 */ | |
| 755 { 0x0000, 0x0000 }, /* R650 */ | |
| 756 { 0x0000, 0x0000 }, /* R651 */ | |
| 757 { 0x0000, 0x0000 }, /* R652 */ | |
| 758 { 0x0000, 0x0000 }, /* R653 */ | |
| 759 { 0x0000, 0x0000 }, /* R654 */ | |
| 760 { 0x0000, 0x0000 }, /* R655 */ | |
| 761 { 0x0000, 0x0000 }, /* R656 */ | |
| 762 { 0x0000, 0x0000 }, /* R657 */ | |
| 763 { 0x0000, 0x0000 }, /* R658 */ | |
| 764 { 0x0000, 0x0000 }, /* R659 */ | |
| 765 { 0x0000, 0x0000 }, /* R660 */ | |
| 766 { 0x0000, 0x0000 }, /* R661 */ | |
| 767 { 0x0000, 0x0000 }, /* R662 */ | |
| 768 { 0x0000, 0x0000 }, /* R663 */ | |
| 769 { 0x0000, 0x0000 }, /* R664 */ | |
| 770 { 0x0000, 0x0000 }, /* R665 */ | |
| 771 { 0x0000, 0x0000 }, /* R666 */ | |
| 772 { 0x0000, 0x0000 }, /* R667 */ | |
| 773 { 0x0000, 0x0000 }, /* R668 */ | |
| 774 { 0x0000, 0x0000 }, /* R669 */ | |
| 775 { 0x0000, 0x0000 }, /* R670 */ | |
| 776 { 0x0000, 0x0000 }, /* R671 */ | |
| 777 { 0x0000, 0x0000 }, /* R672 */ | |
| 778 { 0x0000, 0x0000 }, /* R673 */ | |
| 779 { 0x0000, 0x0000 }, /* R674 */ | |
| 780 { 0x0000, 0x0000 }, /* R675 */ | |
| 781 { 0x0000, 0x0000 }, /* R676 */ | |
| 782 { 0x0000, 0x0000 }, /* R677 */ | |
| 783 { 0x0000, 0x0000 }, /* R678 */ | |
| 784 { 0x0000, 0x0000 }, /* R679 */ | |
| 785 { 0x0000, 0x0000 }, /* R680 */ | |
| 786 { 0x0000, 0x0000 }, /* R681 */ | |
| 787 { 0x0000, 0x0000 }, /* R682 */ | |
| 788 { 0x0000, 0x0000 }, /* R683 */ | |
| 789 { 0x0000, 0x0000 }, /* R684 */ | |
| 790 { 0x0000, 0x0000 }, /* R685 */ | |
| 791 { 0x0000, 0x0000 }, /* R686 */ | |
| 792 { 0x0000, 0x0000 }, /* R687 */ | |
| 793 { 0x0000, 0x0000 }, /* R688 */ | |
| 794 { 0x0000, 0x0000 }, /* R689 */ | |
| 795 { 0x0000, 0x0000 }, /* R690 */ | |
| 796 { 0x0000, 0x0000 }, /* R691 */ | |
| 797 { 0x0000, 0x0000 }, /* R692 */ | |
| 798 { 0x0000, 0x0000 }, /* R693 */ | |
| 799 { 0x0000, 0x0000 }, /* R694 */ | |
| 800 { 0x0000, 0x0000 }, /* R695 */ | |
| 801 { 0x0000, 0x0000 }, /* R696 */ | |
| 802 { 0x0000, 0x0000 }, /* R697 */ | |
| 803 { 0x0000, 0x0000 }, /* R698 */ | |
| 804 { 0x0000, 0x0000 }, /* R699 */ | |
| 805 { 0x0000, 0x0000 }, /* R700 */ | |
| 806 { 0x0000, 0x0000 }, /* R701 */ | |
| 807 { 0x0000, 0x0000 }, /* R702 */ | |
| 808 { 0x0000, 0x0000 }, /* R703 */ | |
| 809 { 0x0000, 0x0000 }, /* R704 */ | |
| 810 { 0x0000, 0x0000 }, /* R705 */ | |
| 811 { 0x0000, 0x0000 }, /* R706 */ | |
| 812 { 0x0000, 0x0000 }, /* R707 */ | |
| 813 { 0x0000, 0x0000 }, /* R708 */ | |
| 814 { 0x0000, 0x0000 }, /* R709 */ | |
| 815 { 0x0000, 0x0000 }, /* R710 */ | |
| 816 { 0x0000, 0x0000 }, /* R711 */ | |
| 817 { 0x0000, 0x0000 }, /* R712 */ | |
| 818 { 0x0000, 0x0000 }, /* R713 */ | |
| 819 { 0x0000, 0x0000 }, /* R714 */ | |
| 820 { 0x0000, 0x0000 }, /* R715 */ | |
| 821 { 0x0000, 0x0000 }, /* R716 */ | |
| 822 { 0x0000, 0x0000 }, /* R717 */ | |
| 823 { 0x0000, 0x0000 }, /* R718 */ | |
| 824 { 0x0000, 0x0000 }, /* R719 */ | |
| 825 { 0x0000, 0x0000 }, /* R720 */ | |
| 826 { 0x0000, 0x0000 }, /* R721 */ | |
| 827 { 0x0000, 0x0000 }, /* R722 */ | |
| 828 { 0x0000, 0x0000 }, /* R723 */ | |
| 829 { 0x0000, 0x0000 }, /* R724 */ | |
| 830 { 0x0000, 0x0000 }, /* R725 */ | |
| 831 { 0x0000, 0x0000 }, /* R726 */ | |
| 832 { 0x0000, 0x0000 }, /* R727 */ | |
| 833 { 0x0000, 0x0000 }, /* R728 */ | |
| 834 { 0x0000, 0x0000 }, /* R729 */ | |
| 835 { 0x0000, 0x0000 }, /* R730 */ | |
| 836 { 0x0000, 0x0000 }, /* R731 */ | |
| 837 { 0x0000, 0x0000 }, /* R732 */ | |
| 838 { 0x0000, 0x0000 }, /* R733 */ | |
| 839 { 0x0000, 0x0000 }, /* R734 */ | |
| 840 { 0x0000, 0x0000 }, /* R735 */ | |
| 841 { 0x0000, 0x0000 }, /* R736 */ | |
| 842 { 0x0000, 0x0000 }, /* R737 */ | |
| 843 { 0x0000, 0x0000 }, /* R738 */ | |
| 844 { 0x0000, 0x0000 }, /* R739 */ | |
| 845 { 0x0000, 0x0000 }, /* R740 */ | |
| 846 { 0x0000, 0x0000 }, /* R741 */ | |
| 847 { 0x0000, 0x0000 }, /* R742 */ | |
| 848 { 0x0000, 0x0000 }, /* R743 */ | |
| 849 { 0x0000, 0x0000 }, /* R744 */ | |
| 850 { 0x0000, 0x0000 }, /* R745 */ | |
| 851 { 0x0000, 0x0000 }, /* R746 */ | |
| 852 { 0x0000, 0x0000 }, /* R747 */ | |
| 853 { 0x0000, 0x0000 }, /* R748 */ | |
| 854 { 0x0000, 0x0000 }, /* R749 */ | |
| 855 { 0x0000, 0x0000 }, /* R750 */ | |
| 856 { 0x0000, 0x0000 }, /* R751 */ | |
| 857 { 0x0000, 0x0000 }, /* R752 */ | |
| 858 { 0x0000, 0x0000 }, /* R753 */ | |
| 859 { 0x0000, 0x0000 }, /* R754 */ | |
| 860 { 0x0000, 0x0000 }, /* R755 */ | |
| 861 { 0x0000, 0x0000 }, /* R756 */ | |
| 862 { 0x0000, 0x0000 }, /* R757 */ | |
| 863 { 0x0000, 0x0000 }, /* R758 */ | |
| 864 { 0x0000, 0x0000 }, /* R759 */ | |
| 865 { 0x0000, 0x0000 }, /* R760 */ | |
| 866 { 0x0000, 0x0000 }, /* R761 */ | |
| 867 { 0x0000, 0x0000 }, /* R762 */ | |
| 868 { 0x0000, 0x0000 }, /* R763 */ | |
| 869 { 0x0000, 0x0000 }, /* R764 */ | |
| 870 { 0x0000, 0x0000 }, /* R765 */ | |
| 871 { 0x0000, 0x0000 }, /* R766 */ | |
| 872 { 0x0000, 0x0000 }, /* R767 */ | |
| 873 { 0xE1F8, 0xE1F8 }, /* R768 - AIF1 Control (1) */ | |
| 874 { 0xCD1F, 0xCD1F }, /* R769 - AIF1 Control (2) */ | |
| 875 { 0xF000, 0xF000 }, /* R770 - AIF1 Master/Slave */ | |
| 876 { 0x01F0, 0x01F0 }, /* R771 - AIF1 BCLK */ | |
| 877 { 0x0FFF, 0x0FFF }, /* R772 - AIF1ADC LRCLK */ | |
| 878 { 0x0FFF, 0x0FFF }, /* R773 - AIF1DAC LRCLK */ | |
| 879 { 0x0003, 0x0003 }, /* R774 - AIF1DAC Data */ | |
| 880 { 0x0003, 0x0003 }, /* R775 - AIF1ADC Data */ | |
| 881 { 0x0000, 0x0000 }, /* R776 */ | |
| 882 { 0x0000, 0x0000 }, /* R777 */ | |
| 883 { 0x0000, 0x0000 }, /* R778 */ | |
| 884 { 0x0000, 0x0000 }, /* R779 */ | |
| 885 { 0x0000, 0x0000 }, /* R780 */ | |
| 886 { 0x0000, 0x0000 }, /* R781 */ | |
| 887 { 0x0000, 0x0000 }, /* R782 */ | |
| 888 { 0x0000, 0x0000 }, /* R783 */ | |
| 889 { 0xF1F8, 0xF1F8 }, /* R784 - AIF2 Control (1) */ | |
| 890 { 0xFD1F, 0xFD1F }, /* R785 - AIF2 Control (2) */ | |
| 891 { 0xF000, 0xF000 }, /* R786 - AIF2 Master/Slave */ | |
| 892 { 0x01F0, 0x01F0 }, /* R787 - AIF2 BCLK */ | |
| 893 { 0x0FFF, 0x0FFF }, /* R788 - AIF2ADC LRCLK */ | |
| 894 { 0x0FFF, 0x0FFF }, /* R789 - AIF2DAC LRCLK */ | |
| 895 { 0x0003, 0x0003 }, /* R790 - AIF2DAC Data */ | |
| 896 { 0x0003, 0x0003 }, /* R791 - AIF2ADC Data */ | |
| 897 { 0x0000, 0x0000 }, /* R792 */ | |
| 898 { 0x0000, 0x0000 }, /* R793 */ | |
| 899 { 0x0000, 0x0000 }, /* R794 */ | |
| 900 { 0x0000, 0x0000 }, /* R795 */ | |
| 901 { 0x0000, 0x0000 }, /* R796 */ | |
| 902 { 0x0000, 0x0000 }, /* R797 */ | |
| 903 { 0x0000, 0x0000 }, /* R798 */ | |
| 904 { 0x0000, 0x0000 }, /* R799 */ | |
| 905 { 0x0000, 0x0000 }, /* R800 */ | |
| 906 { 0x0000, 0x0000 }, /* R801 */ | |
| 907 { 0x0000, 0x0000 }, /* R802 */ | |
| 908 { 0x0000, 0x0000 }, /* R803 */ | |
| 909 { 0x0000, 0x0000 }, /* R804 */ | |
| 910 { 0x0000, 0x0000 }, /* R805 */ | |
| 911 { 0x0000, 0x0000 }, /* R806 */ | |
| 912 { 0x0000, 0x0000 }, /* R807 */ | |
| 913 { 0x0000, 0x0000 }, /* R808 */ | |
| 914 { 0x0000, 0x0000 }, /* R809 */ | |
| 915 { 0x0000, 0x0000 }, /* R810 */ | |
| 916 { 0x0000, 0x0000 }, /* R811 */ | |
| 917 { 0x0000, 0x0000 }, /* R812 */ | |
| 918 { 0x0000, 0x0000 }, /* R813 */ | |
| 919 { 0x0000, 0x0000 }, /* R814 */ | |
| 920 { 0x0000, 0x0000 }, /* R815 */ | |
| 921 { 0x0000, 0x0000 }, /* R816 */ | |
| 922 { 0x0000, 0x0000 }, /* R817 */ | |
| 923 { 0x0000, 0x0000 }, /* R818 */ | |
| 924 { 0x0000, 0x0000 }, /* R819 */ | |
| 925 { 0x0000, 0x0000 }, /* R820 */ | |
| 926 { 0x0000, 0x0000 }, /* R821 */ | |
| 927 { 0x0000, 0x0000 }, /* R822 */ | |
| 928 { 0x0000, 0x0000 }, /* R823 */ | |
| 929 { 0x0000, 0x0000 }, /* R824 */ | |
| 930 { 0x0000, 0x0000 }, /* R825 */ | |
| 931 { 0x0000, 0x0000 }, /* R826 */ | |
| 932 { 0x0000, 0x0000 }, /* R827 */ | |
| 933 { 0x0000, 0x0000 }, /* R828 */ | |
| 934 { 0x0000, 0x0000 }, /* R829 */ | |
| 935 { 0x0000, 0x0000 }, /* R830 */ | |
| 936 { 0x0000, 0x0000 }, /* R831 */ | |
| 937 { 0x0000, 0x0000 }, /* R832 */ | |
| 938 { 0x0000, 0x0000 }, /* R833 */ | |
| 939 { 0x0000, 0x0000 }, /* R834 */ | |
| 940 { 0x0000, 0x0000 }, /* R835 */ | |
| 941 { 0x0000, 0x0000 }, /* R836 */ | |
| 942 { 0x0000, 0x0000 }, /* R837 */ | |
| 943 { 0x0000, 0x0000 }, /* R838 */ | |
| 944 { 0x0000, 0x0000 }, /* R839 */ | |
| 945 { 0x0000, 0x0000 }, /* R840 */ | |
| 946 { 0x0000, 0x0000 }, /* R841 */ | |
| 947 { 0x0000, 0x0000 }, /* R842 */ | |
| 948 { 0x0000, 0x0000 }, /* R843 */ | |
| 949 { 0x0000, 0x0000 }, /* R844 */ | |
| 950 { 0x0000, 0x0000 }, /* R845 */ | |
| 951 { 0x0000, 0x0000 }, /* R846 */ | |
| 952 { 0x0000, 0x0000 }, /* R847 */ | |
| 953 { 0x0000, 0x0000 }, /* R848 */ | |
| 954 { 0x0000, 0x0000 }, /* R849 */ | |
| 955 { 0x0000, 0x0000 }, /* R850 */ | |
| 956 { 0x0000, 0x0000 }, /* R851 */ | |
| 957 { 0x0000, 0x0000 }, /* R852 */ | |
| 958 { 0x0000, 0x0000 }, /* R853 */ | |
| 959 { 0x0000, 0x0000 }, /* R854 */ | |
| 960 { 0x0000, 0x0000 }, /* R855 */ | |
| 961 { 0x0000, 0x0000 }, /* R856 */ | |
| 962 { 0x0000, 0x0000 }, /* R857 */ | |
| 963 { 0x0000, 0x0000 }, /* R858 */ | |
| 964 { 0x0000, 0x0000 }, /* R859 */ | |
| 965 { 0x0000, 0x0000 }, /* R860 */ | |
| 966 { 0x0000, 0x0000 }, /* R861 */ | |
| 967 { 0x0000, 0x0000 }, /* R862 */ | |
| 968 { 0x0000, 0x0000 }, /* R863 */ | |
| 969 { 0x0000, 0x0000 }, /* R864 */ | |
| 970 { 0x0000, 0x0000 }, /* R865 */ | |
| 971 { 0x0000, 0x0000 }, /* R866 */ | |
| 972 { 0x0000, 0x0000 }, /* R867 */ | |
| 973 { 0x0000, 0x0000 }, /* R868 */ | |
| 974 { 0x0000, 0x0000 }, /* R869 */ | |
| 975 { 0x0000, 0x0000 }, /* R870 */ | |
| 976 { 0x0000, 0x0000 }, /* R871 */ | |
| 977 { 0x0000, 0x0000 }, /* R872 */ | |
| 978 { 0x0000, 0x0000 }, /* R873 */ | |
| 979 { 0x0000, 0x0000 }, /* R874 */ | |
| 980 { 0x0000, 0x0000 }, /* R875 */ | |
| 981 { 0x0000, 0x0000 }, /* R876 */ | |
| 982 { 0x0000, 0x0000 }, /* R877 */ | |
| 983 { 0x0000, 0x0000 }, /* R878 */ | |
| 984 { 0x0000, 0x0000 }, /* R879 */ | |
| 985 { 0x0000, 0x0000 }, /* R880 */ | |
| 986 { 0x0000, 0x0000 }, /* R881 */ | |
| 987 { 0x0000, 0x0000 }, /* R882 */ | |
| 988 { 0x0000, 0x0000 }, /* R883 */ | |
| 989 { 0x0000, 0x0000 }, /* R884 */ | |
| 990 { 0x0000, 0x0000 }, /* R885 */ | |
| 991 { 0x0000, 0x0000 }, /* R886 */ | |
| 992 { 0x0000, 0x0000 }, /* R887 */ | |
| 993 { 0x0000, 0x0000 }, /* R888 */ | |
| 994 { 0x0000, 0x0000 }, /* R889 */ | |
| 995 { 0x0000, 0x0000 }, /* R890 */ | |
| 996 { 0x0000, 0x0000 }, /* R891 */ | |
| 997 { 0x0000, 0x0000 }, /* R892 */ | |
| 998 { 0x0000, 0x0000 }, /* R893 */ | |
| 999 { 0x0000, 0x0000 }, /* R894 */ | |
| 1000 { 0x0000, 0x0000 }, /* R895 */ | |
| 1001 { 0x0000, 0x0000 }, /* R896 */ | |
| 1002 { 0x0000, 0x0000 }, /* R897 */ | |
| 1003 { 0x0000, 0x0000 }, /* R898 */ | |
| 1004 { 0x0000, 0x0000 }, /* R899 */ | |
| 1005 { 0x0000, 0x0000 }, /* R900 */ | |
| 1006 { 0x0000, 0x0000 }, /* R901 */ | |
| 1007 { 0x0000, 0x0000 }, /* R902 */ | |
| 1008 { 0x0000, 0x0000 }, /* R903 */ | |
| 1009 { 0x0000, 0x0000 }, /* R904 */ | |
| 1010 { 0x0000, 0x0000 }, /* R905 */ | |
| 1011 { 0x0000, 0x0000 }, /* R906 */ | |
| 1012 { 0x0000, 0x0000 }, /* R907 */ | |
| 1013 { 0x0000, 0x0000 }, /* R908 */ | |
| 1014 { 0x0000, 0x0000 }, /* R909 */ | |
| 1015 { 0x0000, 0x0000 }, /* R910 */ | |
| 1016 { 0x0000, 0x0000 }, /* R911 */ | |
| 1017 { 0x0000, 0x0000 }, /* R912 */ | |
| 1018 { 0x0000, 0x0000 }, /* R913 */ | |
| 1019 { 0x0000, 0x0000 }, /* R914 */ | |
| 1020 { 0x0000, 0x0000 }, /* R915 */ | |
| 1021 { 0x0000, 0x0000 }, /* R916 */ | |
| 1022 { 0x0000, 0x0000 }, /* R917 */ | |
| 1023 { 0x0000, 0x0000 }, /* R918 */ | |
| 1024 { 0x0000, 0x0000 }, /* R919 */ | |
| 1025 { 0x0000, 0x0000 }, /* R920 */ | |
| 1026 { 0x0000, 0x0000 }, /* R921 */ | |
| 1027 { 0x0000, 0x0000 }, /* R922 */ | |
| 1028 { 0x0000, 0x0000 }, /* R923 */ | |
| 1029 { 0x0000, 0x0000 }, /* R924 */ | |
| 1030 { 0x0000, 0x0000 }, /* R925 */ | |
| 1031 { 0x0000, 0x0000 }, /* R926 */ | |
| 1032 { 0x0000, 0x0000 }, /* R927 */ | |
| 1033 { 0x0000, 0x0000 }, /* R928 */ | |
| 1034 { 0x0000, 0x0000 }, /* R929 */ | |
| 1035 { 0x0000, 0x0000 }, /* R930 */ | |
| 1036 { 0x0000, 0x0000 }, /* R931 */ | |
| 1037 { 0x0000, 0x0000 }, /* R932 */ | |
| 1038 { 0x0000, 0x0000 }, /* R933 */ | |
| 1039 { 0x0000, 0x0000 }, /* R934 */ | |
| 1040 { 0x0000, 0x0000 }, /* R935 */ | |
| 1041 { 0x0000, 0x0000 }, /* R936 */ | |
| 1042 { 0x0000, 0x0000 }, /* R937 */ | |
| 1043 { 0x0000, 0x0000 }, /* R938 */ | |
| 1044 { 0x0000, 0x0000 }, /* R939 */ | |
| 1045 { 0x0000, 0x0000 }, /* R940 */ | |
| 1046 { 0x0000, 0x0000 }, /* R941 */ | |
| 1047 { 0x0000, 0x0000 }, /* R942 */ | |
| 1048 { 0x0000, 0x0000 }, /* R943 */ | |
| 1049 { 0x0000, 0x0000 }, /* R944 */ | |
| 1050 { 0x0000, 0x0000 }, /* R945 */ | |
| 1051 { 0x0000, 0x0000 }, /* R946 */ | |
| 1052 { 0x0000, 0x0000 }, /* R947 */ | |
| 1053 { 0x0000, 0x0000 }, /* R948 */ | |
| 1054 { 0x0000, 0x0000 }, /* R949 */ | |
| 1055 { 0x0000, 0x0000 }, /* R950 */ | |
| 1056 { 0x0000, 0x0000 }, /* R951 */ | |
| 1057 { 0x0000, 0x0000 }, /* R952 */ | |
| 1058 { 0x0000, 0x0000 }, /* R953 */ | |
| 1059 { 0x0000, 0x0000 }, /* R954 */ | |
| 1060 { 0x0000, 0x0000 }, /* R955 */ | |
| 1061 { 0x0000, 0x0000 }, /* R956 */ | |
| 1062 { 0x0000, 0x0000 }, /* R957 */ | |
| 1063 { 0x0000, 0x0000 }, /* R958 */ | |
| 1064 { 0x0000, 0x0000 }, /* R959 */ | |
| 1065 { 0x0000, 0x0000 }, /* R960 */ | |
| 1066 { 0x0000, 0x0000 }, /* R961 */ | |
| 1067 { 0x0000, 0x0000 }, /* R962 */ | |
| 1068 { 0x0000, 0x0000 }, /* R963 */ | |
| 1069 { 0x0000, 0x0000 }, /* R964 */ | |
| 1070 { 0x0000, 0x0000 }, /* R965 */ | |
| 1071 { 0x0000, 0x0000 }, /* R966 */ | |
| 1072 { 0x0000, 0x0000 }, /* R967 */ | |
| 1073 { 0x0000, 0x0000 }, /* R968 */ | |
| 1074 { 0x0000, 0x0000 }, /* R969 */ | |
| 1075 { 0x0000, 0x0000 }, /* R970 */ | |
| 1076 { 0x0000, 0x0000 }, /* R971 */ | |
| 1077 { 0x0000, 0x0000 }, /* R972 */ | |
| 1078 { 0x0000, 0x0000 }, /* R973 */ | |
| 1079 { 0x0000, 0x0000 }, /* R974 */ | |
| 1080 { 0x0000, 0x0000 }, /* R975 */ | |
| 1081 { 0x0000, 0x0000 }, /* R976 */ | |
| 1082 { 0x0000, 0x0000 }, /* R977 */ | |
| 1083 { 0x0000, 0x0000 }, /* R978 */ | |
| 1084 { 0x0000, 0x0000 }, /* R979 */ | |
| 1085 { 0x0000, 0x0000 }, /* R980 */ | |
| 1086 { 0x0000, 0x0000 }, /* R981 */ | |
| 1087 { 0x0000, 0x0000 }, /* R982 */ | |
| 1088 { 0x0000, 0x0000 }, /* R983 */ | |
| 1089 { 0x0000, 0x0000 }, /* R984 */ | |
| 1090 { 0x0000, 0x0000 }, /* R985 */ | |
| 1091 { 0x0000, 0x0000 }, /* R986 */ | |
| 1092 { 0x0000, 0x0000 }, /* R987 */ | |
| 1093 { 0x0000, 0x0000 }, /* R988 */ | |
| 1094 { 0x0000, 0x0000 }, /* R989 */ | |
| 1095 { 0x0000, 0x0000 }, /* R990 */ | |
| 1096 { 0x0000, 0x0000 }, /* R991 */ | |
| 1097 { 0x0000, 0x0000 }, /* R992 */ | |
| 1098 { 0x0000, 0x0000 }, /* R993 */ | |
| 1099 { 0x0000, 0x0000 }, /* R994 */ | |
| 1100 { 0x0000, 0x0000 }, /* R995 */ | |
| 1101 { 0x0000, 0x0000 }, /* R996 */ | |
| 1102 { 0x0000, 0x0000 }, /* R997 */ | |
| 1103 { 0x0000, 0x0000 }, /* R998 */ | |
| 1104 { 0x0000, 0x0000 }, /* R999 */ | |
| 1105 { 0x0000, 0x0000 }, /* R1000 */ | |
| 1106 { 0x0000, 0x0000 }, /* R1001 */ | |
| 1107 { 0x0000, 0x0000 }, /* R1002 */ | |
| 1108 { 0x0000, 0x0000 }, /* R1003 */ | |
| 1109 { 0x0000, 0x0000 }, /* R1004 */ | |
| 1110 { 0x0000, 0x0000 }, /* R1005 */ | |
| 1111 { 0x0000, 0x0000 }, /* R1006 */ | |
| 1112 { 0x0000, 0x0000 }, /* R1007 */ | |
| 1113 { 0x0000, 0x0000 }, /* R1008 */ | |
| 1114 { 0x0000, 0x0000 }, /* R1009 */ | |
| 1115 { 0x0000, 0x0000 }, /* R1010 */ | |
| 1116 { 0x0000, 0x0000 }, /* R1011 */ | |
| 1117 { 0x0000, 0x0000 }, /* R1012 */ | |
| 1118 { 0x0000, 0x0000 }, /* R1013 */ | |
| 1119 { 0x0000, 0x0000 }, /* R1014 */ | |
| 1120 { 0x0000, 0x0000 }, /* R1015 */ | |
| 1121 { 0x0000, 0x0000 }, /* R1016 */ | |
| 1122 { 0x0000, 0x0000 }, /* R1017 */ | |
| 1123 { 0x0000, 0x0000 }, /* R1018 */ | |
| 1124 { 0x0000, 0x0000 }, /* R1019 */ | |
| 1125 { 0x0000, 0x0000 }, /* R1020 */ | |
| 1126 { 0x0000, 0x0000 }, /* R1021 */ | |
| 1127 { 0x0000, 0x0000 }, /* R1022 */ | |
| 1128 { 0x0000, 0x0000 }, /* R1023 */ | |
| 1129 { 0x00FF, 0x01FF }, /* R1024 - AIF1 ADC1 Left Volume */ | |
| 1130 { 0x00FF, 0x01FF }, /* R1025 - AIF1 ADC1 Right Volume */ | |
| 1131 { 0x00FF, 0x01FF }, /* R1026 - AIF1 DAC1 Left Volume */ | |
| 1132 { 0x00FF, 0x01FF }, /* R1027 - AIF1 DAC1 Right Volume */ | |
| 1133 { 0x00FF, 0x01FF }, /* R1028 - AIF1 ADC2 Left Volume */ | |
| 1134 { 0x00FF, 0x01FF }, /* R1029 - AIF1 ADC2 Right Volume */ | |
| 1135 { 0x00FF, 0x01FF }, /* R1030 - AIF1 DAC2 Left Volume */ | |
| 1136 { 0x00FF, 0x01FF }, /* R1031 - AIF1 DAC2 Right Volume */ | |
| 1137 { 0x0000, 0x0000 }, /* R1032 */ | |
| 1138 { 0x0000, 0x0000 }, /* R1033 */ | |
| 1139 { 0x0000, 0x0000 }, /* R1034 */ | |
| 1140 { 0x0000, 0x0000 }, /* R1035 */ | |
| 1141 { 0x0000, 0x0000 }, /* R1036 */ | |
| 1142 { 0x0000, 0x0000 }, /* R1037 */ | |
| 1143 { 0x0000, 0x0000 }, /* R1038 */ | |
| 1144 { 0x0000, 0x0000 }, /* R1039 */ | |
| 1145 { 0xF800, 0xF800 }, /* R1040 - AIF1 ADC1 Filters */ | |
| 1146 { 0x7800, 0x7800 }, /* R1041 - AIF1 ADC2 Filters */ | |
| 1147 { 0x0000, 0x0000 }, /* R1042 */ | |
| 1148 { 0x0000, 0x0000 }, /* R1043 */ | |
| 1149 { 0x0000, 0x0000 }, /* R1044 */ | |
| 1150 { 0x0000, 0x0000 }, /* R1045 */ | |
| 1151 { 0x0000, 0x0000 }, /* R1046 */ | |
| 1152 { 0x0000, 0x0000 }, /* R1047 */ | |
| 1153 { 0x0000, 0x0000 }, /* R1048 */ | |
| 1154 { 0x0000, 0x0000 }, /* R1049 */ | |
| 1155 { 0x0000, 0x0000 }, /* R1050 */ | |
| 1156 { 0x0000, 0x0000 }, /* R1051 */ | |
| 1157 { 0x0000, 0x0000 }, /* R1052 */ | |
| 1158 { 0x0000, 0x0000 }, /* R1053 */ | |
| 1159 { 0x0000, 0x0000 }, /* R1054 */ | |
| 1160 { 0x0000, 0x0000 }, /* R1055 */ | |
| 1161 { 0x02B6, 0x02B6 }, /* R1056 - AIF1 DAC1 Filters (1) */ | |
| 1162 { 0x3F00, 0x3F00 }, /* R1057 - AIF1 DAC1 Filters (2) */ | |
| 1163 { 0x02B6, 0x02B6 }, /* R1058 - AIF1 DAC2 Filters (1) */ | |
| 1164 { 0x3F00, 0x3F00 }, /* R1059 - AIF1 DAC2 Filters (2) */ | |
| 1165 { 0x0000, 0x0000 }, /* R1060 */ | |
| 1166 { 0x0000, 0x0000 }, /* R1061 */ | |
| 1167 { 0x0000, 0x0000 }, /* R1062 */ | |
| 1168 { 0x0000, 0x0000 }, /* R1063 */ | |
| 1169 { 0x0000, 0x0000 }, /* R1064 */ | |
| 1170 { 0x0000, 0x0000 }, /* R1065 */ | |
| 1171 { 0x0000, 0x0000 }, /* R1066 */ | |
| 1172 { 0x0000, 0x0000 }, /* R1067 */ | |
| 1173 { 0x0000, 0x0000 }, /* R1068 */ | |
| 1174 { 0x0000, 0x0000 }, /* R1069 */ | |
| 1175 { 0x0000, 0x0000 }, /* R1070 */ | |
| 1176 { 0x0000, 0x0000 }, /* R1071 */ | |
| 1177 { 0x0000, 0x0000 }, /* R1072 */ | |
| 1178 { 0x0000, 0x0000 }, /* R1073 */ | |
| 1179 { 0x0000, 0x0000 }, /* R1074 */ | |
| 1180 { 0x0000, 0x0000 }, /* R1075 */ | |
| 1181 { 0x0000, 0x0000 }, /* R1076 */ | |
| 1182 { 0x0000, 0x0000 }, /* R1077 */ | |
| 1183 { 0x0000, 0x0000 }, /* R1078 */ | |
| 1184 { 0x0000, 0x0000 }, /* R1079 */ | |
| 1185 { 0x0000, 0x0000 }, /* R1080 */ | |
| 1186 { 0x0000, 0x0000 }, /* R1081 */ | |
| 1187 { 0x0000, 0x0000 }, /* R1082 */ | |
| 1188 { 0x0000, 0x0000 }, /* R1083 */ | |
| 1189 { 0x0000, 0x0000 }, /* R1084 */ | |
| 1190 { 0x0000, 0x0000 }, /* R1085 */ | |
| 1191 { 0x0000, 0x0000 }, /* R1086 */ | |
| 1192 { 0x0000, 0x0000 }, /* R1087 */ | |
| 1193 { 0xFFFF, 0xFFFF }, /* R1088 - AIF1 DRC1 (1) */ | |
| 1194 { 0x1FFF, 0x1FFF }, /* R1089 - AIF1 DRC1 (2) */ | |
| 1195 { 0xFFFF, 0xFFFF }, /* R1090 - AIF1 DRC1 (3) */ | |
| 1196 { 0x07FF, 0x07FF }, /* R1091 - AIF1 DRC1 (4) */ | |
| 1197 { 0x03FF, 0x03FF }, /* R1092 - AIF1 DRC1 (5) */ | |
| 1198 { 0x0000, 0x0000 }, /* R1093 */ | |
| 1199 { 0x0000, 0x0000 }, /* R1094 */ | |
| 1200 { 0x0000, 0x0000 }, /* R1095 */ | |
| 1201 { 0x0000, 0x0000 }, /* R1096 */ | |
| 1202 { 0x0000, 0x0000 }, /* R1097 */ | |
| 1203 { 0x0000, 0x0000 }, /* R1098 */ | |
| 1204 { 0x0000, 0x0000 }, /* R1099 */ | |
| 1205 { 0x0000, 0x0000 }, /* R1100 */ | |
| 1206 { 0x0000, 0x0000 }, /* R1101 */ | |
| 1207 { 0x0000, 0x0000 }, /* R1102 */ | |
| 1208 { 0x0000, 0x0000 }, /* R1103 */ | |
| 1209 { 0xFFFF, 0xFFFF }, /* R1104 - AIF1 DRC2 (1) */ | |
| 1210 { 0x1FFF, 0x1FFF }, /* R1105 - AIF1 DRC2 (2) */ | |
| 1211 { 0xFFFF, 0xFFFF }, /* R1106 - AIF1 DRC2 (3) */ | |
| 1212 { 0x07FF, 0x07FF }, /* R1107 - AIF1 DRC2 (4) */ | |
| 1213 { 0x03FF, 0x03FF }, /* R1108 - AIF1 DRC2 (5) */ | |
| 1214 { 0x0000, 0x0000 }, /* R1109 */ | |
| 1215 { 0x0000, 0x0000 }, /* R1110 */ | |
| 1216 { 0x0000, 0x0000 }, /* R1111 */ | |
| 1217 { 0x0000, 0x0000 }, /* R1112 */ | |
| 1218 { 0x0000, 0x0000 }, /* R1113 */ | |
| 1219 { 0x0000, 0x0000 }, /* R1114 */ | |
| 1220 { 0x0000, 0x0000 }, /* R1115 */ | |
| 1221 { 0x0000, 0x0000 }, /* R1116 */ | |
| 1222 { 0x0000, 0x0000 }, /* R1117 */ | |
| 1223 { 0x0000, 0x0000 }, /* R1118 */ | |
| 1224 { 0x0000, 0x0000 }, /* R1119 */ | |
| 1225 { 0x0000, 0x0000 }, /* R1120 */ | |
| 1226 { 0x0000, 0x0000 }, /* R1121 */ | |
| 1227 { 0x0000, 0x0000 }, /* R1122 */ | |
| 1228 { 0x0000, 0x0000 }, /* R1123 */ | |
| 1229 { 0x0000, 0x0000 }, /* R1124 */ | |
| 1230 { 0x0000, 0x0000 }, /* R1125 */ | |
| 1231 { 0x0000, 0x0000 }, /* R1126 */ | |
| 1232 { 0x0000, 0x0000 }, /* R1127 */ | |
| 1233 { 0x0000, 0x0000 }, /* R1128 */ | |
| 1234 { 0x0000, 0x0000 }, /* R1129 */ | |
| 1235 { 0x0000, 0x0000 }, /* R1130 */ | |
| 1236 { 0x0000, 0x0000 }, /* R1131 */ | |
| 1237 { 0x0000, 0x0000 }, /* R1132 */ | |
| 1238 { 0x0000, 0x0000 }, /* R1133 */ | |
| 1239 { 0x0000, 0x0000 }, /* R1134 */ | |
| 1240 { 0x0000, 0x0000 }, /* R1135 */ | |
| 1241 { 0x0000, 0x0000 }, /* R1136 */ | |
| 1242 { 0x0000, 0x0000 }, /* R1137 */ | |
| 1243 { 0x0000, 0x0000 }, /* R1138 */ | |
| 1244 { 0x0000, 0x0000 }, /* R1139 */ | |
| 1245 { 0x0000, 0x0000 }, /* R1140 */ | |
| 1246 { 0x0000, 0x0000 }, /* R1141 */ | |
| 1247 { 0x0000, 0x0000 }, /* R1142 */ | |
| 1248 { 0x0000, 0x0000 }, /* R1143 */ | |
| 1249 { 0x0000, 0x0000 }, /* R1144 */ | |
| 1250 { 0x0000, 0x0000 }, /* R1145 */ | |
| 1251 { 0x0000, 0x0000 }, /* R1146 */ | |
| 1252 { 0x0000, 0x0000 }, /* R1147 */ | |
| 1253 { 0x0000, 0x0000 }, /* R1148 */ | |
| 1254 { 0x0000, 0x0000 }, /* R1149 */ | |
| 1255 { 0x0000, 0x0000 }, /* R1150 */ | |
| 1256 { 0x0000, 0x0000 }, /* R1151 */ | |
| 1257 { 0xFFFF, 0xFFFF }, /* R1152 - AIF1 DAC1 EQ Gains (1) */ | |
| 1258 { 0xFFC0, 0xFFC0 }, /* R1153 - AIF1 DAC1 EQ Gains (2) */ | |
| 1259 { 0xFFFF, 0xFFFF }, /* R1154 - AIF1 DAC1 EQ Band 1 A */ | |
| 1260 { 0xFFFF, 0xFFFF }, /* R1155 - AIF1 DAC1 EQ Band 1 B */ | |
| 1261 { 0xFFFF, 0xFFFF }, /* R1156 - AIF1 DAC1 EQ Band 1 PG */ | |
| 1262 { 0xFFFF, 0xFFFF }, /* R1157 - AIF1 DAC1 EQ Band 2 A */ | |
| 1263 { 0xFFFF, 0xFFFF }, /* R1158 - AIF1 DAC1 EQ Band 2 B */ | |
| 1264 { 0xFFFF, 0xFFFF }, /* R1159 - AIF1 DAC1 EQ Band 2 C */ | |
| 1265 { 0xFFFF, 0xFFFF }, /* R1160 - AIF1 DAC1 EQ Band 2 PG */ | |
| 1266 { 0xFFFF, 0xFFFF }, /* R1161 - AIF1 DAC1 EQ Band 3 A */ | |
| 1267 { 0xFFFF, 0xFFFF }, /* R1162 - AIF1 DAC1 EQ Band 3 B */ | |
| 1268 { 0xFFFF, 0xFFFF }, /* R1163 - AIF1 DAC1 EQ Band 3 C */ | |
| 1269 { 0xFFFF, 0xFFFF }, /* R1164 - AIF1 DAC1 EQ Band 3 PG */ | |
| 1270 { 0xFFFF, 0xFFFF }, /* R1165 - AIF1 DAC1 EQ Band 4 A */ | |
| 1271 { 0xFFFF, 0xFFFF }, /* R1166 - AIF1 DAC1 EQ Band 4 B */ | |
| 1272 { 0xFFFF, 0xFFFF }, /* R1167 - AIF1 DAC1 EQ Band 4 C */ | |
| 1273 { 0xFFFF, 0xFFFF }, /* R1168 - AIF1 DAC1 EQ Band 4 PG */ | |
| 1274 { 0xFFFF, 0xFFFF }, /* R1169 - AIF1 DAC1 EQ Band 5 A */ | |
| 1275 { 0xFFFF, 0xFFFF }, /* R1170 - AIF1 DAC1 EQ Band 5 B */ | |
| 1276 { 0xFFFF, 0xFFFF }, /* R1171 - AIF1 DAC1 EQ Band 5 PG */ | |
| 1277 { 0x0000, 0x0000 }, /* R1172 */ | |
| 1278 { 0x0000, 0x0000 }, /* R1173 */ | |
| 1279 { 0x0000, 0x0000 }, /* R1174 */ | |
| 1280 { 0x0000, 0x0000 }, /* R1175 */ | |
| 1281 { 0x0000, 0x0000 }, /* R1176 */ | |
| 1282 { 0x0000, 0x0000 }, /* R1177 */ | |
| 1283 { 0x0000, 0x0000 }, /* R1178 */ | |
| 1284 { 0x0000, 0x0000 }, /* R1179 */ | |
| 1285 { 0x0000, 0x0000 }, /* R1180 */ | |
| 1286 { 0x0000, 0x0000 }, /* R1181 */ | |
| 1287 { 0x0000, 0x0000 }, /* R1182 */ | |
| 1288 { 0x0000, 0x0000 }, /* R1183 */ | |
| 1289 { 0xFFFF, 0xFFFF }, /* R1184 - AIF1 DAC2 EQ Gains (1) */ | |
| 1290 { 0xFFC0, 0xFFC0 }, /* R1185 - AIF1 DAC2 EQ Gains (2) */ | |
| 1291 { 0xFFFF, 0xFFFF }, /* R1186 - AIF1 DAC2 EQ Band 1 A */ | |
| 1292 { 0xFFFF, 0xFFFF }, /* R1187 - AIF1 DAC2 EQ Band 1 B */ | |
| 1293 { 0xFFFF, 0xFFFF }, /* R1188 - AIF1 DAC2 EQ Band 1 PG */ | |
| 1294 { 0xFFFF, 0xFFFF }, /* R1189 - AIF1 DAC2 EQ Band 2 A */ | |
| 1295 { 0xFFFF, 0xFFFF }, /* R1190 - AIF1 DAC2 EQ Band 2 B */ | |
| 1296 { 0xFFFF, 0xFFFF }, /* R1191 - AIF1 DAC2 EQ Band 2 C */ | |
| 1297 { 0xFFFF, 0xFFFF }, /* R1192 - AIF1 DAC2 EQ Band 2 PG */ | |
| 1298 { 0xFFFF, 0xFFFF }, /* R1193 - AIF1 DAC2 EQ Band 3 A */ | |
| 1299 { 0xFFFF, 0xFFFF }, /* R1194 - AIF1 DAC2 EQ Band 3 B */ | |
| 1300 { 0xFFFF, 0xFFFF }, /* R1195 - AIF1 DAC2 EQ Band 3 C */ | |
| 1301 { 0xFFFF, 0xFFFF }, /* R1196 - AIF1 DAC2 EQ Band 3 PG */ | |
| 1302 { 0xFFFF, 0xFFFF }, /* R1197 - AIF1 DAC2 EQ Band 4 A */ | |
| 1303 { 0xFFFF, 0xFFFF }, /* R1198 - AIF1 DAC2 EQ Band 4 B */ | |
| 1304 { 0xFFFF, 0xFFFF }, /* R1199 - AIF1 DAC2 EQ Band 4 C */ | |
| 1305 { 0xFFFF, 0xFFFF }, /* R1200 - AIF1 DAC2 EQ Band 4 PG */ | |
| 1306 { 0xFFFF, 0xFFFF }, /* R1201 - AIF1 DAC2 EQ Band 5 A */ | |
| 1307 { 0xFFFF, 0xFFFF }, /* R1202 - AIF1 DAC2 EQ Band 5 B */ | |
| 1308 { 0xFFFF, 0xFFFF }, /* R1203 - AIF1 DAC2 EQ Band 5 PG */ | |
| 1309 { 0x0000, 0x0000 }, /* R1204 */ | |
| 1310 { 0x0000, 0x0000 }, /* R1205 */ | |
| 1311 { 0x0000, 0x0000 }, /* R1206 */ | |
| 1312 { 0x0000, 0x0000 }, /* R1207 */ | |
| 1313 { 0x0000, 0x0000 }, /* R1208 */ | |
| 1314 { 0x0000, 0x0000 }, /* R1209 */ | |
| 1315 { 0x0000, 0x0000 }, /* R1210 */ | |
| 1316 { 0x0000, 0x0000 }, /* R1211 */ | |
| 1317 { 0x0000, 0x0000 }, /* R1212 */ | |
| 1318 { 0x0000, 0x0000 }, /* R1213 */ | |
| 1319 { 0x0000, 0x0000 }, /* R1214 */ | |
| 1320 { 0x0000, 0x0000 }, /* R1215 */ | |
| 1321 { 0x0000, 0x0000 }, /* R1216 */ | |
| 1322 { 0x0000, 0x0000 }, /* R1217 */ | |
| 1323 { 0x0000, 0x0000 }, /* R1218 */ | |
| 1324 { 0x0000, 0x0000 }, /* R1219 */ | |
| 1325 { 0x0000, 0x0000 }, /* R1220 */ | |
| 1326 { 0x0000, 0x0000 }, /* R1221 */ | |
| 1327 { 0x0000, 0x0000 }, /* R1222 */ | |
| 1328 { 0x0000, 0x0000 }, /* R1223 */ | |
| 1329 { 0x0000, 0x0000 }, /* R1224 */ | |
| 1330 { 0x0000, 0x0000 }, /* R1225 */ | |
| 1331 { 0x0000, 0x0000 }, /* R1226 */ | |
| 1332 { 0x0000, 0x0000 }, /* R1227 */ | |
| 1333 { 0x0000, 0x0000 }, /* R1228 */ | |
| 1334 { 0x0000, 0x0000 }, /* R1229 */ | |
| 1335 { 0x0000, 0x0000 }, /* R1230 */ | |
| 1336 { 0x0000, 0x0000 }, /* R1231 */ | |
| 1337 { 0x0000, 0x0000 }, /* R1232 */ | |
| 1338 { 0x0000, 0x0000 }, /* R1233 */ | |
| 1339 { 0x0000, 0x0000 }, /* R1234 */ | |
| 1340 { 0x0000, 0x0000 }, /* R1235 */ | |
| 1341 { 0x0000, 0x0000 }, /* R1236 */ | |
| 1342 { 0x0000, 0x0000 }, /* R1237 */ | |
| 1343 { 0x0000, 0x0000 }, /* R1238 */ | |
| 1344 { 0x0000, 0x0000 }, /* R1239 */ | |
| 1345 { 0x0000, 0x0000 }, /* R1240 */ | |
| 1346 { 0x0000, 0x0000 }, /* R1241 */ | |
| 1347 { 0x0000, 0x0000 }, /* R1242 */ | |
| 1348 { 0x0000, 0x0000 }, /* R1243 */ | |
| 1349 { 0x0000, 0x0000 }, /* R1244 */ | |
| 1350 { 0x0000, 0x0000 }, /* R1245 */ | |
| 1351 { 0x0000, 0x0000 }, /* R1246 */ | |
| 1352 { 0x0000, 0x0000 }, /* R1247 */ | |
| 1353 { 0x0000, 0x0000 }, /* R1248 */ | |
| 1354 { 0x0000, 0x0000 }, /* R1249 */ | |
| 1355 { 0x0000, 0x0000 }, /* R1250 */ | |
| 1356 { 0x0000, 0x0000 }, /* R1251 */ | |
| 1357 { 0x0000, 0x0000 }, /* R1252 */ | |
| 1358 { 0x0000, 0x0000 }, /* R1253 */ | |
| 1359 { 0x0000, 0x0000 }, /* R1254 */ | |
| 1360 { 0x0000, 0x0000 }, /* R1255 */ | |
| 1361 { 0x0000, 0x0000 }, /* R1256 */ | |
| 1362 { 0x0000, 0x0000 }, /* R1257 */ | |
| 1363 { 0x0000, 0x0000 }, /* R1258 */ | |
| 1364 { 0x0000, 0x0000 }, /* R1259 */ | |
| 1365 { 0x0000, 0x0000 }, /* R1260 */ | |
| 1366 { 0x0000, 0x0000 }, /* R1261 */ | |
| 1367 { 0x0000, 0x0000 }, /* R1262 */ | |
| 1368 { 0x0000, 0x0000 }, /* R1263 */ | |
| 1369 { 0x0000, 0x0000 }, /* R1264 */ | |
| 1370 { 0x0000, 0x0000 }, /* R1265 */ | |
| 1371 { 0x0000, 0x0000 }, /* R1266 */ | |
| 1372 { 0x0000, 0x0000 }, /* R1267 */ | |
| 1373 { 0x0000, 0x0000 }, /* R1268 */ | |
| 1374 { 0x0000, 0x0000 }, /* R1269 */ | |
| 1375 { 0x0000, 0x0000 }, /* R1270 */ | |
| 1376 { 0x0000, 0x0000 }, /* R1271 */ | |
| 1377 { 0x0000, 0x0000 }, /* R1272 */ | |
| 1378 { 0x0000, 0x0000 }, /* R1273 */ | |
| 1379 { 0x0000, 0x0000 }, /* R1274 */ | |
| 1380 { 0x0000, 0x0000 }, /* R1275 */ | |
| 1381 { 0x0000, 0x0000 }, /* R1276 */ | |
| 1382 { 0x0000, 0x0000 }, /* R1277 */ | |
| 1383 { 0x0000, 0x0000 }, /* R1278 */ | |
| 1384 { 0x0000, 0x0000 }, /* R1279 */ | |
| 1385 { 0x00FF, 0x01FF }, /* R1280 - AIF2 ADC Left Volume */ | |
| 1386 { 0x00FF, 0x01FF }, /* R1281 - AIF2 ADC Right Volume */ | |
| 1387 { 0x00FF, 0x01FF }, /* R1282 - AIF2 DAC Left Volume */ | |
| 1388 { 0x00FF, 0x01FF }, /* R1283 - AIF2 DAC Right Volume */ | |
| 1389 { 0x0000, 0x0000 }, /* R1284 */ | |
| 1390 { 0x0000, 0x0000 }, /* R1285 */ | |
| 1391 { 0x0000, 0x0000 }, /* R1286 */ | |
| 1392 { 0x0000, 0x0000 }, /* R1287 */ | |
| 1393 { 0x0000, 0x0000 }, /* R1288 */ | |
| 1394 { 0x0000, 0x0000 }, /* R1289 */ | |
| 1395 { 0x0000, 0x0000 }, /* R1290 */ | |
| 1396 { 0x0000, 0x0000 }, /* R1291 */ | |
| 1397 { 0x0000, 0x0000 }, /* R1292 */ | |
| 1398 { 0x0000, 0x0000 }, /* R1293 */ | |
| 1399 { 0x0000, 0x0000 }, /* R1294 */ | |
| 1400 { 0x0000, 0x0000 }, /* R1295 */ | |
| 1401 { 0xF800, 0xF800 }, /* R1296 - AIF2 ADC Filters */ | |
| 1402 { 0x0000, 0x0000 }, /* R1297 */ | |
| 1403 { 0x0000, 0x0000 }, /* R1298 */ | |
| 1404 { 0x0000, 0x0000 }, /* R1299 */ | |
| 1405 { 0x0000, 0x0000 }, /* R1300 */ | |
| 1406 { 0x0000, 0x0000 }, /* R1301 */ | |
| 1407 { 0x0000, 0x0000 }, /* R1302 */ | |
| 1408 { 0x0000, 0x0000 }, /* R1303 */ | |
| 1409 { 0x0000, 0x0000 }, /* R1304 */ | |
| 1410 { 0x0000, 0x0000 }, /* R1305 */ | |
| 1411 { 0x0000, 0x0000 }, /* R1306 */ | |
| 1412 { 0x0000, 0x0000 }, /* R1307 */ | |
| 1413 { 0x0000, 0x0000 }, /* R1308 */ | |
| 1414 { 0x0000, 0x0000 }, /* R1309 */ | |
| 1415 { 0x0000, 0x0000 }, /* R1310 */ | |
| 1416 { 0x0000, 0x0000 }, /* R1311 */ | |
| 1417 { 0x02B6, 0x02B6 }, /* R1312 - AIF2 DAC Filters (1) */ | |
| 1418 { 0x3F00, 0x3F00 }, /* R1313 - AIF2 DAC Filters (2) */ | |
| 1419 { 0x0000, 0x0000 }, /* R1314 */ | |
| 1420 { 0x0000, 0x0000 }, /* R1315 */ | |
| 1421 { 0x0000, 0x0000 }, /* R1316 */ | |
| 1422 { 0x0000, 0x0000 }, /* R1317 */ | |
| 1423 { 0x0000, 0x0000 }, /* R1318 */ | |
| 1424 { 0x0000, 0x0000 }, /* R1319 */ | |
| 1425 { 0x0000, 0x0000 }, /* R1320 */ | |
| 1426 { 0x0000, 0x0000 }, /* R1321 */ | |
| 1427 { 0x0000, 0x0000 }, /* R1322 */ | |
| 1428 { 0x0000, 0x0000 }, /* R1323 */ | |
| 1429 { 0x0000, 0x0000 }, /* R1324 */ | |
| 1430 { 0x0000, 0x0000 }, /* R1325 */ | |
| 1431 { 0x0000, 0x0000 }, /* R1326 */ | |
| 1432 { 0x0000, 0x0000 }, /* R1327 */ | |
| 1433 { 0x0000, 0x0000 }, /* R1328 */ | |
| 1434 { 0x0000, 0x0000 }, /* R1329 */ | |
| 1435 { 0x0000, 0x0000 }, /* R1330 */ | |
| 1436 { 0x0000, 0x0000 }, /* R1331 */ | |
| 1437 { 0x0000, 0x0000 }, /* R1332 */ | |
| 1438 { 0x0000, 0x0000 }, /* R1333 */ | |
| 1439 { 0x0000, 0x0000 }, /* R1334 */ | |
| 1440 { 0x0000, 0x0000 }, /* R1335 */ | |
| 1441 { 0x0000, 0x0000 }, /* R1336 */ | |
| 1442 { 0x0000, 0x0000 }, /* R1337 */ | |
| 1443 { 0x0000, 0x0000 }, /* R1338 */ | |
| 1444 { 0x0000, 0x0000 }, /* R1339 */ | |
| 1445 { 0x0000, 0x0000 }, /* R1340 */ | |
| 1446 { 0x0000, 0x0000 }, /* R1341 */ | |
| 1447 { 0x0000, 0x0000 }, /* R1342 */ | |
| 1448 { 0x0000, 0x0000 }, /* R1343 */ | |
| 1449 { 0xFFFF, 0xFFFF }, /* R1344 - AIF2 DRC (1) */ | |
| 1450 { 0x1FFF, 0x1FFF }, /* R1345 - AIF2 DRC (2) */ | |
| 1451 { 0xFFFF, 0xFFFF }, /* R1346 - AIF2 DRC (3) */ | |
| 1452 { 0x07FF, 0x07FF }, /* R1347 - AIF2 DRC (4) */ | |
| 1453 { 0x03FF, 0x03FF }, /* R1348 - AIF2 DRC (5) */ | |
| 1454 { 0x0000, 0x0000 }, /* R1349 */ | |
| 1455 { 0x0000, 0x0000 }, /* R1350 */ | |
| 1456 { 0x0000, 0x0000 }, /* R1351 */ | |
| 1457 { 0x0000, 0x0000 }, /* R1352 */ | |
| 1458 { 0x0000, 0x0000 }, /* R1353 */ | |
| 1459 { 0x0000, 0x0000 }, /* R1354 */ | |
| 1460 { 0x0000, 0x0000 }, /* R1355 */ | |
| 1461 { 0x0000, 0x0000 }, /* R1356 */ | |
| 1462 { 0x0000, 0x0000 }, /* R1357 */ | |
| 1463 { 0x0000, 0x0000 }, /* R1358 */ | |
| 1464 { 0x0000, 0x0000 }, /* R1359 */ | |
| 1465 { 0x0000, 0x0000 }, /* R1360 */ | |
| 1466 { 0x0000, 0x0000 }, /* R1361 */ | |
| 1467 { 0x0000, 0x0000 }, /* R1362 */ | |
| 1468 { 0x0000, 0x0000 }, /* R1363 */ | |
| 1469 { 0x0000, 0x0000 }, /* R1364 */ | |
| 1470 { 0x0000, 0x0000 }, /* R1365 */ | |
| 1471 { 0x0000, 0x0000 }, /* R1366 */ | |
| 1472 { 0x0000, 0x0000 }, /* R1367 */ | |
| 1473 { 0x0000, 0x0000 }, /* R1368 */ | |
| 1474 { 0x0000, 0x0000 }, /* R1369 */ | |
| 1475 { 0x0000, 0x0000 }, /* R1370 */ | |
| 1476 { 0x0000, 0x0000 }, /* R1371 */ | |
| 1477 { 0x0000, 0x0000 }, /* R1372 */ | |
| 1478 { 0x0000, 0x0000 }, /* R1373 */ | |
| 1479 { 0x0000, 0x0000 }, /* R1374 */ | |
| 1480 { 0x0000, 0x0000 }, /* R1375 */ | |
| 1481 { 0x0000, 0x0000 }, /* R1376 */ | |
| 1482 { 0x0000, 0x0000 }, /* R1377 */ | |
| 1483 { 0x0000, 0x0000 }, /* R1378 */ | |
| 1484 { 0x0000, 0x0000 }, /* R1379 */ | |
| 1485 { 0x0000, 0x0000 }, /* R1380 */ | |
| 1486 { 0x0000, 0x0000 }, /* R1381 */ | |
| 1487 { 0x0000, 0x0000 }, /* R1382 */ | |
| 1488 { 0x0000, 0x0000 }, /* R1383 */ | |
| 1489 { 0x0000, 0x0000 }, /* R1384 */ | |
| 1490 { 0x0000, 0x0000 }, /* R1385 */ | |
| 1491 { 0x0000, 0x0000 }, /* R1386 */ | |
| 1492 { 0x0000, 0x0000 }, /* R1387 */ | |
| 1493 { 0x0000, 0x0000 }, /* R1388 */ | |
| 1494 { 0x0000, 0x0000 }, /* R1389 */ | |
| 1495 { 0x0000, 0x0000 }, /* R1390 */ | |
| 1496 { 0x0000, 0x0000 }, /* R1391 */ | |
| 1497 { 0x0000, 0x0000 }, /* R1392 */ | |
| 1498 { 0x0000, 0x0000 }, /* R1393 */ | |
| 1499 { 0x0000, 0x0000 }, /* R1394 */ | |
| 1500 { 0x0000, 0x0000 }, /* R1395 */ | |
| 1501 { 0x0000, 0x0000 }, /* R1396 */ | |
| 1502 { 0x0000, 0x0000 }, /* R1397 */ | |
| 1503 { 0x0000, 0x0000 }, /* R1398 */ | |
| 1504 { 0x0000, 0x0000 }, /* R1399 */ | |
| 1505 { 0x0000, 0x0000 }, /* R1400 */ | |
| 1506 { 0x0000, 0x0000 }, /* R1401 */ | |
| 1507 { 0x0000, 0x0000 }, /* R1402 */ | |
| 1508 { 0x0000, 0x0000 }, /* R1403 */ | |
| 1509 { 0x0000, 0x0000 }, /* R1404 */ | |
| 1510 { 0x0000, 0x0000 }, /* R1405 */ | |
| 1511 { 0x0000, 0x0000 }, /* R1406 */ | |
| 1512 { 0x0000, 0x0000 }, /* R1407 */ | |
| 1513 { 0xFFFF, 0xFFFF }, /* R1408 - AIF2 EQ Gains (1) */ | |
| 1514 { 0xFFC0, 0xFFC0 }, /* R1409 - AIF2 EQ Gains (2) */ | |
| 1515 { 0xFFFF, 0xFFFF }, /* R1410 - AIF2 EQ Band 1 A */ | |
| 1516 { 0xFFFF, 0xFFFF }, /* R1411 - AIF2 EQ Band 1 B */ | |
| 1517 { 0xFFFF, 0xFFFF }, /* R1412 - AIF2 EQ Band 1 PG */ | |
| 1518 { 0xFFFF, 0xFFFF }, /* R1413 - AIF2 EQ Band 2 A */ | |
| 1519 { 0xFFFF, 0xFFFF }, /* R1414 - AIF2 EQ Band 2 B */ | |
| 1520 { 0xFFFF, 0xFFFF }, /* R1415 - AIF2 EQ Band 2 C */ | |
| 1521 { 0xFFFF, 0xFFFF }, /* R1416 - AIF2 EQ Band 2 PG */ | |
| 1522 { 0xFFFF, 0xFFFF }, /* R1417 - AIF2 EQ Band 3 A */ | |
| 1523 { 0xFFFF, 0xFFFF }, /* R1418 - AIF2 EQ Band 3 B */ | |
| 1524 { 0xFFFF, 0xFFFF }, /* R1419 - AIF2 EQ Band 3 C */ | |
| 1525 { 0xFFFF, 0xFFFF }, /* R1420 - AIF2 EQ Band 3 PG */ | |
| 1526 { 0xFFFF, 0xFFFF }, /* R1421 - AIF2 EQ Band 4 A */ | |
| 1527 { 0xFFFF, 0xFFFF }, /* R1422 - AIF2 EQ Band 4 B */ | |
| 1528 { 0xFFFF, 0xFFFF }, /* R1423 - AIF2 EQ Band 4 C */ | |
| 1529 { 0xFFFF, 0xFFFF }, /* R1424 - AIF2 EQ Band 4 PG */ | |
| 1530 { 0xFFFF, 0xFFFF }, /* R1425 - AIF2 EQ Band 5 A */ | |
| 1531 { 0xFFFF, 0xFFFF }, /* R1426 - AIF2 EQ Band 5 B */ | |
| 1532 { 0xFFFF, 0xFFFF }, /* R1427 - AIF2 EQ Band 5 PG */ | |
| 1533 { 0x0000, 0x0000 }, /* R1428 */ | |
| 1534 { 0x0000, 0x0000 }, /* R1429 */ | |
| 1535 { 0x0000, 0x0000 }, /* R1430 */ | |
| 1536 { 0x0000, 0x0000 }, /* R1431 */ | |
| 1537 { 0x0000, 0x0000 }, /* R1432 */ | |
| 1538 { 0x0000, 0x0000 }, /* R1433 */ | |
| 1539 { 0x0000, 0x0000 }, /* R1434 */ | |
| 1540 { 0x0000, 0x0000 }, /* R1435 */ | |
| 1541 { 0x0000, 0x0000 }, /* R1436 */ | |
| 1542 { 0x0000, 0x0000 }, /* R1437 */ | |
| 1543 { 0x0000, 0x0000 }, /* R1438 */ | |
| 1544 { 0x0000, 0x0000 }, /* R1439 */ | |
| 1545 { 0x0000, 0x0000 }, /* R1440 */ | |
| 1546 { 0x0000, 0x0000 }, /* R1441 */ | |
| 1547 { 0x0000, 0x0000 }, /* R1442 */ | |
| 1548 { 0x0000, 0x0000 }, /* R1443 */ | |
| 1549 { 0x0000, 0x0000 }, /* R1444 */ | |
| 1550 { 0x0000, 0x0000 }, /* R1445 */ | |
| 1551 { 0x0000, 0x0000 }, /* R1446 */ | |
| 1552 { 0x0000, 0x0000 }, /* R1447 */ | |
| 1553 { 0x0000, 0x0000 }, /* R1448 */ | |
| 1554 { 0x0000, 0x0000 }, /* R1449 */ | |
| 1555 { 0x0000, 0x0000 }, /* R1450 */ | |
| 1556 { 0x0000, 0x0000 }, /* R1451 */ | |
| 1557 { 0x0000, 0x0000 }, /* R1452 */ | |
| 1558 { 0x0000, 0x0000 }, /* R1453 */ | |
| 1559 { 0x0000, 0x0000 }, /* R1454 */ | |
| 1560 { 0x0000, 0x0000 }, /* R1455 */ | |
| 1561 { 0x0000, 0x0000 }, /* R1456 */ | |
| 1562 { 0x0000, 0x0000 }, /* R1457 */ | |
| 1563 { 0x0000, 0x0000 }, /* R1458 */ | |
| 1564 { 0x0000, 0x0000 }, /* R1459 */ | |
| 1565 { 0x0000, 0x0000 }, /* R1460 */ | |
| 1566 { 0x0000, 0x0000 }, /* R1461 */ | |
| 1567 { 0x0000, 0x0000 }, /* R1462 */ | |
| 1568 { 0x0000, 0x0000 }, /* R1463 */ | |
| 1569 { 0x0000, 0x0000 }, /* R1464 */ | |
| 1570 { 0x0000, 0x0000 }, /* R1465 */ | |
| 1571 { 0x0000, 0x0000 }, /* R1466 */ | |
| 1572 { 0x0000, 0x0000 }, /* R1467 */ | |
| 1573 { 0x0000, 0x0000 }, /* R1468 */ | |
| 1574 { 0x0000, 0x0000 }, /* R1469 */ | |
| 1575 { 0x0000, 0x0000 }, /* R1470 */ | |
| 1576 { 0x0000, 0x0000 }, /* R1471 */ | |
| 1577 { 0x0000, 0x0000 }, /* R1472 */ | |
| 1578 { 0x0000, 0x0000 }, /* R1473 */ | |
| 1579 { 0x0000, 0x0000 }, /* R1474 */ | |
| 1580 { 0x0000, 0x0000 }, /* R1475 */ | |
| 1581 { 0x0000, 0x0000 }, /* R1476 */ | |
| 1582 { 0x0000, 0x0000 }, /* R1477 */ | |
| 1583 { 0x0000, 0x0000 }, /* R1478 */ | |
| 1584 { 0x0000, 0x0000 }, /* R1479 */ | |
| 1585 { 0x0000, 0x0000 }, /* R1480 */ | |
| 1586 { 0x0000, 0x0000 }, /* R1481 */ | |
| 1587 { 0x0000, 0x0000 }, /* R1482 */ | |
| 1588 { 0x0000, 0x0000 }, /* R1483 */ | |
| 1589 { 0x0000, 0x0000 }, /* R1484 */ | |
| 1590 { 0x0000, 0x0000 }, /* R1485 */ | |
| 1591 { 0x0000, 0x0000 }, /* R1486 */ | |
| 1592 { 0x0000, 0x0000 }, /* R1487 */ | |
| 1593 { 0x0000, 0x0000 }, /* R1488 */ | |
| 1594 { 0x0000, 0x0000 }, /* R1489 */ | |
| 1595 { 0x0000, 0x0000 }, /* R1490 */ | |
| 1596 { 0x0000, 0x0000 }, /* R1491 */ | |
| 1597 { 0x0000, 0x0000 }, /* R1492 */ | |
| 1598 { 0x0000, 0x0000 }, /* R1493 */ | |
| 1599 { 0x0000, 0x0000 }, /* R1494 */ | |
| 1600 { 0x0000, 0x0000 }, /* R1495 */ | |
| 1601 { 0x0000, 0x0000 }, /* R1496 */ | |
| 1602 { 0x0000, 0x0000 }, /* R1497 */ | |
| 1603 { 0x0000, 0x0000 }, /* R1498 */ | |
| 1604 { 0x0000, 0x0000 }, /* R1499 */ | |
| 1605 { 0x0000, 0x0000 }, /* R1500 */ | |
| 1606 { 0x0000, 0x0000 }, /* R1501 */ | |
| 1607 { 0x0000, 0x0000 }, /* R1502 */ | |
| 1608 { 0x0000, 0x0000 }, /* R1503 */ | |
| 1609 { 0x0000, 0x0000 }, /* R1504 */ | |
| 1610 { 0x0000, 0x0000 }, /* R1505 */ | |
| 1611 { 0x0000, 0x0000 }, /* R1506 */ | |
| 1612 { 0x0000, 0x0000 }, /* R1507 */ | |
| 1613 { 0x0000, 0x0000 }, /* R1508 */ | |
| 1614 { 0x0000, 0x0000 }, /* R1509 */ | |
| 1615 { 0x0000, 0x0000 }, /* R1510 */ | |
| 1616 { 0x0000, 0x0000 }, /* R1511 */ | |
| 1617 { 0x0000, 0x0000 }, /* R1512 */ | |
| 1618 { 0x0000, 0x0000 }, /* R1513 */ | |
| 1619 { 0x0000, 0x0000 }, /* R1514 */ | |
| 1620 { 0x0000, 0x0000 }, /* R1515 */ | |
| 1621 { 0x0000, 0x0000 }, /* R1516 */ | |
| 1622 { 0x0000, 0x0000 }, /* R1517 */ | |
| 1623 { 0x0000, 0x0000 }, /* R1518 */ | |
| 1624 { 0x0000, 0x0000 }, /* R1519 */ | |
| 1625 { 0x0000, 0x0000 }, /* R1520 */ | |
| 1626 { 0x0000, 0x0000 }, /* R1521 */ | |
| 1627 { 0x0000, 0x0000 }, /* R1522 */ | |
| 1628 { 0x0000, 0x0000 }, /* R1523 */ | |
| 1629 { 0x0000, 0x0000 }, /* R1524 */ | |
| 1630 { 0x0000, 0x0000 }, /* R1525 */ | |
| 1631 { 0x0000, 0x0000 }, /* R1526 */ | |
| 1632 { 0x0000, 0x0000 }, /* R1527 */ | |
| 1633 { 0x0000, 0x0000 }, /* R1528 */ | |
| 1634 { 0x0000, 0x0000 }, /* R1529 */ | |
| 1635 { 0x0000, 0x0000 }, /* R1530 */ | |
| 1636 { 0x0000, 0x0000 }, /* R1531 */ | |
| 1637 { 0x0000, 0x0000 }, /* R1532 */ | |
| 1638 { 0x0000, 0x0000 }, /* R1533 */ | |
| 1639 { 0x0000, 0x0000 }, /* R1534 */ | |
| 1640 { 0x0000, 0x0000 }, /* R1535 */ | |
| 1641 { 0x01EF, 0x01EF }, /* R1536 - DAC1 Mixer Volumes */ | |
| 1642 { 0x0037, 0x0037 }, /* R1537 - DAC1 Left Mixer Routing */ | |
| 1643 { 0x0037, 0x0037 }, /* R1538 - DAC1 Right Mixer Routing */ | |
| 1644 { 0x01EF, 0x01EF }, /* R1539 - DAC2 Mixer Volumes */ | |
| 1645 { 0x0037, 0x0037 }, /* R1540 - DAC2 Left Mixer Routing */ | |
| 1646 { 0x0037, 0x0037 }, /* R1541 - DAC2 Right Mixer Routing */ | |
| 1647 { 0x0003, 0x0003 }, /* R1542 - AIF1 ADC1 Left Mixer Routing */ | |
| 1648 { 0x0003, 0x0003 }, /* R1543 - AIF1 ADC1 Right Mixer Routing */ | |
| 1649 { 0x0003, 0x0003 }, /* R1544 - AIF1 ADC2 Left Mixer Routing */ | |
| 1650 { 0x0003, 0x0003 }, /* R1545 - AIF1 ADC2 Right mixer Routing */ | |
| 1651 { 0x0000, 0x0000 }, /* R1546 */ | |
| 1652 { 0x0000, 0x0000 }, /* R1547 */ | |
| 1653 { 0x0000, 0x0000 }, /* R1548 */ | |
| 1654 { 0x0000, 0x0000 }, /* R1549 */ | |
| 1655 { 0x0000, 0x0000 }, /* R1550 */ | |
| 1656 { 0x0000, 0x0000 }, /* R1551 */ | |
| 1657 { 0x02FF, 0x03FF }, /* R1552 - DAC1 Left Volume */ | |
| 1658 { 0x02FF, 0x03FF }, /* R1553 - DAC1 Right Volume */ | |
| 1659 { 0x02FF, 0x03FF }, /* R1554 - DAC2 Left Volume */ | |
| 1660 { 0x02FF, 0x03FF }, /* R1555 - DAC2 Right Volume */ | |
| 1661 { 0x0003, 0x0003 }, /* R1556 - DAC Softmute */ | |
| 1662 { 0x0000, 0x0000 }, /* R1557 */ | |
| 1663 { 0x0000, 0x0000 }, /* R1558 */ | |
| 1664 { 0x0000, 0x0000 }, /* R1559 */ | |
| 1665 { 0x0000, 0x0000 }, /* R1560 */ | |
| 1666 { 0x0000, 0x0000 }, /* R1561 */ | |
| 1667 { 0x0000, 0x0000 }, /* R1562 */ | |
| 1668 { 0x0000, 0x0000 }, /* R1563 */ | |
| 1669 { 0x0000, 0x0000 }, /* R1564 */ | |
| 1670 { 0x0000, 0x0000 }, /* R1565 */ | |
| 1671 { 0x0000, 0x0000 }, /* R1566 */ | |
| 1672 { 0x0000, 0x0000 }, /* R1567 */ | |
| 1673 { 0x0003, 0x0003 }, /* R1568 - Oversampling */ | |
| 1674 { 0x03C3, 0x03C3 }, /* R1569 - Sidetone */ | |
| 1675 }; | |
| 1676 | |
| 1677 static int wm8994_readable(unsigned int reg) | |
| 1678 { | 116 { |
| 1679 switch (reg) { | 117 switch (reg) { |
| 1680 case WM8994_GPIO_1: | 118 case WM8994_GPIO_1: |
| 1681 case WM8994_GPIO_2: | 119 case WM8994_GPIO_2: |
| 1682 case WM8994_GPIO_3: | 120 case WM8994_GPIO_3: |
| 1683 case WM8994_GPIO_4: | 121 case WM8994_GPIO_4: |
| 1684 case WM8994_GPIO_5: | 122 case WM8994_GPIO_5: |
| 1685 case WM8994_GPIO_6: | 123 case WM8994_GPIO_6: |
| 1686 case WM8994_GPIO_7: | 124 case WM8994_GPIO_7: |
| 1687 case WM8994_GPIO_8: | 125 case WM8994_GPIO_8: |
| 1688 case WM8994_GPIO_9: | 126 case WM8994_GPIO_9: |
| 1689 case WM8994_GPIO_10: | 127 case WM8994_GPIO_10: |
| 1690 case WM8994_GPIO_11: | 128 case WM8994_GPIO_11: |
| 1691 case WM8994_INTERRUPT_STATUS_1: | 129 case WM8994_INTERRUPT_STATUS_1: |
| 1692 case WM8994_INTERRUPT_STATUS_2: | 130 case WM8994_INTERRUPT_STATUS_2: |
| 1693 case WM8994_INTERRUPT_RAW_STATUS_2: | 131 case WM8994_INTERRUPT_RAW_STATUS_2: |
| 1694 return 1; | 132 return 1; |
| 1695 default: | 133 default: |
| 1696 break; | 134 break; |
| 1697 } | 135 } |
| 1698 | 136 |
| 1699 » if (reg >= ARRAY_SIZE(access_masks)) | 137 » if (reg >= WM8994_CACHE_SIZE) |
| 1700 return 0; | 138 return 0; |
| 1701 » return access_masks[reg].readable != 0; | 139 » return wm8994_access_masks[reg].readable != 0; |
| 1702 } | 140 } |
| 1703 | 141 |
| 1704 static int wm8994_volatile(unsigned int reg) | 142 static int wm8994_volatile(struct snd_soc_codec *codec, unsigned int reg) |
| 1705 { | 143 { |
| 1706 » if (reg >= WM8994_REG_CACHE_SIZE) | 144 » if (reg >= WM8994_CACHE_SIZE) |
| 1707 return 1; | 145 return 1; |
| 1708 | 146 |
| 1709 switch (reg) { | 147 switch (reg) { |
| 1710 case WM8994_SOFTWARE_RESET: | 148 case WM8994_SOFTWARE_RESET: |
| 1711 case WM8994_CHIP_REVISION: | 149 case WM8994_CHIP_REVISION: |
| 1712 case WM8994_DC_SERVO_1: | 150 case WM8994_DC_SERVO_1: |
| 1713 case WM8994_DC_SERVO_READBACK: | 151 case WM8994_DC_SERVO_READBACK: |
| 1714 case WM8994_RATE_STATUS: | 152 case WM8994_RATE_STATUS: |
| 1715 case WM8994_LDO_1: | 153 case WM8994_LDO_1: |
| 1716 case WM8994_LDO_2: | 154 case WM8994_LDO_2: |
| 155 case WM8958_DSP2_EXECCONTROL: |
| 156 case WM8958_MIC_DETECT_3: |
| 1717 return 1; | 157 return 1; |
| 1718 default: | 158 default: |
| 1719 return 0; | 159 return 0; |
| 1720 } | 160 } |
| 1721 } | 161 } |
| 1722 | 162 |
| 1723 static int wm8994_write(struct snd_soc_codec *codec, unsigned int reg, | 163 static int wm8994_write(struct snd_soc_codec *codec, unsigned int reg, |
| 1724 unsigned int value) | 164 unsigned int value) |
| 1725 { | 165 { |
| 1726 » struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | 166 » int ret; |
| 1727 | 167 |
| 1728 BUG_ON(reg > WM8994_MAX_REGISTER); | 168 BUG_ON(reg > WM8994_MAX_REGISTER); |
| 1729 | 169 |
| 1730 » if (!wm8994_volatile(reg)) | 170 » if (!wm8994_volatile(codec, reg)) { |
| 1731 » » wm8994->reg_cache[reg] = value; | 171 » » ret = snd_soc_cache_write(codec, reg, value); |
| 1732 | 172 » » if (ret != 0) |
| 1733 » dev_dbg(codec->dev, "0x%x = 0x%x\n", reg, value); | 173 » » » dev_err(codec->dev, "Cache write to %x failed: %d\n", |
| 174 » » » » reg, ret); |
| 175 » } |
| 1734 | 176 |
| 1735 return wm8994_reg_write(codec->control_data, reg, value); | 177 return wm8994_reg_write(codec->control_data, reg, value); |
| 1736 } | 178 } |
| 1737 | 179 |
| 1738 static unsigned int wm8994_read(struct snd_soc_codec *codec, | 180 static unsigned int wm8994_read(struct snd_soc_codec *codec, |
| 1739 unsigned int reg) | 181 unsigned int reg) |
| 1740 { | 182 { |
| 1741 » u16 *reg_cache = codec->reg_cache; | 183 » unsigned int val; |
| 184 » int ret; |
| 1742 | 185 |
| 1743 BUG_ON(reg > WM8994_MAX_REGISTER); | 186 BUG_ON(reg > WM8994_MAX_REGISTER); |
| 1744 | 187 |
| 1745 » if (wm8994_volatile(reg)) | 188 » if (!wm8994_volatile(codec, reg) && wm8994_readable(codec, reg) && |
| 1746 » » return wm8994_reg_read(codec->control_data, reg); | 189 » reg < codec->driver->reg_cache_size) { |
| 1747 » else | 190 » » ret = snd_soc_cache_read(codec, reg, &val); |
| 1748 » » return reg_cache[reg]; | 191 » » if (ret >= 0) |
| 192 » » » return val; |
| 193 » » else |
| 194 » » » dev_err(codec->dev, "Cache read from %x failed: %d\n", |
| 195 » » » » reg, ret); |
| 196 » } |
| 197 |
| 198 » return wm8994_reg_read(codec->control_data, reg); |
| 1749 } | 199 } |
| 1750 | 200 |
| 1751 static int configure_aif_clock(struct snd_soc_codec *codec, int aif) | 201 static int configure_aif_clock(struct snd_soc_codec *codec, int aif) |
| 1752 { | 202 { |
| 1753 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | 203 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 1754 int rate; | 204 int rate; |
| 1755 int reg1 = 0; | 205 int reg1 = 0; |
| 1756 int offset; | 206 int offset; |
| 1757 | 207 |
| 1758 if (aif) | 208 if (aif) |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1830 new = 0; | 280 new = 0; |
| 1831 | 281 |
| 1832 old = snd_soc_read(codec, WM8994_CLOCKING_1) & WM8994_SYSCLK_SRC; | 282 old = snd_soc_read(codec, WM8994_CLOCKING_1) & WM8994_SYSCLK_SRC; |
| 1833 | 283 |
| 1834 /* If there's no change then we're done. */ | 284 /* If there's no change then we're done. */ |
| 1835 if (old == new) | 285 if (old == new) |
| 1836 return 0; | 286 return 0; |
| 1837 | 287 |
| 1838 snd_soc_update_bits(codec, WM8994_CLOCKING_1, WM8994_SYSCLK_SRC, new); | 288 snd_soc_update_bits(codec, WM8994_CLOCKING_1, WM8994_SYSCLK_SRC, new); |
| 1839 | 289 |
| 1840 » snd_soc_dapm_sync(codec); | 290 » snd_soc_dapm_sync(&codec->dapm); |
| 1841 | 291 |
| 1842 return 0; | 292 return 0; |
| 1843 } | 293 } |
| 1844 | 294 |
| 1845 static int check_clk_sys(struct snd_soc_dapm_widget *source, | 295 static int check_clk_sys(struct snd_soc_dapm_widget *source, |
| 1846 struct snd_soc_dapm_widget *sink) | 296 struct snd_soc_dapm_widget *sink) |
| 1847 { | 297 { |
| 1848 int reg = snd_soc_read(source->codec, WM8994_CLOCKING_1); | 298 int reg = snd_soc_read(source->codec, WM8994_CLOCKING_1); |
| 1849 const char *clk; | 299 const char *clk; |
| 1850 | 300 |
| 1851 /* Check what we're currently using for CLK_SYS */ | 301 /* Check what we're currently using for CLK_SYS */ |
| 1852 if (reg & WM8994_SYSCLK_SRC) | 302 if (reg & WM8994_SYSCLK_SRC) |
| 1853 clk = "AIF2CLK"; | 303 clk = "AIF2CLK"; |
| 1854 else | 304 else |
| 1855 clk = "AIF1CLK"; | 305 clk = "AIF1CLK"; |
| 1856 | 306 |
| 1857 return strcmp(source->name, clk) == 0; | 307 return strcmp(source->name, clk) == 0; |
| 1858 } | 308 } |
| 1859 | 309 |
| 1860 static const char *sidetone_hpf_text[] = { | 310 static const char *sidetone_hpf_text[] = { |
| 1861 "2.7kHz", "1.35kHz", "675Hz", "370Hz", "180Hz", "90Hz", "45Hz" | 311 "2.7kHz", "1.35kHz", "675Hz", "370Hz", "180Hz", "90Hz", "45Hz" |
| 1862 }; | 312 }; |
| 1863 | 313 |
| 1864 static const struct soc_enum sidetone_hpf = | 314 static const struct soc_enum sidetone_hpf = |
| 1865 SOC_ENUM_SINGLE(WM8994_SIDETONE, 7, 7, sidetone_hpf_text); | 315 SOC_ENUM_SINGLE(WM8994_SIDETONE, 7, 7, sidetone_hpf_text); |
| 1866 | 316 |
| 317 static const char *adc_hpf_text[] = { |
| 318 "HiFi", "Voice 1", "Voice 2", "Voice 3" |
| 319 }; |
| 320 |
| 321 static const struct soc_enum aif1adc1_hpf = |
| 322 SOC_ENUM_SINGLE(WM8994_AIF1_ADC1_FILTERS, 13, 4, adc_hpf_text); |
| 323 |
| 324 static const struct soc_enum aif1adc2_hpf = |
| 325 SOC_ENUM_SINGLE(WM8994_AIF1_ADC2_FILTERS, 13, 4, adc_hpf_text); |
| 326 |
| 327 static const struct soc_enum aif2adc_hpf = |
| 328 SOC_ENUM_SINGLE(WM8994_AIF2_ADC_FILTERS, 13, 4, adc_hpf_text); |
| 329 |
| 1867 static const DECLARE_TLV_DB_SCALE(aif_tlv, 0, 600, 0); | 330 static const DECLARE_TLV_DB_SCALE(aif_tlv, 0, 600, 0); |
| 1868 static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1); | 331 static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1); |
| 1869 static const DECLARE_TLV_DB_SCALE(st_tlv, -3600, 300, 0); | 332 static const DECLARE_TLV_DB_SCALE(st_tlv, -3600, 300, 0); |
| 1870 static const DECLARE_TLV_DB_SCALE(wm8994_3d_tlv, -1600, 183, 0); | 333 static const DECLARE_TLV_DB_SCALE(wm8994_3d_tlv, -1600, 183, 0); |
| 1871 static const DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0); | 334 static const DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0); |
| 1872 | 335 |
| 1873 #define WM8994_DRC_SWITCH(xname, reg, shift) \ | 336 #define WM8994_DRC_SWITCH(xname, reg, shift) \ |
| 1874 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ | 337 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ |
| 1875 .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\ | 338 .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\ |
| 1876 .put = wm8994_put_drc_sw, \ | 339 .put = wm8994_put_drc_sw, \ |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2064 { | 527 { |
| 2065 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | 528 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
| 2066 struct wm8994_priv *wm8994 =snd_soc_codec_get_drvdata(codec); | 529 struct wm8994_priv *wm8994 =snd_soc_codec_get_drvdata(codec); |
| 2067 int block = wm8994_get_retune_mobile_block(kcontrol->id.name); | 530 int block = wm8994_get_retune_mobile_block(kcontrol->id.name); |
| 2068 | 531 |
| 2069 ucontrol->value.enumerated.item[0] = wm8994->retune_mobile_cfg[block]; | 532 ucontrol->value.enumerated.item[0] = wm8994->retune_mobile_cfg[block]; |
| 2070 | 533 |
| 2071 return 0; | 534 return 0; |
| 2072 } | 535 } |
| 2073 | 536 |
| 2074 static const char *aifdac_src_text[] = { | 537 static const char *aif_chan_src_text[] = { |
| 2075 "Left", "Right" | 538 "Left", "Right" |
| 2076 }; | 539 }; |
| 2077 | 540 |
| 541 static const struct soc_enum aif1adcl_src = |
| 542 SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_1, 15, 2, aif_chan_src_text); |
| 543 |
| 544 static const struct soc_enum aif1adcr_src = |
| 545 SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_1, 14, 2, aif_chan_src_text); |
| 546 |
| 547 static const struct soc_enum aif2adcl_src = |
| 548 SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_1, 15, 2, aif_chan_src_text); |
| 549 |
| 550 static const struct soc_enum aif2adcr_src = |
| 551 SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_1, 14, 2, aif_chan_src_text); |
| 552 |
| 2078 static const struct soc_enum aif1dacl_src = | 553 static const struct soc_enum aif1dacl_src = |
| 2079 » SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_2, 15, 2, aifdac_src_text); | 554 » SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_2, 15, 2, aif_chan_src_text); |
| 2080 | 555 |
| 2081 static const struct soc_enum aif1dacr_src = | 556 static const struct soc_enum aif1dacr_src = |
| 2082 » SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_2, 14, 2, aifdac_src_text); | 557 » SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_2, 14, 2, aif_chan_src_text); |
| 2083 | 558 |
| 2084 static const struct soc_enum aif2dacl_src = | 559 static const struct soc_enum aif2dacl_src = |
| 2085 » SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, 15, 2, aifdac_src_text); | 560 » SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, 15, 2, aif_chan_src_text); |
| 2086 | 561 |
| 2087 static const struct soc_enum aif2dacr_src = | 562 static const struct soc_enum aif2dacr_src = |
| 2088 » SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, 14, 2, aifdac_src_text); | 563 » SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, 14, 2, aif_chan_src_text); |
| 564 |
| 565 static const char *osr_text[] = { |
| 566 » "Low Power", "High Performance", |
| 567 }; |
| 568 |
| 569 static const struct soc_enum dac_osr = |
| 570 » SOC_ENUM_SINGLE(WM8994_OVERSAMPLING, 0, 2, osr_text); |
| 571 |
| 572 static const struct soc_enum adc_osr = |
| 573 » SOC_ENUM_SINGLE(WM8994_OVERSAMPLING, 1, 2, osr_text); |
| 574 |
| 575 static void wm8958_mbc_apply(struct snd_soc_codec *codec, int mbc, int start) |
| 576 { |
| 577 » struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 578 » struct wm8994_pdata *pdata = wm8994->pdata; |
| 579 » int pwr_reg = snd_soc_read(codec, WM8994_POWER_MANAGEMENT_5); |
| 580 » int ena, reg, aif, i; |
| 581 |
| 582 » switch (mbc) { |
| 583 » case 0: |
| 584 » » pwr_reg &= (WM8994_AIF1DAC1L_ENA | WM8994_AIF1DAC1R_ENA); |
| 585 » » aif = 0; |
| 586 » » break; |
| 587 » case 1: |
| 588 » » pwr_reg &= (WM8994_AIF1DAC2L_ENA | WM8994_AIF1DAC2R_ENA); |
| 589 » » aif = 0; |
| 590 » » break; |
| 591 » case 2: |
| 592 » » pwr_reg &= (WM8994_AIF2DACL_ENA | WM8994_AIF2DACR_ENA); |
| 593 » » aif = 1; |
| 594 » » break; |
| 595 » default: |
| 596 » » BUG(); |
| 597 » » return; |
| 598 » } |
| 599 |
| 600 » /* We can only enable the MBC if the AIF is enabled and we |
| 601 » * want it to be enabled. */ |
| 602 » ena = pwr_reg && wm8994->mbc_ena[mbc]; |
| 603 |
| 604 » reg = snd_soc_read(codec, WM8958_DSP2_PROGRAM); |
| 605 |
| 606 » dev_dbg(codec->dev, "MBC %d startup: %d, power: %x, DSP: %x\n", |
| 607 » » mbc, start, pwr_reg, reg); |
| 608 |
| 609 » if (start && ena) { |
| 610 » » /* If the DSP is already running then noop */ |
| 611 » » if (reg & WM8958_DSP2_ENA) |
| 612 » » » return; |
| 613 |
| 614 » » /* Switch the clock over to the appropriate AIF */ |
| 615 » » snd_soc_update_bits(codec, WM8994_CLOCKING_1, |
| 616 » » » » WM8958_DSP2CLK_SRC | WM8958_DSP2CLK_ENA, |
| 617 » » » » aif << WM8958_DSP2CLK_SRC_SHIFT | |
| 618 » » » » WM8958_DSP2CLK_ENA); |
| 619 |
| 620 » » snd_soc_update_bits(codec, WM8958_DSP2_PROGRAM, |
| 621 » » » » WM8958_DSP2_ENA, WM8958_DSP2_ENA); |
| 622 |
| 623 » » /* If we've got user supplied MBC settings use them */ |
| 624 » » if (pdata && pdata->num_mbc_cfgs) { |
| 625 » » » struct wm8958_mbc_cfg *cfg |
| 626 » » » » = &pdata->mbc_cfgs[wm8994->mbc_cfg]; |
| 627 |
| 628 » » » for (i = 0; i < ARRAY_SIZE(cfg->coeff_regs); i++) |
| 629 » » » » snd_soc_write(codec, i + WM8958_MBC_BAND_1_K_1, |
| 630 » » » » » cfg->coeff_regs[i]); |
| 631 |
| 632 » » » for (i = 0; i < ARRAY_SIZE(cfg->cutoff_regs); i++) |
| 633 » » » » snd_soc_write(codec, |
| 634 » » » » » i + WM8958_MBC_BAND_2_LOWER_CUTOFF
_C1_1, |
| 635 » » » » » cfg->cutoff_regs[i]); |
| 636 » » } |
| 637 |
| 638 » » /* Run the DSP */ |
| 639 » » snd_soc_write(codec, WM8958_DSP2_EXECCONTROL, |
| 640 » » » WM8958_DSP2_RUNR); |
| 641 |
| 642 » » /* And we're off! */ |
| 643 » » snd_soc_update_bits(codec, WM8958_DSP2_CONFIG, |
| 644 » » » » WM8958_MBC_ENA | WM8958_MBC_SEL_MASK, |
| 645 » » » » mbc << WM8958_MBC_SEL_SHIFT | |
| 646 » » » » WM8958_MBC_ENA); |
| 647 » } else { |
| 648 » » /* If the DSP is already stopped then noop */ |
| 649 » » if (!(reg & WM8958_DSP2_ENA)) |
| 650 » » » return; |
| 651 |
| 652 » » snd_soc_update_bits(codec, WM8958_DSP2_CONFIG, |
| 653 » » » » WM8958_MBC_ENA, 0);» |
| 654 » » snd_soc_update_bits(codec, WM8958_DSP2_PROGRAM, |
| 655 » » » » WM8958_DSP2_ENA, 0); |
| 656 » » snd_soc_update_bits(codec, WM8994_CLOCKING_1, |
| 657 » » » » WM8958_DSP2CLK_ENA, 0); |
| 658 » } |
| 659 } |
| 660 |
| 661 static int wm8958_aif_ev(struct snd_soc_dapm_widget *w, |
| 662 » » struct snd_kcontrol *kcontrol, int event) |
| 663 { |
| 664 » struct snd_soc_codec *codec = w->codec; |
| 665 » int mbc; |
| 666 |
| 667 » switch (w->shift) { |
| 668 » case 13: |
| 669 » case 12: |
| 670 » » mbc = 2; |
| 671 » » break; |
| 672 » case 11: |
| 673 » case 10: |
| 674 » » mbc = 1; |
| 675 » » break; |
| 676 » case 9: |
| 677 » case 8: |
| 678 » » mbc = 0; |
| 679 » » break; |
| 680 » default: |
| 681 » » BUG(); |
| 682 » » return -EINVAL; |
| 683 » } |
| 684 |
| 685 » switch (event) { |
| 686 » case SND_SOC_DAPM_POST_PMU: |
| 687 » » wm8958_mbc_apply(codec, mbc, 1); |
| 688 » » break; |
| 689 » case SND_SOC_DAPM_POST_PMD: |
| 690 » » wm8958_mbc_apply(codec, mbc, 0); |
| 691 » » break; |
| 692 » } |
| 693 |
| 694 » return 0; |
| 695 } |
| 696 |
| 697 static int wm8958_put_mbc_enum(struct snd_kcontrol *kcontrol, |
| 698 » » » struct snd_ctl_elem_value *ucontrol) |
| 699 { |
| 700 » struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
| 701 » struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 702 » struct wm8994_pdata *pdata = wm8994->pdata; |
| 703 » int value = ucontrol->value.integer.value[0]; |
| 704 » int reg; |
| 705 |
| 706 » /* Don't allow on the fly reconfiguration */ |
| 707 » reg = snd_soc_read(codec, WM8994_CLOCKING_1); |
| 708 » if (reg < 0 || reg & WM8958_DSP2CLK_ENA) |
| 709 » » return -EBUSY; |
| 710 |
| 711 » if (value >= pdata->num_mbc_cfgs) |
| 712 » » return -EINVAL; |
| 713 |
| 714 » wm8994->mbc_cfg = value; |
| 715 |
| 716 » return 0; |
| 717 } |
| 718 |
| 719 static int wm8958_get_mbc_enum(struct snd_kcontrol *kcontrol, |
| 720 » » » struct snd_ctl_elem_value *ucontrol) |
| 721 { |
| 722 » struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
| 723 » struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 724 |
| 725 » ucontrol->value.enumerated.item[0] = wm8994->mbc_cfg; |
| 726 |
| 727 » return 0; |
| 728 } |
| 729 |
| 730 static int wm8958_mbc_info(struct snd_kcontrol *kcontrol, |
| 731 » » » struct snd_ctl_elem_info *uinfo) |
| 732 { |
| 733 » uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; |
| 734 » uinfo->count = 1; |
| 735 » uinfo->value.integer.min = 0; |
| 736 » uinfo->value.integer.max = 1; |
| 737 » return 0; |
| 738 } |
| 739 |
| 740 static int wm8958_mbc_get(struct snd_kcontrol *kcontrol, |
| 741 » » » struct snd_ctl_elem_value *ucontrol) |
| 742 { |
| 743 » int mbc = kcontrol->private_value; |
| 744 » struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
| 745 » struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 746 |
| 747 » ucontrol->value.integer.value[0] = wm8994->mbc_ena[mbc]; |
| 748 |
| 749 » return 0; |
| 750 } |
| 751 |
| 752 static int wm8958_mbc_put(struct snd_kcontrol *kcontrol, |
| 753 » » » struct snd_ctl_elem_value *ucontrol) |
| 754 { |
| 755 » int mbc = kcontrol->private_value; |
| 756 » int i; |
| 757 » struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
| 758 » struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 759 |
| 760 » if (ucontrol->value.integer.value[0] > 1) |
| 761 » » return -EINVAL; |
| 762 |
| 763 » for (i = 0; i < ARRAY_SIZE(wm8994->mbc_ena); i++) { |
| 764 » » if (mbc != i && wm8994->mbc_ena[i]) { |
| 765 » » » dev_dbg(codec->dev, "MBC %d active already\n", mbc); |
| 766 » » » return -EBUSY; |
| 767 » » } |
| 768 » } |
| 769 |
| 770 » wm8994->mbc_ena[mbc] = ucontrol->value.integer.value[0]; |
| 771 |
| 772 » wm8958_mbc_apply(codec, mbc, wm8994->mbc_ena[mbc]); |
| 773 |
| 774 » return 0; |
| 775 } |
| 776 |
| 777 #define WM8958_MBC_SWITCH(xname, xval) {\ |
| 778 » .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ |
| 779 » .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,\ |
| 780 » .info = wm8958_mbc_info, \ |
| 781 » .get = wm8958_mbc_get, .put = wm8958_mbc_put, \ |
| 782 » .private_value = xval } |
| 2089 | 783 |
| 2090 static const struct snd_kcontrol_new wm8994_snd_controls[] = { | 784 static const struct snd_kcontrol_new wm8994_snd_controls[] = { |
| 2091 SOC_DOUBLE_R_TLV("AIF1ADC1 Volume", WM8994_AIF1_ADC1_LEFT_VOLUME, | 785 SOC_DOUBLE_R_TLV("AIF1ADC1 Volume", WM8994_AIF1_ADC1_LEFT_VOLUME, |
| 2092 WM8994_AIF1_ADC1_RIGHT_VOLUME, | 786 WM8994_AIF1_ADC1_RIGHT_VOLUME, |
| 2093 1, 119, 0, digital_tlv), | 787 1, 119, 0, digital_tlv), |
| 2094 SOC_DOUBLE_R_TLV("AIF1ADC2 Volume", WM8994_AIF1_ADC2_LEFT_VOLUME, | 788 SOC_DOUBLE_R_TLV("AIF1ADC2 Volume", WM8994_AIF1_ADC2_LEFT_VOLUME, |
| 2095 WM8994_AIF1_ADC2_RIGHT_VOLUME, | 789 WM8994_AIF1_ADC2_RIGHT_VOLUME, |
| 2096 1, 119, 0, digital_tlv), | 790 1, 119, 0, digital_tlv), |
| 2097 SOC_DOUBLE_R_TLV("AIF2ADC Volume", WM8994_AIF2_ADC_LEFT_VOLUME, | 791 SOC_DOUBLE_R_TLV("AIF2ADC Volume", WM8994_AIF2_ADC_LEFT_VOLUME, |
| 2098 WM8994_AIF2_ADC_RIGHT_VOLUME, | 792 WM8994_AIF2_ADC_RIGHT_VOLUME, |
| 2099 1, 119, 0, digital_tlv), | 793 1, 119, 0, digital_tlv), |
| 2100 | 794 |
| 795 SOC_ENUM("AIF1ADCL Source", aif1adcl_src), |
| 796 SOC_ENUM("AIF1ADCR Source", aif1adcr_src), |
| 797 SOC_ENUM("AIF2ADCL Source", aif2adcl_src), |
| 798 SOC_ENUM("AIF2ADCR Source", aif2adcr_src), |
| 799 |
| 2101 SOC_ENUM("AIF1DACL Source", aif1dacl_src), | 800 SOC_ENUM("AIF1DACL Source", aif1dacl_src), |
| 2102 SOC_ENUM("AIF1DACR Source", aif1dacr_src), | 801 SOC_ENUM("AIF1DACR Source", aif1dacr_src), |
| 2103 SOC_ENUM("AIF2DACL Source", aif1dacl_src), | 802 SOC_ENUM("AIF2DACL Source", aif2dacl_src), |
| 2104 SOC_ENUM("AIF2DACR Source", aif1dacr_src), | 803 SOC_ENUM("AIF2DACR Source", aif2dacr_src), |
| 2105 | 804 |
| 2106 SOC_DOUBLE_R_TLV("AIF1DAC1 Volume", WM8994_AIF1_DAC1_LEFT_VOLUME, | 805 SOC_DOUBLE_R_TLV("AIF1DAC1 Volume", WM8994_AIF1_DAC1_LEFT_VOLUME, |
| 2107 WM8994_AIF1_DAC1_RIGHT_VOLUME, 1, 96, 0, digital_tlv), | 806 WM8994_AIF1_DAC1_RIGHT_VOLUME, 1, 96, 0, digital_tlv), |
| 2108 SOC_DOUBLE_R_TLV("AIF1DAC2 Volume", WM8994_AIF1_DAC2_LEFT_VOLUME, | 807 SOC_DOUBLE_R_TLV("AIF1DAC2 Volume", WM8994_AIF1_DAC2_LEFT_VOLUME, |
| 2109 WM8994_AIF1_DAC2_RIGHT_VOLUME, 1, 96, 0, digital_tlv), | 808 WM8994_AIF1_DAC2_RIGHT_VOLUME, 1, 96, 0, digital_tlv), |
| 2110 SOC_DOUBLE_R_TLV("AIF2DAC Volume", WM8994_AIF2_DAC_LEFT_VOLUME, | 809 SOC_DOUBLE_R_TLV("AIF2DAC Volume", WM8994_AIF2_DAC_LEFT_VOLUME, |
| 2111 WM8994_AIF2_DAC_RIGHT_VOLUME, 1, 96, 0, digital_tlv), | 810 WM8994_AIF2_DAC_RIGHT_VOLUME, 1, 96, 0, digital_tlv), |
| 2112 | 811 |
| 2113 SOC_SINGLE_TLV("AIF1 Boost Volume", WM8994_AIF1_CONTROL_2, 10, 3, 0, aif_tlv), | 812 SOC_SINGLE_TLV("AIF1 Boost Volume", WM8994_AIF1_CONTROL_2, 10, 3, 0, aif_tlv), |
| 2114 SOC_SINGLE_TLV("AIF2 Boost Volume", WM8994_AIF2_CONTROL_2, 10, 3, 0, aif_tlv), | 813 SOC_SINGLE_TLV("AIF2 Boost Volume", WM8994_AIF2_CONTROL_2, 10, 3, 0, aif_tlv), |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2133 5, 12, 0, st_tlv), | 832 5, 12, 0, st_tlv), |
| 2134 SOC_SINGLE_TLV("DAC1 Left Sidetone Volume", WM8994_DAC1_MIXER_VOLUMES, | 833 SOC_SINGLE_TLV("DAC1 Left Sidetone Volume", WM8994_DAC1_MIXER_VOLUMES, |
| 2135 0, 12, 0, st_tlv), | 834 0, 12, 0, st_tlv), |
| 2136 SOC_SINGLE_TLV("DAC2 Right Sidetone Volume", WM8994_DAC2_MIXER_VOLUMES, | 835 SOC_SINGLE_TLV("DAC2 Right Sidetone Volume", WM8994_DAC2_MIXER_VOLUMES, |
| 2137 5, 12, 0, st_tlv), | 836 5, 12, 0, st_tlv), |
| 2138 SOC_SINGLE_TLV("DAC2 Left Sidetone Volume", WM8994_DAC2_MIXER_VOLUMES, | 837 SOC_SINGLE_TLV("DAC2 Left Sidetone Volume", WM8994_DAC2_MIXER_VOLUMES, |
| 2139 0, 12, 0, st_tlv), | 838 0, 12, 0, st_tlv), |
| 2140 SOC_ENUM("Sidetone HPF Mux", sidetone_hpf), | 839 SOC_ENUM("Sidetone HPF Mux", sidetone_hpf), |
| 2141 SOC_SINGLE("Sidetone HPF Switch", WM8994_SIDETONE, 6, 1, 0), | 840 SOC_SINGLE("Sidetone HPF Switch", WM8994_SIDETONE, 6, 1, 0), |
| 2142 | 841 |
| 842 SOC_ENUM("AIF1ADC1 HPF Mode", aif1adc1_hpf), |
| 843 SOC_DOUBLE("AIF1ADC1 HPF Switch", WM8994_AIF1_ADC1_FILTERS, 12, 11, 1, 0), |
| 844 |
| 845 SOC_ENUM("AIF1ADC2 HPF Mode", aif1adc2_hpf), |
| 846 SOC_DOUBLE("AIF1ADC2 HPF Switch", WM8994_AIF1_ADC2_FILTERS, 12, 11, 1, 0), |
| 847 |
| 848 SOC_ENUM("AIF2ADC HPF Mode", aif2adc_hpf), |
| 849 SOC_DOUBLE("AIF2ADC HPF Switch", WM8994_AIF2_ADC_FILTERS, 12, 11, 1, 0), |
| 850 |
| 851 SOC_ENUM("ADC OSR", adc_osr), |
| 852 SOC_ENUM("DAC OSR", dac_osr), |
| 853 |
| 2143 SOC_DOUBLE_R_TLV("DAC1 Volume", WM8994_DAC1_LEFT_VOLUME, | 854 SOC_DOUBLE_R_TLV("DAC1 Volume", WM8994_DAC1_LEFT_VOLUME, |
| 2144 WM8994_DAC1_RIGHT_VOLUME, 1, 96, 0, digital_tlv), | 855 WM8994_DAC1_RIGHT_VOLUME, 1, 96, 0, digital_tlv), |
| 2145 SOC_DOUBLE_R("DAC1 Switch", WM8994_DAC1_LEFT_VOLUME, | 856 SOC_DOUBLE_R("DAC1 Switch", WM8994_DAC1_LEFT_VOLUME, |
| 2146 WM8994_DAC1_RIGHT_VOLUME, 9, 1, 1), | 857 WM8994_DAC1_RIGHT_VOLUME, 9, 1, 1), |
| 2147 | 858 |
| 2148 SOC_DOUBLE_R_TLV("DAC2 Volume", WM8994_DAC2_LEFT_VOLUME, | 859 SOC_DOUBLE_R_TLV("DAC2 Volume", WM8994_DAC2_LEFT_VOLUME, |
| 2149 WM8994_DAC2_RIGHT_VOLUME, 1, 96, 0, digital_tlv), | 860 WM8994_DAC2_RIGHT_VOLUME, 1, 96, 0, digital_tlv), |
| 2150 SOC_DOUBLE_R("DAC2 Switch", WM8994_DAC2_LEFT_VOLUME, | 861 SOC_DOUBLE_R("DAC2 Switch", WM8994_DAC2_LEFT_VOLUME, |
| 2151 WM8994_DAC2_RIGHT_VOLUME, 9, 1, 1), | 862 WM8994_DAC2_RIGHT_VOLUME, 9, 1, 1), |
| 2152 | 863 |
| 2153 SOC_SINGLE_TLV("SPKL DAC2 Volume", WM8994_SPKMIXL_ATTENUATION, | 864 SOC_SINGLE_TLV("SPKL DAC2 Volume", WM8994_SPKMIXL_ATTENUATION, |
| 2154 6, 1, 1, wm_hubs_spkmix_tlv), | 865 6, 1, 1, wm_hubs_spkmix_tlv), |
| 2155 SOC_SINGLE_TLV("SPKL DAC1 Volume", WM8994_SPKMIXL_ATTENUATION, | 866 SOC_SINGLE_TLV("SPKL DAC1 Volume", WM8994_SPKMIXL_ATTENUATION, |
| 2156 2, 1, 1, wm_hubs_spkmix_tlv), | 867 2, 1, 1, wm_hubs_spkmix_tlv), |
| 2157 | 868 |
| 2158 SOC_SINGLE_TLV("SPKR DAC2 Volume", WM8994_SPKMIXR_ATTENUATION, | 869 SOC_SINGLE_TLV("SPKR DAC2 Volume", WM8994_SPKMIXR_ATTENUATION, |
| 2159 6, 1, 1, wm_hubs_spkmix_tlv), | 870 6, 1, 1, wm_hubs_spkmix_tlv), |
| 2160 SOC_SINGLE_TLV("SPKR DAC1 Volume", WM8994_SPKMIXR_ATTENUATION, | 871 SOC_SINGLE_TLV("SPKR DAC1 Volume", WM8994_SPKMIXR_ATTENUATION, |
| 2161 2, 1, 1, wm_hubs_spkmix_tlv), | 872 2, 1, 1, wm_hubs_spkmix_tlv), |
| 2162 | 873 |
| 2163 SOC_SINGLE_TLV("AIF1DAC1 3D Stereo Volume", WM8994_AIF1_DAC1_FILTERS_2, | 874 SOC_SINGLE_TLV("AIF1DAC1 3D Stereo Volume", WM8994_AIF1_DAC1_FILTERS_2, |
| 2164 10, 15, 0, wm8994_3d_tlv), | 875 10, 15, 0, wm8994_3d_tlv), |
| 2165 SOC_SINGLE("AIF1DAC1 3D Stereo Switch", WM8994_AIF1_DAC2_FILTERS_2, | 876 SOC_SINGLE("AIF1DAC1 3D Stereo Switch", WM8994_AIF1_DAC1_FILTERS_2, |
| 2166 8, 1, 0), | 877 8, 1, 0), |
| 2167 SOC_SINGLE_TLV("AIF1DAC2 3D Stereo Volume", WM8994_AIF1_DAC2_FILTERS_2, | 878 SOC_SINGLE_TLV("AIF1DAC2 3D Stereo Volume", WM8994_AIF1_DAC2_FILTERS_2, |
| 2168 10, 15, 0, wm8994_3d_tlv), | 879 10, 15, 0, wm8994_3d_tlv), |
| 2169 SOC_SINGLE("AIF1DAC2 3D Stereo Switch", WM8994_AIF1_DAC2_FILTERS_2, | 880 SOC_SINGLE("AIF1DAC2 3D Stereo Switch", WM8994_AIF1_DAC2_FILTERS_2, |
| 2170 8, 1, 0), | 881 8, 1, 0), |
| 2171 SOC_SINGLE_TLV("AIF2DAC 3D Stereo Volume", WM8994_AIF1_DAC1_FILTERS_2, | 882 SOC_SINGLE_TLV("AIF2DAC 3D Stereo Volume", WM8994_AIF2_DAC_FILTERS_2, |
| 2172 10, 15, 0, wm8994_3d_tlv), | 883 10, 15, 0, wm8994_3d_tlv), |
| 2173 SOC_SINGLE("AIF2DAC 3D Stereo Switch", WM8994_AIF1_DAC2_FILTERS_2, | 884 SOC_SINGLE("AIF2DAC 3D Stereo Switch", WM8994_AIF2_DAC_FILTERS_2, |
| 2174 8, 1, 0), | 885 8, 1, 0), |
| 2175 }; | 886 }; |
| 2176 | 887 |
| 2177 static const struct snd_kcontrol_new wm8994_eq_controls[] = { | 888 static const struct snd_kcontrol_new wm8994_eq_controls[] = { |
| 2178 SOC_SINGLE_TLV("AIF1DAC1 EQ1 Volume", WM8994_AIF1_DAC1_EQ_GAINS_1, 11, 31, 0, | 889 SOC_SINGLE_TLV("AIF1DAC1 EQ1 Volume", WM8994_AIF1_DAC1_EQ_GAINS_1, 11, 31, 0, |
| 2179 eq_tlv), | 890 eq_tlv), |
| 2180 SOC_SINGLE_TLV("AIF1DAC1 EQ2 Volume", WM8994_AIF1_DAC1_EQ_GAINS_1, 6, 31, 0, | 891 SOC_SINGLE_TLV("AIF1DAC1 EQ2 Volume", WM8994_AIF1_DAC1_EQ_GAINS_1, 6, 31, 0, |
| 2181 eq_tlv), | 892 eq_tlv), |
| 2182 SOC_SINGLE_TLV("AIF1DAC1 EQ3 Volume", WM8994_AIF1_DAC1_EQ_GAINS_1, 1, 31, 0, | 893 SOC_SINGLE_TLV("AIF1DAC1 EQ3 Volume", WM8994_AIF1_DAC1_EQ_GAINS_1, 1, 31, 0, |
| 2183 eq_tlv), | 894 eq_tlv), |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2202 SOC_SINGLE_TLV("AIF2 EQ2 Volume", WM8994_AIF2_EQ_GAINS_1, 6, 31, 0, | 913 SOC_SINGLE_TLV("AIF2 EQ2 Volume", WM8994_AIF2_EQ_GAINS_1, 6, 31, 0, |
| 2203 eq_tlv), | 914 eq_tlv), |
| 2204 SOC_SINGLE_TLV("AIF2 EQ3 Volume", WM8994_AIF2_EQ_GAINS_1, 1, 31, 0, | 915 SOC_SINGLE_TLV("AIF2 EQ3 Volume", WM8994_AIF2_EQ_GAINS_1, 1, 31, 0, |
| 2205 eq_tlv), | 916 eq_tlv), |
| 2206 SOC_SINGLE_TLV("AIF2 EQ4 Volume", WM8994_AIF2_EQ_GAINS_2, 11, 31, 0, | 917 SOC_SINGLE_TLV("AIF2 EQ4 Volume", WM8994_AIF2_EQ_GAINS_2, 11, 31, 0, |
| 2207 eq_tlv), | 918 eq_tlv), |
| 2208 SOC_SINGLE_TLV("AIF2 EQ5 Volume", WM8994_AIF2_EQ_GAINS_2, 6, 31, 0, | 919 SOC_SINGLE_TLV("AIF2 EQ5 Volume", WM8994_AIF2_EQ_GAINS_2, 6, 31, 0, |
| 2209 eq_tlv), | 920 eq_tlv), |
| 2210 }; | 921 }; |
| 2211 | 922 |
| 923 static const struct snd_kcontrol_new wm8958_snd_controls[] = { |
| 924 SOC_SINGLE_TLV("AIF3 Boost Volume", WM8958_AIF3_CONTROL_2, 10, 3, 0, aif_tlv), |
| 925 WM8958_MBC_SWITCH("AIF1DAC1 MBC Switch", 0), |
| 926 WM8958_MBC_SWITCH("AIF1DAC2 MBC Switch", 1), |
| 927 WM8958_MBC_SWITCH("AIF2DAC MBC Switch", 2), |
| 928 }; |
| 929 |
| 2212 static int clk_sys_event(struct snd_soc_dapm_widget *w, | 930 static int clk_sys_event(struct snd_soc_dapm_widget *w, |
| 2213 struct snd_kcontrol *kcontrol, int event) | 931 struct snd_kcontrol *kcontrol, int event) |
| 2214 { | 932 { |
| 2215 struct snd_soc_codec *codec = w->codec; | 933 struct snd_soc_codec *codec = w->codec; |
| 2216 | 934 |
| 2217 switch (event) { | 935 switch (event) { |
| 2218 case SND_SOC_DAPM_PRE_PMU: | 936 case SND_SOC_DAPM_PRE_PMU: |
| 2219 return configure_clock(codec); | 937 return configure_clock(codec); |
| 2220 | 938 |
| 2221 case SND_SOC_DAPM_POST_PMD: | 939 case SND_SOC_DAPM_POST_PMD: |
| 2222 configure_clock(codec); | 940 configure_clock(codec); |
| 2223 break; | 941 break; |
| 2224 } | 942 } |
| 2225 | 943 |
| 2226 return 0; | 944 return 0; |
| 2227 } | 945 } |
| 2228 | 946 |
| 2229 static void wm8994_update_class_w(struct snd_soc_codec *codec) | 947 static void wm8994_update_class_w(struct snd_soc_codec *codec) |
| 2230 { | 948 { |
| 949 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 2231 int enable = 1; | 950 int enable = 1; |
| 2232 int source = 0; /* GCC flow analysis can't track enable */ | 951 int source = 0; /* GCC flow analysis can't track enable */ |
| 2233 int reg, reg_r; | 952 int reg, reg_r; |
| 2234 | 953 |
| 2235 /* Only support direct DAC->headphone paths */ | 954 /* Only support direct DAC->headphone paths */ |
| 2236 reg = snd_soc_read(codec, WM8994_OUTPUT_MIXER_1); | 955 reg = snd_soc_read(codec, WM8994_OUTPUT_MIXER_1); |
| 2237 if (!(reg & WM8994_DAC1L_TO_HPOUT1L)) { | 956 if (!(reg & WM8994_DAC1L_TO_HPOUT1L)) { |
| 2238 dev_vdbg(codec->dev, "HPL connected to output mixer\n"); | 957 dev_vdbg(codec->dev, "HPL connected to output mixer\n"); |
| 2239 enable = 0; | 958 enable = 0; |
| 2240 } | 959 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2271 dev_vdbg(codec->dev, "Left and right DAC mixers different\n"); | 990 dev_vdbg(codec->dev, "Left and right DAC mixers different\n"); |
| 2272 enable = 0; | 991 enable = 0; |
| 2273 } | 992 } |
| 2274 | 993 |
| 2275 if (enable) { | 994 if (enable) { |
| 2276 dev_dbg(codec->dev, "Class W enabled\n"); | 995 dev_dbg(codec->dev, "Class W enabled\n"); |
| 2277 snd_soc_update_bits(codec, WM8994_CLASS_W_1, | 996 snd_soc_update_bits(codec, WM8994_CLASS_W_1, |
| 2278 WM8994_CP_DYN_PWR | | 997 WM8994_CP_DYN_PWR | |
| 2279 WM8994_CP_DYN_SRC_SEL_MASK, | 998 WM8994_CP_DYN_SRC_SEL_MASK, |
| 2280 source | WM8994_CP_DYN_PWR); | 999 source | WM8994_CP_DYN_PWR); |
| 1000 wm8994->hubs.class_w = true; |
| 2281 | 1001 |
| 2282 } else { | 1002 } else { |
| 2283 dev_dbg(codec->dev, "Class W disabled\n"); | 1003 dev_dbg(codec->dev, "Class W disabled\n"); |
| 2284 snd_soc_update_bits(codec, WM8994_CLASS_W_1, | 1004 snd_soc_update_bits(codec, WM8994_CLASS_W_1, |
| 2285 WM8994_CP_DYN_PWR, 0); | 1005 WM8994_CP_DYN_PWR, 0); |
| 1006 wm8994->hubs.class_w = false; |
| 2286 } | 1007 } |
| 2287 } | 1008 } |
| 2288 | 1009 |
| 1010 static int late_enable_ev(struct snd_soc_dapm_widget *w, |
| 1011 struct snd_kcontrol *kcontrol, int event) |
| 1012 { |
| 1013 struct snd_soc_codec *codec = w->codec; |
| 1014 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 1015 |
| 1016 switch (event) { |
| 1017 case SND_SOC_DAPM_PRE_PMU: |
| 1018 if (wm8994->aif1clk_enable) |
| 1019 snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1, |
| 1020 WM8994_AIF1CLK_ENA_MASK, |
| 1021 WM8994_AIF1CLK_ENA); |
| 1022 if (wm8994->aif2clk_enable) |
| 1023 snd_soc_update_bits(codec, WM8994_AIF2_CLOCKING_1, |
| 1024 WM8994_AIF2CLK_ENA_MASK, |
| 1025 WM8994_AIF2CLK_ENA); |
| 1026 break; |
| 1027 } |
| 1028 |
| 1029 return 0; |
| 1030 } |
| 1031 |
| 1032 static int late_disable_ev(struct snd_soc_dapm_widget *w, |
| 1033 struct snd_kcontrol *kcontrol, int event) |
| 1034 { |
| 1035 struct snd_soc_codec *codec = w->codec; |
| 1036 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 1037 |
| 1038 switch (event) { |
| 1039 case SND_SOC_DAPM_POST_PMD: |
| 1040 if (wm8994->aif1clk_enable) { |
| 1041 snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1, |
| 1042 WM8994_AIF1CLK_ENA_MASK, 0); |
| 1043 wm8994->aif1clk_enable = 0; |
| 1044 } |
| 1045 if (wm8994->aif2clk_enable) { |
| 1046 snd_soc_update_bits(codec, WM8994_AIF2_CLOCKING_1, |
| 1047 WM8994_AIF2CLK_ENA_MASK, 0); |
| 1048 wm8994->aif2clk_enable = 0; |
| 1049 } |
| 1050 break; |
| 1051 } |
| 1052 |
| 1053 return 0; |
| 1054 } |
| 1055 |
| 1056 static int aif1clk_ev(struct snd_soc_dapm_widget *w, |
| 1057 struct snd_kcontrol *kcontrol, int event) |
| 1058 { |
| 1059 struct snd_soc_codec *codec = w->codec; |
| 1060 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 1061 |
| 1062 switch (event) { |
| 1063 case SND_SOC_DAPM_PRE_PMU: |
| 1064 wm8994->aif1clk_enable = 1; |
| 1065 break; |
| 1066 } |
| 1067 |
| 1068 return 0; |
| 1069 } |
| 1070 |
| 1071 static int aif2clk_ev(struct snd_soc_dapm_widget *w, |
| 1072 struct snd_kcontrol *kcontrol, int event) |
| 1073 { |
| 1074 struct snd_soc_codec *codec = w->codec; |
| 1075 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 1076 |
| 1077 switch (event) { |
| 1078 case SND_SOC_DAPM_PRE_PMU: |
| 1079 wm8994->aif2clk_enable = 1; |
| 1080 break; |
| 1081 } |
| 1082 |
| 1083 return 0; |
| 1084 } |
| 1085 |
| 1086 static int dac_ev(struct snd_soc_dapm_widget *w, |
| 1087 struct snd_kcontrol *kcontrol, int event) |
| 1088 { |
| 1089 struct snd_soc_codec *codec = w->codec; |
| 1090 unsigned int mask = 1 << w->shift; |
| 1091 |
| 1092 snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_5, |
| 1093 mask, mask); |
| 1094 return 0; |
| 1095 } |
| 1096 |
| 2289 static const char *hp_mux_text[] = { | 1097 static const char *hp_mux_text[] = { |
| 2290 "Mixer", | 1098 "Mixer", |
| 2291 "DAC", | 1099 "DAC", |
| 2292 }; | 1100 }; |
| 2293 | 1101 |
| 2294 #define WM8994_HP_ENUM(xname, xenum) \ | 1102 #define WM8994_HP_ENUM(xname, xenum) \ |
| 2295 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ | 1103 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ |
| 2296 .info = snd_soc_info_enum_double, \ | 1104 .info = snd_soc_info_enum_double, \ |
| 2297 .get = snd_soc_dapm_get_enum_double, \ | 1105 .get = snd_soc_dapm_get_enum_double, \ |
| 2298 .put = wm8994_put_hp_enum, \ | 1106 .put = wm8994_put_hp_enum, \ |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2505 "AIF2ADCDAT", "AIF3DACDAT", | 1313 "AIF2ADCDAT", "AIF3DACDAT", |
| 2506 }; | 1314 }; |
| 2507 | 1315 |
| 2508 static const struct soc_enum aif2adc_enum = | 1316 static const struct soc_enum aif2adc_enum = |
| 2509 SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 2, 2, aif2adc_text); | 1317 SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 2, 2, aif2adc_text); |
| 2510 | 1318 |
| 2511 static const struct snd_kcontrol_new aif2adc_mux = | 1319 static const struct snd_kcontrol_new aif2adc_mux = |
| 2512 SOC_DAPM_ENUM("AIF2ADC Mux", aif2adc_enum); | 1320 SOC_DAPM_ENUM("AIF2ADC Mux", aif2adc_enum); |
| 2513 | 1321 |
| 2514 static const char *aif3adc_text[] = { | 1322 static const char *aif3adc_text[] = { |
| 2515 » "AIF1ADCDAT", "AIF2ADCDAT", "AIF2DACDAT", | 1323 » "AIF1ADCDAT", "AIF2ADCDAT", "AIF2DACDAT", "Mono PCM", |
| 2516 }; | 1324 }; |
| 2517 | 1325 |
| 2518 static const struct soc_enum aif3adc_enum = | 1326 static const struct soc_enum wm8994_aif3adc_enum = |
| 2519 SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 3, 3, aif3adc_text); | 1327 SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 3, 3, aif3adc_text); |
| 2520 | 1328 |
| 2521 static const struct snd_kcontrol_new aif3adc_mux = | 1329 static const struct snd_kcontrol_new wm8994_aif3adc_mux = |
| 2522 » SOC_DAPM_ENUM("AIF3ADC Mux", aif3adc_enum); | 1330 » SOC_DAPM_ENUM("AIF3ADC Mux", wm8994_aif3adc_enum); |
| 1331 |
| 1332 static const struct soc_enum wm8958_aif3adc_enum = |
| 1333 » SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 3, 4, aif3adc_text); |
| 1334 |
| 1335 static const struct snd_kcontrol_new wm8958_aif3adc_mux = |
| 1336 » SOC_DAPM_ENUM("AIF3ADC Mux", wm8958_aif3adc_enum); |
| 1337 |
| 1338 static const char *mono_pcm_out_text[] = { |
| 1339 » "None", "AIF2ADCL", "AIF2ADCR", |
| 1340 }; |
| 1341 |
| 1342 static const struct soc_enum mono_pcm_out_enum = |
| 1343 » SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 9, 3, mono_pcm_out_text); |
| 1344 |
| 1345 static const struct snd_kcontrol_new mono_pcm_out_mux = |
| 1346 » SOC_DAPM_ENUM("Mono PCM Out Mux", mono_pcm_out_enum); |
| 1347 |
| 1348 static const char *aif2dac_src_text[] = { |
| 1349 » "AIF2", "AIF3", |
| 1350 }; |
| 1351 |
| 1352 /* Note that these two control shouldn't be simultaneously switched to AIF3 */ |
| 1353 static const struct soc_enum aif2dacl_src_enum = |
| 1354 » SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 7, 2, aif2dac_src_text); |
| 1355 |
| 1356 static const struct snd_kcontrol_new aif2dacl_src_mux = |
| 1357 » SOC_DAPM_ENUM("AIF2DACL Mux", aif2dacl_src_enum); |
| 1358 |
| 1359 static const struct soc_enum aif2dacr_src_enum = |
| 1360 » SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 8, 2, aif2dac_src_text); |
| 1361 |
| 1362 static const struct snd_kcontrol_new aif2dacr_src_mux = |
| 1363 » SOC_DAPM_ENUM("AIF2DACR Mux", aif2dacr_src_enum); |
| 1364 |
| 1365 static const struct snd_soc_dapm_widget wm8994_lateclk_revd_widgets[] = { |
| 1366 SND_SOC_DAPM_SUPPLY("AIF1CLK", SND_SOC_NOPM, 0, 0, aif1clk_ev, |
| 1367 » SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), |
| 1368 SND_SOC_DAPM_SUPPLY("AIF2CLK", SND_SOC_NOPM, 0, 0, aif2clk_ev, |
| 1369 » SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), |
| 1370 |
| 1371 SND_SOC_DAPM_PGA_E("Late DAC1L Enable PGA", SND_SOC_NOPM, 0, 0, NULL, 0, |
| 1372 » late_enable_ev, SND_SOC_DAPM_PRE_PMU), |
| 1373 SND_SOC_DAPM_PGA_E("Late DAC1R Enable PGA", SND_SOC_NOPM, 0, 0, NULL, 0, |
| 1374 » late_enable_ev, SND_SOC_DAPM_PRE_PMU), |
| 1375 SND_SOC_DAPM_PGA_E("Late DAC2L Enable PGA", SND_SOC_NOPM, 0, 0, NULL, 0, |
| 1376 » late_enable_ev, SND_SOC_DAPM_PRE_PMU), |
| 1377 SND_SOC_DAPM_PGA_E("Late DAC2R Enable PGA", SND_SOC_NOPM, 0, 0, NULL, 0, |
| 1378 » late_enable_ev, SND_SOC_DAPM_PRE_PMU), |
| 1379 |
| 1380 SND_SOC_DAPM_POST("Late Disable PGA", late_disable_ev) |
| 1381 }; |
| 1382 |
| 1383 static const struct snd_soc_dapm_widget wm8994_lateclk_widgets[] = { |
| 1384 SND_SOC_DAPM_SUPPLY("AIF1CLK", WM8994_AIF1_CLOCKING_1, 0, 0, NULL, 0), |
| 1385 SND_SOC_DAPM_SUPPLY("AIF2CLK", WM8994_AIF2_CLOCKING_1, 0, 0, NULL, 0) |
| 1386 }; |
| 1387 |
| 1388 static const struct snd_soc_dapm_widget wm8994_dac_revd_widgets[] = { |
| 1389 SND_SOC_DAPM_DAC_E("DAC2L", NULL, SND_SOC_NOPM, 3, 0, |
| 1390 » dac_ev, SND_SOC_DAPM_PRE_PMU), |
| 1391 SND_SOC_DAPM_DAC_E("DAC2R", NULL, SND_SOC_NOPM, 2, 0, |
| 1392 » dac_ev, SND_SOC_DAPM_PRE_PMU), |
| 1393 SND_SOC_DAPM_DAC_E("DAC1L", NULL, SND_SOC_NOPM, 1, 0, |
| 1394 » dac_ev, SND_SOC_DAPM_PRE_PMU), |
| 1395 SND_SOC_DAPM_DAC_E("DAC1R", NULL, SND_SOC_NOPM, 0, 0, |
| 1396 » dac_ev, SND_SOC_DAPM_PRE_PMU), |
| 1397 }; |
| 1398 |
| 1399 static const struct snd_soc_dapm_widget wm8994_dac_widgets[] = { |
| 1400 SND_SOC_DAPM_DAC("DAC2L", NULL, WM8994_POWER_MANAGEMENT_5, 3, 0), |
| 1401 SND_SOC_DAPM_DAC("DAC1R", NULL, WM8994_POWER_MANAGEMENT_5, 2, 0), |
| 1402 SND_SOC_DAPM_DAC("DAC1L", NULL, WM8994_POWER_MANAGEMENT_5, 1, 0), |
| 1403 SND_SOC_DAPM_DAC("DAC1R", NULL, WM8994_POWER_MANAGEMENT_5, 0, 0), |
| 1404 }; |
| 2523 | 1405 |
| 2524 static const struct snd_soc_dapm_widget wm8994_dapm_widgets[] = { | 1406 static const struct snd_soc_dapm_widget wm8994_dapm_widgets[] = { |
| 2525 SND_SOC_DAPM_INPUT("DMIC1DAT"), | 1407 SND_SOC_DAPM_INPUT("DMIC1DAT"), |
| 2526 SND_SOC_DAPM_INPUT("DMIC2DAT"), | 1408 SND_SOC_DAPM_INPUT("DMIC2DAT"), |
| 2527 SND_SOC_DAPM_INPUT("Clock"), | 1409 SND_SOC_DAPM_INPUT("Clock"), |
| 2528 | 1410 |
| 2529 SND_SOC_DAPM_SUPPLY("CLK_SYS", SND_SOC_NOPM, 0, 0, clk_sys_event, | 1411 SND_SOC_DAPM_SUPPLY("CLK_SYS", SND_SOC_NOPM, 0, 0, clk_sys_event, |
| 2530 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), | 1412 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), |
| 2531 | 1413 |
| 2532 SND_SOC_DAPM_SUPPLY("DSP1CLK", WM8994_CLOCKING_1, 3, 0, NULL, 0), | 1414 SND_SOC_DAPM_SUPPLY("DSP1CLK", WM8994_CLOCKING_1, 3, 0, NULL, 0), |
| 2533 SND_SOC_DAPM_SUPPLY("DSP2CLK", WM8994_CLOCKING_1, 2, 0, NULL, 0), | 1415 SND_SOC_DAPM_SUPPLY("DSP2CLK", WM8994_CLOCKING_1, 2, 0, NULL, 0), |
| 2534 SND_SOC_DAPM_SUPPLY("DSPINTCLK", WM8994_CLOCKING_1, 1, 0, NULL, 0), | 1416 SND_SOC_DAPM_SUPPLY("DSPINTCLK", WM8994_CLOCKING_1, 1, 0, NULL, 0), |
| 2535 | 1417 |
| 2536 SND_SOC_DAPM_SUPPLY("AIF1CLK", WM8994_AIF1_CLOCKING_1, 0, 0, NULL, 0), | 1418 SND_SOC_DAPM_AIF_OUT("AIF1ADC1L", NULL, |
| 2537 SND_SOC_DAPM_SUPPLY("AIF2CLK", WM8994_AIF2_CLOCKING_1, 0, 0, NULL, 0), | 1419 » » 0, WM8994_POWER_MANAGEMENT_4, 9, 0), |
| 1420 SND_SOC_DAPM_AIF_OUT("AIF1ADC1R", NULL, |
| 1421 » » 0, WM8994_POWER_MANAGEMENT_4, 8, 0), |
| 1422 SND_SOC_DAPM_AIF_IN_E("AIF1DAC1L", NULL, 0, |
| 1423 » » WM8994_POWER_MANAGEMENT_5, 9, 0, wm8958_aif_ev, |
| 1424 » » SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), |
| 1425 SND_SOC_DAPM_AIF_IN_E("AIF1DAC1R", NULL, 0, |
| 1426 » » WM8994_POWER_MANAGEMENT_5, 8, 0, wm8958_aif_ev, |
| 1427 » » SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), |
| 2538 | 1428 |
| 2539 SND_SOC_DAPM_AIF_OUT("AIF1ADC1L", "AIF1 Capture", | 1429 SND_SOC_DAPM_AIF_OUT("AIF1ADC2L", NULL, |
| 2540 » » 0, WM8994_POWER_MANAGEMENT_4, 9, 0), | |
| 2541 SND_SOC_DAPM_AIF_OUT("AIF1ADC1R", "AIF1 Capture", | |
| 2542 » » 0, WM8994_POWER_MANAGEMENT_4, 8, 0), | |
| 2543 SND_SOC_DAPM_AIF_IN("AIF1DAC1L", NULL, 0, | |
| 2544 » » WM8994_POWER_MANAGEMENT_5, 9, 0), | |
| 2545 SND_SOC_DAPM_AIF_IN("AIF1DAC1R", NULL, 0, | |
| 2546 » » WM8994_POWER_MANAGEMENT_5, 8, 0), | |
| 2547 | |
| 2548 SND_SOC_DAPM_AIF_OUT("AIF1ADC2L", "AIF1 Capture", | |
| 2549 0, WM8994_POWER_MANAGEMENT_4, 11, 0), | 1430 0, WM8994_POWER_MANAGEMENT_4, 11, 0), |
| 2550 SND_SOC_DAPM_AIF_OUT("AIF1ADC2R", "AIF1 Capture", | 1431 SND_SOC_DAPM_AIF_OUT("AIF1ADC2R", NULL, |
| 2551 0, WM8994_POWER_MANAGEMENT_4, 10, 0), | 1432 0, WM8994_POWER_MANAGEMENT_4, 10, 0), |
| 2552 SND_SOC_DAPM_AIF_IN("AIF1DAC2L", NULL, 0, | 1433 SND_SOC_DAPM_AIF_IN_E("AIF1DAC2L", NULL, 0, |
| 2553 » » WM8994_POWER_MANAGEMENT_5, 11, 0), | 1434 » » WM8994_POWER_MANAGEMENT_5, 11, 0, wm8958_aif_ev, |
| 2554 SND_SOC_DAPM_AIF_IN("AIF1DAC2R", NULL, 0, | 1435 » » SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), |
| 2555 » » WM8994_POWER_MANAGEMENT_5, 10, 0), | 1436 SND_SOC_DAPM_AIF_IN_E("AIF1DAC2R", NULL, 0, |
| 1437 » » WM8994_POWER_MANAGEMENT_5, 10, 0, wm8958_aif_ev, |
| 1438 » » SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), |
| 2556 | 1439 |
| 2557 SND_SOC_DAPM_MIXER("AIF1ADC1L Mixer", SND_SOC_NOPM, 0, 0, | 1440 SND_SOC_DAPM_MIXER("AIF1ADC1L Mixer", SND_SOC_NOPM, 0, 0, |
| 2558 aif1adc1l_mix, ARRAY_SIZE(aif1adc1l_mix)), | 1441 aif1adc1l_mix, ARRAY_SIZE(aif1adc1l_mix)), |
| 2559 SND_SOC_DAPM_MIXER("AIF1ADC1R Mixer", SND_SOC_NOPM, 0, 0, | 1442 SND_SOC_DAPM_MIXER("AIF1ADC1R Mixer", SND_SOC_NOPM, 0, 0, |
| 2560 aif1adc1r_mix, ARRAY_SIZE(aif1adc1r_mix)), | 1443 aif1adc1r_mix, ARRAY_SIZE(aif1adc1r_mix)), |
| 2561 | 1444 |
| 2562 SND_SOC_DAPM_MIXER("AIF1ADC2L Mixer", SND_SOC_NOPM, 0, 0, | 1445 SND_SOC_DAPM_MIXER("AIF1ADC2L Mixer", SND_SOC_NOPM, 0, 0, |
| 2563 aif1adc2l_mix, ARRAY_SIZE(aif1adc2l_mix)), | 1446 aif1adc2l_mix, ARRAY_SIZE(aif1adc2l_mix)), |
| 2564 SND_SOC_DAPM_MIXER("AIF1ADC2R Mixer", SND_SOC_NOPM, 0, 0, | 1447 SND_SOC_DAPM_MIXER("AIF1ADC2R Mixer", SND_SOC_NOPM, 0, 0, |
| 2565 aif1adc2r_mix, ARRAY_SIZE(aif1adc2r_mix)), | 1448 aif1adc2r_mix, ARRAY_SIZE(aif1adc2r_mix)), |
| 2566 | 1449 |
| 2567 SND_SOC_DAPM_MIXER("AIF2DAC2L Mixer", SND_SOC_NOPM, 0, 0, | 1450 SND_SOC_DAPM_MIXER("AIF2DAC2L Mixer", SND_SOC_NOPM, 0, 0, |
| 2568 aif2dac2l_mix, ARRAY_SIZE(aif2dac2l_mix)), | 1451 aif2dac2l_mix, ARRAY_SIZE(aif2dac2l_mix)), |
| 2569 SND_SOC_DAPM_MIXER("AIF2DAC2R Mixer", SND_SOC_NOPM, 0, 0, | 1452 SND_SOC_DAPM_MIXER("AIF2DAC2R Mixer", SND_SOC_NOPM, 0, 0, |
| 2570 aif2dac2r_mix, ARRAY_SIZE(aif2dac2r_mix)), | 1453 aif2dac2r_mix, ARRAY_SIZE(aif2dac2r_mix)), |
| 2571 | 1454 |
| 2572 SND_SOC_DAPM_MUX("Left Sidetone", SND_SOC_NOPM, 0, 0, &sidetone1_mux), | 1455 SND_SOC_DAPM_MUX("Left Sidetone", SND_SOC_NOPM, 0, 0, &sidetone1_mux), |
| 2573 SND_SOC_DAPM_MUX("Right Sidetone", SND_SOC_NOPM, 0, 0, &sidetone2_mux), | 1456 SND_SOC_DAPM_MUX("Right Sidetone", SND_SOC_NOPM, 0, 0, &sidetone2_mux), |
| 2574 | 1457 |
| 2575 SND_SOC_DAPM_MIXER("DAC1L Mixer", SND_SOC_NOPM, 0, 0, | 1458 SND_SOC_DAPM_MIXER("DAC1L Mixer", SND_SOC_NOPM, 0, 0, |
| 2576 dac1l_mix, ARRAY_SIZE(dac1l_mix)), | 1459 dac1l_mix, ARRAY_SIZE(dac1l_mix)), |
| 2577 SND_SOC_DAPM_MIXER("DAC1R Mixer", SND_SOC_NOPM, 0, 0, | 1460 SND_SOC_DAPM_MIXER("DAC1R Mixer", SND_SOC_NOPM, 0, 0, |
| 2578 dac1r_mix, ARRAY_SIZE(dac1r_mix)), | 1461 dac1r_mix, ARRAY_SIZE(dac1r_mix)), |
| 2579 | 1462 |
| 2580 SND_SOC_DAPM_AIF_OUT("AIF2ADCL", NULL, 0, | 1463 SND_SOC_DAPM_AIF_OUT("AIF2ADCL", NULL, 0, |
| 2581 WM8994_POWER_MANAGEMENT_4, 13, 0), | 1464 WM8994_POWER_MANAGEMENT_4, 13, 0), |
| 2582 SND_SOC_DAPM_AIF_OUT("AIF2ADCR", NULL, 0, | 1465 SND_SOC_DAPM_AIF_OUT("AIF2ADCR", NULL, 0, |
| 2583 WM8994_POWER_MANAGEMENT_4, 12, 0), | 1466 WM8994_POWER_MANAGEMENT_4, 12, 0), |
| 2584 SND_SOC_DAPM_AIF_IN("AIF2DACL", NULL, 0, | 1467 SND_SOC_DAPM_AIF_IN_E("AIF2DACL", NULL, 0, |
| 2585 » » WM8994_POWER_MANAGEMENT_5, 13, 0), | 1468 » » WM8994_POWER_MANAGEMENT_5, 13, 0, wm8958_aif_ev, |
| 2586 SND_SOC_DAPM_AIF_IN("AIF2DACR", NULL, 0, | 1469 » » SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), |
| 2587 » » WM8994_POWER_MANAGEMENT_5, 12, 0), | 1470 SND_SOC_DAPM_AIF_IN_E("AIF2DACR", NULL, 0, |
| 1471 » » WM8994_POWER_MANAGEMENT_5, 12, 0, wm8958_aif_ev, |
| 1472 » » SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), |
| 2588 | 1473 |
| 2589 SND_SOC_DAPM_AIF_IN("AIF1DACDAT", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0), | 1474 SND_SOC_DAPM_AIF_IN("AIF1DACDAT", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0), |
| 2590 SND_SOC_DAPM_AIF_IN("AIF2DACDAT", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0), | 1475 SND_SOC_DAPM_AIF_IN("AIF2DACDAT", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0), |
| 1476 SND_SOC_DAPM_AIF_OUT("AIF1ADCDAT", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0), |
| 2591 SND_SOC_DAPM_AIF_OUT("AIF2ADCDAT", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0), | 1477 SND_SOC_DAPM_AIF_OUT("AIF2ADCDAT", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0), |
| 2592 | 1478 |
| 2593 SND_SOC_DAPM_MUX("AIF1DAC Mux", SND_SOC_NOPM, 0, 0, &aif1dac_mux), | 1479 SND_SOC_DAPM_MUX("AIF1DAC Mux", SND_SOC_NOPM, 0, 0, &aif1dac_mux), |
| 2594 SND_SOC_DAPM_MUX("AIF2DAC Mux", SND_SOC_NOPM, 0, 0, &aif2dac_mux), | 1480 SND_SOC_DAPM_MUX("AIF2DAC Mux", SND_SOC_NOPM, 0, 0, &aif2dac_mux), |
| 2595 SND_SOC_DAPM_MUX("AIF2ADC Mux", SND_SOC_NOPM, 0, 0, &aif2adc_mux), | 1481 SND_SOC_DAPM_MUX("AIF2ADC Mux", SND_SOC_NOPM, 0, 0, &aif2adc_mux), |
| 2596 SND_SOC_DAPM_MUX("AIF3ADC Mux", SND_SOC_NOPM, 0, 0, &aif3adc_mux), | |
| 2597 | 1482 |
| 2598 SND_SOC_DAPM_AIF_IN("AIF3DACDAT", "AIF3 Playback", 0, SND_SOC_NOPM, 0, 0), | 1483 SND_SOC_DAPM_AIF_IN("AIF3DACDAT", "AIF3 Playback", 0, SND_SOC_NOPM, 0, 0), |
| 2599 SND_SOC_DAPM_AIF_IN("AIF3ADCDAT", "AIF3 Capture", 0, SND_SOC_NOPM, 0, 0), | 1484 SND_SOC_DAPM_AIF_IN("AIF3ADCDAT", "AIF3 Capture", 0, SND_SOC_NOPM, 0, 0), |
| 2600 | 1485 |
| 2601 SND_SOC_DAPM_SUPPLY("TOCLK", WM8994_CLOCKING_1, 4, 0, NULL, 0), | 1486 SND_SOC_DAPM_SUPPLY("TOCLK", WM8994_CLOCKING_1, 4, 0, NULL, 0), |
| 2602 | 1487 |
| 2603 SND_SOC_DAPM_ADC("DMIC2L", NULL, WM8994_POWER_MANAGEMENT_4, 5, 0), | 1488 SND_SOC_DAPM_ADC("DMIC2L", NULL, WM8994_POWER_MANAGEMENT_4, 5, 0), |
| 2604 SND_SOC_DAPM_ADC("DMIC2R", NULL, WM8994_POWER_MANAGEMENT_4, 4, 0), | 1489 SND_SOC_DAPM_ADC("DMIC2R", NULL, WM8994_POWER_MANAGEMENT_4, 4, 0), |
| 2605 SND_SOC_DAPM_ADC("DMIC1L", NULL, WM8994_POWER_MANAGEMENT_4, 3, 0), | 1490 SND_SOC_DAPM_ADC("DMIC1L", NULL, WM8994_POWER_MANAGEMENT_4, 3, 0), |
| 2606 SND_SOC_DAPM_ADC("DMIC1R", NULL, WM8994_POWER_MANAGEMENT_4, 2, 0), | 1491 SND_SOC_DAPM_ADC("DMIC1R", NULL, WM8994_POWER_MANAGEMENT_4, 2, 0), |
| 2607 | 1492 |
| 2608 /* Power is done with the muxes since the ADC power also controls the | 1493 /* Power is done with the muxes since the ADC power also controls the |
| 2609 * downsampling chain, the chip will automatically manage the analogue | 1494 * downsampling chain, the chip will automatically manage the analogue |
| 2610 * specific portions. | 1495 * specific portions. |
| 2611 */ | 1496 */ |
| 2612 SND_SOC_DAPM_ADC("ADCL", NULL, SND_SOC_NOPM, 1, 0), | 1497 SND_SOC_DAPM_ADC("ADCL", NULL, SND_SOC_NOPM, 1, 0), |
| 2613 SND_SOC_DAPM_ADC("ADCR", NULL, SND_SOC_NOPM, 0, 0), | 1498 SND_SOC_DAPM_ADC("ADCR", NULL, SND_SOC_NOPM, 0, 0), |
| 2614 | 1499 |
| 2615 SND_SOC_DAPM_MUX("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux), | 1500 SND_SOC_DAPM_MUX("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux), |
| 2616 SND_SOC_DAPM_MUX("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux), | 1501 SND_SOC_DAPM_MUX("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux), |
| 2617 | 1502 |
| 2618 SND_SOC_DAPM_DAC("DAC2L", NULL, WM8994_POWER_MANAGEMENT_5, 3, 0), | |
| 2619 SND_SOC_DAPM_DAC("DAC2R", NULL, WM8994_POWER_MANAGEMENT_5, 2, 0), | |
| 2620 SND_SOC_DAPM_DAC("DAC1L", NULL, WM8994_POWER_MANAGEMENT_5, 1, 0), | |
| 2621 SND_SOC_DAPM_DAC("DAC1R", NULL, WM8994_POWER_MANAGEMENT_5, 0, 0), | |
| 2622 | |
| 2623 SND_SOC_DAPM_MUX("Left Headphone Mux", SND_SOC_NOPM, 0, 0, &hpl_mux), | 1503 SND_SOC_DAPM_MUX("Left Headphone Mux", SND_SOC_NOPM, 0, 0, &hpl_mux), |
| 2624 SND_SOC_DAPM_MUX("Right Headphone Mux", SND_SOC_NOPM, 0, 0, &hpr_mux), | 1504 SND_SOC_DAPM_MUX("Right Headphone Mux", SND_SOC_NOPM, 0, 0, &hpr_mux), |
| 2625 | 1505 |
| 2626 SND_SOC_DAPM_MIXER("SPKL", WM8994_POWER_MANAGEMENT_3, 8, 0, | 1506 SND_SOC_DAPM_MIXER("SPKL", WM8994_POWER_MANAGEMENT_3, 8, 0, |
| 2627 left_speaker_mixer, ARRAY_SIZE(left_speaker_mixer)), | 1507 left_speaker_mixer, ARRAY_SIZE(left_speaker_mixer)), |
| 2628 SND_SOC_DAPM_MIXER("SPKR", WM8994_POWER_MANAGEMENT_3, 9, 0, | 1508 SND_SOC_DAPM_MIXER("SPKR", WM8994_POWER_MANAGEMENT_3, 9, 0, |
| 2629 right_speaker_mixer, ARRAY_SIZE(right_speaker_mixer)), | 1509 right_speaker_mixer, ARRAY_SIZE(right_speaker_mixer)), |
| 2630 | 1510 |
| 2631 SND_SOC_DAPM_POST("Debug log", post_ev), | 1511 SND_SOC_DAPM_POST("Debug log", post_ev), |
| 2632 }; | 1512 }; |
| 2633 | 1513 |
| 1514 static const struct snd_soc_dapm_widget wm8994_specific_dapm_widgets[] = { |
| 1515 SND_SOC_DAPM_MUX("AIF3ADC Mux", SND_SOC_NOPM, 0, 0, &wm8994_aif3adc_mux), |
| 1516 }; |
| 1517 |
| 1518 static const struct snd_soc_dapm_widget wm8958_dapm_widgets[] = { |
| 1519 SND_SOC_DAPM_MUX("Mono PCM Out Mux", SND_SOC_NOPM, 0, 0, &mono_pcm_out_mux), |
| 1520 SND_SOC_DAPM_MUX("AIF2DACL Mux", SND_SOC_NOPM, 0, 0, &aif2dacl_src_mux), |
| 1521 SND_SOC_DAPM_MUX("AIF2DACR Mux", SND_SOC_NOPM, 0, 0, &aif2dacr_src_mux), |
| 1522 SND_SOC_DAPM_MUX("AIF3ADC Mux", SND_SOC_NOPM, 0, 0, &wm8958_aif3adc_mux), |
| 1523 }; |
| 1524 |
| 2634 static const struct snd_soc_dapm_route intercon[] = { | 1525 static const struct snd_soc_dapm_route intercon[] = { |
| 2635 | |
| 2636 { "CLK_SYS", NULL, "AIF1CLK", check_clk_sys }, | 1526 { "CLK_SYS", NULL, "AIF1CLK", check_clk_sys }, |
| 2637 { "CLK_SYS", NULL, "AIF2CLK", check_clk_sys }, | 1527 { "CLK_SYS", NULL, "AIF2CLK", check_clk_sys }, |
| 2638 | 1528 |
| 2639 { "DSP1CLK", NULL, "CLK_SYS" }, | 1529 { "DSP1CLK", NULL, "CLK_SYS" }, |
| 2640 { "DSP2CLK", NULL, "CLK_SYS" }, | 1530 { "DSP2CLK", NULL, "CLK_SYS" }, |
| 2641 { "DSPINTCLK", NULL, "CLK_SYS" }, | 1531 { "DSPINTCLK", NULL, "CLK_SYS" }, |
| 2642 | 1532 |
| 2643 { "AIF1ADC1L", NULL, "AIF1CLK" }, | 1533 { "AIF1ADC1L", NULL, "AIF1CLK" }, |
| 2644 { "AIF1ADC1L", NULL, "DSP1CLK" }, | 1534 { "AIF1ADC1L", NULL, "DSP1CLK" }, |
| 2645 { "AIF1ADC1R", NULL, "AIF1CLK" }, | 1535 { "AIF1ADC1R", NULL, "AIF1CLK" }, |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2733 { "AIF1ADC2R", NULL, "AIF1ADC2R Mixer" }, | 1623 { "AIF1ADC2R", NULL, "AIF1ADC2R Mixer" }, |
| 2734 { "AIF1ADC2R Mixer", "DMIC Switch", "DMIC2R" }, | 1624 { "AIF1ADC2R Mixer", "DMIC Switch", "DMIC2R" }, |
| 2735 { "AIF1ADC2R Mixer", "AIF2 Switch", "AIF2DACR" }, | 1625 { "AIF1ADC2R Mixer", "AIF2 Switch", "AIF2DACR" }, |
| 2736 | 1626 |
| 2737 /* Pin level routing for AIF3 */ | 1627 /* Pin level routing for AIF3 */ |
| 2738 { "AIF1DAC1L", NULL, "AIF1DAC Mux" }, | 1628 { "AIF1DAC1L", NULL, "AIF1DAC Mux" }, |
| 2739 { "AIF1DAC1R", NULL, "AIF1DAC Mux" }, | 1629 { "AIF1DAC1R", NULL, "AIF1DAC Mux" }, |
| 2740 { "AIF1DAC2L", NULL, "AIF1DAC Mux" }, | 1630 { "AIF1DAC2L", NULL, "AIF1DAC Mux" }, |
| 2741 { "AIF1DAC2R", NULL, "AIF1DAC Mux" }, | 1631 { "AIF1DAC2R", NULL, "AIF1DAC Mux" }, |
| 2742 | 1632 |
| 2743 { "AIF2DACL", NULL, "AIF2DAC Mux" }, | |
| 2744 { "AIF2DACR", NULL, "AIF2DAC Mux" }, | |
| 2745 | |
| 2746 { "AIF1DAC Mux", "AIF1DACDAT", "AIF1DACDAT" }, | 1633 { "AIF1DAC Mux", "AIF1DACDAT", "AIF1DACDAT" }, |
| 2747 { "AIF1DAC Mux", "AIF3DACDAT", "AIF3DACDAT" }, | 1634 { "AIF1DAC Mux", "AIF3DACDAT", "AIF3DACDAT" }, |
| 2748 { "AIF2DAC Mux", "AIF2DACDAT", "AIF2DACDAT" }, | 1635 { "AIF2DAC Mux", "AIF2DACDAT", "AIF2DACDAT" }, |
| 2749 { "AIF2DAC Mux", "AIF3DACDAT", "AIF3DACDAT" }, | 1636 { "AIF2DAC Mux", "AIF3DACDAT", "AIF3DACDAT" }, |
| 2750 { "AIF2ADC Mux", "AIF2ADCDAT", "AIF2ADCL" }, | 1637 { "AIF2ADC Mux", "AIF2ADCDAT", "AIF2ADCL" }, |
| 2751 { "AIF2ADC Mux", "AIF2ADCDAT", "AIF2ADCR" }, | 1638 { "AIF2ADC Mux", "AIF2ADCDAT", "AIF2ADCR" }, |
| 2752 { "AIF2ADC Mux", "AIF3DACDAT", "AIF3ADCDAT" }, | 1639 { "AIF2ADC Mux", "AIF3DACDAT", "AIF3ADCDAT" }, |
| 2753 | 1640 |
| 2754 /* DAC1 inputs */ | 1641 /* DAC1 inputs */ |
| 2755 { "DAC1L", NULL, "DAC1L Mixer" }, | |
| 2756 { "DAC1L Mixer", "AIF2 Switch", "AIF2DACL" }, | 1642 { "DAC1L Mixer", "AIF2 Switch", "AIF2DACL" }, |
| 2757 { "DAC1L Mixer", "AIF1.2 Switch", "AIF1DAC2L" }, | 1643 { "DAC1L Mixer", "AIF1.2 Switch", "AIF1DAC2L" }, |
| 2758 { "DAC1L Mixer", "AIF1.1 Switch", "AIF1DAC1L" }, | 1644 { "DAC1L Mixer", "AIF1.1 Switch", "AIF1DAC1L" }, |
| 2759 { "DAC1L Mixer", "Left Sidetone Switch", "Left Sidetone" }, | 1645 { "DAC1L Mixer", "Left Sidetone Switch", "Left Sidetone" }, |
| 2760 { "DAC1L Mixer", "Right Sidetone Switch", "Right Sidetone" }, | 1646 { "DAC1L Mixer", "Right Sidetone Switch", "Right Sidetone" }, |
| 2761 | 1647 |
| 2762 { "DAC1R", NULL, "DAC1R Mixer" }, | |
| 2763 { "DAC1R Mixer", "AIF2 Switch", "AIF2DACR" }, | 1648 { "DAC1R Mixer", "AIF2 Switch", "AIF2DACR" }, |
| 2764 { "DAC1R Mixer", "AIF1.2 Switch", "AIF1DAC2R" }, | 1649 { "DAC1R Mixer", "AIF1.2 Switch", "AIF1DAC2R" }, |
| 2765 { "DAC1R Mixer", "AIF1.1 Switch", "AIF1DAC1R" }, | 1650 { "DAC1R Mixer", "AIF1.1 Switch", "AIF1DAC1R" }, |
| 2766 { "DAC1R Mixer", "Left Sidetone Switch", "Left Sidetone" }, | 1651 { "DAC1R Mixer", "Left Sidetone Switch", "Left Sidetone" }, |
| 2767 { "DAC1R Mixer", "Right Sidetone Switch", "Right Sidetone" }, | 1652 { "DAC1R Mixer", "Right Sidetone Switch", "Right Sidetone" }, |
| 2768 | 1653 |
| 2769 /* DAC2/AIF2 outputs */ | 1654 /* DAC2/AIF2 outputs */ |
| 2770 { "AIF2ADCL", NULL, "AIF2DAC2L Mixer" }, | 1655 { "AIF2ADCL", NULL, "AIF2DAC2L Mixer" }, |
| 2771 { "DAC2L", NULL, "AIF2DAC2L Mixer" }, | |
| 2772 { "AIF2DAC2L Mixer", "AIF2 Switch", "AIF2DACL" }, | 1656 { "AIF2DAC2L Mixer", "AIF2 Switch", "AIF2DACL" }, |
| 2773 { "AIF2DAC2L Mixer", "AIF1.2 Switch", "AIF1DAC2L" }, | 1657 { "AIF2DAC2L Mixer", "AIF1.2 Switch", "AIF1DAC2L" }, |
| 2774 { "AIF2DAC2L Mixer", "AIF1.1 Switch", "AIF1DAC1L" }, | 1658 { "AIF2DAC2L Mixer", "AIF1.1 Switch", "AIF1DAC1L" }, |
| 2775 { "AIF2DAC2L Mixer", "Left Sidetone Switch", "Left Sidetone" }, | 1659 { "AIF2DAC2L Mixer", "Left Sidetone Switch", "Left Sidetone" }, |
| 2776 { "AIF2DAC2L Mixer", "Right Sidetone Switch", "Right Sidetone" }, | 1660 { "AIF2DAC2L Mixer", "Right Sidetone Switch", "Right Sidetone" }, |
| 2777 | 1661 |
| 2778 { "AIF2ADCR", NULL, "AIF2DAC2R Mixer" }, | 1662 { "AIF2ADCR", NULL, "AIF2DAC2R Mixer" }, |
| 2779 { "DAC2R", NULL, "AIF2DAC2R Mixer" }, | |
| 2780 { "AIF2DAC2R Mixer", "AIF2 Switch", "AIF2DACR" }, | 1663 { "AIF2DAC2R Mixer", "AIF2 Switch", "AIF2DACR" }, |
| 2781 { "AIF2DAC2R Mixer", "AIF1.2 Switch", "AIF1DAC2R" }, | 1664 { "AIF2DAC2R Mixer", "AIF1.2 Switch", "AIF1DAC2R" }, |
| 2782 { "AIF2DAC2R Mixer", "AIF1.1 Switch", "AIF1DAC1R" }, | 1665 { "AIF2DAC2R Mixer", "AIF1.1 Switch", "AIF1DAC1R" }, |
| 2783 { "AIF2DAC2R Mixer", "Left Sidetone Switch", "Left Sidetone" }, | 1666 { "AIF2DAC2R Mixer", "Left Sidetone Switch", "Left Sidetone" }, |
| 2784 { "AIF2DAC2R Mixer", "Right Sidetone Switch", "Right Sidetone" }, | 1667 { "AIF2DAC2R Mixer", "Right Sidetone Switch", "Right Sidetone" }, |
| 2785 | 1668 |
| 1669 { "AIF1ADCDAT", NULL, "AIF1ADC1L" }, |
| 1670 { "AIF1ADCDAT", NULL, "AIF1ADC1R" }, |
| 1671 { "AIF1ADCDAT", NULL, "AIF1ADC2L" }, |
| 1672 { "AIF1ADCDAT", NULL, "AIF1ADC2R" }, |
| 1673 |
| 2786 { "AIF2ADCDAT", NULL, "AIF2ADC Mux" }, | 1674 { "AIF2ADCDAT", NULL, "AIF2ADC Mux" }, |
| 2787 | 1675 |
| 2788 /* AIF3 output */ | 1676 /* AIF3 output */ |
| 2789 { "AIF3ADCDAT", "AIF1ADCDAT", "AIF1ADC1L" }, | 1677 { "AIF3ADCDAT", "AIF1ADCDAT", "AIF1ADC1L" }, |
| 2790 { "AIF3ADCDAT", "AIF1ADCDAT", "AIF1ADC1R" }, | 1678 { "AIF3ADCDAT", "AIF1ADCDAT", "AIF1ADC1R" }, |
| 2791 { "AIF3ADCDAT", "AIF1ADCDAT", "AIF1ADC2L" }, | 1679 { "AIF3ADCDAT", "AIF1ADCDAT", "AIF1ADC2L" }, |
| 2792 { "AIF3ADCDAT", "AIF1ADCDAT", "AIF1ADC2R" }, | 1680 { "AIF3ADCDAT", "AIF1ADCDAT", "AIF1ADC2R" }, |
| 2793 { "AIF3ADCDAT", "AIF2ADCDAT", "AIF2ADCL" }, | 1681 { "AIF3ADCDAT", "AIF2ADCDAT", "AIF2ADCL" }, |
| 2794 { "AIF3ADCDAT", "AIF2ADCDAT", "AIF2ADCR" }, | 1682 { "AIF3ADCDAT", "AIF2ADCDAT", "AIF2ADCR" }, |
| 2795 { "AIF3ADCDAT", "AIF2DACDAT", "AIF2DACL" }, | 1683 { "AIF3ADCDAT", "AIF2DACDAT", "AIF2DACL" }, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2808 { "SPKL", "DAC1 Switch", "DAC1L" }, | 1696 { "SPKL", "DAC1 Switch", "DAC1L" }, |
| 2809 { "SPKL", "DAC2 Switch", "DAC2L" }, | 1697 { "SPKL", "DAC2 Switch", "DAC2L" }, |
| 2810 | 1698 |
| 2811 { "SPKR", "DAC1 Switch", "DAC1R" }, | 1699 { "SPKR", "DAC1 Switch", "DAC1R" }, |
| 2812 { "SPKR", "DAC2 Switch", "DAC2R" }, | 1700 { "SPKR", "DAC2 Switch", "DAC2R" }, |
| 2813 | 1701 |
| 2814 { "Left Headphone Mux", "DAC", "DAC1L" }, | 1702 { "Left Headphone Mux", "DAC", "DAC1L" }, |
| 2815 { "Right Headphone Mux", "DAC", "DAC1R" }, | 1703 { "Right Headphone Mux", "DAC", "DAC1R" }, |
| 2816 }; | 1704 }; |
| 2817 | 1705 |
| 1706 static const struct snd_soc_dapm_route wm8994_lateclk_revd_intercon[] = { |
| 1707 { "DAC1L", NULL, "Late DAC1L Enable PGA" }, |
| 1708 { "Late DAC1L Enable PGA", NULL, "DAC1L Mixer" }, |
| 1709 { "DAC1R", NULL, "Late DAC1R Enable PGA" }, |
| 1710 { "Late DAC1R Enable PGA", NULL, "DAC1R Mixer" }, |
| 1711 { "DAC2L", NULL, "Late DAC2L Enable PGA" }, |
| 1712 { "Late DAC2L Enable PGA", NULL, "AIF2DAC2L Mixer" }, |
| 1713 { "DAC2R", NULL, "Late DAC2R Enable PGA" }, |
| 1714 { "Late DAC2R Enable PGA", NULL, "AIF2DAC2R Mixer" } |
| 1715 }; |
| 1716 |
| 1717 static const struct snd_soc_dapm_route wm8994_lateclk_intercon[] = { |
| 1718 { "DAC1L", NULL, "DAC1L Mixer" }, |
| 1719 { "DAC1R", NULL, "DAC1R Mixer" }, |
| 1720 { "DAC2L", NULL, "AIF2DAC2L Mixer" }, |
| 1721 { "DAC2R", NULL, "AIF2DAC2R Mixer" }, |
| 1722 }; |
| 1723 |
| 1724 static const struct snd_soc_dapm_route wm8994_revd_intercon[] = { |
| 1725 { "AIF1DACDAT", NULL, "AIF2DACDAT" }, |
| 1726 { "AIF2DACDAT", NULL, "AIF1DACDAT" }, |
| 1727 { "AIF1ADCDAT", NULL, "AIF2ADCDAT" }, |
| 1728 { "AIF2ADCDAT", NULL, "AIF1ADCDAT" }, |
| 1729 }; |
| 1730 |
| 1731 static const struct snd_soc_dapm_route wm8994_intercon[] = { |
| 1732 { "AIF2DACL", NULL, "AIF2DAC Mux" }, |
| 1733 { "AIF2DACR", NULL, "AIF2DAC Mux" }, |
| 1734 }; |
| 1735 |
| 1736 static const struct snd_soc_dapm_route wm8958_intercon[] = { |
| 1737 { "AIF2DACL", NULL, "AIF2DACL Mux" }, |
| 1738 { "AIF2DACR", NULL, "AIF2DACR Mux" }, |
| 1739 |
| 1740 { "AIF2DACL Mux", "AIF2", "AIF2DAC Mux" }, |
| 1741 { "AIF2DACL Mux", "AIF3", "AIF3DACDAT" }, |
| 1742 { "AIF2DACR Mux", "AIF2", "AIF2DAC Mux" }, |
| 1743 { "AIF2DACR Mux", "AIF3", "AIF3DACDAT" }, |
| 1744 |
| 1745 { "Mono PCM Out Mux", "AIF2ADCL", "AIF2ADCL" }, |
| 1746 { "Mono PCM Out Mux", "AIF2ADCR", "AIF2ADCR" }, |
| 1747 |
| 1748 { "AIF3ADC Mux", "Mono PCM", "Mono PCM Out Mux" }, |
| 1749 }; |
| 1750 |
| 2818 /* The size in bits of the FLL divide multiplied by 10 | 1751 /* The size in bits of the FLL divide multiplied by 10 |
| 2819 * to allow rounding later */ | 1752 * to allow rounding later */ |
| 2820 #define FIXED_FLL_SIZE ((1 << 16) * 10) | 1753 #define FIXED_FLL_SIZE ((1 << 16) * 10) |
| 2821 | 1754 |
| 2822 struct fll_div { | 1755 struct fll_div { |
| 2823 u16 outdiv; | 1756 u16 outdiv; |
| 2824 u16 n; | 1757 u16 n; |
| 2825 u16 k; | 1758 u16 k; |
| 2826 u16 clk_ref_div; | 1759 u16 clk_ref_div; |
| 2827 u16 fll_fratio; | 1760 u16 fll_fratio; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2923 break; | 1856 break; |
| 2924 default: | 1857 default: |
| 2925 return -EINVAL; | 1858 return -EINVAL; |
| 2926 } | 1859 } |
| 2927 | 1860 |
| 2928 switch (src) { | 1861 switch (src) { |
| 2929 case 0: | 1862 case 0: |
| 2930 /* Allow no source specification when stopping */ | 1863 /* Allow no source specification when stopping */ |
| 2931 if (freq_out) | 1864 if (freq_out) |
| 2932 return -EINVAL; | 1865 return -EINVAL; |
| 1866 src = wm8994->fll[id].src; |
| 2933 break; | 1867 break; |
| 2934 case WM8994_FLL_SRC_MCLK1: | 1868 case WM8994_FLL_SRC_MCLK1: |
| 2935 case WM8994_FLL_SRC_MCLK2: | 1869 case WM8994_FLL_SRC_MCLK2: |
| 2936 case WM8994_FLL_SRC_LRCLK: | 1870 case WM8994_FLL_SRC_LRCLK: |
| 2937 case WM8994_FLL_SRC_BCLK: | 1871 case WM8994_FLL_SRC_BCLK: |
| 2938 break; | 1872 break; |
| 2939 default: | 1873 default: |
| 2940 return -EINVAL; | 1874 return -EINVAL; |
| 2941 } | 1875 } |
| 2942 | 1876 |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3087 } | 2021 } |
| 3088 | 2022 |
| 3089 configure_clock(codec); | 2023 configure_clock(codec); |
| 3090 | 2024 |
| 3091 return 0; | 2025 return 0; |
| 3092 } | 2026 } |
| 3093 | 2027 |
| 3094 static int wm8994_set_bias_level(struct snd_soc_codec *codec, | 2028 static int wm8994_set_bias_level(struct snd_soc_codec *codec, |
| 3095 enum snd_soc_bias_level level) | 2029 enum snd_soc_bias_level level) |
| 3096 { | 2030 { |
| 2031 struct wm8994 *control = codec->control_data; |
| 3097 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | 2032 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 3098 | 2033 |
| 3099 switch (level) { | 2034 switch (level) { |
| 3100 case SND_SOC_BIAS_ON: | 2035 case SND_SOC_BIAS_ON: |
| 3101 break; | 2036 break; |
| 3102 | 2037 |
| 3103 case SND_SOC_BIAS_PREPARE: | 2038 case SND_SOC_BIAS_PREPARE: |
| 3104 /* VMID=2x40k */ | 2039 /* VMID=2x40k */ |
| 3105 snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, | 2040 snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, |
| 3106 WM8994_VMID_SEL_MASK, 0x2); | 2041 WM8994_VMID_SEL_MASK, 0x2); |
| 3107 break; | 2042 break; |
| 3108 | 2043 |
| 3109 case SND_SOC_BIAS_STANDBY: | 2044 case SND_SOC_BIAS_STANDBY: |
| 3110 » » if (codec->bias_level == SND_SOC_BIAS_OFF) { | 2045 » » if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) { |
| 3111 » » » /* Tweak DC servo and DSP configuration for | 2046 » » » pm_runtime_get_sync(codec->dev); |
| 3112 » » » * improved performance. */ | 2047 |
| 3113 » » » if (wm8994->revision < 4) { | 2048 » » » switch (control->type) { |
| 3114 » » » » /* Tweak DC servo and DSP configuration for | 2049 » » » case WM8994: |
| 3115 » » » » * improved performance. */ | 2050 » » » » if (wm8994->revision < 4) { |
| 3116 » » » » snd_soc_write(codec, 0x102, 0x3); | 2051 » » » » » /* Tweak DC servo and DSP |
| 3117 » » » » snd_soc_write(codec, 0x56, 0x3); | 2052 » » » » » * configuration for improved |
| 3118 » » » » snd_soc_write(codec, 0x817, 0); | 2053 » » » » » * performance. */ |
| 3119 » » » » snd_soc_write(codec, 0x102, 0); | 2054 » » » » » snd_soc_write(codec, 0x102, 0x3); |
| 2055 » » » » » snd_soc_write(codec, 0x56, 0x3); |
| 2056 » » » » » snd_soc_write(codec, 0x817, 0); |
| 2057 » » » » » snd_soc_write(codec, 0x102, 0); |
| 2058 » » » » } |
| 2059 » » » » break; |
| 2060 |
| 2061 » » » case WM8958: |
| 2062 » » » » if (wm8994->revision == 0) { |
| 2063 » » » » » /* Optimise performance for rev A */ |
| 2064 » » » » » snd_soc_write(codec, 0x102, 0x3); |
| 2065 » » » » » snd_soc_write(codec, 0xcb, 0x81); |
| 2066 » » » » » snd_soc_write(codec, 0x817, 0); |
| 2067 » » » » » snd_soc_write(codec, 0x102, 0); |
| 2068 |
| 2069 » » » » » snd_soc_update_bits(codec, |
| 2070 » » » » » » » WM8958_CHARGE_PUMP_2
, |
| 2071 » » » » » » » WM8958_CP_DISCH, |
| 2072 » » » » » » » WM8958_CP_DISCH); |
| 2073 » » » » } |
| 2074 » » » » break; |
| 3120 } | 2075 } |
| 3121 | 2076 |
| 3122 /* Discharge LINEOUT1 & 2 */ | 2077 /* Discharge LINEOUT1 & 2 */ |
| 3123 snd_soc_update_bits(codec, WM8994_ANTIPOP_1, | 2078 snd_soc_update_bits(codec, WM8994_ANTIPOP_1, |
| 3124 WM8994_LINEOUT1_DISCH | | 2079 WM8994_LINEOUT1_DISCH | |
| 3125 WM8994_LINEOUT2_DISCH, | 2080 WM8994_LINEOUT2_DISCH, |
| 3126 WM8994_LINEOUT1_DISCH | | 2081 WM8994_LINEOUT1_DISCH | |
| 3127 WM8994_LINEOUT2_DISCH); | 2082 WM8994_LINEOUT2_DISCH); |
| 3128 | 2083 |
| 3129 /* Startup bias, VMID ramp & buffer */ | 2084 /* Startup bias, VMID ramp & buffer */ |
| (...skipping 14 matching lines...) Expand all Loading... |
| 3144 msleep(20); | 2099 msleep(20); |
| 3145 } | 2100 } |
| 3146 | 2101 |
| 3147 /* VMID=2x500k */ | 2102 /* VMID=2x500k */ |
| 3148 snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, | 2103 snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, |
| 3149 WM8994_VMID_SEL_MASK, 0x4); | 2104 WM8994_VMID_SEL_MASK, 0x4); |
| 3150 | 2105 |
| 3151 break; | 2106 break; |
| 3152 | 2107 |
| 3153 case SND_SOC_BIAS_OFF: | 2108 case SND_SOC_BIAS_OFF: |
| 3154 » » if (codec->bias_level == SND_SOC_BIAS_STANDBY) { | 2109 » » if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY) { |
| 3155 /* Switch over to startup biases */ | 2110 /* Switch over to startup biases */ |
| 3156 snd_soc_update_bits(codec, WM8994_ANTIPOP_2, | 2111 snd_soc_update_bits(codec, WM8994_ANTIPOP_2, |
| 3157 WM8994_BIAS_SRC | | 2112 WM8994_BIAS_SRC | |
| 3158 WM8994_STARTUP_BIAS_ENA | | 2113 WM8994_STARTUP_BIAS_ENA | |
| 3159 WM8994_VMID_BUF_ENA | | 2114 WM8994_VMID_BUF_ENA | |
| 3160 WM8994_VMID_RAMP_MASK, | 2115 WM8994_VMID_RAMP_MASK, |
| 3161 WM8994_BIAS_SRC | | 2116 WM8994_BIAS_SRC | |
| 3162 WM8994_STARTUP_BIAS_ENA | | 2117 WM8994_STARTUP_BIAS_ENA | |
| 3163 WM8994_VMID_BUF_ENA | | 2118 WM8994_VMID_BUF_ENA | |
| 3164 (1 << WM8994_VMID_RAMP_SHIFT)); | 2119 (1 << WM8994_VMID_RAMP_SHIFT)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3176 WM8994_LINEOUT2_DISCH); | 2131 WM8994_LINEOUT2_DISCH); |
| 3177 | 2132 |
| 3178 msleep(5); | 2133 msleep(5); |
| 3179 | 2134 |
| 3180 /* Switch off startup biases */ | 2135 /* Switch off startup biases */ |
| 3181 snd_soc_update_bits(codec, WM8994_ANTIPOP_2, | 2136 snd_soc_update_bits(codec, WM8994_ANTIPOP_2, |
| 3182 WM8994_BIAS_SRC | | 2137 WM8994_BIAS_SRC | |
| 3183 WM8994_STARTUP_BIAS_ENA | | 2138 WM8994_STARTUP_BIAS_ENA | |
| 3184 WM8994_VMID_BUF_ENA | | 2139 WM8994_VMID_BUF_ENA | |
| 3185 WM8994_VMID_RAMP_MASK, 0); | 2140 WM8994_VMID_RAMP_MASK, 0); |
| 2141 |
| 2142 pm_runtime_put(codec->dev); |
| 3186 } | 2143 } |
| 3187 break; | 2144 break; |
| 3188 } | 2145 } |
| 3189 » codec->bias_level = level; | 2146 » codec->dapm.bias_level = level; |
| 3190 return 0; | 2147 return 0; |
| 3191 } | 2148 } |
| 3192 | 2149 |
| 3193 static int wm8994_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) | 2150 static int wm8994_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) |
| 3194 { | 2151 { |
| 3195 struct snd_soc_codec *codec = dai->codec; | 2152 struct snd_soc_codec *codec = dai->codec; |
| 2153 struct wm8994 *control = codec->control_data; |
| 3196 int ms_reg; | 2154 int ms_reg; |
| 3197 int aif1_reg; | 2155 int aif1_reg; |
| 3198 int ms = 0; | 2156 int ms = 0; |
| 3199 int aif1 = 0; | 2157 int aif1 = 0; |
| 3200 | 2158 |
| 3201 switch (dai->id) { | 2159 switch (dai->id) { |
| 3202 case 1: | 2160 case 1: |
| 3203 ms_reg = WM8994_AIF1_MASTER_SLAVE; | 2161 ms_reg = WM8994_AIF1_MASTER_SLAVE; |
| 3204 aif1_reg = WM8994_AIF1_CONTROL_1; | 2162 aif1_reg = WM8994_AIF1_CONTROL_1; |
| 3205 break; | 2163 break; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3270 aif1 |= WM8994_AIF1_LRCLK_INV; | 2228 aif1 |= WM8994_AIF1_LRCLK_INV; |
| 3271 break; | 2229 break; |
| 3272 default: | 2230 default: |
| 3273 return -EINVAL; | 2231 return -EINVAL; |
| 3274 } | 2232 } |
| 3275 break; | 2233 break; |
| 3276 default: | 2234 default: |
| 3277 return -EINVAL; | 2235 return -EINVAL; |
| 3278 } | 2236 } |
| 3279 | 2237 |
| 2238 /* The AIF2 format configuration needs to be mirrored to AIF3 |
| 2239 * on WM8958 if it's in use so just do it all the time. */ |
| 2240 if (control->type == WM8958 && dai->id == 2) |
| 2241 snd_soc_update_bits(codec, WM8958_AIF3_CONTROL_1, |
| 2242 WM8994_AIF1_LRCLK_INV | |
| 2243 WM8958_AIF3_FMT_MASK, aif1); |
| 2244 |
| 3280 snd_soc_update_bits(codec, aif1_reg, | 2245 snd_soc_update_bits(codec, aif1_reg, |
| 3281 WM8994_AIF1_BCLK_INV | WM8994_AIF1_LRCLK_INV | | 2246 WM8994_AIF1_BCLK_INV | WM8994_AIF1_LRCLK_INV | |
| 3282 WM8994_AIF1_FMT_MASK, | 2247 WM8994_AIF1_FMT_MASK, |
| 3283 aif1); | 2248 aif1); |
| 3284 snd_soc_update_bits(codec, ms_reg, WM8994_AIF1_MSTR, | 2249 snd_soc_update_bits(codec, ms_reg, WM8994_AIF1_MSTR, |
| 3285 ms); | 2250 ms); |
| 3286 | 2251 |
| 3287 return 0; | 2252 return 0; |
| 3288 } | 2253 } |
| 3289 | 2254 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 3310 static int bclk_divs[] = { | 2275 static int bclk_divs[] = { |
| 3311 10, 15, 20, 30, 40, 50, 60, 80, 110, 120, 160, 220, 240, 320, 440, 480, | 2276 10, 15, 20, 30, 40, 50, 60, 80, 110, 120, 160, 220, 240, 320, 440, 480, |
| 3312 640, 880, 960, 1280, 1760, 1920 | 2277 640, 880, 960, 1280, 1760, 1920 |
| 3313 }; | 2278 }; |
| 3314 | 2279 |
| 3315 static int wm8994_hw_params(struct snd_pcm_substream *substream, | 2280 static int wm8994_hw_params(struct snd_pcm_substream *substream, |
| 3316 struct snd_pcm_hw_params *params, | 2281 struct snd_pcm_hw_params *params, |
| 3317 struct snd_soc_dai *dai) | 2282 struct snd_soc_dai *dai) |
| 3318 { | 2283 { |
| 3319 struct snd_soc_codec *codec = dai->codec; | 2284 struct snd_soc_codec *codec = dai->codec; |
| 2285 struct wm8994 *control = codec->control_data; |
| 3320 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | 2286 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 3321 int aif1_reg; | 2287 int aif1_reg; |
| 2288 int aif2_reg; |
| 3322 int bclk_reg; | 2289 int bclk_reg; |
| 3323 int lrclk_reg; | 2290 int lrclk_reg; |
| 3324 int rate_reg; | 2291 int rate_reg; |
| 3325 int aif1 = 0; | 2292 int aif1 = 0; |
| 2293 int aif2 = 0; |
| 3326 int bclk = 0; | 2294 int bclk = 0; |
| 3327 int lrclk = 0; | 2295 int lrclk = 0; |
| 3328 int rate_val = 0; | 2296 int rate_val = 0; |
| 3329 int id = dai->id - 1; | 2297 int id = dai->id - 1; |
| 3330 | 2298 |
| 3331 int i, cur_val, best_val, bclk_rate, best; | 2299 int i, cur_val, best_val, bclk_rate, best; |
| 3332 | 2300 |
| 3333 switch (dai->id) { | 2301 switch (dai->id) { |
| 3334 case 1: | 2302 case 1: |
| 3335 aif1_reg = WM8994_AIF1_CONTROL_1; | 2303 aif1_reg = WM8994_AIF1_CONTROL_1; |
| 2304 aif2_reg = WM8994_AIF1_CONTROL_2; |
| 3336 bclk_reg = WM8994_AIF1_BCLK; | 2305 bclk_reg = WM8994_AIF1_BCLK; |
| 3337 rate_reg = WM8994_AIF1_RATE; | 2306 rate_reg = WM8994_AIF1_RATE; |
| 3338 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || | 2307 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || |
| 3339 wm8994->lrclk_shared[0]) { | 2308 wm8994->lrclk_shared[0]) { |
| 3340 lrclk_reg = WM8994_AIF1DAC_LRCLK; | 2309 lrclk_reg = WM8994_AIF1DAC_LRCLK; |
| 3341 } else { | 2310 } else { |
| 3342 lrclk_reg = WM8994_AIF1ADC_LRCLK; | 2311 lrclk_reg = WM8994_AIF1ADC_LRCLK; |
| 3343 dev_dbg(codec->dev, "AIF1 using split LRCLK\n"); | 2312 dev_dbg(codec->dev, "AIF1 using split LRCLK\n"); |
| 3344 } | 2313 } |
| 3345 break; | 2314 break; |
| 3346 case 2: | 2315 case 2: |
| 3347 aif1_reg = WM8994_AIF2_CONTROL_1; | 2316 aif1_reg = WM8994_AIF2_CONTROL_1; |
| 2317 aif2_reg = WM8994_AIF2_CONTROL_2; |
| 3348 bclk_reg = WM8994_AIF2_BCLK; | 2318 bclk_reg = WM8994_AIF2_BCLK; |
| 3349 rate_reg = WM8994_AIF2_RATE; | 2319 rate_reg = WM8994_AIF2_RATE; |
| 3350 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || | 2320 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || |
| 3351 wm8994->lrclk_shared[1]) { | 2321 wm8994->lrclk_shared[1]) { |
| 3352 lrclk_reg = WM8994_AIF2DAC_LRCLK; | 2322 lrclk_reg = WM8994_AIF2DAC_LRCLK; |
| 3353 } else { | 2323 } else { |
| 3354 lrclk_reg = WM8994_AIF2ADC_LRCLK; | 2324 lrclk_reg = WM8994_AIF2ADC_LRCLK; |
| 3355 dev_dbg(codec->dev, "AIF2 using split LRCLK\n"); | 2325 dev_dbg(codec->dev, "AIF2 using split LRCLK\n"); |
| 3356 } | 2326 } |
| 3357 break; | 2327 break; |
| 2328 case 3: |
| 2329 switch (control->type) { |
| 2330 case WM8958: |
| 2331 aif1_reg = WM8958_AIF3_CONTROL_1; |
| 2332 break; |
| 2333 default: |
| 2334 return 0; |
| 2335 } |
| 3358 default: | 2336 default: |
| 3359 return -EINVAL; | 2337 return -EINVAL; |
| 3360 } | 2338 } |
| 3361 | 2339 |
| 3362 bclk_rate = params_rate(params) * 2; | 2340 bclk_rate = params_rate(params) * 2; |
| 3363 switch (params_format(params)) { | 2341 switch (params_format(params)) { |
| 3364 case SNDRV_PCM_FORMAT_S16_LE: | 2342 case SNDRV_PCM_FORMAT_S16_LE: |
| 3365 bclk_rate *= 16; | 2343 bclk_rate *= 16; |
| 3366 break; | 2344 break; |
| 3367 case SNDRV_PCM_FORMAT_S20_3LE: | 2345 case SNDRV_PCM_FORMAT_S20_3LE: |
| (...skipping 17 matching lines...) Expand all Loading... |
| 3385 if (srs[i].rate == params_rate(params)) | 2363 if (srs[i].rate == params_rate(params)) |
| 3386 break; | 2364 break; |
| 3387 if (i == ARRAY_SIZE(srs)) | 2365 if (i == ARRAY_SIZE(srs)) |
| 3388 return -EINVAL; | 2366 return -EINVAL; |
| 3389 rate_val |= srs[i].val << WM8994_AIF1_SR_SHIFT; | 2367 rate_val |= srs[i].val << WM8994_AIF1_SR_SHIFT; |
| 3390 | 2368 |
| 3391 dev_dbg(dai->dev, "Sample rate is %dHz\n", srs[i].rate); | 2369 dev_dbg(dai->dev, "Sample rate is %dHz\n", srs[i].rate); |
| 3392 dev_dbg(dai->dev, "AIF%dCLK is %dHz, target BCLK %dHz\n", | 2370 dev_dbg(dai->dev, "AIF%dCLK is %dHz, target BCLK %dHz\n", |
| 3393 dai->id, wm8994->aifclk[id], bclk_rate); | 2371 dai->id, wm8994->aifclk[id], bclk_rate); |
| 3394 | 2372 |
| 2373 if (params_channels(params) == 1 && |
| 2374 (snd_soc_read(codec, aif1_reg) & 0x18) == 0x18) |
| 2375 aif2 |= WM8994_AIF1_MONO; |
| 2376 |
| 3395 if (wm8994->aifclk[id] == 0) { | 2377 if (wm8994->aifclk[id] == 0) { |
| 3396 dev_err(dai->dev, "AIF%dCLK not configured\n", dai->id); | 2378 dev_err(dai->dev, "AIF%dCLK not configured\n", dai->id); |
| 3397 return -EINVAL; | 2379 return -EINVAL; |
| 3398 } | 2380 } |
| 3399 | 2381 |
| 3400 /* AIFCLK/fs ratio; look for a close match in either direction */ | 2382 /* AIFCLK/fs ratio; look for a close match in either direction */ |
| 3401 best = 0; | 2383 best = 0; |
| 3402 best_val = abs((fs_ratios[0] * params_rate(params)) | 2384 best_val = abs((fs_ratios[0] * params_rate(params)) |
| 3403 - wm8994->aifclk[id]); | 2385 - wm8994->aifclk[id]); |
| 3404 for (i = 1; i < ARRAY_SIZE(fs_ratios); i++) { | 2386 for (i = 1; i < ARRAY_SIZE(fs_ratios); i++) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 3428 bclk_rate = wm8994->aifclk[id] * 10 / bclk_divs[best]; | 2410 bclk_rate = wm8994->aifclk[id] * 10 / bclk_divs[best]; |
| 3429 dev_dbg(dai->dev, "Using BCLK_DIV %d for actual BCLK %dHz\n", | 2411 dev_dbg(dai->dev, "Using BCLK_DIV %d for actual BCLK %dHz\n", |
| 3430 bclk_divs[best], bclk_rate); | 2412 bclk_divs[best], bclk_rate); |
| 3431 bclk |= best << WM8994_AIF1_BCLK_DIV_SHIFT; | 2413 bclk |= best << WM8994_AIF1_BCLK_DIV_SHIFT; |
| 3432 | 2414 |
| 3433 lrclk = bclk_rate / params_rate(params); | 2415 lrclk = bclk_rate / params_rate(params); |
| 3434 dev_dbg(dai->dev, "Using LRCLK rate %d for actual LRCLK %dHz\n", | 2416 dev_dbg(dai->dev, "Using LRCLK rate %d for actual LRCLK %dHz\n", |
| 3435 lrclk, bclk_rate / lrclk); | 2417 lrclk, bclk_rate / lrclk); |
| 3436 | 2418 |
| 3437 snd_soc_update_bits(codec, aif1_reg, WM8994_AIF1_WL_MASK, aif1); | 2419 snd_soc_update_bits(codec, aif1_reg, WM8994_AIF1_WL_MASK, aif1); |
| 2420 snd_soc_update_bits(codec, aif2_reg, WM8994_AIF1_MONO, aif2); |
| 3438 snd_soc_update_bits(codec, bclk_reg, WM8994_AIF1_BCLK_DIV_MASK, bclk); | 2421 snd_soc_update_bits(codec, bclk_reg, WM8994_AIF1_BCLK_DIV_MASK, bclk); |
| 3439 snd_soc_update_bits(codec, lrclk_reg, WM8994_AIF1DAC_RATE_MASK, | 2422 snd_soc_update_bits(codec, lrclk_reg, WM8994_AIF1DAC_RATE_MASK, |
| 3440 lrclk); | 2423 lrclk); |
| 3441 snd_soc_update_bits(codec, rate_reg, WM8994_AIF1_SR_MASK | | 2424 snd_soc_update_bits(codec, rate_reg, WM8994_AIF1_SR_MASK | |
| 3442 WM8994_AIF1CLK_RATE_MASK, rate_val); | 2425 WM8994_AIF1CLK_RATE_MASK, rate_val); |
| 3443 | 2426 |
| 3444 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | 2427 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
| 3445 switch (dai->id) { | 2428 switch (dai->id) { |
| 3446 case 1: | 2429 case 1: |
| 3447 wm8994->dac_rates[0] = params_rate(params); | 2430 wm8994->dac_rates[0] = params_rate(params); |
| 3448 wm8994_set_retune_mobile(codec, 0); | 2431 wm8994_set_retune_mobile(codec, 0); |
| 3449 wm8994_set_retune_mobile(codec, 1); | 2432 wm8994_set_retune_mobile(codec, 1); |
| 3450 break; | 2433 break; |
| 3451 case 2: | 2434 case 2: |
| 3452 wm8994->dac_rates[1] = params_rate(params); | 2435 wm8994->dac_rates[1] = params_rate(params); |
| 3453 wm8994_set_retune_mobile(codec, 2); | 2436 wm8994_set_retune_mobile(codec, 2); |
| 3454 break; | 2437 break; |
| 3455 } | 2438 } |
| 3456 } | 2439 } |
| 3457 | 2440 |
| 3458 return 0; | 2441 return 0; |
| 3459 } | 2442 } |
| 3460 | 2443 |
| 2444 static int wm8994_aif3_hw_params(struct snd_pcm_substream *substream, |
| 2445 struct snd_pcm_hw_params *params, |
| 2446 struct snd_soc_dai *dai) |
| 2447 { |
| 2448 struct snd_soc_codec *codec = dai->codec; |
| 2449 struct wm8994 *control = codec->control_data; |
| 2450 int aif1_reg; |
| 2451 int aif1 = 0; |
| 2452 |
| 2453 switch (dai->id) { |
| 2454 case 3: |
| 2455 switch (control->type) { |
| 2456 case WM8958: |
| 2457 aif1_reg = WM8958_AIF3_CONTROL_1; |
| 2458 break; |
| 2459 default: |
| 2460 return 0; |
| 2461 } |
| 2462 default: |
| 2463 return 0; |
| 2464 } |
| 2465 |
| 2466 switch (params_format(params)) { |
| 2467 case SNDRV_PCM_FORMAT_S16_LE: |
| 2468 break; |
| 2469 case SNDRV_PCM_FORMAT_S20_3LE: |
| 2470 aif1 |= 0x20; |
| 2471 break; |
| 2472 case SNDRV_PCM_FORMAT_S24_LE: |
| 2473 aif1 |= 0x40; |
| 2474 break; |
| 2475 case SNDRV_PCM_FORMAT_S32_LE: |
| 2476 aif1 |= 0x60; |
| 2477 break; |
| 2478 default: |
| 2479 return -EINVAL; |
| 2480 } |
| 2481 |
| 2482 return snd_soc_update_bits(codec, aif1_reg, WM8994_AIF1_WL_MASK, aif1); |
| 2483 } |
| 2484 |
| 3461 static int wm8994_aif_mute(struct snd_soc_dai *codec_dai, int mute) | 2485 static int wm8994_aif_mute(struct snd_soc_dai *codec_dai, int mute) |
| 3462 { | 2486 { |
| 3463 struct snd_soc_codec *codec = codec_dai->codec; | 2487 struct snd_soc_codec *codec = codec_dai->codec; |
| 3464 int mute_reg; | 2488 int mute_reg; |
| 3465 int reg; | 2489 int reg; |
| 3466 | 2490 |
| 3467 switch (codec_dai->id) { | 2491 switch (codec_dai->id) { |
| 3468 case 1: | 2492 case 1: |
| 3469 mute_reg = WM8994_AIF1_DAC1_FILTERS_1; | 2493 mute_reg = WM8994_AIF1_DAC1_FILTERS_1; |
| 3470 break; | 2494 break; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3505 break; | 2529 break; |
| 3506 default: | 2530 default: |
| 3507 return -EINVAL; | 2531 return -EINVAL; |
| 3508 } | 2532 } |
| 3509 | 2533 |
| 3510 if (tristate) | 2534 if (tristate) |
| 3511 val = mask; | 2535 val = mask; |
| 3512 else | 2536 else |
| 3513 val = 0; | 2537 val = 0; |
| 3514 | 2538 |
| 3515 » return snd_soc_update_bits(codec, reg, mask, reg); | 2539 » return snd_soc_update_bits(codec, reg, mask, val); |
| 3516 } | 2540 } |
| 3517 | 2541 |
| 3518 #define WM8994_RATES SNDRV_PCM_RATE_8000_96000 | 2542 #define WM8994_RATES SNDRV_PCM_RATE_8000_96000 |
| 3519 | 2543 |
| 3520 #define WM8994_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ | 2544 #define WM8994_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ |
| 3521 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) | 2545 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) |
| 3522 | 2546 |
| 3523 static struct snd_soc_dai_ops wm8994_aif1_dai_ops = { | 2547 static struct snd_soc_dai_ops wm8994_aif1_dai_ops = { |
| 3524 .set_sysclk = wm8994_set_dai_sysclk, | 2548 .set_sysclk = wm8994_set_dai_sysclk, |
| 3525 .set_fmt = wm8994_set_dai_fmt, | 2549 .set_fmt = wm8994_set_dai_fmt, |
| 3526 .hw_params = wm8994_hw_params, | 2550 .hw_params = wm8994_hw_params, |
| 3527 .digital_mute = wm8994_aif_mute, | 2551 .digital_mute = wm8994_aif_mute, |
| 3528 .set_pll = wm8994_set_fll, | 2552 .set_pll = wm8994_set_fll, |
| 3529 .set_tristate = wm8994_set_tristate, | 2553 .set_tristate = wm8994_set_tristate, |
| 3530 }; | 2554 }; |
| 3531 | 2555 |
| 3532 static struct snd_soc_dai_ops wm8994_aif2_dai_ops = { | 2556 static struct snd_soc_dai_ops wm8994_aif2_dai_ops = { |
| 3533 .set_sysclk = wm8994_set_dai_sysclk, | 2557 .set_sysclk = wm8994_set_dai_sysclk, |
| 3534 .set_fmt = wm8994_set_dai_fmt, | 2558 .set_fmt = wm8994_set_dai_fmt, |
| 3535 .hw_params = wm8994_hw_params, | 2559 .hw_params = wm8994_hw_params, |
| 3536 .digital_mute = wm8994_aif_mute, | 2560 .digital_mute = wm8994_aif_mute, |
| 3537 .set_pll = wm8994_set_fll, | 2561 .set_pll = wm8994_set_fll, |
| 3538 .set_tristate = wm8994_set_tristate, | 2562 .set_tristate = wm8994_set_tristate, |
| 3539 }; | 2563 }; |
| 3540 | 2564 |
| 3541 static struct snd_soc_dai_ops wm8994_aif3_dai_ops = { | 2565 static struct snd_soc_dai_ops wm8994_aif3_dai_ops = { |
| 2566 .hw_params = wm8994_aif3_hw_params, |
| 3542 .set_tristate = wm8994_set_tristate, | 2567 .set_tristate = wm8994_set_tristate, |
| 3543 }; | 2568 }; |
| 3544 | 2569 |
| 3545 static struct snd_soc_dai_driver wm8994_dai[] = { | 2570 static struct snd_soc_dai_driver wm8994_dai[] = { |
| 3546 { | 2571 { |
| 3547 .name = "wm8994-aif1", | 2572 .name = "wm8994-aif1", |
| 3548 .id = 1, | 2573 .id = 1, |
| 3549 .playback = { | 2574 .playback = { |
| 3550 .stream_name = "AIF1 Playback", | 2575 .stream_name = "AIF1 Playback", |
| 3551 » » » .channels_min = 2, | 2576 » » » .channels_min = 1, |
| 3552 .channels_max = 2, | 2577 .channels_max = 2, |
| 3553 .rates = WM8994_RATES, | 2578 .rates = WM8994_RATES, |
| 3554 .formats = WM8994_FORMATS, | 2579 .formats = WM8994_FORMATS, |
| 3555 }, | 2580 }, |
| 3556 .capture = { | 2581 .capture = { |
| 3557 .stream_name = "AIF1 Capture", | 2582 .stream_name = "AIF1 Capture", |
| 3558 » » » .channels_min = 2, | 2583 » » » .channels_min = 1, |
| 3559 .channels_max = 2, | 2584 .channels_max = 2, |
| 3560 .rates = WM8994_RATES, | 2585 .rates = WM8994_RATES, |
| 3561 .formats = WM8994_FORMATS, | 2586 .formats = WM8994_FORMATS, |
| 3562 }, | 2587 }, |
| 3563 .ops = &wm8994_aif1_dai_ops, | 2588 .ops = &wm8994_aif1_dai_ops, |
| 3564 }, | 2589 }, |
| 3565 { | 2590 { |
| 3566 .name = "wm8994-aif2", | 2591 .name = "wm8994-aif2", |
| 3567 .id = 2, | 2592 .id = 2, |
| 3568 .playback = { | 2593 .playback = { |
| 3569 .stream_name = "AIF2 Playback", | 2594 .stream_name = "AIF2 Playback", |
| 3570 » » » .channels_min = 2, | 2595 » » » .channels_min = 1, |
| 3571 .channels_max = 2, | 2596 .channels_max = 2, |
| 3572 .rates = WM8994_RATES, | 2597 .rates = WM8994_RATES, |
| 3573 .formats = WM8994_FORMATS, | 2598 .formats = WM8994_FORMATS, |
| 3574 }, | 2599 }, |
| 3575 .capture = { | 2600 .capture = { |
| 3576 .stream_name = "AIF2 Capture", | 2601 .stream_name = "AIF2 Capture", |
| 3577 » » » .channels_min = 2, | 2602 » » » .channels_min = 1, |
| 3578 .channels_max = 2, | 2603 .channels_max = 2, |
| 3579 .rates = WM8994_RATES, | 2604 .rates = WM8994_RATES, |
| 3580 .formats = WM8994_FORMATS, | 2605 .formats = WM8994_FORMATS, |
| 3581 }, | 2606 }, |
| 3582 .ops = &wm8994_aif2_dai_ops, | 2607 .ops = &wm8994_aif2_dai_ops, |
| 3583 }, | 2608 }, |
| 3584 { | 2609 { |
| 3585 .name = "wm8994-aif3", | 2610 .name = "wm8994-aif3", |
| 3586 .id = 3, | 2611 .id = 3, |
| 3587 .playback = { | 2612 .playback = { |
| 3588 .stream_name = "AIF3 Playback", | 2613 .stream_name = "AIF3 Playback", |
| 3589 » » » .channels_min = 2, | 2614 » » » .channels_min = 1, |
| 3590 .channels_max = 2, | 2615 .channels_max = 2, |
| 3591 .rates = WM8994_RATES, | 2616 .rates = WM8994_RATES, |
| 3592 .formats = WM8994_FORMATS, | 2617 .formats = WM8994_FORMATS, |
| 3593 }, | 2618 }, |
| 3594 .capture = { | 2619 .capture = { |
| 3595 .stream_name = "AIF3 Capture", | 2620 .stream_name = "AIF3 Capture", |
| 3596 » » » .channels_min = 2, | 2621 » » » .channels_min = 1, |
| 3597 .channels_max = 2, | 2622 .channels_max = 2, |
| 3598 .rates = WM8994_RATES, | 2623 .rates = WM8994_RATES, |
| 3599 .formats = WM8994_FORMATS, | 2624 .formats = WM8994_FORMATS, |
| 3600 }, | 2625 }, |
| 3601 .ops = &wm8994_aif3_dai_ops, | 2626 .ops = &wm8994_aif3_dai_ops, |
| 3602 } | 2627 } |
| 3603 }; | 2628 }; |
| 3604 | 2629 |
| 3605 #ifdef CONFIG_PM | 2630 #ifdef CONFIG_PM |
| 3606 static int wm8994_suspend(struct snd_soc_codec *codec, pm_message_t state) | 2631 static int wm8994_suspend(struct snd_soc_codec *codec, pm_message_t state) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3618 } | 2643 } |
| 3619 | 2644 |
| 3620 wm8994_set_bias_level(codec, SND_SOC_BIAS_OFF); | 2645 wm8994_set_bias_level(codec, SND_SOC_BIAS_OFF); |
| 3621 | 2646 |
| 3622 return 0; | 2647 return 0; |
| 3623 } | 2648 } |
| 3624 | 2649 |
| 3625 static int wm8994_resume(struct snd_soc_codec *codec) | 2650 static int wm8994_resume(struct snd_soc_codec *codec) |
| 3626 { | 2651 { |
| 3627 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | 2652 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 3628 u16 *reg_cache = codec->reg_cache; | |
| 3629 int i, ret; | 2653 int i, ret; |
| 2654 unsigned int val, mask; |
| 2655 |
| 2656 if (wm8994->revision < 4) { |
| 2657 /* force a HW read */ |
| 2658 val = wm8994_reg_read(codec->control_data, |
| 2659 WM8994_POWER_MANAGEMENT_5); |
| 2660 |
| 2661 /* modify the cache only */ |
| 2662 codec->cache_only = 1; |
| 2663 mask = WM8994_DAC1R_ENA | WM8994_DAC1L_ENA | |
| 2664 WM8994_DAC2R_ENA | WM8994_DAC2L_ENA; |
| 2665 val &= mask; |
| 2666 snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_5, |
| 2667 mask, val); |
| 2668 codec->cache_only = 0; |
| 2669 } |
| 3630 | 2670 |
| 3631 /* Restore the registers */ | 2671 /* Restore the registers */ |
| 3632 » for (i = 1; i < ARRAY_SIZE(wm8994->reg_cache); i++) { | 2672 » ret = snd_soc_cache_sync(codec); |
| 3633 » » switch (i) { | 2673 » if (ret != 0) |
| 3634 » » case WM8994_LDO_1: | 2674 » » dev_err(codec->dev, "Failed to sync cache: %d\n", ret); |
| 3635 » » case WM8994_LDO_2: | |
| 3636 » » case WM8994_SOFTWARE_RESET: | |
| 3637 » » » /* Handled by other MFD drivers */ | |
| 3638 » » » continue; | |
| 3639 » » default: | |
| 3640 » » » break; | |
| 3641 » » } | |
| 3642 | |
| 3643 » » if (!access_masks[i].writable) | |
| 3644 » » » continue; | |
| 3645 | |
| 3646 » » wm8994_reg_write(codec->control_data, i, reg_cache[i]); | |
| 3647 » } | |
| 3648 | 2675 |
| 3649 wm8994_set_bias_level(codec, SND_SOC_BIAS_STANDBY); | 2676 wm8994_set_bias_level(codec, SND_SOC_BIAS_STANDBY); |
| 3650 | 2677 |
| 3651 for (i = 0; i < ARRAY_SIZE(wm8994->fll); i++) { | 2678 for (i = 0; i < ARRAY_SIZE(wm8994->fll); i++) { |
| 3652 if (!wm8994->fll_suspend[i].out) | 2679 if (!wm8994->fll_suspend[i].out) |
| 3653 continue; | 2680 continue; |
| 3654 | 2681 |
| 3655 ret = _wm8994_set_fll(codec, i + 1, | 2682 ret = _wm8994_set_fll(codec, i + 1, |
| 3656 wm8994->fll_suspend[i].src, | 2683 wm8994->fll_suspend[i].src, |
| 3657 wm8994->fll_suspend[i].in, | 2684 wm8994->fll_suspend[i].in, |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3787 dev_err(wm8994->codec->dev, | 2814 dev_err(wm8994->codec->dev, |
| 3788 "Failed to add DRC mode controls: %d\n", ret); | 2815 "Failed to add DRC mode controls: %d\n", ret); |
| 3789 | 2816 |
| 3790 for (i = 0; i < WM8994_NUM_DRC; i++) | 2817 for (i = 0; i < WM8994_NUM_DRC; i++) |
| 3791 wm8994_set_drc(codec, i); | 2818 wm8994_set_drc(codec, i); |
| 3792 } | 2819 } |
| 3793 | 2820 |
| 3794 dev_dbg(codec->dev, "%d ReTune Mobile configurations\n", | 2821 dev_dbg(codec->dev, "%d ReTune Mobile configurations\n", |
| 3795 pdata->num_retune_mobile_cfgs); | 2822 pdata->num_retune_mobile_cfgs); |
| 3796 | 2823 |
| 2824 if (pdata->num_mbc_cfgs) { |
| 2825 struct snd_kcontrol_new control[] = { |
| 2826 SOC_ENUM_EXT("MBC Mode", wm8994->mbc_enum, |
| 2827 wm8958_get_mbc_enum, wm8958_put_mbc_enum), |
| 2828 }; |
| 2829 |
| 2830 /* We need an array of texts for the enum API */ |
| 2831 wm8994->mbc_texts = kmalloc(sizeof(char *) |
| 2832 * pdata->num_mbc_cfgs, GFP_KERNEL); |
| 2833 if (!wm8994->mbc_texts) { |
| 2834 dev_err(wm8994->codec->dev, |
| 2835 "Failed to allocate %d MBC config texts\n", |
| 2836 pdata->num_mbc_cfgs); |
| 2837 return; |
| 2838 } |
| 2839 |
| 2840 for (i = 0; i < pdata->num_mbc_cfgs; i++) |
| 2841 wm8994->mbc_texts[i] = pdata->mbc_cfgs[i].name; |
| 2842 |
| 2843 wm8994->mbc_enum.max = pdata->num_mbc_cfgs; |
| 2844 wm8994->mbc_enum.texts = wm8994->mbc_texts; |
| 2845 |
| 2846 ret = snd_soc_add_controls(wm8994->codec, control, 1); |
| 2847 if (ret != 0) |
| 2848 dev_err(wm8994->codec->dev, |
| 2849 "Failed to add MBC mode controls: %d\n", ret); |
| 2850 } |
| 2851 |
| 3797 if (pdata->num_retune_mobile_cfgs) | 2852 if (pdata->num_retune_mobile_cfgs) |
| 3798 wm8994_handle_retune_mobile_pdata(wm8994); | 2853 wm8994_handle_retune_mobile_pdata(wm8994); |
| 3799 else | 2854 else |
| 3800 snd_soc_add_controls(wm8994->codec, wm8994_eq_controls, | 2855 snd_soc_add_controls(wm8994->codec, wm8994_eq_controls, |
| 3801 ARRAY_SIZE(wm8994_eq_controls)); | 2856 ARRAY_SIZE(wm8994_eq_controls)); |
| 3802 } | 2857 } |
| 3803 | 2858 |
| 3804 /** | 2859 /** |
| 3805 * wm8994_mic_detect - Enable microphone detection via the WM8994 IRQ | 2860 * wm8994_mic_detect - Enable microphone detection via the WM8994 IRQ |
| 3806 * | 2861 * |
| 3807 * @codec: WM8994 codec | 2862 * @codec: WM8994 codec |
| 3808 * @jack: jack to report detection events on | 2863 * @jack: jack to report detection events on |
| 3809 * @micbias: microphone bias to detect on | 2864 * @micbias: microphone bias to detect on |
| 3810 * @det: value to report for presence detection | 2865 * @det: value to report for presence detection |
| 3811 * @shrt: value to report for short detection | 2866 * @shrt: value to report for short detection |
| 3812 * | 2867 * |
| 3813 * Enable microphone detection via IRQ on the WM8994. If GPIOs are | 2868 * Enable microphone detection via IRQ on the WM8994. If GPIOs are |
| 3814 * being used to bring out signals to the processor then only platform | 2869 * being used to bring out signals to the processor then only platform |
| 3815 * data configuration is needed for WM8994 and processor GPIOs should | 2870 * data configuration is needed for WM8994 and processor GPIOs should |
| 3816 * be configured using snd_soc_jack_add_gpios() instead. | 2871 * be configured using snd_soc_jack_add_gpios() instead. |
| 3817 * | 2872 * |
| 3818 * Configuration of detection levels is available via the micbias1_lvl | 2873 * Configuration of detection levels is available via the micbias1_lvl |
| 3819 * and micbias2_lvl platform data members. | 2874 * and micbias2_lvl platform data members. |
| 3820 */ | 2875 */ |
| 3821 int wm8994_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, | 2876 int wm8994_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, |
| 3822 int micbias, int det, int shrt) | 2877 int micbias, int det, int shrt) |
| 3823 { | 2878 { |
| 3824 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | 2879 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 3825 struct wm8994_micdet *micdet; | 2880 struct wm8994_micdet *micdet; |
| 2881 struct wm8994 *control = codec->control_data; |
| 3826 int reg; | 2882 int reg; |
| 3827 | 2883 |
| 2884 if (control->type != WM8994) |
| 2885 return -EINVAL; |
| 2886 |
| 3828 switch (micbias) { | 2887 switch (micbias) { |
| 3829 case 1: | 2888 case 1: |
| 3830 micdet = &wm8994->micdet[0]; | 2889 micdet = &wm8994->micdet[0]; |
| 3831 break; | 2890 break; |
| 3832 case 2: | 2891 case 2: |
| 3833 micdet = &wm8994->micdet[1]; | 2892 micdet = &wm8994->micdet[1]; |
| 3834 break; | 2893 break; |
| 3835 default: | 2894 default: |
| 3836 return -EINVAL; | 2895 return -EINVAL; |
| 3837 } | 2896 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 3856 } | 2915 } |
| 3857 EXPORT_SYMBOL_GPL(wm8994_mic_detect); | 2916 EXPORT_SYMBOL_GPL(wm8994_mic_detect); |
| 3858 | 2917 |
| 3859 static irqreturn_t wm8994_mic_irq(int irq, void *data) | 2918 static irqreturn_t wm8994_mic_irq(int irq, void *data) |
| 3860 { | 2919 { |
| 3861 struct wm8994_priv *priv = data; | 2920 struct wm8994_priv *priv = data; |
| 3862 struct snd_soc_codec *codec = priv->codec; | 2921 struct snd_soc_codec *codec = priv->codec; |
| 3863 int reg; | 2922 int reg; |
| 3864 int report; | 2923 int report; |
| 3865 | 2924 |
| 2925 #ifndef CONFIG_SND_SOC_WM8994_MODULE |
| 2926 trace_snd_soc_jack_irq(dev_name(codec->dev)); |
| 2927 #endif |
| 2928 |
| 3866 reg = snd_soc_read(codec, WM8994_INTERRUPT_RAW_STATUS_2); | 2929 reg = snd_soc_read(codec, WM8994_INTERRUPT_RAW_STATUS_2); |
| 3867 if (reg < 0) { | 2930 if (reg < 0) { |
| 3868 dev_err(codec->dev, "Failed to read microphone status: %d\n", | 2931 dev_err(codec->dev, "Failed to read microphone status: %d\n", |
| 3869 reg); | 2932 reg); |
| 3870 return IRQ_HANDLED; | 2933 return IRQ_HANDLED; |
| 3871 } | 2934 } |
| 3872 | 2935 |
| 3873 dev_dbg(codec->dev, "Microphone status: %x\n", reg); | 2936 dev_dbg(codec->dev, "Microphone status: %x\n", reg); |
| 3874 | 2937 |
| 3875 report = 0; | 2938 report = 0; |
| 3876 if (reg & WM8994_MIC1_DET_STS) | 2939 if (reg & WM8994_MIC1_DET_STS) |
| 3877 report |= priv->micdet[0].det; | 2940 report |= priv->micdet[0].det; |
| 3878 if (reg & WM8994_MIC1_SHRT_STS) | 2941 if (reg & WM8994_MIC1_SHRT_STS) |
| 3879 report |= priv->micdet[0].shrt; | 2942 report |= priv->micdet[0].shrt; |
| 3880 snd_soc_jack_report(priv->micdet[0].jack, report, | 2943 snd_soc_jack_report(priv->micdet[0].jack, report, |
| 3881 priv->micdet[0].det | priv->micdet[0].shrt); | 2944 priv->micdet[0].det | priv->micdet[0].shrt); |
| 3882 | 2945 |
| 3883 report = 0; | 2946 report = 0; |
| 3884 if (reg & WM8994_MIC2_DET_STS) | 2947 if (reg & WM8994_MIC2_DET_STS) |
| 3885 report |= priv->micdet[1].det; | 2948 report |= priv->micdet[1].det; |
| 3886 if (reg & WM8994_MIC2_SHRT_STS) | 2949 if (reg & WM8994_MIC2_SHRT_STS) |
| 3887 report |= priv->micdet[1].shrt; | 2950 report |= priv->micdet[1].shrt; |
| 3888 snd_soc_jack_report(priv->micdet[1].jack, report, | 2951 snd_soc_jack_report(priv->micdet[1].jack, report, |
| 3889 priv->micdet[1].det | priv->micdet[1].shrt); | 2952 priv->micdet[1].det | priv->micdet[1].shrt); |
| 3890 | 2953 |
| 3891 return IRQ_HANDLED; | 2954 return IRQ_HANDLED; |
| 3892 } | 2955 } |
| 3893 | 2956 |
| 2957 /* Default microphone detection handler for WM8958 - the user can |
| 2958 * override this if they wish. |
| 2959 */ |
| 2960 static void wm8958_default_micdet(u16 status, void *data) |
| 2961 { |
| 2962 struct snd_soc_codec *codec = data; |
| 2963 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 2964 int report = 0; |
| 2965 |
| 2966 /* If nothing present then clear our statuses */ |
| 2967 if (!(status & WM8958_MICD_STS)) { |
| 2968 wm8994->jack_is_video = false; |
| 2969 wm8994->jack_is_mic = false; |
| 2970 goto done; |
| 2971 } |
| 2972 |
| 2973 /* Assume anything over 475 ohms is a microphone and remember |
| 2974 * that we've seen one (since buttons override it) */ |
| 2975 if (status & 0x600) |
| 2976 wm8994->jack_is_mic = true; |
| 2977 if (wm8994->jack_is_mic) |
| 2978 report |= SND_JACK_MICROPHONE; |
| 2979 |
| 2980 /* Video has an impedence of approximately 75 ohms; assume |
| 2981 * this isn't used as a button and remember it since buttons |
| 2982 * override it. */ |
| 2983 if (status & 0x40) |
| 2984 wm8994->jack_is_video = true; |
| 2985 if (wm8994->jack_is_video) |
| 2986 report |= SND_JACK_VIDEOOUT; |
| 2987 |
| 2988 /* Everything else is buttons; just assign slots */ |
| 2989 if (status & 0x4) |
| 2990 report |= SND_JACK_BTN_0; |
| 2991 if (status & 0x8) |
| 2992 report |= SND_JACK_BTN_1; |
| 2993 if (status & 0x10) |
| 2994 report |= SND_JACK_BTN_2; |
| 2995 if (status & 0x20) |
| 2996 report |= SND_JACK_BTN_3; |
| 2997 if (status & 0x80) |
| 2998 report |= SND_JACK_BTN_4; |
| 2999 if (status & 0x100) |
| 3000 report |= SND_JACK_BTN_5; |
| 3001 |
| 3002 done: |
| 3003 snd_soc_jack_report(wm8994->micdet[0].jack, |
| 3004 SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 | |
| 3005 SND_JACK_BTN_3 | SND_JACK_BTN_4 | SND_JACK_BTN_5 | |
| 3006 SND_JACK_MICROPHONE | SND_JACK_VIDEOOUT, |
| 3007 report); |
| 3008 } |
| 3009 |
| 3010 /** |
| 3011 * wm8958_mic_detect - Enable microphone detection via the WM8958 IRQ |
| 3012 * |
| 3013 * @codec: WM8958 codec |
| 3014 * @jack: jack to report detection events on |
| 3015 * |
| 3016 * Enable microphone detection functionality for the WM8958. By |
| 3017 * default simple detection which supports the detection of up to 6 |
| 3018 * buttons plus video and microphone functionality is supported. |
| 3019 * |
| 3020 * The WM8958 has an advanced jack detection facility which is able to |
| 3021 * support complex accessory detection, especially when used in |
| 3022 * conjunction with external circuitry. In order to provide maximum |
| 3023 * flexiblity a callback is provided which allows a completely custom |
| 3024 * detection algorithm. |
| 3025 */ |
| 3026 int wm8958_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, |
| 3027 wm8958_micdet_cb cb, void *cb_data) |
| 3028 { |
| 3029 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 3030 struct wm8994 *control = codec->control_data; |
| 3031 |
| 3032 if (control->type != WM8958) |
| 3033 return -EINVAL; |
| 3034 |
| 3035 if (jack) { |
| 3036 if (!cb) { |
| 3037 dev_dbg(codec->dev, "Using default micdet callback\n"); |
| 3038 cb = wm8958_default_micdet; |
| 3039 cb_data = codec; |
| 3040 } |
| 3041 |
| 3042 wm8994->micdet[0].jack = jack; |
| 3043 wm8994->jack_cb = cb; |
| 3044 wm8994->jack_cb_data = cb_data; |
| 3045 |
| 3046 snd_soc_update_bits(codec, WM8958_MIC_DETECT_1, |
| 3047 WM8958_MICD_ENA, WM8958_MICD_ENA); |
| 3048 } else { |
| 3049 snd_soc_update_bits(codec, WM8958_MIC_DETECT_1, |
| 3050 WM8958_MICD_ENA, 0); |
| 3051 } |
| 3052 |
| 3053 return 0; |
| 3054 } |
| 3055 EXPORT_SYMBOL_GPL(wm8958_mic_detect); |
| 3056 |
| 3057 static irqreturn_t wm8958_mic_irq(int irq, void *data) |
| 3058 { |
| 3059 struct wm8994_priv *wm8994 = data; |
| 3060 struct snd_soc_codec *codec = wm8994->codec; |
| 3061 int reg; |
| 3062 |
| 3063 reg = snd_soc_read(codec, WM8958_MIC_DETECT_3); |
| 3064 if (reg < 0) { |
| 3065 dev_err(codec->dev, "Failed to read mic detect status: %d\n", |
| 3066 reg); |
| 3067 return IRQ_NONE; |
| 3068 } |
| 3069 |
| 3070 if (!(reg & WM8958_MICD_VALID)) { |
| 3071 dev_dbg(codec->dev, "Mic detect data not valid\n"); |
| 3072 goto out; |
| 3073 } |
| 3074 |
| 3075 #ifndef CONFIG_SND_SOC_WM8994_MODULE |
| 3076 trace_snd_soc_jack_irq(dev_name(codec->dev)); |
| 3077 #endif |
| 3078 |
| 3079 if (wm8994->jack_cb) |
| 3080 wm8994->jack_cb(reg, wm8994->jack_cb_data); |
| 3081 else |
| 3082 dev_warn(codec->dev, "Accessory detection with no callback\n"); |
| 3083 |
| 3084 out: |
| 3085 return IRQ_HANDLED; |
| 3086 } |
| 3087 |
| 3894 static int wm8994_codec_probe(struct snd_soc_codec *codec) | 3088 static int wm8994_codec_probe(struct snd_soc_codec *codec) |
| 3895 { | 3089 { |
| 3090 struct wm8994 *control; |
| 3896 struct wm8994_priv *wm8994; | 3091 struct wm8994_priv *wm8994; |
| 3092 struct snd_soc_dapm_context *dapm = &codec->dapm; |
| 3897 int ret, i; | 3093 int ret, i; |
| 3898 | 3094 |
| 3899 codec->control_data = dev_get_drvdata(codec->dev->parent); | 3095 codec->control_data = dev_get_drvdata(codec->dev->parent); |
| 3096 control = codec->control_data; |
| 3900 | 3097 |
| 3901 wm8994 = kzalloc(sizeof(struct wm8994_priv), GFP_KERNEL); | 3098 wm8994 = kzalloc(sizeof(struct wm8994_priv), GFP_KERNEL); |
| 3902 if (wm8994 == NULL) | 3099 if (wm8994 == NULL) |
| 3903 return -ENOMEM; | 3100 return -ENOMEM; |
| 3904 snd_soc_codec_set_drvdata(codec, wm8994); | 3101 snd_soc_codec_set_drvdata(codec, wm8994); |
| 3905 | 3102 |
| 3906 codec->reg_cache = &wm8994->reg_cache; | |
| 3907 | |
| 3908 wm8994->pdata = dev_get_platdata(codec->dev->parent); | 3103 wm8994->pdata = dev_get_platdata(codec->dev->parent); |
| 3909 wm8994->codec = codec; | 3104 wm8994->codec = codec; |
| 3910 | 3105 |
| 3911 » /* Fill the cache with physical values we inherited; don't reset */ | 3106 » pm_runtime_enable(codec->dev); |
| 3912 » ret = wm8994_bulk_read(codec->control_data, 0, | 3107 » pm_runtime_resume(codec->dev); |
| 3913 » » » ARRAY_SIZE(wm8994->reg_cache) - 1, | 3108 |
| 3914 » » » codec->reg_cache); | 3109 » /* Read our current status back from the chip - we don't want to |
| 3915 » if (ret < 0) { | 3110 » * reset as this may interfere with the GPIO or LDO operation. */ |
| 3916 » » dev_err(codec->dev, "Failed to fill register cache: %d\n", | 3111 » for (i = 0; i < WM8994_CACHE_SIZE; i++) { |
| 3917 » » » ret); | 3112 » » if (!wm8994_readable(codec, i) || wm8994_volatile(codec, i)) |
| 3918 » » goto err; | 3113 » » » continue; |
| 3919 » } | 3114 |
| 3920 | 3115 » » ret = wm8994_reg_read(codec->control_data, i); |
| 3921 » /* Clear the cached values for unreadable/volatile registers to | 3116 » » if (ret <= 0) |
| 3922 » * avoid potential confusion. | 3117 » » » continue; |
| 3923 » */ | 3118 |
| 3924 » for (i = 0; i < ARRAY_SIZE(wm8994->reg_cache); i++) | 3119 » » ret = snd_soc_cache_write(codec, i, ret); |
| 3925 » » if (wm8994_volatile(i) || !wm8994_readable(i)) | 3120 » » if (ret != 0) { |
| 3926 » » » wm8994->reg_cache[i] = 0; | 3121 » » » dev_err(codec->dev, |
| 3122 » » » » "Failed to initialise cache for 0x%x: %d\n", |
| 3123 » » » » i, ret); |
| 3124 » » » goto err; |
| 3125 » » } |
| 3126 » } |
| 3927 | 3127 |
| 3928 /* Set revision-specific configuration */ | 3128 /* Set revision-specific configuration */ |
| 3929 wm8994->revision = snd_soc_read(codec, WM8994_CHIP_REVISION); | 3129 wm8994->revision = snd_soc_read(codec, WM8994_CHIP_REVISION); |
| 3930 » switch (wm8994->revision) { | 3130 » switch (control->type) { |
| 3931 » case 2: | 3131 » case WM8994: |
| 3932 » case 3: | 3132 » » switch (wm8994->revision) { |
| 3933 » » wm8994->hubs.dcs_codes = -5; | 3133 » » case 2: |
| 3934 » » wm8994->hubs.hp_startup_mode = 1; | 3134 » » case 3: |
| 3135 » » » wm8994->hubs.dcs_codes = -5; |
| 3136 » » » wm8994->hubs.hp_startup_mode = 1; |
| 3137 » » » wm8994->hubs.dcs_readback_mode = 1; |
| 3138 » » » break; |
| 3139 » » default: |
| 3140 » » » wm8994->hubs.dcs_readback_mode = 1; |
| 3141 » » » break; |
| 3142 » » } |
| 3143 |
| 3144 » case WM8958: |
| 3935 wm8994->hubs.dcs_readback_mode = 1; | 3145 wm8994->hubs.dcs_readback_mode = 1; |
| 3936 break; | 3146 break; |
| 3147 |
| 3937 default: | 3148 default: |
| 3938 » » wm8994->hubs.dcs_readback_mode = 1; | 3149 » » break; |
| 3939 » » break; | 3150 » } |
| 3940 » } | 3151 |
| 3941 | 3152 » switch (control->type) { |
| 3942 » ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_MIC1_DET, | 3153 » case WM8994: |
| 3943 » » » » wm8994_mic_irq, "Mic 1 detect", wm8994); | 3154 » » ret = wm8994_request_irq(codec->control_data, |
| 3944 » if (ret != 0) | 3155 » » » » » WM8994_IRQ_MIC1_DET, |
| 3945 » » dev_warn(codec->dev, | 3156 » » » » » wm8994_mic_irq, "Mic 1 detect", |
| 3946 » » » "Failed to request Mic1 detect IRQ: %d\n", ret); | 3157 » » » » » wm8994); |
| 3947 | 3158 » » if (ret != 0) |
| 3948 » ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_MIC1_SHRT, | 3159 » » » dev_warn(codec->dev, |
| 3949 » » » » wm8994_mic_irq, "Mic 1 short", wm8994); | 3160 » » » » "Failed to request Mic1 detect IRQ: %d\n", |
| 3950 » if (ret != 0) | 3161 » » » » ret); |
| 3951 » » dev_warn(codec->dev, | 3162 |
| 3952 » » » "Failed to request Mic1 short IRQ: %d\n", ret); | 3163 » » ret = wm8994_request_irq(codec->control_data, |
| 3953 | 3164 » » » » » WM8994_IRQ_MIC1_SHRT, |
| 3954 » ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_MIC2_DET, | 3165 » » » » » wm8994_mic_irq, "Mic 1 short", |
| 3955 » » » » wm8994_mic_irq, "Mic 2 detect", wm8994); | 3166 » » » » » wm8994); |
| 3956 » if (ret != 0) | 3167 » » if (ret != 0) |
| 3957 » » dev_warn(codec->dev, | 3168 » » » dev_warn(codec->dev, |
| 3958 » » » "Failed to request Mic2 detect IRQ: %d\n", ret); | 3169 » » » » "Failed to request Mic1 short IRQ: %d\n", |
| 3959 | 3170 » » » » ret); |
| 3960 » ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_MIC2_SHRT, | 3171 |
| 3961 » » » » wm8994_mic_irq, "Mic 2 short", wm8994); | 3172 » » ret = wm8994_request_irq(codec->control_data, |
| 3962 » if (ret != 0) | 3173 » » » » » WM8994_IRQ_MIC2_DET, |
| 3963 » » dev_warn(codec->dev, | 3174 » » » » » wm8994_mic_irq, "Mic 2 detect", |
| 3964 » » » "Failed to request Mic2 short IRQ: %d\n", ret); | 3175 » » » » » wm8994); |
| 3176 » » if (ret != 0) |
| 3177 » » » dev_warn(codec->dev, |
| 3178 » » » » "Failed to request Mic2 detect IRQ: %d\n", |
| 3179 » » » » ret); |
| 3180 |
| 3181 » » ret = wm8994_request_irq(codec->control_data, |
| 3182 » » » » » WM8994_IRQ_MIC2_SHRT, |
| 3183 » » » » » wm8994_mic_irq, "Mic 2 short", |
| 3184 » » » » » wm8994); |
| 3185 » » if (ret != 0) |
| 3186 » » » dev_warn(codec->dev, |
| 3187 » » » » "Failed to request Mic2 short IRQ: %d\n", |
| 3188 » » » » ret); |
| 3189 » » break; |
| 3190 |
| 3191 » case WM8958: |
| 3192 » » ret = wm8994_request_irq(codec->control_data, |
| 3193 » » » » » WM8994_IRQ_MIC1_DET, |
| 3194 » » » » » wm8958_mic_irq, "Mic detect", |
| 3195 » » » » » wm8994); |
| 3196 » » if (ret != 0) |
| 3197 » » » dev_warn(codec->dev, |
| 3198 » » » » "Failed to request Mic detect IRQ: %d\n", |
| 3199 » » » » ret); |
| 3200 » » break; |
| 3201 » } |
| 3965 | 3202 |
| 3966 /* Remember if AIFnLRCLK is configured as a GPIO. This should be | 3203 /* Remember if AIFnLRCLK is configured as a GPIO. This should be |
| 3967 * configured on init - if a system wants to do this dynamically | 3204 * configured on init - if a system wants to do this dynamically |
| 3968 * at runtime we can deal with that then. | 3205 * at runtime we can deal with that then. |
| 3969 */ | 3206 */ |
| 3970 ret = wm8994_reg_read(codec->control_data, WM8994_GPIO_1); | 3207 ret = wm8994_reg_read(codec->control_data, WM8994_GPIO_1); |
| 3971 if (ret < 0) { | 3208 if (ret < 0) { |
| 3972 dev_err(codec->dev, "Failed to read GPIO1 state: %d\n", ret); | 3209 dev_err(codec->dev, "Failed to read GPIO1 state: %d\n", ret); |
| 3973 goto err_irq; | 3210 goto err_irq; |
| 3974 } | 3211 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4027 snd_soc_update_bits(codec, WM8994_AIF1_CONTROL_1, | 3264 snd_soc_update_bits(codec, WM8994_AIF1_CONTROL_1, |
| 4028 WM8994_AIF1ADC_TDM, WM8994_AIF1ADC_TDM); | 3265 WM8994_AIF1ADC_TDM, WM8994_AIF1ADC_TDM); |
| 4029 | 3266 |
| 4030 wm8994_update_class_w(codec); | 3267 wm8994_update_class_w(codec); |
| 4031 | 3268 |
| 4032 wm8994_handle_pdata(wm8994); | 3269 wm8994_handle_pdata(wm8994); |
| 4033 | 3270 |
| 4034 wm_hubs_add_analogue_controls(codec); | 3271 wm_hubs_add_analogue_controls(codec); |
| 4035 snd_soc_add_controls(codec, wm8994_snd_controls, | 3272 snd_soc_add_controls(codec, wm8994_snd_controls, |
| 4036 ARRAY_SIZE(wm8994_snd_controls)); | 3273 ARRAY_SIZE(wm8994_snd_controls)); |
| 4037 » snd_soc_dapm_new_controls(codec, wm8994_dapm_widgets, | 3274 » snd_soc_dapm_new_controls(dapm, wm8994_dapm_widgets, |
| 4038 ARRAY_SIZE(wm8994_dapm_widgets)); | 3275 ARRAY_SIZE(wm8994_dapm_widgets)); |
| 3276 |
| 3277 switch (control->type) { |
| 3278 case WM8994: |
| 3279 snd_soc_dapm_new_controls(dapm, wm8994_specific_dapm_widgets, |
| 3280 ARRAY_SIZE(wm8994_specific_dapm_widget
s)); |
| 3281 if (wm8994->revision < 4) { |
| 3282 snd_soc_dapm_new_controls(dapm, wm8994_lateclk_revd_widg
ets, |
| 3283 ARRAY_SIZE(wm8994_lateclk_revd
_widgets)); |
| 3284 snd_soc_dapm_new_controls(dapm, wm8994_dac_revd_widgets, |
| 3285 ARRAY_SIZE(wm8994_dac_revd_wid
gets)); |
| 3286 } else { |
| 3287 snd_soc_dapm_new_controls(dapm, wm8994_lateclk_widgets, |
| 3288 ARRAY_SIZE(wm8994_lateclk_widg
ets)); |
| 3289 snd_soc_dapm_new_controls(dapm, wm8994_dac_widgets, |
| 3290 ARRAY_SIZE(wm8994_dac_widgets)
); |
| 3291 } |
| 3292 break; |
| 3293 case WM8958: |
| 3294 snd_soc_add_controls(codec, wm8958_snd_controls, |
| 3295 ARRAY_SIZE(wm8958_snd_controls)); |
| 3296 snd_soc_dapm_new_controls(dapm, wm8958_dapm_widgets, |
| 3297 ARRAY_SIZE(wm8958_dapm_widgets)); |
| 3298 break; |
| 3299 } |
| 3300 |
| 3301 |
| 4039 wm_hubs_add_analogue_routes(codec, 0, 0); | 3302 wm_hubs_add_analogue_routes(codec, 0, 0); |
| 4040 » snd_soc_dapm_add_routes(codec, intercon, ARRAY_SIZE(intercon)); | 3303 » snd_soc_dapm_add_routes(dapm, intercon, ARRAY_SIZE(intercon)); |
| 3304 |
| 3305 » switch (control->type) { |
| 3306 » case WM8994: |
| 3307 » » snd_soc_dapm_add_routes(dapm, wm8994_intercon, |
| 3308 » » » » » ARRAY_SIZE(wm8994_intercon)); |
| 3309 |
| 3310 » » if (wm8994->revision < 4) { |
| 3311 » » » snd_soc_dapm_add_routes(dapm, wm8994_revd_intercon, |
| 3312 » » » » » » ARRAY_SIZE(wm8994_revd_intercon)
); |
| 3313 » » » snd_soc_dapm_add_routes(dapm, wm8994_lateclk_revd_interc
on, |
| 3314 » » » » » » ARRAY_SIZE(wm8994_lateclk_revd_i
ntercon)); |
| 3315 » » } else { |
| 3316 » » » snd_soc_dapm_add_routes(dapm, wm8994_lateclk_intercon, |
| 3317 » » » » » » ARRAY_SIZE(wm8994_lateclk_interc
on)); |
| 3318 » » } |
| 3319 » » break; |
| 3320 » case WM8958: |
| 3321 » » snd_soc_dapm_add_routes(dapm, wm8958_intercon, |
| 3322 » » » » » ARRAY_SIZE(wm8958_intercon)); |
| 3323 » » break; |
| 3324 » } |
| 4041 | 3325 |
| 4042 return 0; | 3326 return 0; |
| 4043 | 3327 |
| 4044 err_irq: | 3328 err_irq: |
| 4045 wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_SHRT, wm8994); | 3329 wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_SHRT, wm8994); |
| 4046 wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_DET, wm8994); | 3330 wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_DET, wm8994); |
| 4047 wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC1_SHRT, wm8994); | 3331 wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC1_SHRT, wm8994); |
| 4048 wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC1_DET, wm8994); | 3332 wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC1_DET, wm8994); |
| 4049 err: | 3333 err: |
| 4050 kfree(wm8994); | 3334 kfree(wm8994); |
| 4051 return ret; | 3335 return ret; |
| 4052 } | 3336 } |
| 4053 | 3337 |
| 4054 static int wm8994_codec_remove(struct snd_soc_codec *codec) | 3338 static int wm8994_codec_remove(struct snd_soc_codec *codec) |
| 4055 { | 3339 { |
| 4056 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | 3340 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 3341 struct wm8994 *control = codec->control_data; |
| 4057 | 3342 |
| 4058 wm8994_set_bias_level(codec, SND_SOC_BIAS_OFF); | 3343 wm8994_set_bias_level(codec, SND_SOC_BIAS_OFF); |
| 4059 | 3344 |
| 4060 » wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_SHRT, wm8994); | 3345 » pm_runtime_disable(codec->dev); |
| 4061 » wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_DET, wm8994); | 3346 |
| 4062 » wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC1_SHRT, wm8994); | 3347 » switch (control->type) { |
| 4063 » wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC1_DET, wm8994); | 3348 » case WM8994: |
| 3349 » » wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_SHRT, |
| 3350 » » » » wm8994); |
| 3351 » » wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_DET, |
| 3352 » » » » wm8994); |
| 3353 » » wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC1_SHRT, |
| 3354 » » » » wm8994); |
| 3355 » » wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC1_DET, |
| 3356 » » » » wm8994); |
| 3357 » » break; |
| 3358 |
| 3359 » case WM8958: |
| 3360 » » wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC1_DET, |
| 3361 » » » » wm8994); |
| 3362 » » break; |
| 3363 » } |
| 4064 kfree(wm8994->retune_mobile_texts); | 3364 kfree(wm8994->retune_mobile_texts); |
| 4065 kfree(wm8994->drc_texts); | 3365 kfree(wm8994->drc_texts); |
| 4066 kfree(wm8994); | 3366 kfree(wm8994); |
| 4067 | 3367 |
| 4068 return 0; | 3368 return 0; |
| 4069 } | 3369 } |
| 4070 | 3370 |
| 4071 static struct snd_soc_codec_driver soc_codec_dev_wm8994 = { | 3371 static struct snd_soc_codec_driver soc_codec_dev_wm8994 = { |
| 4072 .probe = wm8994_codec_probe, | 3372 .probe = wm8994_codec_probe, |
| 4073 .remove = wm8994_codec_remove, | 3373 .remove = wm8994_codec_remove, |
| 4074 .suspend = wm8994_suspend, | 3374 .suspend = wm8994_suspend, |
| 4075 .resume = wm8994_resume, | 3375 .resume = wm8994_resume, |
| 4076 » .read = wm8994_read, | 3376 » .read =»» wm8994_read, |
| 4077 » .write = wm8994_write, | 3377 » .write =» wm8994_write, |
| 4078 .readable_register = wm8994_readable, | 3378 .readable_register = wm8994_readable, |
| 4079 .volatile_register = wm8994_volatile, | 3379 .volatile_register = wm8994_volatile, |
| 4080 .set_bias_level = wm8994_set_bias_level, | 3380 .set_bias_level = wm8994_set_bias_level, |
| 3381 |
| 3382 .reg_cache_size = WM8994_CACHE_SIZE, |
| 3383 .reg_cache_default = wm8994_reg_defaults, |
| 3384 .reg_word_size = 2, |
| 3385 .compress_type = SND_SOC_RBTREE_COMPRESSION, |
| 4081 }; | 3386 }; |
| 4082 | 3387 |
| 4083 static int __devinit wm8994_probe(struct platform_device *pdev) | 3388 static int __devinit wm8994_probe(struct platform_device *pdev) |
| 4084 { | 3389 { |
| 4085 return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8994, | 3390 return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8994, |
| 4086 wm8994_dai, ARRAY_SIZE(wm8994_dai)); | 3391 wm8994_dai, ARRAY_SIZE(wm8994_dai)); |
| 4087 } | 3392 } |
| 4088 | 3393 |
| 4089 static int __devexit wm8994_remove(struct platform_device *pdev) | 3394 static int __devexit wm8994_remove(struct platform_device *pdev) |
| 4090 { | 3395 { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 4111 { | 3416 { |
| 4112 platform_driver_unregister(&wm8994_codec_driver); | 3417 platform_driver_unregister(&wm8994_codec_driver); |
| 4113 } | 3418 } |
| 4114 module_exit(wm8994_exit); | 3419 module_exit(wm8994_exit); |
| 4115 | 3420 |
| 4116 | 3421 |
| 4117 MODULE_DESCRIPTION("ASoC WM8994 driver"); | 3422 MODULE_DESCRIPTION("ASoC WM8994 driver"); |
| 4118 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); | 3423 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); |
| 4119 MODULE_LICENSE("GPL"); | 3424 MODULE_LICENSE("GPL"); |
| 4120 MODULE_ALIAS("platform:wm8994-codec"); | 3425 MODULE_ALIAS("platform:wm8994-codec"); |
| OLD | NEW |