1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * es8311.c -- es8311 ALSA SoC audio driver 4 * 5 * Copyright (C) 2024 Matteo Martelli <matteomartelli3@gmail.com> 6 * 7 * Author: Matteo Martelli <matteomartelli3@gmail.com> 8 */ 9 10 #include "linux/array_size.h" 11 #include "sound/pcm.h" 12 #include <linux/clk.h> 13 #include <linux/i2c.h> 14 #include <linux/module.h> 15 #include <linux/regmap.h> 16 #include <sound/core.h> 17 #include <sound/pcm_params.h> 18 #include <sound/soc.h> 19 #include <sound/tlv.h> 20 #include "es8311.h" 21 22 #define ES8311_NUM_RATES 10 23 #define ES8311_RATES (SNDRV_PCM_RATE_8000_96000) 24 #define ES8311_FORMATS \ 25 (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S18_3LE | \ 26 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_3LE | \ 27 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) 28 29 struct es8311_priv { 30 struct regmap *regmap; 31 struct clk *mclk; 32 unsigned long mclk_freq; 33 bool provider; 34 unsigned int rates[ES8311_NUM_RATES]; 35 struct snd_pcm_hw_constraint_list constraints; 36 }; 37 38 static const DECLARE_TLV_DB_SCALE(es8311_adc_vol_tlv, -9550, 50, 0); 39 static const DECLARE_TLV_DB_SCALE(es8311_pga_gain_tlv, 0, 300, 0); 40 static const DECLARE_TLV_DB_SCALE(es8311_adc_scale_tlv, 0, 600, 0); 41 42 #define ES8311_DB_LRCK_STEPS \ 43 "0.25db/4LRCK", \ 44 "0.25db/8LRCK", \ 45 "0.25db/16LRCK", \ 46 "0.25db/32LRCK", \ 47 "0.25db/64LRCK", \ 48 "0.25db/128LRCK", \ 49 "0.25db/256LRCK", \ 50 "0.25db/512LRCK", \ 51 "0.25db/1024LRCK", \ 52 "0.25db/2048LRCK", \ 53 "0.25db/4096LRCK", \ 54 "0.25db/8192LRCK", \ 55 "0.25db/16384LRCK", \ 56 "0.25db/32768LRCK", \ 57 "0.25db/65536LRCK", 58 59 static const char *const es8311_level_winsize_txt[] = { 60 "0.25db/2LRCK", 61 ES8311_DB_LRCK_STEPS 62 }; 63 64 static SOC_ENUM_SINGLE_DECL( 65 es8311_alc_winsize, ES8311_ADC4, 66 ES8311_ADC4_ALC_WINSIZE_SHIFT, es8311_level_winsize_txt); 67 static const DECLARE_TLV_DB_RANGE(es8311_level_tlv, 68 0, 1, TLV_DB_SCALE_ITEM(-3010, 600, 0), 69 2, 3, TLV_DB_SCALE_ITEM(-2060, 250, 0), 70 4, 5, TLV_DB_SCALE_ITEM(-1610, 160, 0), 71 6, 7, TLV_DB_SCALE_ITEM(-1320, 120, 0), 72 8, 9, TLV_DB_SCALE_ITEM(-1100, 90, 0), 73 10, 11, TLV_DB_SCALE_ITEM(-930, 80, 0), 74 12, 15, TLV_DB_SCALE_ITEM(-780, 60, 0), 75 ); 76 77 static const char *const es8311_ramprate_txt[] = { 78 "Disabled", 79 ES8311_DB_LRCK_STEPS 80 }; 81 static SOC_ENUM_SINGLE_DECL( 82 es8311_adc_ramprate, ES8311_ADC1, 83 ES8311_ADC1_RAMPRATE_SHIFT, es8311_ramprate_txt); 84 85 static const char *const es8311_automute_winsize_txt[] = { 86 "2048 samples", 87 "4096 samples", 88 "6144 samples", 89 "8192 samples", 90 "10240 samples", 91 "12288 samples", 92 "14336 samples", 93 "16384 samples", 94 "18432 samples", 95 "20480 samples", 96 "22528 samples", 97 "24576 samples", 98 "26624 samples", 99 "28672 samples", 100 "30720 samples", 101 "32768 samples", 102 }; 103 static SOC_ENUM_SINGLE_DECL( 104 es8311_automute_winsize, ES8311_ADC6, 105 ES8311_ADC6_AUTOMUTE_WS_SHIFT, es8311_automute_winsize_txt); 106 static const DECLARE_TLV_DB_RANGE(es8311_automute_ng_tlv, 107 0, 7, TLV_DB_SCALE_ITEM(-9600, 600, 0), 108 8, 15, TLV_DB_SCALE_ITEM(-5100, 300, 0), 109 ); 110 static const DECLARE_TLV_DB_SCALE(es8311_automute_vol_tlv, -2800, 400, 0); 111 112 static const DECLARE_TLV_DB_SCALE(es8311_dac_vol_tlv, -9550, 50, 0); 113 static SOC_ENUM_SINGLE_DECL( 114 es8311_drc_winsize, ES8311_DAC4, 115 ES8311_DAC4_DRC_WINSIZE_SHIFT, es8311_level_winsize_txt); 116 static SOC_ENUM_SINGLE_DECL( 117 es8311_dac_ramprate, ES8311_DAC6, 118 ES8311_DAC6_RAMPRATE_SHIFT, es8311_ramprate_txt); 119 120 static const char *const es8311_out_mode_txt[] = { 121 "Lineout", 122 "Headphones" 123 }; 124 static SOC_ENUM_SINGLE_DECL( 125 es8311_out_mode, ES8311_SYS9, 126 ES8311_SYS9_HPSW_SHIFT, es8311_out_mode_txt); 127 128 static const struct snd_kcontrol_new es8311_snd_controls[] = { 129 /* Capture path */ 130 SOC_SINGLE_TLV("PGA Capture Volume", ES8311_SYS10, 131 ES8311_SYS10_PGAGAIN_SHIFT, ES8311_SYS10_PGAGAIN_MAX, 0, 132 es8311_pga_gain_tlv), 133 SOC_SINGLE("ADC Polarity Invert Capture Switch", ES8311_ADC2, 134 ES8311_ADC2_INV_SHIFT, 1, 0), 135 SOC_SINGLE_TLV("ADC Scale Capture Volume", ES8311_ADC2, 136 ES8311_ADC2_SCALE_SHIFT, ES8311_ADC2_SCALE_MAX, 0, 137 es8311_adc_scale_tlv), 138 SOC_SINGLE_TLV("ADC Capture Volume", ES8311_ADC3, 139 ES8311_ADC3_VOLUME_SHIFT, ES8311_ADC3_VOLUME_MAX, 0, 140 es8311_adc_vol_tlv), 141 SOC_ENUM("ADC Capture Ramp Rate", es8311_adc_ramprate), 142 SOC_SINGLE("ADC Automute Capture Switch", ES8311_ADC4, 143 ES8311_ADC4_AUTOMUTE_EN_SHIFT, 1, 0), 144 SOC_ENUM("ADC Automute Capture Winsize", es8311_automute_winsize), 145 SOC_SINGLE_TLV("ADC Automute Noise Gate Capture Volume", ES8311_ADC6, 146 ES8311_ADC6_AUTOMUTE_NG_SHIFT, 147 ES8311_ADC6_AUTOMUTE_NG_MAX, 0, es8311_automute_ng_tlv), 148 SOC_SINGLE_TLV("ADC Automute Capture Volume", ES8311_ADC7, 149 ES8311_ADC7_AUTOMUTE_VOL_SHIFT, 150 ES8311_ADC7_AUTOMUTE_VOL_MAX, 0, 151 es8311_automute_vol_tlv), 152 SOC_SINGLE("ADC HPF Capture Switch", ES8311_ADC8, ES8311_ADC8_HPF_SHIFT, 153 1, 0), 154 SOC_SINGLE("ADC EQ Capture Switch", ES8311_ADC8, 155 ES8311_ADC8_EQBYPASS_SHIFT, 1, 1), 156 SOC_SINGLE("ALC Capture Switch", ES8311_ADC4, ES8311_ADC4_ALC_EN_SHIFT, 157 1, 0), 158 SOC_SINGLE_TLV("ALC Capture Max Volume", ES8311_ADC5, 159 ES8311_ADC5_ALC_MAXLEVEL_SHIFT, 160 ES8311_ADC5_ALC_MAXLEVEL_MAX, 0, es8311_level_tlv), 161 SOC_SINGLE_TLV("ALC Capture Min Volume", ES8311_ADC5, 162 ES8311_ADC5_ALC_MINLEVEL_SHIFT, 163 ES8311_ADC5_ALC_MINLEVEL_MAX, 0, es8311_level_tlv), 164 SOC_ENUM("ALC Capture Winsize", es8311_alc_winsize), 165 166 /* Playback path */ 167 SOC_SINGLE_TLV("DAC Playback Volume", ES8311_DAC2, 0, 168 ES8311_DAC2_VOLUME_MAX, 0, es8311_dac_vol_tlv), 169 SOC_SINGLE("DRC Playback Switch", ES8311_DAC4, ES8311_DAC4_DRC_EN_SHIFT, 170 1, 0), 171 SOC_SINGLE_TLV("DRC Playback Max Volume", ES8311_DAC5, 172 ES8311_DAC5_DRC_MAXLEVEL_SHIFT, 173 ES8311_DAC5_DRC_MAXLEVEL_MAX, 0, es8311_level_tlv), 174 SOC_SINGLE_TLV("DRC Playback Min Volume", ES8311_DAC5, 175 ES8311_DAC5_DRC_MINLEVEL_SHIFT, 176 ES8311_DAC5_DRC_MINLEVEL_MAX, 0, es8311_level_tlv), 177 SOC_ENUM("DRC Playback Winsize", es8311_drc_winsize), 178 SOC_ENUM("DAC Playback Ramp Rate", es8311_dac_ramprate), 179 SOC_SINGLE("DAC EQ Playback Switch", ES8311_DAC6, 180 ES8311_DAC6_EQBYPASS_SHIFT, 1, 1), 181 182 SOC_ENUM("Output Mode", es8311_out_mode), 183 }; 184 185 static const char *const es8311_diff_src_txt[] = { 186 "Disabled", 187 "MIC1P-MIC1N", 188 }; 189 static SOC_ENUM_SINGLE_DECL( 190 es8311_diff_src_enum, ES8311_SYS10, 191 ES8311_SYS10_LINESEL_SHIFT, es8311_diff_src_txt); 192 static const struct snd_kcontrol_new es8311_diff_src_mux = 193 SOC_DAPM_ENUM("Differential Source", es8311_diff_src_enum); 194 195 static const char *const es8311_dmic_src_txt[] = { 196 "Disabled", 197 "DMIC from MIC1P", 198 }; 199 static SOC_ENUM_SINGLE_DECL( 200 es8311_dmic_src_enum, ES8311_SYS10, 201 ES8311_SYS10_DMIC_ON_SHIFT, es8311_dmic_src_txt); 202 static const struct snd_kcontrol_new es8311_dmic_src_mux = 203 SOC_DAPM_ENUM("Digital Mic Source", es8311_dmic_src_enum); 204 205 static const char * const es8311_aif1tx_src_txt[] = { 206 "ADC + ADC", 207 "ADC + 0", 208 "0 + ADC", 209 "0 + 0", 210 "DACL + ADC", 211 "ADC + DACR", 212 "DACL + DACR", 213 }; 214 static SOC_ENUM_SINGLE_DECL( 215 es8311_aif1tx_src_enum, ES8311_GPIO, 216 ES8311_GPIO_ADCDAT_SEL_SHIFT, es8311_aif1tx_src_txt); 217 static const struct snd_kcontrol_new es8311_aif1tx_src_mux = 218 SOC_DAPM_ENUM("AIF1TX Source", es8311_aif1tx_src_enum); 219 220 static const char * const es8311_dac_src_txt[] = { 221 "Left", 222 "Right" 223 }; 224 static SOC_ENUM_SINGLE_DECL( 225 es8311_dac_src_enum, ES8311_SDP_IN, 226 ES8311_SDP_IN_SEL_SHIFT, es8311_dac_src_txt); 227 static const struct snd_kcontrol_new es8311_dac_src_mux = 228 SOC_DAPM_ENUM("Mono DAC Source", es8311_dac_src_enum); 229 230 static const struct snd_soc_dapm_widget es8311_dapm_widgets[] = { 231 SND_SOC_DAPM_SUPPLY("Bias", ES8311_SYS3, ES8311_SYS3_PDN_IBIASGEN_SHIFT, 232 1, NULL, 0), 233 SND_SOC_DAPM_SUPPLY("Analog power", ES8311_SYS3, 234 ES8311_SYS3_PDN_ANA_SHIFT, 1, NULL, 0), 235 SND_SOC_DAPM_SUPPLY("Vref", ES8311_SYS3, ES8311_SYS3_PDN_VREF_SHIFT, 1, 236 NULL, 0), 237 238 /* Capture path */ 239 SND_SOC_DAPM_INPUT("DMIC"), 240 SND_SOC_DAPM_INPUT("MIC1"), 241 SND_SOC_DAPM_MUX("Differential Mux", SND_SOC_NOPM, 0, 0, 242 &es8311_diff_src_mux), 243 SND_SOC_DAPM_SUPPLY("ADC Bias Gen", ES8311_SYS3, 244 ES8311_SYS3_PDN_ADCBIASGEN_SHIFT, 1, NULL, 0), 245 SND_SOC_DAPM_SUPPLY("ADC Vref Gen", ES8311_SYS3, 246 ES8311_SYS3_PDN_ADCVREFGEN_SHIFT, 1, NULL, 0), 247 SND_SOC_DAPM_SUPPLY("ADC Clock", ES8311_CLKMGR1, 248 ES8311_CLKMGR1_CLKADC_ON_SHIFT, 0, NULL, 0), 249 SND_SOC_DAPM_SUPPLY("ADC Analog Clock", ES8311_CLKMGR1, 250 ES8311_CLKMGR1_ANACLKADC_ON_SHIFT, 0, NULL, 0), 251 SND_SOC_DAPM_PGA("PGA", ES8311_SYS4, ES8311_SYS4_PDN_PGA_SHIFT, 1, NULL, 252 0), 253 SND_SOC_DAPM_ADC("Mono ADC", NULL, ES8311_SYS4, 254 ES8311_SYS4_PDN_MOD_SHIFT, 1), 255 SND_SOC_DAPM_MUX("Digital Mic Mux", SND_SOC_NOPM, 0, 0, 256 &es8311_dmic_src_mux), 257 SND_SOC_DAPM_MUX("AIF1TX Source Mux", SND_SOC_NOPM, 0, 0, 258 &es8311_aif1tx_src_mux), 259 SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, ES8311_SDP_OUT, 260 ES8311_SDP_MUTE_SHIFT, 1), 261 262 /* Playback path */ 263 SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, ES8311_SDP_IN, 264 ES8311_SDP_MUTE_SHIFT, 1), 265 SND_SOC_DAPM_MUX("Mono DAC Source Mux", SND_SOC_NOPM, 0, 0, 266 &es8311_dac_src_mux), 267 SND_SOC_DAPM_DAC("Mono DAC", NULL, ES8311_SYS8, 268 ES8311_SYS8_PDN_DAC_SHIFT, 1), 269 SND_SOC_DAPM_SUPPLY("DAC Clock", ES8311_CLKMGR1, 270 ES8311_CLKMGR1_CLKDAC_ON_SHIFT, 0, NULL, 0), 271 SND_SOC_DAPM_SUPPLY("DAC Analog Clock", ES8311_CLKMGR1, 272 ES8311_CLKMGR1_ANACLKDAC_ON_SHIFT, 0, NULL, 0), 273 SND_SOC_DAPM_SUPPLY("DAC Vref Gen", ES8311_SYS3, 274 ES8311_SYS3_PDN_DACVREFGEN_SHIFT, 1, NULL, 0), 275 SND_SOC_DAPM_OUTPUT("OUT"), 276 }; 277 278 static const struct snd_soc_dapm_route es8311_dapm_routes[] = { 279 /* Capture Path */ 280 { "MIC1", NULL, "Bias" }, 281 { "MIC1", NULL, "Analog power" }, 282 { "MIC1", NULL, "Vref" }, 283 { "Differential Mux", "MIC1P-MIC1N", "MIC1" }, 284 { "PGA", NULL, "Differential Mux" }, 285 { "Mono ADC", NULL, "PGA" }, 286 { "Mono ADC", NULL, "ADC Bias Gen" }, 287 { "Mono ADC", NULL, "ADC Vref Gen" }, 288 { "Mono ADC", NULL, "ADC Clock" }, 289 { "Mono ADC", NULL, "ADC Analog Clock" }, 290 { "Digital Mic Mux", "Disabled", "Mono ADC" }, 291 { "Digital Mic Mux", "DMIC from MIC1P", "DMIC" }, 292 293 { "AIF1TX Source Mux", "ADC + ADC", "Digital Mic Mux" }, 294 { "AIF1TX Source Mux", "ADC + 0", "Digital Mic Mux" }, 295 { "AIF1TX Source Mux", "0 + ADC", "Digital Mic Mux" }, 296 { "AIF1TX Source Mux", "DACL + ADC", "Digital Mic Mux" }, 297 { "AIF1TX Source Mux", "ADC + DACR", "Digital Mic Mux" }, 298 299 { "AIF1TX", NULL, "AIF1TX Source Mux" }, 300 301 /* Playback Path */ 302 { "Mono DAC Source Mux", "Left", "AIF1RX" }, 303 { "Mono DAC Source Mux", "Right", "AIF1RX" }, 304 { "Mono DAC", NULL, "Mono DAC Source Mux" }, 305 { "Mono DAC", NULL, "DAC Clock" }, 306 { "Mono DAC", NULL, "DAC Analog Clock" }, 307 { "OUT", NULL, "Mono DAC" }, 308 { "OUT", NULL, "Bias" }, 309 { "OUT", NULL, "Analog power" }, 310 { "OUT", NULL, "Vref" }, 311 { "OUT", NULL, "DAC Vref Gen" }, 312 }; 313 314 /* Bit clock divider values: 315 * from 1 to 20: the register takes the div value - 1 316 * above 20: the register takes the corresponding idx of the div value 317 * in the following table + 20 318 */ 319 #define ES8311_BCLK_DIV_IDX_OFFSET 20 320 static const unsigned int es8311_bclk_divs[] = { 321 22, 24, 25, 30, 32, 33, 34, 36, 44, 48, 66, 72 322 }; 323 324 struct es8311_mclk_coeff { 325 unsigned int rate; 326 unsigned int mclk; 327 unsigned int div; 328 unsigned int mult; 329 unsigned int div_adc_dac; 330 }; 331 332 #define ES8311_MCLK_MAX_FREQ 49200000 333 334 /* Coefficients for common master clock frequencies based on clock table from 335 * documentation. Limited to have a ratio of adc (or dac) clock to lrclk equal 336 * to 256. This to keep the default adc and dac oversampling and adc scale 337 * settings. Internal mclk dividers and multipliers are dynamically adjusted to 338 * support, respectively, multiples (up to x8) and factors (/2,4,8) of listed 339 * mclks frequencies (see es8311_cmp_adj_mclk_coeff). 340 * All rates are supported when mclk/rate ratio is 32, 64, 128, 256, 384 or 512 341 * (upper limit due to max mclk freq of 49.2MHz). 342 */ 343 static const struct es8311_mclk_coeff es8311_mclk_coeffs[] = { 344 { 8000, 2048000, 1, 1, 1 }, 345 { 8000, 6144000, 3, 1, 1 }, 346 { 8000, 18432000, 3, 1, 3 }, 347 { 11025, 2822400, 1, 1, 1 }, 348 { 11025, 8467200, 3, 1, 1 }, 349 { 16000, 4096000, 1, 1, 1 }, 350 { 16000, 12288000, 3, 1, 1 }, 351 { 16000, 18432000, 3, 2, 3 }, 352 { 22050, 5644800, 1, 1, 1 }, 353 { 22050, 16934400, 3, 1, 1 }, 354 { 32000, 8192000, 1, 1, 1 }, 355 { 32000, 12288000, 3, 2, 1 }, 356 { 32000, 18432000, 3, 4, 3 }, 357 { 44100, 11289600, 1, 1, 1 }, 358 { 44100, 33868800, 3, 1, 1 }, 359 { 48000, 12288000, 1, 1, 1 }, 360 { 48000, 18432000, 3, 2, 1 }, 361 { 64000, 8192000, 1, 2, 1 }, 362 { 64000, 12288000, 3, 4, 1 }, 363 { 88200, 11289600, 1, 2, 1 }, 364 { 88200, 33868800, 3, 2, 1 }, 365 { 96000, 12288000, 1, 2, 1 }, 366 { 96000, 18432000, 3, 4, 1 }, 367 }; 368 369 /* Compare coeff with provided mclk_freq and adjust it if needed. 370 * If frequencies match, return 0 and the unaltered coeff copy into out_coeff. 371 * If mclk_freq is a valid multiple or factor of coeff mclk freq, return 0 and 372 * the adjusted coeff copy into out_coeff. 373 * Return -EINVAL otherwise. 374 */ 375 static int es8311_cmp_adj_mclk_coeff(unsigned int mclk_freq, 376 const struct es8311_mclk_coeff *coeff, 377 struct es8311_mclk_coeff *out_coeff) 378 { 379 if (WARN_ON_ONCE(!coeff)) 380 return -EINVAL; 381 382 unsigned int div = coeff->div; 383 unsigned int mult = coeff->mult; 384 bool match = false; 385 386 if (coeff->mclk == mclk_freq) { 387 match = true; 388 } else if (mclk_freq % coeff->mclk == 0) { 389 div = mclk_freq / coeff->mclk; 390 div *= coeff->div; 391 if (div <= 8) 392 match = true; 393 } else if (coeff->mclk % mclk_freq == 0) { 394 mult = coeff->mclk / mclk_freq; 395 if (mult == 2 || mult == 4 || mult == 8) { 396 mult *= coeff->mult; 397 if (mult <= 8) 398 match = true; 399 } 400 } 401 if (!match) 402 return -EINVAL; 403 if (out_coeff) { 404 *out_coeff = *coeff; 405 out_coeff->div = div; 406 out_coeff->mult = mult; 407 } 408 return 0; 409 } 410 411 static int es8311_get_mclk_coeff(unsigned int mclk_freq, unsigned int rate, 412 struct es8311_mclk_coeff *out_coeff) 413 { 414 for (unsigned int i = 0; i < ARRAY_SIZE(es8311_mclk_coeffs); i++) { 415 const struct es8311_mclk_coeff *coeff = &es8311_mclk_coeffs[i]; 416 417 if (coeff->rate != rate) 418 continue; 419 420 int ret = 421 es8311_cmp_adj_mclk_coeff(mclk_freq, coeff, out_coeff); 422 if (ret == 0) 423 return 0; 424 } 425 return -EINVAL; 426 } 427 428 static void es8311_set_sysclk_constraints(unsigned int mclk_freq, 429 struct es8311_priv *es8311) 430 { 431 unsigned int count = 0; 432 433 for (unsigned int i = 0; i < ARRAY_SIZE(es8311_mclk_coeffs) && 434 count < ARRAY_SIZE(es8311->rates); i++) { 435 const struct es8311_mclk_coeff *coeff = &es8311_mclk_coeffs[i]; 436 437 if (count > 0 && coeff->rate == es8311->rates[count - 1]) 438 continue; 439 440 int ret = es8311_cmp_adj_mclk_coeff(mclk_freq, coeff, NULL); 441 if (ret == 0) 442 es8311->rates[count++] = coeff->rate; 443 } 444 if (count) { 445 es8311->constraints.list = es8311->rates; 446 es8311->constraints.count = count; 447 } 448 } 449 450 static int es8311_mute(struct snd_soc_dai *dai, int mute, int direction) 451 { 452 struct snd_soc_component *component = dai->component; 453 struct es8311_priv *es8311 = snd_soc_component_get_drvdata(component); 454 455 if (direction == SNDRV_PCM_STREAM_PLAYBACK) { 456 unsigned int mask = ES8311_DAC1_DAC_DSMMUTE | 457 ES8311_DAC1_DAC_DEMMUTE; 458 unsigned int val = mute ? mask : 0; 459 460 regmap_update_bits(es8311->regmap, ES8311_DAC1, mask, val); 461 } 462 463 return 0; 464 } 465 466 static int es8311_startup(struct snd_pcm_substream *substream, 467 struct snd_soc_dai *dai) 468 { 469 struct snd_soc_component *component = dai->component; 470 struct es8311_priv *es8311 = snd_soc_component_get_drvdata(component); 471 472 if (es8311->constraints.list) { 473 snd_pcm_hw_constraint_list(substream->runtime, 0, 474 SNDRV_PCM_HW_PARAM_RATE, 475 &es8311->constraints); 476 } 477 478 return 0; 479 } 480 481 static int es8311_hw_params(struct snd_pcm_substream *substream, 482 struct snd_pcm_hw_params *params, 483 struct snd_soc_dai *dai) 484 { 485 struct snd_soc_component *component = dai->component; 486 struct es8311_priv *es8311 = snd_soc_component_get_drvdata(component); 487 unsigned int wl; 488 int par_width = params_width(params); 489 490 switch (par_width) { 491 case 16: 492 wl = ES8311_SDP_WL_16; 493 break; 494 case 18: 495 wl = ES8311_SDP_WL_18; 496 break; 497 case 20: 498 wl = ES8311_SDP_WL_20; 499 break; 500 case 24: 501 wl = ES8311_SDP_WL_24; 502 break; 503 case 32: 504 wl = ES8311_SDP_WL_32; 505 break; 506 default: 507 return -EINVAL; 508 } 509 unsigned int width = (unsigned int)par_width; 510 511 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 512 snd_soc_component_update_bits(component, ES8311_SDP_IN, 513 ES8311_SDP_WL_MASK, 514 wl << ES8311_SDP_WL_SHIFT); 515 } else { 516 snd_soc_component_update_bits(component, ES8311_SDP_OUT, 517 ES8311_SDP_WL_MASK, 518 wl << ES8311_SDP_WL_SHIFT); 519 } 520 521 if (es8311->mclk_freq > ES8311_MCLK_MAX_FREQ) { 522 dev_err(component->dev, "mclk frequency %lu too high\n", 523 es8311->mclk_freq); 524 return -EINVAL; 525 } 526 527 unsigned int mclk_freq = es8311->mclk_freq; 528 unsigned int rate = params_rate(params); 529 unsigned int clkmgr = ES8311_CLKMGR1_MCLK_ON; 530 531 if (!mclk_freq) { 532 if (es8311->provider) { 533 dev_err(component->dev, 534 "mclk not configured, cannot run as master\n"); 535 return -EINVAL; 536 } 537 dev_dbg(component->dev, 538 "mclk not configured, use bclk as internal mclk\n"); 539 540 clkmgr = ES8311_CLKMGR1_MCLK_SEL; 541 542 mclk_freq = rate * width * 2; 543 } 544 545 struct es8311_mclk_coeff coeff; 546 int ret = es8311_get_mclk_coeff(mclk_freq, rate, &coeff); 547 if (ret) { 548 dev_err(component->dev, "unable to find mclk coefficient\n"); 549 return ret; 550 } 551 552 unsigned int mask = ES8311_CLKMGR1_MCLK_SEL | ES8311_CLKMGR1_MCLK_ON | 553 ES8311_CLKMGR1_BCLK_ON; 554 555 clkmgr |= ES8311_CLKMGR1_BCLK_ON; 556 snd_soc_component_update_bits(component, ES8311_CLKMGR1, mask, clkmgr); 557 558 if (WARN_ON_ONCE(coeff.div == 0 || coeff.div > 8 || 559 coeff.div_adc_dac == 0 || coeff.div_adc_dac > 8)) 560 return -EINVAL; 561 562 unsigned int mult; 563 564 switch (coeff.mult) { 565 case 1: 566 mult = 0; 567 break; 568 case 2: 569 mult = 1; 570 break; 571 case 4: 572 mult = 2; 573 break; 574 case 8: 575 mult = 3; 576 break; 577 default: 578 WARN_ON_ONCE(true); 579 return -EINVAL; 580 } 581 582 mask = ES8311_CLKMGR2_DIV_PRE_MASK | ES8311_CLKMGR2_MULT_PRE_MASK; 583 clkmgr = (coeff.div - 1) << ES8311_CLKMGR2_DIV_PRE_SHIFT | 584 mult << ES8311_CLKMGR2_MULT_PRE_SHIFT; 585 snd_soc_component_update_bits(component, ES8311_CLKMGR2, mask, clkmgr); 586 587 mask = ES8311_CLKMGR5_ADC_DIV_MASK | ES8311_CLKMGR5_DAC_DIV_MASK; 588 clkmgr = (coeff.div_adc_dac - 1) << ES8311_CLKMGR5_ADC_DIV_SHIFT | 589 (coeff.div_adc_dac - 1) << ES8311_CLKMGR5_DAC_DIV_SHIFT; 590 snd_soc_component_update_bits(component, ES8311_CLKMGR5, mask, clkmgr); 591 592 if (es8311->provider) { 593 unsigned int div_lrclk = mclk_freq / rate; 594 595 if (WARN_ON_ONCE(div_lrclk == 0 || 596 div_lrclk > ES8311_CLKMGR_LRCLK_DIV_MAX + 1)) 597 return -EINVAL; 598 599 mask = ES8311_CLKMGR7_LRCLK_DIV_H_MASK; 600 clkmgr = (div_lrclk - 1) >> 8; 601 snd_soc_component_update_bits(component, ES8311_CLKMGR7, mask, 602 clkmgr); 603 clkmgr = (div_lrclk - 1) & 0xFF; 604 snd_soc_component_write(component, ES8311_CLKMGR8, clkmgr); 605 606 if (div_lrclk % (2 * width) != 0) { 607 dev_err(component->dev, 608 "unable to divide mclk %u to generate bclk\n", 609 mclk_freq); 610 return -EINVAL; 611 } 612 613 unsigned int div_bclk = div_lrclk / (2 * width); 614 615 mask = ES8311_CLKMGR6_DIV_BCLK_MASK; 616 if (div_bclk <= ES8311_BCLK_DIV_IDX_OFFSET) { 617 clkmgr = div_bclk - 1; 618 } else { 619 unsigned int i; 620 621 for (i = 0; i < ARRAY_SIZE(es8311_bclk_divs); i++) { 622 if (es8311_bclk_divs[i] == div_bclk) 623 break; 624 } 625 if (i == ARRAY_SIZE(es8311_bclk_divs)) { 626 dev_err(component->dev, 627 "bclk divider %u not supported\n", 628 div_bclk); 629 return -EINVAL; 630 } 631 632 clkmgr = i + ES8311_BCLK_DIV_IDX_OFFSET; 633 } 634 snd_soc_component_update_bits(component, ES8311_CLKMGR6, mask, 635 clkmgr); 636 } 637 638 return 0; 639 } 640 641 static int es8311_set_sysclk(struct snd_soc_dai *codec_dai, int clk_id, 642 unsigned int freq, int dir) 643 { 644 struct snd_soc_component *component = codec_dai->component; 645 struct es8311_priv *es8311 = snd_soc_component_get_drvdata(component); 646 647 if (freq > ES8311_MCLK_MAX_FREQ) { 648 dev_err(component->dev, "invalid frequency %u: too high\n", 649 freq); 650 return -EINVAL; 651 } 652 653 if (es8311->mclk_freq == freq) 654 return 0; 655 656 es8311->mclk_freq = freq; 657 es8311->constraints.list = NULL; 658 es8311->constraints.count = 0; 659 660 if (freq == 0) 661 return 0; 662 663 int ret = clk_set_rate(es8311->mclk, freq); 664 if (ret) { 665 dev_err(component->dev, "unable to set mclk rate\n"); 666 return ret; 667 } 668 669 es8311_set_sysclk_constraints(freq, es8311); 670 671 return ret; 672 } 673 674 static int es8311_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) 675 { 676 struct snd_soc_component *component = codec_dai->component; 677 struct es8311_priv *es8311 = snd_soc_component_get_drvdata(component); 678 679 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 680 case SND_SOC_DAIFMT_CBP_CFP: 681 /* Master mode */ 682 es8311->provider = true; 683 684 snd_soc_component_update_bits(component, ES8311_RESET, 685 ES8311_RESET_MSC, 686 ES8311_RESET_MSC); 687 break; 688 case SND_SOC_DAIFMT_CBC_CFC: 689 /* Slave mode */ 690 es8311->provider = false; 691 snd_soc_component_update_bits(component, ES8311_RESET, 692 ES8311_RESET_MSC, 0); 693 break; 694 default: 695 return -EINVAL; 696 } 697 698 unsigned int sdp = 0; 699 700 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 701 case SND_SOC_DAIFMT_I2S: 702 sdp |= ES8311_SDP_FMT_I2S; 703 break; 704 case SND_SOC_DAIFMT_LEFT_J: 705 sdp |= ES8311_SDP_FMT_LEFT_J; 706 break; 707 case SND_SOC_DAIFMT_RIGHT_J: 708 dev_err(component->dev, "right justified mode not supported\n"); 709 return -EINVAL; 710 case SND_SOC_DAIFMT_DSP_B: 711 sdp |= ES8311_SDP_LRP; 712 fallthrough; 713 case SND_SOC_DAIFMT_DSP_A: 714 sdp |= ES8311_SDP_FMT_DSP; 715 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 716 case SND_SOC_DAIFMT_NB_NF: 717 case SND_SOC_DAIFMT_IB_NF: 718 break; 719 default: 720 dev_err(component->dev, 721 "inverted fsync not supported in dsp mode\n"); 722 return -EINVAL; 723 } 724 break; 725 default: 726 return -EINVAL; 727 } 728 729 unsigned int clkmgr = 0; 730 731 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 732 case SND_SOC_DAIFMT_NB_NF: 733 break; 734 case SND_SOC_DAIFMT_NB_IF: 735 sdp |= ES8311_SDP_LRP; 736 break; 737 case SND_SOC_DAIFMT_IB_NF: 738 clkmgr |= ES8311_CLKMGR6_BCLK_INV; 739 break; 740 case SND_SOC_DAIFMT_IB_IF: 741 clkmgr |= ES8311_CLKMGR6_BCLK_INV; 742 sdp |= ES8311_SDP_LRP; 743 break; 744 default: 745 return -EINVAL; 746 } 747 748 unsigned int mask = ES8311_CLKMGR6_BCLK_INV; 749 750 snd_soc_component_update_bits(component, ES8311_CLKMGR6, mask, clkmgr); 751 752 mask = ES8311_SDP_FMT_MASK | ES8311_SDP_LRP; 753 snd_soc_component_update_bits(component, ES8311_SDP_IN, mask, sdp); 754 snd_soc_component_update_bits(component, ES8311_SDP_OUT, mask, sdp); 755 756 return 0; 757 } 758 759 static int es8311_set_bias_level(struct snd_soc_component *component, 760 enum snd_soc_bias_level level) 761 { 762 struct es8311_priv *es8311 = snd_soc_component_get_drvdata(component); 763 764 switch (level) { 765 case SND_SOC_BIAS_ON: 766 break; 767 case SND_SOC_BIAS_PREPARE: 768 break; 769 case SND_SOC_BIAS_STANDBY: 770 if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { 771 int ret = clk_prepare_enable(es8311->mclk); 772 if (ret) { 773 dev_err(component->dev, 774 "unable to prepare mclk\n"); 775 return ret; 776 } 777 778 snd_soc_component_update_bits( 779 component, ES8311_SYS3, 780 ES8311_SYS3_PDN_VMIDSEL_MASK, 781 ES8311_SYS3_PDN_VMIDSEL_STARTUP_NORMAL_SPEED); 782 } 783 784 break; 785 case SND_SOC_BIAS_OFF: 786 clk_disable_unprepare(es8311->mclk); 787 snd_soc_component_update_bits( 788 component, ES8311_SYS3, ES8311_SYS3_PDN_VMIDSEL_MASK, 789 ES8311_SYS3_PDN_VMIDSEL_POWER_DOWN); 790 break; 791 default: 792 break; 793 } 794 return 0; 795 } 796 797 static const struct snd_soc_dai_ops es8311_dai_ops = { 798 .startup = es8311_startup, 799 .hw_params = es8311_hw_params, 800 .mute_stream = es8311_mute, 801 .set_sysclk = es8311_set_sysclk, 802 .set_fmt = es8311_set_dai_fmt, 803 .no_capture_mute = 1, 804 }; 805 806 static struct snd_soc_dai_driver es8311_dai = { 807 .name = "es8311", 808 .playback = { 809 .stream_name = "AIF1 Playback", 810 .channels_min = 1, 811 .channels_max = 2, 812 .rates = ES8311_RATES, 813 .formats = ES8311_FORMATS, 814 }, 815 .capture = { 816 .stream_name = "AIF1 Capture", 817 .channels_min = 1, 818 .channels_max = 2, 819 .rates = ES8311_RATES, 820 .formats = ES8311_FORMATS, 821 }, 822 .ops = &es8311_dai_ops, 823 .symmetric_rate = 1, 824 }; 825 826 static void es8311_reset(struct snd_soc_component *component, bool reset) 827 { 828 /* Reset procedure: 829 * (1) power down state machine and reset codec blocks then, 830 * (2) after a short delay, power up state machine and leave reset mode. 831 * Specific delay is not documented, using the same as es8316. 832 */ 833 unsigned int mask = ES8311_RESET_CSM_ON | ES8311_RESET_RST_MASK; 834 835 if (reset) { 836 /* Enter reset mode */ 837 snd_soc_component_update_bits(component, ES8311_RESET, mask, 838 ES8311_RESET_RST_MASK); 839 } else { 840 /* Leave reset mode */ 841 usleep_range(5000, 5500); 842 snd_soc_component_update_bits(component, ES8311_RESET, mask, 843 ES8311_RESET_CSM_ON); 844 } 845 } 846 847 static int es8311_suspend(struct snd_soc_component *component) 848 { 849 struct es8311_priv *es8311; 850 851 es8311 = snd_soc_component_get_drvdata(component); 852 853 es8311_reset(component, true); 854 855 regcache_cache_only(es8311->regmap, true); 856 regcache_mark_dirty(es8311->regmap); 857 858 return 0; 859 } 860 861 static int es8311_resume(struct snd_soc_component *component) 862 { 863 struct es8311_priv *es8311; 864 865 es8311 = snd_soc_component_get_drvdata(component); 866 867 es8311_reset(component, false); 868 869 regcache_cache_only(es8311->regmap, false); 870 regcache_sync(es8311->regmap); 871 872 return 0; 873 } 874 875 static int es8311_component_probe(struct snd_soc_component *component) 876 { 877 struct es8311_priv *es8311; 878 879 es8311 = snd_soc_component_get_drvdata(component); 880 881 es8311->mclk = devm_clk_get_optional(component->dev, "mclk"); 882 if (IS_ERR(es8311->mclk)) { 883 dev_err(component->dev, "invalid mclk\n"); 884 return PTR_ERR(es8311->mclk); 885 } 886 887 es8311->mclk_freq = clk_get_rate(es8311->mclk); 888 if (es8311->mclk_freq > 0 && es8311->mclk_freq < ES8311_MCLK_MAX_FREQ) 889 es8311_set_sysclk_constraints(es8311->mclk_freq, es8311); 890 891 es8311_reset(component, true); 892 es8311_reset(component, false); 893 894 /* Set minimal power up time */ 895 snd_soc_component_write(component, ES8311_SYS1, 0); 896 snd_soc_component_write(component, ES8311_SYS2, 0); 897 898 return 0; 899 } 900 901 static const struct regmap_config es8311_regmap_config = { 902 .reg_bits = 8, 903 .val_bits = 8, 904 .max_register = ES8311_REG_MAX, 905 .cache_type = REGCACHE_MAPLE, 906 .use_single_read = true, 907 .use_single_write = true, 908 }; 909 910 static const struct snd_soc_component_driver es8311_component_driver = { 911 .probe = es8311_component_probe, 912 .suspend = es8311_suspend, 913 .resume = es8311_resume, 914 .set_bias_level = es8311_set_bias_level, 915 .controls = es8311_snd_controls, 916 .num_controls = ARRAY_SIZE(es8311_snd_controls), 917 .dapm_widgets = es8311_dapm_widgets, 918 .num_dapm_widgets = ARRAY_SIZE(es8311_dapm_widgets), 919 .dapm_routes = es8311_dapm_routes, 920 .num_dapm_routes = ARRAY_SIZE(es8311_dapm_routes), 921 .use_pmdown_time = 1, 922 .endianness = 1, 923 }; 924 925 static int es8311_i2c_probe(struct i2c_client *i2c_client) 926 { 927 struct es8311_priv *es8311; 928 929 struct device *dev = &i2c_client->dev; 930 931 es8311 = devm_kzalloc(dev, sizeof(*es8311), GFP_KERNEL); 932 if (es8311 == NULL) 933 return -ENOMEM; 934 935 es8311->regmap = 936 devm_regmap_init_i2c(i2c_client, &es8311_regmap_config); 937 if (IS_ERR(es8311->regmap)) 938 return PTR_ERR(es8311->regmap); 939 940 i2c_set_clientdata(i2c_client, es8311); 941 942 return devm_snd_soc_register_component(dev, &es8311_component_driver, 943 &es8311_dai, 1); 944 } 945 946 static const struct i2c_device_id es8311_id[] = { 947 { "es8311" }, 948 { } 949 }; 950 MODULE_DEVICE_TABLE(i2c, es8311_id); 951 952 static const struct of_device_id es8311_of_match[] = { 953 { 954 .compatible = "everest,es8311", 955 }, 956 {} 957 }; 958 MODULE_DEVICE_TABLE(of, es8311_of_match); 959 960 static struct i2c_driver es8311_i2c_driver = { 961 .driver = { 962 .name = "es8311", 963 .of_match_table = es8311_of_match, 964 }, 965 .probe = es8311_i2c_probe, 966 .id_table = es8311_id, 967 }; 968 969 module_i2c_driver(es8311_i2c_driver); 970 971 MODULE_DESCRIPTION("ASoC ES8311 driver"); 972 MODULE_AUTHOR("Matteo Martelli <matteomartelli3@gmail.com>"); 973 MODULE_LICENSE("GPL"); 974
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.