1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Driver for ADAU1361/ADAU1461/ADAU1761/ADAU1961 codec 4 * 5 * Copyright 2011-2013 Analog Devices Inc. 6 * Author: Lars-Peter Clausen <lars@metafoo.de> 7 */ 8 9 #include <linux/module.h> 10 #include <linux/init.h> 11 #include <linux/i2c.h> 12 #include <linux/spi/spi.h> 13 #include <linux/slab.h> 14 #include <sound/core.h> 15 #include <sound/pcm.h> 16 #include <sound/pcm_params.h> 17 #include <sound/soc.h> 18 #include <sound/tlv.h> 19 #include <linux/platform_data/adau17x1.h> 20 21 #include "adau17x1.h" 22 #include "adau1761.h" 23 24 #define ADAU1761_DIGMIC_JACKDETECT 0x4008 25 #define ADAU1761_REC_MIXER_LEFT0 0x400a 26 #define ADAU1761_REC_MIXER_LEFT1 0x400b 27 #define ADAU1761_REC_MIXER_RIGHT0 0x400c 28 #define ADAU1761_REC_MIXER_RIGHT1 0x400d 29 #define ADAU1761_LEFT_DIFF_INPUT_VOL 0x400e 30 #define ADAU1761_RIGHT_DIFF_INPUT_VOL 0x400f 31 #define ADAU1761_ALC_CTRL0 0x4011 32 #define ADAU1761_ALC_CTRL1 0x4012 33 #define ADAU1761_ALC_CTRL2 0x4013 34 #define ADAU1761_ALC_CTRL3 0x4014 35 #define ADAU1761_PLAY_LR_MIXER_LEFT 0x4020 36 #define ADAU1761_PLAY_MIXER_LEFT0 0x401c 37 #define ADAU1761_PLAY_MIXER_LEFT1 0x401d 38 #define ADAU1761_PLAY_MIXER_RIGHT0 0x401e 39 #define ADAU1761_PLAY_MIXER_RIGHT1 0x401f 40 #define ADAU1761_PLAY_LR_MIXER_RIGHT 0x4021 41 #define ADAU1761_PLAY_MIXER_MONO 0x4022 42 #define ADAU1761_PLAY_HP_LEFT_VOL 0x4023 43 #define ADAU1761_PLAY_HP_RIGHT_VOL 0x4024 44 #define ADAU1761_PLAY_LINE_LEFT_VOL 0x4025 45 #define ADAU1761_PLAY_LINE_RIGHT_VOL 0x4026 46 #define ADAU1761_PLAY_MONO_OUTPUT_VOL 0x4027 47 #define ADAU1761_POP_CLICK_SUPPRESS 0x4028 48 #define ADAU1761_JACK_DETECT_PIN 0x4031 49 #define ADAU1761_DEJITTER 0x4036 50 #define ADAU1761_CLK_ENABLE0 0x40f9 51 #define ADAU1761_CLK_ENABLE1 0x40fa 52 53 #define ADAU1761_DIGMIC_JACKDETECT_ACTIVE_LOW BIT(0) 54 #define ADAU1761_DIGMIC_JACKDETECT_DIGMIC BIT(5) 55 56 #define ADAU1761_DIFF_INPUT_VOL_LDEN BIT(0) 57 58 #define ADAU1761_PLAY_MONO_OUTPUT_VOL_MODE_HP BIT(0) 59 #define ADAU1761_PLAY_MONO_OUTPUT_VOL_UNMUTE BIT(1) 60 61 #define ADAU1761_PLAY_HP_RIGHT_VOL_MODE_HP BIT(0) 62 63 #define ADAU1761_PLAY_LINE_LEFT_VOL_MODE_HP BIT(0) 64 65 #define ADAU1761_PLAY_LINE_RIGHT_VOL_MODE_HP BIT(0) 66 67 68 #define ADAU1761_FIRMWARE "adau1761.bin" 69 70 static const struct reg_default adau1761_reg_defaults[] = { 71 { ADAU1761_DEJITTER, 0x03 }, 72 { ADAU1761_DIGMIC_JACKDETECT, 0x00 }, 73 { ADAU1761_REC_MIXER_LEFT0, 0x00 }, 74 { ADAU1761_REC_MIXER_LEFT1, 0x00 }, 75 { ADAU1761_REC_MIXER_RIGHT0, 0x00 }, 76 { ADAU1761_REC_MIXER_RIGHT1, 0x00 }, 77 { ADAU1761_LEFT_DIFF_INPUT_VOL, 0x00 }, 78 { ADAU1761_ALC_CTRL0, 0x00 }, 79 { ADAU1761_ALC_CTRL1, 0x00 }, 80 { ADAU1761_ALC_CTRL2, 0x00 }, 81 { ADAU1761_ALC_CTRL3, 0x00 }, 82 { ADAU1761_RIGHT_DIFF_INPUT_VOL, 0x00 }, 83 { ADAU1761_PLAY_LR_MIXER_LEFT, 0x00 }, 84 { ADAU1761_PLAY_MIXER_LEFT0, 0x00 }, 85 { ADAU1761_PLAY_MIXER_LEFT1, 0x00 }, 86 { ADAU1761_PLAY_MIXER_RIGHT0, 0x00 }, 87 { ADAU1761_PLAY_MIXER_RIGHT1, 0x00 }, 88 { ADAU1761_PLAY_LR_MIXER_RIGHT, 0x00 }, 89 { ADAU1761_PLAY_MIXER_MONO, 0x00 }, 90 { ADAU1761_PLAY_HP_LEFT_VOL, 0x00 }, 91 { ADAU1761_PLAY_HP_RIGHT_VOL, 0x00 }, 92 { ADAU1761_PLAY_LINE_LEFT_VOL, 0x00 }, 93 { ADAU1761_PLAY_LINE_RIGHT_VOL, 0x00 }, 94 { ADAU1761_PLAY_MONO_OUTPUT_VOL, 0x00 }, 95 { ADAU1761_POP_CLICK_SUPPRESS, 0x00 }, 96 { ADAU1761_JACK_DETECT_PIN, 0x00 }, 97 { ADAU1761_CLK_ENABLE0, 0x00 }, 98 { ADAU1761_CLK_ENABLE1, 0x00 }, 99 { ADAU17X1_CLOCK_CONTROL, 0x00 }, 100 { ADAU17X1_PLL_CONTROL, 0x00 }, 101 { ADAU17X1_REC_POWER_MGMT, 0x00 }, 102 { ADAU17X1_MICBIAS, 0x00 }, 103 { ADAU17X1_SERIAL_PORT0, 0x00 }, 104 { ADAU17X1_SERIAL_PORT1, 0x00 }, 105 { ADAU17X1_CONVERTER0, 0x00 }, 106 { ADAU17X1_CONVERTER1, 0x00 }, 107 { ADAU17X1_LEFT_INPUT_DIGITAL_VOL, 0x00 }, 108 { ADAU17X1_RIGHT_INPUT_DIGITAL_VOL, 0x00 }, 109 { ADAU17X1_ADC_CONTROL, 0x00 }, 110 { ADAU17X1_PLAY_POWER_MGMT, 0x00 }, 111 { ADAU17X1_DAC_CONTROL0, 0x00 }, 112 { ADAU17X1_DAC_CONTROL1, 0x00 }, 113 { ADAU17X1_DAC_CONTROL2, 0x00 }, 114 { ADAU17X1_SERIAL_PORT_PAD, 0xaa }, 115 { ADAU17X1_CONTROL_PORT_PAD0, 0xaa }, 116 { ADAU17X1_CONTROL_PORT_PAD1, 0x00 }, 117 { ADAU17X1_DSP_SAMPLING_RATE, 0x01 }, 118 { ADAU17X1_SERIAL_INPUT_ROUTE, 0x00 }, 119 { ADAU17X1_SERIAL_OUTPUT_ROUTE, 0x00 }, 120 { ADAU17X1_DSP_ENABLE, 0x00 }, 121 { ADAU17X1_DSP_RUN, 0x00 }, 122 { ADAU17X1_SERIAL_SAMPLING_RATE, 0x00 }, 123 }; 124 125 static const DECLARE_TLV_DB_SCALE(adau1761_sing_in_tlv, -1500, 300, 1); 126 static const DECLARE_TLV_DB_SCALE(adau1761_diff_in_tlv, -1200, 75, 0); 127 static const DECLARE_TLV_DB_SCALE(adau1761_out_tlv, -5700, 100, 0); 128 static const DECLARE_TLV_DB_SCALE(adau1761_sidetone_tlv, -1800, 300, 1); 129 static const DECLARE_TLV_DB_SCALE(adau1761_boost_tlv, -600, 600, 1); 130 static const DECLARE_TLV_DB_SCALE(adau1761_pga_boost_tlv, -2000, 2000, 1); 131 132 static const DECLARE_TLV_DB_SCALE(adau1761_alc_max_gain_tlv, -1200, 600, 0); 133 static const DECLARE_TLV_DB_SCALE(adau1761_alc_target_tlv, -2850, 150, 0); 134 static const DECLARE_TLV_DB_SCALE(adau1761_alc_ng_threshold_tlv, -7650, 150, 0); 135 136 static const unsigned int adau1761_bias_select_values[] = { 137 0, 2, 3, 138 }; 139 140 static const char * const adau1761_bias_select_text[] = { 141 "Normal operation", "Enhanced performance", "Power saving", 142 }; 143 144 static const char * const adau1761_bias_select_extreme_text[] = { 145 "Normal operation", "Extreme power saving", "Enhanced performance", 146 "Power saving", 147 }; 148 149 static SOC_ENUM_SINGLE_DECL(adau1761_adc_bias_enum, 150 ADAU17X1_REC_POWER_MGMT, 3, adau1761_bias_select_extreme_text); 151 static SOC_ENUM_SINGLE_DECL(adau1761_hp_bias_enum, 152 ADAU17X1_PLAY_POWER_MGMT, 6, adau1761_bias_select_extreme_text); 153 static SOC_ENUM_SINGLE_DECL(adau1761_dac_bias_enum, 154 ADAU17X1_PLAY_POWER_MGMT, 4, adau1761_bias_select_extreme_text); 155 static SOC_VALUE_ENUM_SINGLE_DECL(adau1761_playback_bias_enum, 156 ADAU17X1_PLAY_POWER_MGMT, 2, 0x3, adau1761_bias_select_text, 157 adau1761_bias_select_values); 158 static SOC_VALUE_ENUM_SINGLE_DECL(adau1761_capture_bias_enum, 159 ADAU17X1_REC_POWER_MGMT, 1, 0x3, adau1761_bias_select_text, 160 adau1761_bias_select_values); 161 162 static const unsigned int adau1761_pga_slew_time_values[] = { 163 3, 0, 1, 2, 164 }; 165 166 static const char * const adau1761_pga_slew_time_text[] = { 167 "Off", 168 "24 ms", 169 "48 ms", 170 "96 ms", 171 }; 172 173 static const char * const adau1761_alc_function_text[] = { 174 "Off", 175 "Right", 176 "Left", 177 "Stereo", 178 "DSP control", 179 }; 180 181 static const char * const adau1761_alc_hold_time_text[] = { 182 "2.67 ms", 183 "5.34 ms", 184 "10.68 ms", 185 "21.36 ms", 186 "42.72 ms", 187 "85.44 ms", 188 "170.88 ms", 189 "341.76 ms", 190 "683.52 ms", 191 "1367 ms", 192 "2734.1 ms", 193 "5468.2 ms", 194 "10936 ms", 195 "21873 ms", 196 "43745 ms", 197 "87491 ms", 198 }; 199 200 static const char * const adau1761_alc_attack_time_text[] = { 201 "6 ms", 202 "12 ms", 203 "24 ms", 204 "48 ms", 205 "96 ms", 206 "192 ms", 207 "384 ms", 208 "768 ms", 209 "1540 ms", 210 "3070 ms", 211 "6140 ms", 212 "12290 ms", 213 "24580 ms", 214 "49150 ms", 215 "98300 ms", 216 "196610 ms", 217 }; 218 219 static const char * const adau1761_alc_decay_time_text[] = { 220 "24 ms", 221 "48 ms", 222 "96 ms", 223 "192 ms", 224 "384 ms", 225 "768 ms", 226 "15400 ms", 227 "30700 ms", 228 "61400 ms", 229 "12290 ms", 230 "24580 ms", 231 "49150 ms", 232 "98300 ms", 233 "196610 ms", 234 "393220 ms", 235 "786430 ms", 236 }; 237 238 static const char * const adau1761_alc_ng_type_text[] = { 239 "Hold", 240 "Mute", 241 "Fade", 242 "Fade + Mute", 243 }; 244 245 static SOC_VALUE_ENUM_SINGLE_DECL(adau1761_pga_slew_time_enum, 246 ADAU1761_ALC_CTRL0, 6, 0x3, adau1761_pga_slew_time_text, 247 adau1761_pga_slew_time_values); 248 static SOC_ENUM_SINGLE_DECL(adau1761_alc_function_enum, 249 ADAU1761_ALC_CTRL0, 0, adau1761_alc_function_text); 250 static SOC_ENUM_SINGLE_DECL(adau1761_alc_hold_time_enum, 251 ADAU1761_ALC_CTRL1, 4, adau1761_alc_hold_time_text); 252 static SOC_ENUM_SINGLE_DECL(adau1761_alc_attack_time_enum, 253 ADAU1761_ALC_CTRL2, 4, adau1761_alc_attack_time_text); 254 static SOC_ENUM_SINGLE_DECL(adau1761_alc_decay_time_enum, 255 ADAU1761_ALC_CTRL2, 0, adau1761_alc_decay_time_text); 256 static SOC_ENUM_SINGLE_DECL(adau1761_alc_ng_type_enum, 257 ADAU1761_ALC_CTRL3, 6, adau1761_alc_ng_type_text); 258 259 static const struct snd_kcontrol_new adau1761_jack_detect_controls[] = { 260 SOC_SINGLE("Speaker Auto-mute Switch", ADAU1761_DIGMIC_JACKDETECT, 261 4, 1, 0), 262 }; 263 264 static const struct snd_kcontrol_new adau1761_differential_mode_controls[] = { 265 SOC_DOUBLE_R_TLV("Capture Volume", ADAU1761_LEFT_DIFF_INPUT_VOL, 266 ADAU1761_RIGHT_DIFF_INPUT_VOL, 2, 0x3f, 0, 267 adau1761_diff_in_tlv), 268 SOC_DOUBLE_R("Capture Switch", ADAU1761_LEFT_DIFF_INPUT_VOL, 269 ADAU1761_RIGHT_DIFF_INPUT_VOL, 1, 1, 0), 270 271 SOC_DOUBLE_R_TLV("PGA Boost Capture Volume", ADAU1761_REC_MIXER_LEFT1, 272 ADAU1761_REC_MIXER_RIGHT1, 3, 2, 0, adau1761_pga_boost_tlv), 273 274 SOC_ENUM("PGA Capture Slew Time", adau1761_pga_slew_time_enum), 275 276 SOC_SINGLE_TLV("ALC Capture Max Gain Volume", ADAU1761_ALC_CTRL0, 277 3, 7, 0, adau1761_alc_max_gain_tlv), 278 SOC_ENUM("ALC Capture Function", adau1761_alc_function_enum), 279 SOC_ENUM("ALC Capture Hold Time", adau1761_alc_hold_time_enum), 280 SOC_SINGLE_TLV("ALC Capture Target Volume", ADAU1761_ALC_CTRL1, 281 0, 15, 0, adau1761_alc_target_tlv), 282 SOC_ENUM("ALC Capture Attack Time", adau1761_alc_decay_time_enum), 283 SOC_ENUM("ALC Capture Decay Time", adau1761_alc_attack_time_enum), 284 SOC_ENUM("ALC Capture Noise Gate Type", adau1761_alc_ng_type_enum), 285 SOC_SINGLE("ALC Capture Noise Gate Switch", 286 ADAU1761_ALC_CTRL3, 5, 1, 0), 287 SOC_SINGLE_TLV("ALC Capture Noise Gate Threshold Volume", 288 ADAU1761_ALC_CTRL3, 0, 31, 0, adau1761_alc_ng_threshold_tlv), 289 }; 290 291 static const struct snd_kcontrol_new adau1761_single_mode_controls[] = { 292 SOC_SINGLE_TLV("Input 1 Capture Volume", ADAU1761_REC_MIXER_LEFT0, 293 4, 7, 0, adau1761_sing_in_tlv), 294 SOC_SINGLE_TLV("Input 2 Capture Volume", ADAU1761_REC_MIXER_LEFT0, 295 1, 7, 0, adau1761_sing_in_tlv), 296 SOC_SINGLE_TLV("Input 3 Capture Volume", ADAU1761_REC_MIXER_RIGHT0, 297 4, 7, 0, adau1761_sing_in_tlv), 298 SOC_SINGLE_TLV("Input 4 Capture Volume", ADAU1761_REC_MIXER_RIGHT0, 299 1, 7, 0, adau1761_sing_in_tlv), 300 }; 301 302 static const struct snd_kcontrol_new adau1761_controls[] = { 303 SOC_DOUBLE_R_TLV("Aux Capture Volume", ADAU1761_REC_MIXER_LEFT1, 304 ADAU1761_REC_MIXER_RIGHT1, 0, 7, 0, adau1761_sing_in_tlv), 305 306 SOC_DOUBLE_R_TLV("Headphone Playback Volume", ADAU1761_PLAY_HP_LEFT_VOL, 307 ADAU1761_PLAY_HP_RIGHT_VOL, 2, 0x3f, 0, adau1761_out_tlv), 308 SOC_DOUBLE_R("Headphone Playback Switch", ADAU1761_PLAY_HP_LEFT_VOL, 309 ADAU1761_PLAY_HP_RIGHT_VOL, 1, 1, 0), 310 SOC_DOUBLE_R_TLV("Lineout Playback Volume", ADAU1761_PLAY_LINE_LEFT_VOL, 311 ADAU1761_PLAY_LINE_RIGHT_VOL, 2, 0x3f, 0, adau1761_out_tlv), 312 SOC_DOUBLE_R("Lineout Playback Switch", ADAU1761_PLAY_LINE_LEFT_VOL, 313 ADAU1761_PLAY_LINE_RIGHT_VOL, 1, 1, 0), 314 315 SOC_ENUM("ADC Bias", adau1761_adc_bias_enum), 316 SOC_ENUM("DAC Bias", adau1761_dac_bias_enum), 317 SOC_ENUM("Capture Bias", adau1761_capture_bias_enum), 318 SOC_ENUM("Playback Bias", adau1761_playback_bias_enum), 319 SOC_ENUM("Headphone Bias", adau1761_hp_bias_enum), 320 }; 321 322 static const struct snd_kcontrol_new adau1761_mono_controls[] = { 323 SOC_SINGLE_TLV("Mono Playback Volume", ADAU1761_PLAY_MONO_OUTPUT_VOL, 324 2, 0x3f, 0, adau1761_out_tlv), 325 SOC_SINGLE("Mono Playback Switch", ADAU1761_PLAY_MONO_OUTPUT_VOL, 326 1, 1, 0), 327 }; 328 329 static const struct snd_kcontrol_new adau1761_left_mixer_controls[] = { 330 SOC_DAPM_SINGLE_AUTODISABLE("Left DAC Switch", 331 ADAU1761_PLAY_MIXER_LEFT0, 5, 1, 0), 332 SOC_DAPM_SINGLE_AUTODISABLE("Right DAC Switch", 333 ADAU1761_PLAY_MIXER_LEFT0, 6, 1, 0), 334 SOC_DAPM_SINGLE_TLV("Aux Bypass Volume", 335 ADAU1761_PLAY_MIXER_LEFT0, 1, 8, 0, adau1761_sidetone_tlv), 336 SOC_DAPM_SINGLE_TLV("Right Bypass Volume", 337 ADAU1761_PLAY_MIXER_LEFT1, 4, 8, 0, adau1761_sidetone_tlv), 338 SOC_DAPM_SINGLE_TLV("Left Bypass Volume", 339 ADAU1761_PLAY_MIXER_LEFT1, 0, 8, 0, adau1761_sidetone_tlv), 340 }; 341 342 static const struct snd_kcontrol_new adau1761_right_mixer_controls[] = { 343 SOC_DAPM_SINGLE_AUTODISABLE("Left DAC Switch", 344 ADAU1761_PLAY_MIXER_RIGHT0, 5, 1, 0), 345 SOC_DAPM_SINGLE_AUTODISABLE("Right DAC Switch", 346 ADAU1761_PLAY_MIXER_RIGHT0, 6, 1, 0), 347 SOC_DAPM_SINGLE_TLV("Aux Bypass Volume", 348 ADAU1761_PLAY_MIXER_RIGHT0, 1, 8, 0, adau1761_sidetone_tlv), 349 SOC_DAPM_SINGLE_TLV("Right Bypass Volume", 350 ADAU1761_PLAY_MIXER_RIGHT1, 4, 8, 0, adau1761_sidetone_tlv), 351 SOC_DAPM_SINGLE_TLV("Left Bypass Volume", 352 ADAU1761_PLAY_MIXER_RIGHT1, 0, 8, 0, adau1761_sidetone_tlv), 353 }; 354 355 static const struct snd_kcontrol_new adau1761_left_lr_mixer_controls[] = { 356 SOC_DAPM_SINGLE_TLV("Left Volume", 357 ADAU1761_PLAY_LR_MIXER_LEFT, 1, 2, 0, adau1761_boost_tlv), 358 SOC_DAPM_SINGLE_TLV("Right Volume", 359 ADAU1761_PLAY_LR_MIXER_LEFT, 3, 2, 0, adau1761_boost_tlv), 360 }; 361 362 static const struct snd_kcontrol_new adau1761_right_lr_mixer_controls[] = { 363 SOC_DAPM_SINGLE_TLV("Left Volume", 364 ADAU1761_PLAY_LR_MIXER_RIGHT, 1, 2, 0, adau1761_boost_tlv), 365 SOC_DAPM_SINGLE_TLV("Right Volume", 366 ADAU1761_PLAY_LR_MIXER_RIGHT, 3, 2, 0, adau1761_boost_tlv), 367 }; 368 369 static const char * const adau1761_input_mux_text[] = { 370 "ADC", "DMIC", 371 }; 372 373 static SOC_ENUM_SINGLE_DECL(adau1761_input_mux_enum, 374 ADAU17X1_ADC_CONTROL, 2, adau1761_input_mux_text); 375 376 static const struct snd_kcontrol_new adau1761_input_mux_control = 377 SOC_DAPM_ENUM("Input Select", adau1761_input_mux_enum); 378 379 static int adau1761_dejitter_fixup(struct snd_soc_dapm_widget *w, 380 struct snd_kcontrol *kcontrol, int event) 381 { 382 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 383 struct adau *adau = snd_soc_component_get_drvdata(component); 384 385 /* After any power changes have been made the dejitter circuit 386 * has to be reinitialized. */ 387 regmap_write(adau->regmap, ADAU1761_DEJITTER, 0); 388 if (!adau->master) 389 regmap_write(adau->regmap, ADAU1761_DEJITTER, 3); 390 391 return 0; 392 } 393 394 static const struct snd_soc_dapm_widget adau1x61_dapm_widgets[] = { 395 SND_SOC_DAPM_MIXER("Left Input Mixer", ADAU1761_REC_MIXER_LEFT0, 0, 0, 396 NULL, 0), 397 SND_SOC_DAPM_MIXER("Right Input Mixer", ADAU1761_REC_MIXER_RIGHT0, 0, 0, 398 NULL, 0), 399 400 SOC_MIXER_ARRAY("Left Playback Mixer", ADAU1761_PLAY_MIXER_LEFT0, 401 0, 0, adau1761_left_mixer_controls), 402 SOC_MIXER_ARRAY("Right Playback Mixer", ADAU1761_PLAY_MIXER_RIGHT0, 403 0, 0, adau1761_right_mixer_controls), 404 SOC_MIXER_ARRAY("Left LR Playback Mixer", ADAU1761_PLAY_LR_MIXER_LEFT, 405 0, 0, adau1761_left_lr_mixer_controls), 406 SOC_MIXER_ARRAY("Right LR Playback Mixer", ADAU1761_PLAY_LR_MIXER_RIGHT, 407 0, 0, adau1761_right_lr_mixer_controls), 408 409 SND_SOC_DAPM_SUPPLY("Headphone", ADAU1761_PLAY_HP_LEFT_VOL, 410 0, 0, NULL, 0), 411 412 SND_SOC_DAPM_SUPPLY_S("SYSCLK", 2, SND_SOC_NOPM, 0, 0, NULL, 0), 413 414 SND_SOC_DAPM_POST("Dejitter fixup", adau1761_dejitter_fixup), 415 416 SND_SOC_DAPM_INPUT("LAUX"), 417 SND_SOC_DAPM_INPUT("RAUX"), 418 SND_SOC_DAPM_INPUT("LINP"), 419 SND_SOC_DAPM_INPUT("LINN"), 420 SND_SOC_DAPM_INPUT("RINP"), 421 SND_SOC_DAPM_INPUT("RINN"), 422 423 SND_SOC_DAPM_OUTPUT("LOUT"), 424 SND_SOC_DAPM_OUTPUT("ROUT"), 425 SND_SOC_DAPM_OUTPUT("LHP"), 426 SND_SOC_DAPM_OUTPUT("RHP"), 427 }; 428 429 static const struct snd_soc_dapm_widget adau1761_mono_dapm_widgets[] = { 430 SND_SOC_DAPM_MIXER("Mono Playback Mixer", ADAU1761_PLAY_MIXER_MONO, 431 0, 0, NULL, 0), 432 433 SND_SOC_DAPM_OUTPUT("MONOOUT"), 434 }; 435 436 static const struct snd_soc_dapm_widget adau1761_capless_dapm_widgets[] = { 437 SND_SOC_DAPM_SUPPLY_S("Headphone VGND", 1, ADAU1761_PLAY_MIXER_MONO, 438 0, 0, NULL, 0), 439 }; 440 441 static const struct snd_soc_dapm_route adau1x61_dapm_routes[] = { 442 { "Left Input Mixer", NULL, "LINP" }, 443 { "Left Input Mixer", NULL, "LINN" }, 444 { "Left Input Mixer", NULL, "LAUX" }, 445 446 { "Right Input Mixer", NULL, "RINP" }, 447 { "Right Input Mixer", NULL, "RINN" }, 448 { "Right Input Mixer", NULL, "RAUX" }, 449 450 { "Left Playback Mixer", NULL, "Left Playback Enable"}, 451 { "Right Playback Mixer", NULL, "Right Playback Enable"}, 452 { "Left LR Playback Mixer", NULL, "Left Playback Enable"}, 453 { "Right LR Playback Mixer", NULL, "Right Playback Enable"}, 454 455 { "Left Playback Mixer", "Left DAC Switch", "Left DAC" }, 456 { "Left Playback Mixer", "Right DAC Switch", "Right DAC" }, 457 458 { "Right Playback Mixer", "Left DAC Switch", "Left DAC" }, 459 { "Right Playback Mixer", "Right DAC Switch", "Right DAC" }, 460 461 { "Left LR Playback Mixer", "Left Volume", "Left Playback Mixer" }, 462 { "Left LR Playback Mixer", "Right Volume", "Right Playback Mixer" }, 463 464 { "Right LR Playback Mixer", "Left Volume", "Left Playback Mixer" }, 465 { "Right LR Playback Mixer", "Right Volume", "Right Playback Mixer" }, 466 467 { "LHP", NULL, "Left Playback Mixer" }, 468 { "RHP", NULL, "Right Playback Mixer" }, 469 470 { "LHP", NULL, "Headphone" }, 471 { "RHP", NULL, "Headphone" }, 472 473 { "LOUT", NULL, "Left LR Playback Mixer" }, 474 { "ROUT", NULL, "Right LR Playback Mixer" }, 475 476 { "Left Playback Mixer", "Aux Bypass Volume", "LAUX" }, 477 { "Left Playback Mixer", "Left Bypass Volume", "Left Input Mixer" }, 478 { "Left Playback Mixer", "Right Bypass Volume", "Right Input Mixer" }, 479 { "Right Playback Mixer", "Aux Bypass Volume", "RAUX" }, 480 { "Right Playback Mixer", "Left Bypass Volume", "Left Input Mixer" }, 481 { "Right Playback Mixer", "Right Bypass Volume", "Right Input Mixer" }, 482 }; 483 484 static const struct snd_soc_dapm_route adau1761_mono_dapm_routes[] = { 485 { "Mono Playback Mixer", NULL, "Left Playback Mixer" }, 486 { "Mono Playback Mixer", NULL, "Right Playback Mixer" }, 487 488 { "MONOOUT", NULL, "Mono Playback Mixer" }, 489 }; 490 491 static const struct snd_soc_dapm_route adau1761_capless_dapm_routes[] = { 492 { "Headphone", NULL, "Headphone VGND" }, 493 }; 494 495 static const struct snd_soc_dapm_widget adau1761_dmic_widgets[] = { 496 SND_SOC_DAPM_MUX("Left Decimator Mux", SND_SOC_NOPM, 0, 0, 497 &adau1761_input_mux_control), 498 SND_SOC_DAPM_MUX("Right Decimator Mux", SND_SOC_NOPM, 0, 0, 499 &adau1761_input_mux_control), 500 501 SND_SOC_DAPM_INPUT("DMIC"), 502 }; 503 504 static const struct snd_soc_dapm_route adau1761_dmic_routes[] = { 505 { "Left Decimator Mux", "ADC", "Left Input Mixer" }, 506 { "Left Decimator Mux", "DMIC", "DMIC" }, 507 { "Right Decimator Mux", "ADC", "Right Input Mixer" }, 508 { "Right Decimator Mux", "DMIC", "DMIC" }, 509 510 { "Left Decimator", NULL, "Left Decimator Mux" }, 511 { "Right Decimator", NULL, "Right Decimator Mux" }, 512 }; 513 514 static const struct snd_soc_dapm_route adau1761_no_dmic_routes[] = { 515 { "Left Decimator", NULL, "Left Input Mixer" }, 516 { "Right Decimator", NULL, "Right Input Mixer" }, 517 }; 518 519 static const struct snd_soc_dapm_widget adau1761_dapm_widgets[] = { 520 SND_SOC_DAPM_SUPPLY("Serial Port Clock", ADAU1761_CLK_ENABLE0, 521 0, 0, NULL, 0), 522 SND_SOC_DAPM_SUPPLY("Serial Input Routing Clock", ADAU1761_CLK_ENABLE0, 523 1, 0, NULL, 0), 524 SND_SOC_DAPM_SUPPLY("Serial Output Routing Clock", ADAU1761_CLK_ENABLE0, 525 3, 0, NULL, 0), 526 527 SND_SOC_DAPM_SUPPLY("Decimator Resync Clock", ADAU1761_CLK_ENABLE0, 528 4, 0, NULL, 0), 529 SND_SOC_DAPM_SUPPLY("Interpolator Resync Clock", ADAU1761_CLK_ENABLE0, 530 2, 0, NULL, 0), 531 532 SND_SOC_DAPM_SUPPLY("Slew Clock", ADAU1761_CLK_ENABLE0, 6, 0, NULL, 0), 533 SND_SOC_DAPM_SUPPLY("ALC Clock", ADAU1761_CLK_ENABLE0, 5, 0, NULL, 0), 534 535 SND_SOC_DAPM_SUPPLY_S("Digital Clock 0", 1, ADAU1761_CLK_ENABLE1, 536 0, 0, NULL, 0), 537 SND_SOC_DAPM_SUPPLY_S("Digital Clock 1", 1, ADAU1761_CLK_ENABLE1, 538 1, 0, NULL, 0), 539 }; 540 541 static const struct snd_soc_dapm_route adau1761_dapm_routes[] = { 542 { "Left Decimator", NULL, "Digital Clock 0", }, 543 { "Right Decimator", NULL, "Digital Clock 0", }, 544 { "Left DAC", NULL, "Digital Clock 0", }, 545 { "Right DAC", NULL, "Digital Clock 0", }, 546 547 { "AIFCLK", NULL, "Digital Clock 1" }, 548 549 { "Playback", NULL, "Serial Port Clock" }, 550 { "Capture", NULL, "Serial Port Clock" }, 551 { "Playback", NULL, "Serial Input Routing Clock" }, 552 { "Capture", NULL, "Serial Output Routing Clock" }, 553 554 { "Left Decimator", NULL, "Decimator Resync Clock" }, 555 { "Right Decimator", NULL, "Decimator Resync Clock" }, 556 { "Left DAC", NULL, "Interpolator Resync Clock" }, 557 { "Right DAC", NULL, "Interpolator Resync Clock" }, 558 559 { "Slew Clock", NULL, "Digital Clock 0" }, 560 { "Right Playback Mixer", NULL, "Slew Clock" }, 561 { "Left Playback Mixer", NULL, "Slew Clock" }, 562 563 { "Left Input Mixer", NULL, "ALC Clock" }, 564 { "Right Input Mixer", NULL, "ALC Clock" }, 565 566 { "Digital Clock 0", NULL, "SYSCLK" }, 567 { "Digital Clock 1", NULL, "SYSCLK" }, 568 }; 569 570 static const struct snd_soc_dapm_route adau1761_dapm_dsp_routes[] = { 571 { "DSP", NULL, "Digital Clock 0" }, 572 }; 573 574 static int adau1761_compatibility_probe(struct device *dev) 575 { 576 struct adau *adau = dev_get_drvdata(dev); 577 struct regmap *regmap = adau->regmap; 578 int val, ret = 0; 579 580 /* Only consider compatibility mode when ADAU1361 was specified. */ 581 if (adau->type != ADAU1361) 582 return 0; 583 584 regcache_cache_bypass(regmap, true); 585 586 /* 587 * This will enable the core clock and bypass the PLL, 588 * so that we can access the registers for probing purposes 589 * (without having to set up the PLL). 590 */ 591 regmap_write(regmap, ADAU17X1_CLOCK_CONTROL, 592 ADAU17X1_CLOCK_CONTROL_SYSCLK_EN); 593 594 /* 595 * ADAU17X1_SERIAL_SAMPLING_RATE doesn't exist in non-DSP chips; 596 * reading it results in zero at all times, and write is a no-op. 597 * Use this register to probe for ADAU1761. 598 */ 599 regmap_write(regmap, ADAU17X1_SERIAL_SAMPLING_RATE, 1); 600 ret = regmap_read(regmap, ADAU17X1_SERIAL_SAMPLING_RATE, &val); 601 if (ret) 602 goto exit; 603 if (val != 1) 604 goto exit; 605 regmap_write(regmap, ADAU17X1_SERIAL_SAMPLING_RATE, 0); 606 ret = regmap_read(regmap, ADAU17X1_SERIAL_SAMPLING_RATE, &val); 607 if (ret) 608 goto exit; 609 if (val != 0) 610 goto exit; 611 612 adau->type = ADAU1761_AS_1361; 613 exit: 614 /* Disable core clock after probing. */ 615 regmap_write(regmap, ADAU17X1_CLOCK_CONTROL, 0); 616 regcache_cache_bypass(regmap, false); 617 return ret; 618 } 619 620 static int adau1761_set_bias_level(struct snd_soc_component *component, 621 enum snd_soc_bias_level level) 622 { 623 struct adau *adau = snd_soc_component_get_drvdata(component); 624 struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component); 625 626 switch (level) { 627 case SND_SOC_BIAS_ON: 628 break; 629 case SND_SOC_BIAS_PREPARE: 630 break; 631 case SND_SOC_BIAS_STANDBY: 632 regcache_cache_only(adau->regmap, false); 633 regmap_update_bits(adau->regmap, ADAU17X1_CLOCK_CONTROL, 634 ADAU17X1_CLOCK_CONTROL_SYSCLK_EN, 635 ADAU17X1_CLOCK_CONTROL_SYSCLK_EN); 636 if (snd_soc_dapm_get_bias_level(dapm) == SND_SOC_BIAS_OFF) 637 regcache_sync(adau->regmap); 638 break; 639 case SND_SOC_BIAS_OFF: 640 regmap_update_bits(adau->regmap, ADAU17X1_CLOCK_CONTROL, 641 ADAU17X1_CLOCK_CONTROL_SYSCLK_EN, 0); 642 regcache_cache_only(adau->regmap, true); 643 break; 644 645 } 646 return 0; 647 } 648 649 static enum adau1761_output_mode adau1761_get_lineout_mode( 650 struct snd_soc_component *component) 651 { 652 struct adau1761_platform_data *pdata = component->dev->platform_data; 653 654 if (pdata) 655 return pdata->lineout_mode; 656 657 return ADAU1761_OUTPUT_MODE_LINE; 658 } 659 660 static int adau1761_setup_digmic_jackdetect(struct snd_soc_component *component) 661 { 662 struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component); 663 struct adau1761_platform_data *pdata = component->dev->platform_data; 664 struct adau *adau = snd_soc_component_get_drvdata(component); 665 enum adau1761_digmic_jackdet_pin_mode mode; 666 unsigned int val = 0; 667 int ret; 668 669 if (pdata) 670 mode = pdata->digmic_jackdetect_pin_mode; 671 else 672 mode = ADAU1761_DIGMIC_JACKDET_PIN_MODE_NONE; 673 674 switch (mode) { 675 case ADAU1761_DIGMIC_JACKDET_PIN_MODE_JACKDETECT: 676 switch (pdata->jackdetect_debounce_time) { 677 case ADAU1761_JACKDETECT_DEBOUNCE_5MS: 678 case ADAU1761_JACKDETECT_DEBOUNCE_10MS: 679 case ADAU1761_JACKDETECT_DEBOUNCE_20MS: 680 case ADAU1761_JACKDETECT_DEBOUNCE_40MS: 681 val |= pdata->jackdetect_debounce_time << 6; 682 break; 683 default: 684 return -EINVAL; 685 } 686 if (pdata->jackdetect_active_low) 687 val |= ADAU1761_DIGMIC_JACKDETECT_ACTIVE_LOW; 688 689 ret = snd_soc_add_component_controls(component, 690 adau1761_jack_detect_controls, 691 ARRAY_SIZE(adau1761_jack_detect_controls)); 692 if (ret) 693 return ret; 694 fallthrough; 695 case ADAU1761_DIGMIC_JACKDET_PIN_MODE_NONE: 696 ret = snd_soc_dapm_add_routes(dapm, adau1761_no_dmic_routes, 697 ARRAY_SIZE(adau1761_no_dmic_routes)); 698 if (ret) 699 return ret; 700 break; 701 case ADAU1761_DIGMIC_JACKDET_PIN_MODE_DIGMIC: 702 ret = snd_soc_dapm_new_controls(dapm, adau1761_dmic_widgets, 703 ARRAY_SIZE(adau1761_dmic_widgets)); 704 if (ret) 705 return ret; 706 707 ret = snd_soc_dapm_add_routes(dapm, adau1761_dmic_routes, 708 ARRAY_SIZE(adau1761_dmic_routes)); 709 if (ret) 710 return ret; 711 712 val |= ADAU1761_DIGMIC_JACKDETECT_DIGMIC; 713 break; 714 default: 715 return -EINVAL; 716 } 717 718 regmap_write(adau->regmap, ADAU1761_DIGMIC_JACKDETECT, val); 719 720 return 0; 721 } 722 723 static int adau1761_setup_headphone_mode(struct snd_soc_component *component) 724 { 725 struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component); 726 struct adau *adau = snd_soc_component_get_drvdata(component); 727 struct adau1761_platform_data *pdata = component->dev->platform_data; 728 enum adau1761_output_mode mode; 729 int ret; 730 731 if (pdata) 732 mode = pdata->headphone_mode; 733 else 734 mode = ADAU1761_OUTPUT_MODE_HEADPHONE; 735 736 switch (mode) { 737 case ADAU1761_OUTPUT_MODE_LINE: 738 break; 739 case ADAU1761_OUTPUT_MODE_HEADPHONE_CAPLESS: 740 regmap_update_bits(adau->regmap, ADAU1761_PLAY_MONO_OUTPUT_VOL, 741 ADAU1761_PLAY_MONO_OUTPUT_VOL_MODE_HP | 742 ADAU1761_PLAY_MONO_OUTPUT_VOL_UNMUTE, 743 ADAU1761_PLAY_MONO_OUTPUT_VOL_MODE_HP | 744 ADAU1761_PLAY_MONO_OUTPUT_VOL_UNMUTE); 745 fallthrough; 746 case ADAU1761_OUTPUT_MODE_HEADPHONE: 747 regmap_update_bits(adau->regmap, ADAU1761_PLAY_HP_RIGHT_VOL, 748 ADAU1761_PLAY_HP_RIGHT_VOL_MODE_HP, 749 ADAU1761_PLAY_HP_RIGHT_VOL_MODE_HP); 750 break; 751 default: 752 return -EINVAL; 753 } 754 755 if (mode == ADAU1761_OUTPUT_MODE_HEADPHONE_CAPLESS) { 756 ret = snd_soc_dapm_new_controls(dapm, 757 adau1761_capless_dapm_widgets, 758 ARRAY_SIZE(adau1761_capless_dapm_widgets)); 759 if (ret) 760 return ret; 761 ret = snd_soc_dapm_add_routes(dapm, 762 adau1761_capless_dapm_routes, 763 ARRAY_SIZE(adau1761_capless_dapm_routes)); 764 } else { 765 ret = snd_soc_add_component_controls(component, adau1761_mono_controls, 766 ARRAY_SIZE(adau1761_mono_controls)); 767 if (ret) 768 return ret; 769 ret = snd_soc_dapm_new_controls(dapm, 770 adau1761_mono_dapm_widgets, 771 ARRAY_SIZE(adau1761_mono_dapm_widgets)); 772 if (ret) 773 return ret; 774 ret = snd_soc_dapm_add_routes(dapm, 775 adau1761_mono_dapm_routes, 776 ARRAY_SIZE(adau1761_mono_dapm_routes)); 777 } 778 779 return ret; 780 } 781 782 static bool adau1761_readable_register(struct device *dev, unsigned int reg) 783 { 784 switch (reg) { 785 case ADAU1761_DIGMIC_JACKDETECT: 786 case ADAU1761_REC_MIXER_LEFT0: 787 case ADAU1761_REC_MIXER_LEFT1: 788 case ADAU1761_REC_MIXER_RIGHT0: 789 case ADAU1761_REC_MIXER_RIGHT1: 790 case ADAU1761_LEFT_DIFF_INPUT_VOL: 791 case ADAU1761_RIGHT_DIFF_INPUT_VOL: 792 case ADAU1761_PLAY_LR_MIXER_LEFT: 793 case ADAU1761_PLAY_MIXER_LEFT0: 794 case ADAU1761_PLAY_MIXER_LEFT1: 795 case ADAU1761_PLAY_MIXER_RIGHT0: 796 case ADAU1761_PLAY_MIXER_RIGHT1: 797 case ADAU1761_PLAY_LR_MIXER_RIGHT: 798 case ADAU1761_PLAY_MIXER_MONO: 799 case ADAU1761_PLAY_HP_LEFT_VOL: 800 case ADAU1761_PLAY_HP_RIGHT_VOL: 801 case ADAU1761_PLAY_LINE_LEFT_VOL: 802 case ADAU1761_PLAY_LINE_RIGHT_VOL: 803 case ADAU1761_PLAY_MONO_OUTPUT_VOL: 804 case ADAU1761_POP_CLICK_SUPPRESS: 805 case ADAU1761_JACK_DETECT_PIN: 806 case ADAU1761_DEJITTER: 807 case ADAU1761_CLK_ENABLE0: 808 case ADAU1761_CLK_ENABLE1: 809 case ADAU1761_ALC_CTRL0: 810 case ADAU1761_ALC_CTRL1: 811 case ADAU1761_ALC_CTRL2: 812 case ADAU1761_ALC_CTRL3: 813 return true; 814 default: 815 break; 816 } 817 818 return adau17x1_readable_register(dev, reg); 819 } 820 821 static int adau1761_component_probe(struct snd_soc_component *component) 822 { 823 struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component); 824 struct adau1761_platform_data *pdata = component->dev->platform_data; 825 struct adau *adau = snd_soc_component_get_drvdata(component); 826 int ret; 827 828 ret = adau17x1_add_widgets(component); 829 if (ret < 0) 830 return ret; 831 832 if (pdata && pdata->input_differential) { 833 regmap_update_bits(adau->regmap, ADAU1761_LEFT_DIFF_INPUT_VOL, 834 ADAU1761_DIFF_INPUT_VOL_LDEN, 835 ADAU1761_DIFF_INPUT_VOL_LDEN); 836 regmap_update_bits(adau->regmap, ADAU1761_RIGHT_DIFF_INPUT_VOL, 837 ADAU1761_DIFF_INPUT_VOL_LDEN, 838 ADAU1761_DIFF_INPUT_VOL_LDEN); 839 ret = snd_soc_add_component_controls(component, 840 adau1761_differential_mode_controls, 841 ARRAY_SIZE(adau1761_differential_mode_controls)); 842 if (ret) 843 return ret; 844 } else { 845 ret = snd_soc_add_component_controls(component, 846 adau1761_single_mode_controls, 847 ARRAY_SIZE(adau1761_single_mode_controls)); 848 if (ret) 849 return ret; 850 } 851 852 switch (adau1761_get_lineout_mode(component)) { 853 case ADAU1761_OUTPUT_MODE_LINE: 854 break; 855 case ADAU1761_OUTPUT_MODE_HEADPHONE: 856 regmap_update_bits(adau->regmap, ADAU1761_PLAY_LINE_LEFT_VOL, 857 ADAU1761_PLAY_LINE_LEFT_VOL_MODE_HP, 858 ADAU1761_PLAY_LINE_LEFT_VOL_MODE_HP); 859 regmap_update_bits(adau->regmap, ADAU1761_PLAY_LINE_RIGHT_VOL, 860 ADAU1761_PLAY_LINE_RIGHT_VOL_MODE_HP, 861 ADAU1761_PLAY_LINE_RIGHT_VOL_MODE_HP); 862 break; 863 default: 864 return -EINVAL; 865 } 866 867 ret = adau1761_setup_headphone_mode(component); 868 if (ret) 869 return ret; 870 871 ret = adau1761_setup_digmic_jackdetect(component); 872 if (ret) 873 return ret; 874 875 /* 876 * If we've got an ADAU1761, or an ADAU1761 operating as an 877 * ADAU1361, we need these non-DSP related DAPM widgets and routes. 878 */ 879 if (adau->type == ADAU1761 || adau->type == ADAU1761_AS_1361) { 880 ret = snd_soc_dapm_new_controls(dapm, adau1761_dapm_widgets, 881 ARRAY_SIZE(adau1761_dapm_widgets)); 882 if (ret) 883 return ret; 884 885 ret = snd_soc_dapm_add_routes(dapm, adau1761_dapm_routes, 886 ARRAY_SIZE(adau1761_dapm_routes)); 887 if (ret) 888 return ret; 889 } 890 /* 891 * These routes are DSP related and only used when we have a 892 * bona fide ADAU1761. 893 */ 894 if (adau->type == ADAU1761) { 895 ret = snd_soc_dapm_add_routes(dapm, adau1761_dapm_dsp_routes, 896 ARRAY_SIZE(adau1761_dapm_dsp_routes)); 897 if (ret) 898 return ret; 899 } 900 /* 901 * In the ADAU1761, by default, the AIF is routed to the DSP, whereas 902 * for the ADAU1361, the AIF is permanently routed to the ADC and DAC. 903 * Thus, if we have an ADAU1761 masquerading as an ADAU1361, 904 * we need to explicitly route the AIF to the ADC and DAC. 905 * For the ADAU1761, this is normally done by set_tdm_slot, but this 906 * function is not necessarily called during stream setup, so set up 907 * the compatible AIF routings here from the start. 908 */ 909 if (adau->type == ADAU1761_AS_1361) { 910 regmap_write(adau->regmap, ADAU17X1_SERIAL_INPUT_ROUTE, 0x01); 911 regmap_write(adau->regmap, ADAU17X1_SERIAL_OUTPUT_ROUTE, 0x01); 912 } 913 ret = adau17x1_add_routes(component); 914 if (ret < 0) 915 return ret; 916 917 return 0; 918 } 919 920 static const struct snd_soc_component_driver adau1761_component_driver = { 921 .probe = adau1761_component_probe, 922 .resume = adau17x1_resume, 923 .set_bias_level = adau1761_set_bias_level, 924 .controls = adau1761_controls, 925 .num_controls = ARRAY_SIZE(adau1761_controls), 926 .dapm_widgets = adau1x61_dapm_widgets, 927 .num_dapm_widgets = ARRAY_SIZE(adau1x61_dapm_widgets), 928 .dapm_routes = adau1x61_dapm_routes, 929 .num_dapm_routes = ARRAY_SIZE(adau1x61_dapm_routes), 930 .suspend_bias_off = 1, 931 .idle_bias_on = 1, 932 .use_pmdown_time = 1, 933 .endianness = 1, 934 }; 935 936 #define ADAU1761_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | \ 937 SNDRV_PCM_FMTBIT_S32_LE) 938 939 static struct snd_soc_dai_driver adau1361_dai_driver = { 940 .name = "adau-hifi", 941 .playback = { 942 .stream_name = "Playback", 943 .channels_min = 2, 944 .channels_max = 4, 945 .rates = SNDRV_PCM_RATE_8000_96000, 946 .formats = ADAU1761_FORMATS, 947 }, 948 .capture = { 949 .stream_name = "Capture", 950 .channels_min = 2, 951 .channels_max = 4, 952 .rates = SNDRV_PCM_RATE_8000_96000, 953 .formats = ADAU1761_FORMATS, 954 }, 955 .ops = &adau17x1_dai_ops, 956 }; 957 958 static struct snd_soc_dai_driver adau1761_dai_driver = { 959 .name = "adau-hifi", 960 .playback = { 961 .stream_name = "Playback", 962 .channels_min = 2, 963 .channels_max = 8, 964 .rates = SNDRV_PCM_RATE_8000_96000, 965 .formats = ADAU1761_FORMATS, 966 }, 967 .capture = { 968 .stream_name = "Capture", 969 .channels_min = 2, 970 .channels_max = 8, 971 .rates = SNDRV_PCM_RATE_8000_96000, 972 .formats = ADAU1761_FORMATS, 973 }, 974 .ops = &adau17x1_dai_ops, 975 }; 976 977 int adau1761_probe(struct device *dev, struct regmap *regmap, 978 enum adau17x1_type type, void (*switch_mode)(struct device *dev)) 979 { 980 struct snd_soc_dai_driver *dai_drv; 981 const char *firmware_name; 982 int ret; 983 984 if (type == ADAU1361) { 985 dai_drv = &adau1361_dai_driver; 986 firmware_name = NULL; 987 } else { 988 dai_drv = &adau1761_dai_driver; 989 firmware_name = ADAU1761_FIRMWARE; 990 } 991 992 ret = adau17x1_probe(dev, regmap, type, switch_mode, firmware_name); 993 if (ret) 994 return ret; 995 996 ret = adau1761_compatibility_probe(dev); 997 if (ret) 998 return ret; 999 1000 /* Enable cache only mode as we could miss writes before bias level 1001 * reaches standby and the core clock is enabled */ 1002 regcache_cache_only(regmap, true); 1003 1004 return devm_snd_soc_register_component(dev, &adau1761_component_driver, 1005 dai_drv, 1); 1006 } 1007 EXPORT_SYMBOL_GPL(adau1761_probe); 1008 1009 const struct regmap_config adau1761_regmap_config = { 1010 .val_bits = 8, 1011 .reg_bits = 16, 1012 .max_register = 0x40fa, 1013 .reg_defaults = adau1761_reg_defaults, 1014 .num_reg_defaults = ARRAY_SIZE(adau1761_reg_defaults), 1015 .readable_reg = adau1761_readable_register, 1016 .volatile_reg = adau17x1_volatile_register, 1017 .precious_reg = adau17x1_precious_register, 1018 .cache_type = REGCACHE_MAPLE, 1019 }; 1020 EXPORT_SYMBOL_GPL(adau1761_regmap_config); 1021 1022 MODULE_DESCRIPTION("ASoC ADAU1361/ADAU1461/ADAU1761/ADAU1961 CODEC driver"); 1023 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); 1024 MODULE_LICENSE("GPL"); 1025