1 // SPDX-License-Identifier: GPL-2.0-only
3 * es8316.c -- es8316 ALSA SoC audio driver
4 * Copyright Everest Semiconductor Co.,Ltd
6 * Authors: David Yang <yangxiaohua@everest-semi.com>,
7 * Daniel Drake <drake@endlessm.com>
10 #include <linux/module.h>
11 #include <linux/acpi.h>
12 #include <linux/clk.h>
13 #include <linux/delay.h>
14 #include <linux/i2c.h>
15 #include <linux/mod_devicetable.h>
16 #include <linux/mutex.h>
17 #include <linux/regmap.h>
18 #include <sound/pcm.h>
19 #include <sound/pcm_params.h>
20 #include <sound/soc.h>
21 #include <sound/soc-dapm.h>
22 #include <sound/tlv.h>
23 #include <sound/jack.h>
26 /* In slave mode at single speed, the codec is documented as accepting 5
27 * MCLK/LRCK ratios, but we also add ratio 400, which is commonly used on
28 * Intel Cherry Trail platforms (19.2MHz MCLK, 48kHz LRCK).
30 #define NR_SUPPORTED_MCLK_LRCK_RATIOS 6
31 static const unsigned int supported_mclk_lrck_ratios[] = {
32 256, 384, 400, 512, 768, 1024
38 struct regmap *regmap;
39 struct snd_soc_component *component;
40 struct snd_soc_jack *jack;
43 unsigned int allowed_rates[NR_SUPPORTED_MCLK_LRCK_RATIOS];
44 struct snd_pcm_hw_constraint_list sysclk_constraints;
51 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(dac_vol_tlv, -9600, 50, 1);
52 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(adc_vol_tlv, -9600, 50, 1);
53 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(alc_max_gain_tlv, -650, 150, 0);
54 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(alc_min_gain_tlv, -1200, 150, 0);
55 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(alc_target_tlv, -1650, 150, 0);
56 static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(hpmixer_gain_tlv,
57 0, 4, TLV_DB_SCALE_ITEM(-1200, 150, 0),
58 8, 11, TLV_DB_SCALE_ITEM(-450, 150, 0),
61 static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(adc_pga_gain_tlv,
62 0, 0, TLV_DB_SCALE_ITEM(-350, 0, 0),
63 1, 1, TLV_DB_SCALE_ITEM(0, 0, 0),
64 2, 2, TLV_DB_SCALE_ITEM(250, 0, 0),
65 3, 3, TLV_DB_SCALE_ITEM(450, 0, 0),
66 4, 7, TLV_DB_SCALE_ITEM(700, 300, 0),
67 8, 10, TLV_DB_SCALE_ITEM(1800, 300, 0),
70 static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(hpout_vol_tlv,
71 0, 0, TLV_DB_SCALE_ITEM(-4800, 0, 0),
72 1, 3, TLV_DB_SCALE_ITEM(-2400, 1200, 0),
75 static const char * const ng_type_txt[] =
76 { "Constant PGA Gain", "Mute ADC Output" };
77 static const struct soc_enum ng_type =
78 SOC_ENUM_SINGLE(ES8316_ADC_ALC_NG, 6, 2, ng_type_txt);
80 static const char * const adcpol_txt[] = { "Normal", "Invert" };
81 static const struct soc_enum adcpol =
82 SOC_ENUM_SINGLE(ES8316_ADC_MUTE, 1, 2, adcpol_txt);
83 static const char *const dacpol_txt[] =
84 { "Normal", "R Invert", "L Invert", "L + R Invert" };
85 static const struct soc_enum dacpol =
86 SOC_ENUM_SINGLE(ES8316_DAC_SET1, 0, 4, dacpol_txt);
88 static const struct snd_kcontrol_new es8316_snd_controls[] = {
89 SOC_DOUBLE_TLV("Headphone Playback Volume", ES8316_CPHP_ICAL_VOL,
90 4, 0, 3, 1, hpout_vol_tlv),
91 SOC_DOUBLE_TLV("Headphone Mixer Volume", ES8316_HPMIX_VOL,
92 4, 0, 11, 0, hpmixer_gain_tlv),
94 SOC_ENUM("Playback Polarity", dacpol),
95 SOC_DOUBLE_R_TLV("DAC Playback Volume", ES8316_DAC_VOLL,
96 ES8316_DAC_VOLR, 0, 0xc0, 1, dac_vol_tlv),
97 SOC_SINGLE("DAC Soft Ramp Switch", ES8316_DAC_SET1, 4, 1, 1),
98 SOC_SINGLE("DAC Soft Ramp Rate", ES8316_DAC_SET1, 2, 4, 0),
99 SOC_SINGLE("DAC Notch Filter Switch", ES8316_DAC_SET2, 6, 1, 0),
100 SOC_SINGLE("DAC Double Fs Switch", ES8316_DAC_SET2, 7, 1, 0),
101 SOC_SINGLE("DAC Stereo Enhancement", ES8316_DAC_SET3, 0, 7, 0),
102 SOC_SINGLE("DAC Mono Mix Switch", ES8316_DAC_SET3, 3, 1, 0),
104 SOC_ENUM("Capture Polarity", adcpol),
105 SOC_SINGLE("Mic Boost Switch", ES8316_ADC_D2SEPGA, 0, 1, 0),
106 SOC_SINGLE_TLV("ADC Capture Volume", ES8316_ADC_VOLUME,
107 0, 0xc0, 1, adc_vol_tlv),
108 SOC_SINGLE_TLV("ADC PGA Gain Volume", ES8316_ADC_PGAGAIN,
109 4, 10, 0, adc_pga_gain_tlv),
110 SOC_SINGLE("ADC Soft Ramp Switch", ES8316_ADC_MUTE, 4, 1, 0),
111 SOC_SINGLE("ADC Double Fs Switch", ES8316_ADC_DMIC, 4, 1, 0),
113 SOC_SINGLE("ALC Capture Switch", ES8316_ADC_ALC1, 6, 1, 0),
114 SOC_SINGLE_TLV("ALC Capture Max Volume", ES8316_ADC_ALC1, 0, 28, 0,
116 SOC_SINGLE_TLV("ALC Capture Min Volume", ES8316_ADC_ALC2, 0, 28, 0,
118 SOC_SINGLE_TLV("ALC Capture Target Volume", ES8316_ADC_ALC3, 4, 10, 0,
120 SOC_SINGLE("ALC Capture Hold Time", ES8316_ADC_ALC3, 0, 10, 0),
121 SOC_SINGLE("ALC Capture Decay Time", ES8316_ADC_ALC4, 4, 10, 0),
122 SOC_SINGLE("ALC Capture Attack Time", ES8316_ADC_ALC4, 0, 10, 0),
123 SOC_SINGLE("ALC Capture Noise Gate Switch", ES8316_ADC_ALC_NG,
125 SOC_SINGLE("ALC Capture Noise Gate Threshold", ES8316_ADC_ALC_NG,
127 SOC_ENUM("ALC Capture Noise Gate Type", ng_type),
130 /* Analog Input Mux */
131 static const char * const es8316_analog_in_txt[] = {
134 "lin1-rin1 with 20db Boost",
135 "lin2-rin2 with 20db Boost"
137 static const unsigned int es8316_analog_in_values[] = { 0, 1, 2, 3 };
138 static const struct soc_enum es8316_analog_input_enum =
139 SOC_VALUE_ENUM_SINGLE(ES8316_ADC_PDN_LINSEL, 4, 3,
140 ARRAY_SIZE(es8316_analog_in_txt),
141 es8316_analog_in_txt,
142 es8316_analog_in_values);
143 static const struct snd_kcontrol_new es8316_analog_in_mux_controls =
144 SOC_DAPM_ENUM("Route", es8316_analog_input_enum);
146 static const char * const es8316_dmic_txt[] = {
148 "dmic data at high level",
149 "dmic data at low level",
151 static const unsigned int es8316_dmic_values[] = { 0, 1, 2 };
152 static const struct soc_enum es8316_dmic_src_enum =
153 SOC_VALUE_ENUM_SINGLE(ES8316_ADC_DMIC, 0, 3,
154 ARRAY_SIZE(es8316_dmic_txt),
157 static const struct snd_kcontrol_new es8316_dmic_src_controls =
158 SOC_DAPM_ENUM("Route", es8316_dmic_src_enum);
161 static const char * const es8316_hpmux_texts[] = {
164 "lin-rin with Boost",
165 "lin-rin with Boost and PGA"
168 static SOC_ENUM_SINGLE_DECL(es8316_left_hpmux_enum, ES8316_HPMIX_SEL,
169 4, es8316_hpmux_texts);
171 static const struct snd_kcontrol_new es8316_left_hpmux_controls =
172 SOC_DAPM_ENUM("Route", es8316_left_hpmux_enum);
174 static SOC_ENUM_SINGLE_DECL(es8316_right_hpmux_enum, ES8316_HPMIX_SEL,
175 0, es8316_hpmux_texts);
177 static const struct snd_kcontrol_new es8316_right_hpmux_controls =
178 SOC_DAPM_ENUM("Route", es8316_right_hpmux_enum);
180 /* headphone Output Mixer */
181 static const struct snd_kcontrol_new es8316_out_left_mix[] = {
182 SOC_DAPM_SINGLE("LLIN Switch", ES8316_HPMIX_SWITCH, 6, 1, 0),
183 SOC_DAPM_SINGLE("Left DAC Switch", ES8316_HPMIX_SWITCH, 7, 1, 0),
185 static const struct snd_kcontrol_new es8316_out_right_mix[] = {
186 SOC_DAPM_SINGLE("RLIN Switch", ES8316_HPMIX_SWITCH, 2, 1, 0),
187 SOC_DAPM_SINGLE("Right DAC Switch", ES8316_HPMIX_SWITCH, 3, 1, 0),
190 /* DAC data source mux */
191 static const char * const es8316_dacsrc_texts[] = {
192 "LDATA TO LDAC, RDATA TO RDAC",
193 "LDATA TO LDAC, LDATA TO RDAC",
194 "RDATA TO LDAC, RDATA TO RDAC",
195 "RDATA TO LDAC, LDATA TO RDAC",
198 static SOC_ENUM_SINGLE_DECL(es8316_dacsrc_mux_enum, ES8316_DAC_SET1,
199 6, es8316_dacsrc_texts);
201 static const struct snd_kcontrol_new es8316_dacsrc_mux_controls =
202 SOC_DAPM_ENUM("Route", es8316_dacsrc_mux_enum);
204 static const struct snd_soc_dapm_widget es8316_dapm_widgets[] = {
205 SND_SOC_DAPM_SUPPLY("Bias", ES8316_SYS_PDN, 3, 1, NULL, 0),
206 SND_SOC_DAPM_SUPPLY("Analog power", ES8316_SYS_PDN, 4, 1, NULL, 0),
207 SND_SOC_DAPM_SUPPLY("Mic Bias", ES8316_SYS_PDN, 5, 1, NULL, 0),
209 SND_SOC_DAPM_INPUT("DMIC"),
210 SND_SOC_DAPM_INPUT("MIC1"),
211 SND_SOC_DAPM_INPUT("MIC2"),
214 SND_SOC_DAPM_MUX("Differential Mux", SND_SOC_NOPM, 0, 0,
215 &es8316_analog_in_mux_controls),
217 SND_SOC_DAPM_SUPPLY("ADC Vref", ES8316_SYS_PDN, 1, 1, NULL, 0),
218 SND_SOC_DAPM_SUPPLY("ADC bias", ES8316_SYS_PDN, 2, 1, NULL, 0),
219 SND_SOC_DAPM_SUPPLY("ADC Clock", ES8316_CLKMGR_CLKSW, 3, 0, NULL, 0),
220 SND_SOC_DAPM_PGA("Line input PGA", ES8316_ADC_PDN_LINSEL,
222 SND_SOC_DAPM_ADC("Mono ADC", NULL, ES8316_ADC_PDN_LINSEL, 6, 1),
223 SND_SOC_DAPM_MUX("Digital Mic Mux", SND_SOC_NOPM, 0, 0,
224 &es8316_dmic_src_controls),
226 /* Digital Interface */
227 SND_SOC_DAPM_AIF_OUT("I2S OUT", "I2S1 Capture", 1,
228 ES8316_SERDATA_ADC, 6, 1),
229 SND_SOC_DAPM_AIF_IN("I2S IN", "I2S1 Playback", 0,
232 SND_SOC_DAPM_MUX("DAC Source Mux", SND_SOC_NOPM, 0, 0,
233 &es8316_dacsrc_mux_controls),
235 SND_SOC_DAPM_SUPPLY("DAC Vref", ES8316_SYS_PDN, 0, 1, NULL, 0),
236 SND_SOC_DAPM_SUPPLY("DAC Clock", ES8316_CLKMGR_CLKSW, 2, 0, NULL, 0),
237 SND_SOC_DAPM_DAC("Right DAC", NULL, ES8316_DAC_PDN, 0, 1),
238 SND_SOC_DAPM_DAC("Left DAC", NULL, ES8316_DAC_PDN, 4, 1),
240 /* Headphone Output Side */
241 SND_SOC_DAPM_MUX("Left Headphone Mux", SND_SOC_NOPM, 0, 0,
242 &es8316_left_hpmux_controls),
243 SND_SOC_DAPM_MUX("Right Headphone Mux", SND_SOC_NOPM, 0, 0,
244 &es8316_right_hpmux_controls),
245 SND_SOC_DAPM_MIXER("Left Headphone Mixer", ES8316_HPMIX_PDN,
246 5, 1, &es8316_out_left_mix[0],
247 ARRAY_SIZE(es8316_out_left_mix)),
248 SND_SOC_DAPM_MIXER("Right Headphone Mixer", ES8316_HPMIX_PDN,
249 1, 1, &es8316_out_right_mix[0],
250 ARRAY_SIZE(es8316_out_right_mix)),
251 SND_SOC_DAPM_PGA("Left Headphone Mixer Out", ES8316_HPMIX_PDN,
253 SND_SOC_DAPM_PGA("Right Headphone Mixer Out", ES8316_HPMIX_PDN,
256 SND_SOC_DAPM_OUT_DRV("Left Headphone Charge Pump", ES8316_CPHP_OUTEN,
258 SND_SOC_DAPM_OUT_DRV("Right Headphone Charge Pump", ES8316_CPHP_OUTEN,
260 SND_SOC_DAPM_SUPPLY("Headphone Charge Pump", ES8316_CPHP_PDN2,
262 SND_SOC_DAPM_SUPPLY("Headphone Charge Pump Clock", ES8316_CLKMGR_CLKSW,
265 SND_SOC_DAPM_OUT_DRV("Left Headphone Driver", ES8316_CPHP_OUTEN,
267 SND_SOC_DAPM_OUT_DRV("Right Headphone Driver", ES8316_CPHP_OUTEN,
269 SND_SOC_DAPM_SUPPLY("Headphone Out", ES8316_CPHP_PDN1, 2, 1, NULL, 0),
271 /* pdn_Lical and pdn_Rical bits are documented as Reserved, but must
272 * be explicitly unset in order to enable HP output
274 SND_SOC_DAPM_SUPPLY("Left Headphone ical", ES8316_CPHP_ICAL_VOL,
276 SND_SOC_DAPM_SUPPLY("Right Headphone ical", ES8316_CPHP_ICAL_VOL,
279 SND_SOC_DAPM_OUTPUT("HPOL"),
280 SND_SOC_DAPM_OUTPUT("HPOR"),
283 static const struct snd_soc_dapm_route es8316_dapm_routes[] = {
285 {"MIC1", NULL, "Mic Bias"},
286 {"MIC2", NULL, "Mic Bias"},
287 {"MIC1", NULL, "Bias"},
288 {"MIC2", NULL, "Bias"},
289 {"MIC1", NULL, "Analog power"},
290 {"MIC2", NULL, "Analog power"},
292 {"Differential Mux", "lin1-rin1", "MIC1"},
293 {"Differential Mux", "lin2-rin2", "MIC2"},
294 {"Line input PGA", NULL, "Differential Mux"},
296 {"Mono ADC", NULL, "ADC Clock"},
297 {"Mono ADC", NULL, "ADC Vref"},
298 {"Mono ADC", NULL, "ADC bias"},
299 {"Mono ADC", NULL, "Line input PGA"},
301 /* It's not clear why, but to avoid recording only silence,
302 * the DAC clock must be running for the ADC to work.
304 {"Mono ADC", NULL, "DAC Clock"},
306 {"Digital Mic Mux", "dmic disable", "Mono ADC"},
308 {"I2S OUT", NULL, "Digital Mic Mux"},
311 {"DAC Source Mux", "LDATA TO LDAC, RDATA TO RDAC", "I2S IN"},
313 {"Left DAC", NULL, "DAC Clock"},
314 {"Right DAC", NULL, "DAC Clock"},
316 {"Left DAC", NULL, "DAC Vref"},
317 {"Right DAC", NULL, "DAC Vref"},
319 {"Left DAC", NULL, "DAC Source Mux"},
320 {"Right DAC", NULL, "DAC Source Mux"},
322 {"Left Headphone Mux", "lin-rin with Boost and PGA", "Line input PGA"},
323 {"Right Headphone Mux", "lin-rin with Boost and PGA", "Line input PGA"},
325 {"Left Headphone Mixer", "LLIN Switch", "Left Headphone Mux"},
326 {"Left Headphone Mixer", "Left DAC Switch", "Left DAC"},
328 {"Right Headphone Mixer", "RLIN Switch", "Right Headphone Mux"},
329 {"Right Headphone Mixer", "Right DAC Switch", "Right DAC"},
331 {"Left Headphone Mixer Out", NULL, "Left Headphone Mixer"},
332 {"Right Headphone Mixer Out", NULL, "Right Headphone Mixer"},
334 {"Left Headphone Charge Pump", NULL, "Left Headphone Mixer Out"},
335 {"Right Headphone Charge Pump", NULL, "Right Headphone Mixer Out"},
337 {"Left Headphone Charge Pump", NULL, "Headphone Charge Pump"},
338 {"Right Headphone Charge Pump", NULL, "Headphone Charge Pump"},
340 {"Left Headphone Charge Pump", NULL, "Headphone Charge Pump Clock"},
341 {"Right Headphone Charge Pump", NULL, "Headphone Charge Pump Clock"},
343 {"Left Headphone Driver", NULL, "Left Headphone Charge Pump"},
344 {"Right Headphone Driver", NULL, "Right Headphone Charge Pump"},
346 {"HPOL", NULL, "Left Headphone Driver"},
347 {"HPOR", NULL, "Right Headphone Driver"},
349 {"HPOL", NULL, "Left Headphone ical"},
350 {"HPOR", NULL, "Right Headphone ical"},
352 {"Headphone Out", NULL, "Bias"},
353 {"Headphone Out", NULL, "Analog power"},
354 {"HPOL", NULL, "Headphone Out"},
355 {"HPOR", NULL, "Headphone Out"},
358 static int es8316_set_dai_sysclk(struct snd_soc_dai *codec_dai,
359 int clk_id, unsigned int freq, int dir)
361 struct snd_soc_component *component = codec_dai->component;
362 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
366 es8316->sysclk = freq;
369 es8316->sysclk_constraints.list = NULL;
370 es8316->sysclk_constraints.count = 0;
375 ret = clk_set_rate(es8316->mclk, freq);
379 /* Limit supported sample rates to ones that can be autodetected
380 * by the codec running in slave mode.
382 for (i = 0; i < NR_SUPPORTED_MCLK_LRCK_RATIOS; i++) {
383 const unsigned int ratio = supported_mclk_lrck_ratios[i];
385 if (freq % ratio == 0)
386 es8316->allowed_rates[count++] = freq / ratio;
389 es8316->sysclk_constraints.list = es8316->allowed_rates;
390 es8316->sysclk_constraints.count = count;
395 static int es8316_set_dai_fmt(struct snd_soc_dai *codec_dai,
398 struct snd_soc_component *component = codec_dai->component;
404 if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) {
405 dev_err(component->dev, "Codec driver only supports slave mode\n");
409 if ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) != SND_SOC_DAIFMT_I2S) {
410 dev_err(component->dev, "Codec driver only supports I2S format\n");
414 /* Clock inversion */
415 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
416 case SND_SOC_DAIFMT_NB_NF:
418 case SND_SOC_DAIFMT_IB_IF:
419 serdata1 |= ES8316_SERDATA1_BCLK_INV;
420 serdata2 |= ES8316_SERDATA2_ADCLRP;
422 case SND_SOC_DAIFMT_IB_NF:
423 serdata1 |= ES8316_SERDATA1_BCLK_INV;
425 case SND_SOC_DAIFMT_NB_IF:
426 serdata2 |= ES8316_SERDATA2_ADCLRP;
432 mask = ES8316_SERDATA1_MASTER | ES8316_SERDATA1_BCLK_INV;
433 snd_soc_component_update_bits(component, ES8316_SERDATA1, mask, serdata1);
435 mask = ES8316_SERDATA2_FMT_MASK | ES8316_SERDATA2_ADCLRP;
436 snd_soc_component_update_bits(component, ES8316_SERDATA_ADC, mask, serdata2);
437 snd_soc_component_update_bits(component, ES8316_SERDATA_DAC, mask, serdata2);
439 /* Enable BCLK and MCLK inputs in slave mode */
440 clksw = ES8316_CLKMGR_CLKSW_MCLK_ON | ES8316_CLKMGR_CLKSW_BCLK_ON;
441 snd_soc_component_update_bits(component, ES8316_CLKMGR_CLKSW, clksw, clksw);
446 static int es8316_pcm_startup(struct snd_pcm_substream *substream,
447 struct snd_soc_dai *dai)
449 struct snd_soc_component *component = dai->component;
450 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
452 if (es8316->sysclk_constraints.list)
453 snd_pcm_hw_constraint_list(substream->runtime, 0,
454 SNDRV_PCM_HW_PARAM_RATE,
455 &es8316->sysclk_constraints);
460 static int es8316_pcm_hw_params(struct snd_pcm_substream *substream,
461 struct snd_pcm_hw_params *params,
462 struct snd_soc_dai *dai)
464 struct snd_soc_component *component = dai->component;
465 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
469 /* Validate supported sample rates that are autodetected from MCLK */
470 for (i = 0; i < NR_SUPPORTED_MCLK_LRCK_RATIOS; i++) {
471 const unsigned int ratio = supported_mclk_lrck_ratios[i];
473 if (es8316->sysclk % ratio != 0)
475 if (es8316->sysclk / ratio == params_rate(params))
478 if (i == NR_SUPPORTED_MCLK_LRCK_RATIOS)
481 switch (params_format(params)) {
482 case SNDRV_PCM_FORMAT_S16_LE:
483 wordlen = ES8316_SERDATA2_LEN_16;
485 case SNDRV_PCM_FORMAT_S20_3LE:
486 wordlen = ES8316_SERDATA2_LEN_20;
488 case SNDRV_PCM_FORMAT_S24_LE:
489 wordlen = ES8316_SERDATA2_LEN_24;
491 case SNDRV_PCM_FORMAT_S32_LE:
492 wordlen = ES8316_SERDATA2_LEN_32;
498 snd_soc_component_update_bits(component, ES8316_SERDATA_DAC,
499 ES8316_SERDATA2_LEN_MASK, wordlen);
500 snd_soc_component_update_bits(component, ES8316_SERDATA_ADC,
501 ES8316_SERDATA2_LEN_MASK, wordlen);
505 static int es8316_mute(struct snd_soc_dai *dai, int mute, int direction)
507 snd_soc_component_update_bits(dai->component, ES8316_DAC_SET1, 0x20,
512 #define ES8316_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
513 SNDRV_PCM_FMTBIT_S24_LE)
515 static const struct snd_soc_dai_ops es8316_ops = {
516 .startup = es8316_pcm_startup,
517 .hw_params = es8316_pcm_hw_params,
518 .set_fmt = es8316_set_dai_fmt,
519 .set_sysclk = es8316_set_dai_sysclk,
520 .mute_stream = es8316_mute,
521 .no_capture_mute = 1,
524 static struct snd_soc_dai_driver es8316_dai = {
525 .name = "ES8316 HiFi",
527 .stream_name = "Playback",
530 .rates = SNDRV_PCM_RATE_8000_48000,
531 .formats = ES8316_FORMATS,
534 .stream_name = "Capture",
537 .rates = SNDRV_PCM_RATE_8000_48000,
538 .formats = ES8316_FORMATS,
541 .symmetric_rates = 1,
544 static void es8316_enable_micbias_for_mic_gnd_short_detect(
545 struct snd_soc_component *component)
547 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
549 snd_soc_dapm_mutex_lock(dapm);
550 snd_soc_dapm_force_enable_pin_unlocked(dapm, "Bias");
551 snd_soc_dapm_force_enable_pin_unlocked(dapm, "Analog power");
552 snd_soc_dapm_force_enable_pin_unlocked(dapm, "Mic Bias");
553 snd_soc_dapm_sync_unlocked(dapm);
554 snd_soc_dapm_mutex_unlock(dapm);
559 static void es8316_disable_micbias_for_mic_gnd_short_detect(
560 struct snd_soc_component *component)
562 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
564 snd_soc_dapm_mutex_lock(dapm);
565 snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Bias");
566 snd_soc_dapm_disable_pin_unlocked(dapm, "Analog power");
567 snd_soc_dapm_disable_pin_unlocked(dapm, "Bias");
568 snd_soc_dapm_sync_unlocked(dapm);
569 snd_soc_dapm_mutex_unlock(dapm);
572 static irqreturn_t es8316_irq(int irq, void *data)
574 struct es8316_priv *es8316 = data;
575 struct snd_soc_component *comp = es8316->component;
578 mutex_lock(&es8316->lock);
580 regmap_read(es8316->regmap, ES8316_GPIO_FLAG, &flags);
582 goto out; /* Powered-down / reset */
584 /* Catch spurious IRQ before set_jack is called */
588 if (es8316->jd_inverted)
589 flags ^= ES8316_GPIO_FLAG_HP_NOT_INSERTED;
591 dev_dbg(comp->dev, "gpio flags %#04x\n", flags);
592 if (flags & ES8316_GPIO_FLAG_HP_NOT_INSERTED) {
593 /* Jack removed, or spurious IRQ? */
594 if (es8316->jack->status & SND_JACK_MICROPHONE)
595 es8316_disable_micbias_for_mic_gnd_short_detect(comp);
597 if (es8316->jack->status & SND_JACK_HEADPHONE) {
598 snd_soc_jack_report(es8316->jack, 0,
599 SND_JACK_HEADSET | SND_JACK_BTN_0);
600 dev_dbg(comp->dev, "jack unplugged\n");
602 } else if (!(es8316->jack->status & SND_JACK_HEADPHONE)) {
603 /* Jack inserted, determine type */
604 es8316_enable_micbias_for_mic_gnd_short_detect(comp);
605 regmap_read(es8316->regmap, ES8316_GPIO_FLAG, &flags);
606 if (es8316->jd_inverted)
607 flags ^= ES8316_GPIO_FLAG_HP_NOT_INSERTED;
608 dev_dbg(comp->dev, "gpio flags %#04x\n", flags);
609 if (flags & ES8316_GPIO_FLAG_HP_NOT_INSERTED) {
610 /* Jack unplugged underneath us */
611 es8316_disable_micbias_for_mic_gnd_short_detect(comp);
612 } else if (flags & ES8316_GPIO_FLAG_GM_NOT_SHORTED) {
614 snd_soc_jack_report(es8316->jack,
617 /* Keep mic-gnd-short detection on for button press */
619 /* Shorted, headphones */
620 snd_soc_jack_report(es8316->jack,
623 /* No longer need mic-gnd-short detection */
624 es8316_disable_micbias_for_mic_gnd_short_detect(comp);
626 } else if (es8316->jack->status & SND_JACK_MICROPHONE) {
627 /* Interrupt while jack inserted, report button state */
628 if (flags & ES8316_GPIO_FLAG_GM_NOT_SHORTED) {
629 /* Open, button release */
630 snd_soc_jack_report(es8316->jack, 0, SND_JACK_BTN_0);
632 /* Short, button press */
633 snd_soc_jack_report(es8316->jack,
640 mutex_unlock(&es8316->lock);
644 static void es8316_enable_jack_detect(struct snd_soc_component *component,
645 struct snd_soc_jack *jack)
647 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
650 * Init es8316->jd_inverted here and not in the probe, as we cannot
651 * guarantee that the bytchr-es8316 driver, which might set this
652 * property, will probe before us.
654 es8316->jd_inverted = device_property_read_bool(component->dev,
655 "everest,jack-detect-inverted");
657 mutex_lock(&es8316->lock);
661 if (es8316->jack->status & SND_JACK_MICROPHONE)
662 es8316_enable_micbias_for_mic_gnd_short_detect(component);
664 snd_soc_component_update_bits(component, ES8316_GPIO_DEBOUNCE,
665 ES8316_GPIO_ENABLE_INTERRUPT,
666 ES8316_GPIO_ENABLE_INTERRUPT);
668 mutex_unlock(&es8316->lock);
670 /* Enable irq and sync initial jack state */
671 enable_irq(es8316->irq);
672 es8316_irq(es8316->irq, es8316);
675 static void es8316_disable_jack_detect(struct snd_soc_component *component)
677 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
679 disable_irq(es8316->irq);
681 mutex_lock(&es8316->lock);
683 snd_soc_component_update_bits(component, ES8316_GPIO_DEBOUNCE,
684 ES8316_GPIO_ENABLE_INTERRUPT, 0);
686 if (es8316->jack->status & SND_JACK_MICROPHONE) {
687 es8316_disable_micbias_for_mic_gnd_short_detect(component);
688 snd_soc_jack_report(es8316->jack, 0, SND_JACK_BTN_0);
693 mutex_unlock(&es8316->lock);
696 static int es8316_set_jack(struct snd_soc_component *component,
697 struct snd_soc_jack *jack, void *data)
700 es8316_enable_jack_detect(component, jack);
702 es8316_disable_jack_detect(component);
707 static int es8316_probe(struct snd_soc_component *component)
709 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
712 es8316->component = component;
714 es8316->mclk = devm_clk_get_optional(component->dev, "mclk");
715 if (IS_ERR(es8316->mclk)) {
716 dev_err(component->dev, "unable to get mclk\n");
717 return PTR_ERR(es8316->mclk);
720 dev_warn(component->dev, "assuming static mclk\n");
722 ret = clk_prepare_enable(es8316->mclk);
724 dev_err(component->dev, "unable to enable mclk\n");
728 /* Reset codec and enable current state machine */
729 snd_soc_component_write(component, ES8316_RESET, 0x3f);
730 usleep_range(5000, 5500);
731 snd_soc_component_write(component, ES8316_RESET, ES8316_RESET_CSM_ON);
735 * Documentation is unclear, but this value from the vendor driver is
736 * needed otherwise audio output is silent.
738 snd_soc_component_write(component, ES8316_SYS_VMIDSEL, 0xff);
741 * Documentation for this register is unclear and incomplete,
742 * but here is a vendor-provided value that improves volume
743 * and quality for Intel CHT platforms.
745 snd_soc_component_write(component, ES8316_CLKMGR_ADCOSR, 0x32);
750 static void es8316_remove(struct snd_soc_component *component)
752 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
754 clk_disable_unprepare(es8316->mclk);
757 static const struct snd_soc_component_driver soc_component_dev_es8316 = {
758 .probe = es8316_probe,
759 .remove = es8316_remove,
760 .set_jack = es8316_set_jack,
761 .controls = es8316_snd_controls,
762 .num_controls = ARRAY_SIZE(es8316_snd_controls),
763 .dapm_widgets = es8316_dapm_widgets,
764 .num_dapm_widgets = ARRAY_SIZE(es8316_dapm_widgets),
765 .dapm_routes = es8316_dapm_routes,
766 .num_dapm_routes = ARRAY_SIZE(es8316_dapm_routes),
767 .use_pmdown_time = 1,
769 .non_legacy_dai_naming = 1,
772 static const struct regmap_range es8316_volatile_ranges[] = {
773 regmap_reg_range(ES8316_GPIO_FLAG, ES8316_GPIO_FLAG),
776 static const struct regmap_access_table es8316_volatile_table = {
777 .yes_ranges = es8316_volatile_ranges,
778 .n_yes_ranges = ARRAY_SIZE(es8316_volatile_ranges),
781 static const struct regmap_config es8316_regmap = {
784 .max_register = 0x53,
785 .volatile_table = &es8316_volatile_table,
786 .cache_type = REGCACHE_RBTREE,
789 static int es8316_i2c_probe(struct i2c_client *i2c_client,
790 const struct i2c_device_id *id)
792 struct device *dev = &i2c_client->dev;
793 struct es8316_priv *es8316;
796 es8316 = devm_kzalloc(&i2c_client->dev, sizeof(struct es8316_priv),
801 i2c_set_clientdata(i2c_client, es8316);
803 es8316->regmap = devm_regmap_init_i2c(i2c_client, &es8316_regmap);
804 if (IS_ERR(es8316->regmap))
805 return PTR_ERR(es8316->regmap);
807 es8316->irq = i2c_client->irq;
808 mutex_init(&es8316->lock);
810 ret = devm_request_threaded_irq(dev, es8316->irq, NULL, es8316_irq,
811 IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
814 /* Gets re-enabled by es8316_set_jack() */
815 disable_irq(es8316->irq);
817 dev_warn(dev, "Failed to get IRQ %d: %d\n", es8316->irq, ret);
818 es8316->irq = -ENXIO;
821 return devm_snd_soc_register_component(&i2c_client->dev,
822 &soc_component_dev_es8316,
826 static const struct i2c_device_id es8316_i2c_id[] = {
830 MODULE_DEVICE_TABLE(i2c, es8316_i2c_id);
832 static const struct of_device_id es8316_of_match[] = {
833 { .compatible = "everest,es8316", },
836 MODULE_DEVICE_TABLE(of, es8316_of_match);
839 static const struct acpi_device_id es8316_acpi_match[] = {
843 MODULE_DEVICE_TABLE(acpi, es8316_acpi_match);
846 static struct i2c_driver es8316_i2c_driver = {
849 .acpi_match_table = ACPI_PTR(es8316_acpi_match),
850 .of_match_table = of_match_ptr(es8316_of_match),
852 .probe = es8316_i2c_probe,
853 .id_table = es8316_i2c_id,
855 module_i2c_driver(es8316_i2c_driver);
857 MODULE_DESCRIPTION("Everest Semi ES8316 ALSA SoC Codec Driver");
858 MODULE_AUTHOR("David Yang <yangxiaohua@everest-semi.com>");
859 MODULE_LICENSE("GPL v2");