ARM: dts: omap5: Add bus_dma_limit for L3 bus
[linux/fpc-iii.git] / sound / soc / codecs / es8316.c
blob36eef1fb3d181e31d630cfa57b6698e55cc8a5c3
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
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>
8 */
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>
24 #include "es8316.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
35 struct es8316_priv {
36 struct mutex lock;
37 struct clk *mclk;
38 struct regmap *regmap;
39 struct snd_soc_component *component;
40 struct snd_soc_jack *jack;
41 int irq;
42 unsigned int sysclk;
43 unsigned int allowed_rates[NR_SUPPORTED_MCLK_LRCK_RATIOS];
44 struct snd_pcm_hw_constraint_list sysclk_constraints;
45 bool jd_inverted;
49 * ES8316 controls
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, 4, TLV_DB_SCALE_ITEM(700, 0, 0),
67 5, 5, TLV_DB_SCALE_ITEM(1000, 0, 0),
68 6, 6, TLV_DB_SCALE_ITEM(1300, 0, 0),
69 7, 7, TLV_DB_SCALE_ITEM(1600, 0, 0),
70 8, 8, TLV_DB_SCALE_ITEM(1800, 0, 0),
71 9, 9, TLV_DB_SCALE_ITEM(2100, 0, 0),
72 10, 10, TLV_DB_SCALE_ITEM(2400, 0, 0),
75 static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(hpout_vol_tlv,
76 0, 0, TLV_DB_SCALE_ITEM(-4800, 0, 0),
77 1, 3, TLV_DB_SCALE_ITEM(-2400, 1200, 0),
80 static const char * const ng_type_txt[] =
81 { "Constant PGA Gain", "Mute ADC Output" };
82 static const struct soc_enum ng_type =
83 SOC_ENUM_SINGLE(ES8316_ADC_ALC_NG, 6, 2, ng_type_txt);
85 static const char * const adcpol_txt[] = { "Normal", "Invert" };
86 static const struct soc_enum adcpol =
87 SOC_ENUM_SINGLE(ES8316_ADC_MUTE, 1, 2, adcpol_txt);
88 static const char *const dacpol_txt[] =
89 { "Normal", "R Invert", "L Invert", "L + R Invert" };
90 static const struct soc_enum dacpol =
91 SOC_ENUM_SINGLE(ES8316_DAC_SET1, 0, 4, dacpol_txt);
93 static const struct snd_kcontrol_new es8316_snd_controls[] = {
94 SOC_DOUBLE_TLV("Headphone Playback Volume", ES8316_CPHP_ICAL_VOL,
95 4, 0, 3, 1, hpout_vol_tlv),
96 SOC_DOUBLE_TLV("Headphone Mixer Volume", ES8316_HPMIX_VOL,
97 4, 0, 11, 0, hpmixer_gain_tlv),
99 SOC_ENUM("Playback Polarity", dacpol),
100 SOC_DOUBLE_R_TLV("DAC Playback Volume", ES8316_DAC_VOLL,
101 ES8316_DAC_VOLR, 0, 0xc0, 1, dac_vol_tlv),
102 SOC_SINGLE("DAC Soft Ramp Switch", ES8316_DAC_SET1, 4, 1, 1),
103 SOC_SINGLE("DAC Soft Ramp Rate", ES8316_DAC_SET1, 2, 4, 0),
104 SOC_SINGLE("DAC Notch Filter Switch", ES8316_DAC_SET2, 6, 1, 0),
105 SOC_SINGLE("DAC Double Fs Switch", ES8316_DAC_SET2, 7, 1, 0),
106 SOC_SINGLE("DAC Stereo Enhancement", ES8316_DAC_SET3, 0, 7, 0),
107 SOC_SINGLE("DAC Mono Mix Switch", ES8316_DAC_SET3, 3, 1, 0),
109 SOC_ENUM("Capture Polarity", adcpol),
110 SOC_SINGLE("Mic Boost Switch", ES8316_ADC_D2SEPGA, 0, 1, 0),
111 SOC_SINGLE_TLV("ADC Capture Volume", ES8316_ADC_VOLUME,
112 0, 0xc0, 1, adc_vol_tlv),
113 SOC_SINGLE_TLV("ADC PGA Gain Volume", ES8316_ADC_PGAGAIN,
114 4, 10, 0, adc_pga_gain_tlv),
115 SOC_SINGLE("ADC Soft Ramp Switch", ES8316_ADC_MUTE, 4, 1, 0),
116 SOC_SINGLE("ADC Double Fs Switch", ES8316_ADC_DMIC, 4, 1, 0),
118 SOC_SINGLE("ALC Capture Switch", ES8316_ADC_ALC1, 6, 1, 0),
119 SOC_SINGLE_TLV("ALC Capture Max Volume", ES8316_ADC_ALC1, 0, 28, 0,
120 alc_max_gain_tlv),
121 SOC_SINGLE_TLV("ALC Capture Min Volume", ES8316_ADC_ALC2, 0, 28, 0,
122 alc_min_gain_tlv),
123 SOC_SINGLE_TLV("ALC Capture Target Volume", ES8316_ADC_ALC3, 4, 10, 0,
124 alc_target_tlv),
125 SOC_SINGLE("ALC Capture Hold Time", ES8316_ADC_ALC3, 0, 10, 0),
126 SOC_SINGLE("ALC Capture Decay Time", ES8316_ADC_ALC4, 4, 10, 0),
127 SOC_SINGLE("ALC Capture Attack Time", ES8316_ADC_ALC4, 0, 10, 0),
128 SOC_SINGLE("ALC Capture Noise Gate Switch", ES8316_ADC_ALC_NG,
129 5, 1, 0),
130 SOC_SINGLE("ALC Capture Noise Gate Threshold", ES8316_ADC_ALC_NG,
131 0, 31, 0),
132 SOC_ENUM("ALC Capture Noise Gate Type", ng_type),
135 /* Analog Input Mux */
136 static const char * const es8316_analog_in_txt[] = {
137 "lin1-rin1",
138 "lin2-rin2",
139 "lin1-rin1 with 20db Boost",
140 "lin2-rin2 with 20db Boost"
142 static const unsigned int es8316_analog_in_values[] = { 0, 1, 2, 3 };
143 static const struct soc_enum es8316_analog_input_enum =
144 SOC_VALUE_ENUM_SINGLE(ES8316_ADC_PDN_LINSEL, 4, 3,
145 ARRAY_SIZE(es8316_analog_in_txt),
146 es8316_analog_in_txt,
147 es8316_analog_in_values);
148 static const struct snd_kcontrol_new es8316_analog_in_mux_controls =
149 SOC_DAPM_ENUM("Route", es8316_analog_input_enum);
151 static const char * const es8316_dmic_txt[] = {
152 "dmic disable",
153 "dmic data at high level",
154 "dmic data at low level",
156 static const unsigned int es8316_dmic_values[] = { 0, 1, 2 };
157 static const struct soc_enum es8316_dmic_src_enum =
158 SOC_VALUE_ENUM_SINGLE(ES8316_ADC_DMIC, 0, 3,
159 ARRAY_SIZE(es8316_dmic_txt),
160 es8316_dmic_txt,
161 es8316_dmic_values);
162 static const struct snd_kcontrol_new es8316_dmic_src_controls =
163 SOC_DAPM_ENUM("Route", es8316_dmic_src_enum);
165 /* hp mixer mux */
166 static const char * const es8316_hpmux_texts[] = {
167 "lin1-rin1",
168 "lin2-rin2",
169 "lin-rin with Boost",
170 "lin-rin with Boost and PGA"
173 static SOC_ENUM_SINGLE_DECL(es8316_left_hpmux_enum, ES8316_HPMIX_SEL,
174 4, es8316_hpmux_texts);
176 static const struct snd_kcontrol_new es8316_left_hpmux_controls =
177 SOC_DAPM_ENUM("Route", es8316_left_hpmux_enum);
179 static SOC_ENUM_SINGLE_DECL(es8316_right_hpmux_enum, ES8316_HPMIX_SEL,
180 0, es8316_hpmux_texts);
182 static const struct snd_kcontrol_new es8316_right_hpmux_controls =
183 SOC_DAPM_ENUM("Route", es8316_right_hpmux_enum);
185 /* headphone Output Mixer */
186 static const struct snd_kcontrol_new es8316_out_left_mix[] = {
187 SOC_DAPM_SINGLE("LLIN Switch", ES8316_HPMIX_SWITCH, 6, 1, 0),
188 SOC_DAPM_SINGLE("Left DAC Switch", ES8316_HPMIX_SWITCH, 7, 1, 0),
190 static const struct snd_kcontrol_new es8316_out_right_mix[] = {
191 SOC_DAPM_SINGLE("RLIN Switch", ES8316_HPMIX_SWITCH, 2, 1, 0),
192 SOC_DAPM_SINGLE("Right DAC Switch", ES8316_HPMIX_SWITCH, 3, 1, 0),
195 /* DAC data source mux */
196 static const char * const es8316_dacsrc_texts[] = {
197 "LDATA TO LDAC, RDATA TO RDAC",
198 "LDATA TO LDAC, LDATA TO RDAC",
199 "RDATA TO LDAC, RDATA TO RDAC",
200 "RDATA TO LDAC, LDATA TO RDAC",
203 static SOC_ENUM_SINGLE_DECL(es8316_dacsrc_mux_enum, ES8316_DAC_SET1,
204 6, es8316_dacsrc_texts);
206 static const struct snd_kcontrol_new es8316_dacsrc_mux_controls =
207 SOC_DAPM_ENUM("Route", es8316_dacsrc_mux_enum);
209 static const struct snd_soc_dapm_widget es8316_dapm_widgets[] = {
210 SND_SOC_DAPM_SUPPLY("Bias", ES8316_SYS_PDN, 3, 1, NULL, 0),
211 SND_SOC_DAPM_SUPPLY("Analog power", ES8316_SYS_PDN, 4, 1, NULL, 0),
212 SND_SOC_DAPM_SUPPLY("Mic Bias", ES8316_SYS_PDN, 5, 1, NULL, 0),
214 SND_SOC_DAPM_INPUT("DMIC"),
215 SND_SOC_DAPM_INPUT("MIC1"),
216 SND_SOC_DAPM_INPUT("MIC2"),
218 /* Input Mux */
219 SND_SOC_DAPM_MUX("Differential Mux", SND_SOC_NOPM, 0, 0,
220 &es8316_analog_in_mux_controls),
222 SND_SOC_DAPM_SUPPLY("ADC Vref", ES8316_SYS_PDN, 1, 1, NULL, 0),
223 SND_SOC_DAPM_SUPPLY("ADC bias", ES8316_SYS_PDN, 2, 1, NULL, 0),
224 SND_SOC_DAPM_SUPPLY("ADC Clock", ES8316_CLKMGR_CLKSW, 3, 0, NULL, 0),
225 SND_SOC_DAPM_PGA("Line input PGA", ES8316_ADC_PDN_LINSEL,
226 7, 1, NULL, 0),
227 SND_SOC_DAPM_ADC("Mono ADC", NULL, ES8316_ADC_PDN_LINSEL, 6, 1),
228 SND_SOC_DAPM_MUX("Digital Mic Mux", SND_SOC_NOPM, 0, 0,
229 &es8316_dmic_src_controls),
231 /* Digital Interface */
232 SND_SOC_DAPM_AIF_OUT("I2S OUT", "I2S1 Capture", 1,
233 ES8316_SERDATA_ADC, 6, 1),
234 SND_SOC_DAPM_AIF_IN("I2S IN", "I2S1 Playback", 0,
235 SND_SOC_NOPM, 0, 0),
237 SND_SOC_DAPM_MUX("DAC Source Mux", SND_SOC_NOPM, 0, 0,
238 &es8316_dacsrc_mux_controls),
240 SND_SOC_DAPM_SUPPLY("DAC Vref", ES8316_SYS_PDN, 0, 1, NULL, 0),
241 SND_SOC_DAPM_SUPPLY("DAC Clock", ES8316_CLKMGR_CLKSW, 2, 0, NULL, 0),
242 SND_SOC_DAPM_DAC("Right DAC", NULL, ES8316_DAC_PDN, 0, 1),
243 SND_SOC_DAPM_DAC("Left DAC", NULL, ES8316_DAC_PDN, 4, 1),
245 /* Headphone Output Side */
246 SND_SOC_DAPM_MUX("Left Headphone Mux", SND_SOC_NOPM, 0, 0,
247 &es8316_left_hpmux_controls),
248 SND_SOC_DAPM_MUX("Right Headphone Mux", SND_SOC_NOPM, 0, 0,
249 &es8316_right_hpmux_controls),
250 SND_SOC_DAPM_MIXER("Left Headphone Mixer", ES8316_HPMIX_PDN,
251 5, 1, &es8316_out_left_mix[0],
252 ARRAY_SIZE(es8316_out_left_mix)),
253 SND_SOC_DAPM_MIXER("Right Headphone Mixer", ES8316_HPMIX_PDN,
254 1, 1, &es8316_out_right_mix[0],
255 ARRAY_SIZE(es8316_out_right_mix)),
256 SND_SOC_DAPM_PGA("Left Headphone Mixer Out", ES8316_HPMIX_PDN,
257 4, 1, NULL, 0),
258 SND_SOC_DAPM_PGA("Right Headphone Mixer Out", ES8316_HPMIX_PDN,
259 0, 1, NULL, 0),
261 SND_SOC_DAPM_OUT_DRV("Left Headphone Charge Pump", ES8316_CPHP_OUTEN,
262 6, 0, NULL, 0),
263 SND_SOC_DAPM_OUT_DRV("Right Headphone Charge Pump", ES8316_CPHP_OUTEN,
264 2, 0, NULL, 0),
265 SND_SOC_DAPM_SUPPLY("Headphone Charge Pump", ES8316_CPHP_PDN2,
266 5, 1, NULL, 0),
267 SND_SOC_DAPM_SUPPLY("Headphone Charge Pump Clock", ES8316_CLKMGR_CLKSW,
268 4, 0, NULL, 0),
270 SND_SOC_DAPM_OUT_DRV("Left Headphone Driver", ES8316_CPHP_OUTEN,
271 5, 0, NULL, 0),
272 SND_SOC_DAPM_OUT_DRV("Right Headphone Driver", ES8316_CPHP_OUTEN,
273 1, 0, NULL, 0),
274 SND_SOC_DAPM_SUPPLY("Headphone Out", ES8316_CPHP_PDN1, 2, 1, NULL, 0),
276 /* pdn_Lical and pdn_Rical bits are documented as Reserved, but must
277 * be explicitly unset in order to enable HP output
279 SND_SOC_DAPM_SUPPLY("Left Headphone ical", ES8316_CPHP_ICAL_VOL,
280 7, 1, NULL, 0),
281 SND_SOC_DAPM_SUPPLY("Right Headphone ical", ES8316_CPHP_ICAL_VOL,
282 3, 1, NULL, 0),
284 SND_SOC_DAPM_OUTPUT("HPOL"),
285 SND_SOC_DAPM_OUTPUT("HPOR"),
288 static const struct snd_soc_dapm_route es8316_dapm_routes[] = {
289 /* Recording */
290 {"MIC1", NULL, "Mic Bias"},
291 {"MIC2", NULL, "Mic Bias"},
292 {"MIC1", NULL, "Bias"},
293 {"MIC2", NULL, "Bias"},
294 {"MIC1", NULL, "Analog power"},
295 {"MIC2", NULL, "Analog power"},
297 {"Differential Mux", "lin1-rin1", "MIC1"},
298 {"Differential Mux", "lin2-rin2", "MIC2"},
299 {"Line input PGA", NULL, "Differential Mux"},
301 {"Mono ADC", NULL, "ADC Clock"},
302 {"Mono ADC", NULL, "ADC Vref"},
303 {"Mono ADC", NULL, "ADC bias"},
304 {"Mono ADC", NULL, "Line input PGA"},
306 /* It's not clear why, but to avoid recording only silence,
307 * the DAC clock must be running for the ADC to work.
309 {"Mono ADC", NULL, "DAC Clock"},
311 {"Digital Mic Mux", "dmic disable", "Mono ADC"},
313 {"I2S OUT", NULL, "Digital Mic Mux"},
315 /* Playback */
316 {"DAC Source Mux", "LDATA TO LDAC, RDATA TO RDAC", "I2S IN"},
318 {"Left DAC", NULL, "DAC Clock"},
319 {"Right DAC", NULL, "DAC Clock"},
321 {"Left DAC", NULL, "DAC Vref"},
322 {"Right DAC", NULL, "DAC Vref"},
324 {"Left DAC", NULL, "DAC Source Mux"},
325 {"Right DAC", NULL, "DAC Source Mux"},
327 {"Left Headphone Mux", "lin-rin with Boost and PGA", "Line input PGA"},
328 {"Right Headphone Mux", "lin-rin with Boost and PGA", "Line input PGA"},
330 {"Left Headphone Mixer", "LLIN Switch", "Left Headphone Mux"},
331 {"Left Headphone Mixer", "Left DAC Switch", "Left DAC"},
333 {"Right Headphone Mixer", "RLIN Switch", "Right Headphone Mux"},
334 {"Right Headphone Mixer", "Right DAC Switch", "Right DAC"},
336 {"Left Headphone Mixer Out", NULL, "Left Headphone Mixer"},
337 {"Right Headphone Mixer Out", NULL, "Right Headphone Mixer"},
339 {"Left Headphone Charge Pump", NULL, "Left Headphone Mixer Out"},
340 {"Right Headphone Charge Pump", NULL, "Right Headphone Mixer Out"},
342 {"Left Headphone Charge Pump", NULL, "Headphone Charge Pump"},
343 {"Right Headphone Charge Pump", NULL, "Headphone Charge Pump"},
345 {"Left Headphone Charge Pump", NULL, "Headphone Charge Pump Clock"},
346 {"Right Headphone Charge Pump", NULL, "Headphone Charge Pump Clock"},
348 {"Left Headphone Driver", NULL, "Left Headphone Charge Pump"},
349 {"Right Headphone Driver", NULL, "Right Headphone Charge Pump"},
351 {"HPOL", NULL, "Left Headphone Driver"},
352 {"HPOR", NULL, "Right Headphone Driver"},
354 {"HPOL", NULL, "Left Headphone ical"},
355 {"HPOR", NULL, "Right Headphone ical"},
357 {"Headphone Out", NULL, "Bias"},
358 {"Headphone Out", NULL, "Analog power"},
359 {"HPOL", NULL, "Headphone Out"},
360 {"HPOR", NULL, "Headphone Out"},
363 static int es8316_set_dai_sysclk(struct snd_soc_dai *codec_dai,
364 int clk_id, unsigned int freq, int dir)
366 struct snd_soc_component *component = codec_dai->component;
367 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
368 int i, ret;
369 int count = 0;
371 es8316->sysclk = freq;
373 if (freq == 0) {
374 es8316->sysclk_constraints.list = NULL;
375 es8316->sysclk_constraints.count = 0;
377 return 0;
380 ret = clk_set_rate(es8316->mclk, freq);
381 if (ret)
382 return ret;
384 /* Limit supported sample rates to ones that can be autodetected
385 * by the codec running in slave mode.
387 for (i = 0; i < NR_SUPPORTED_MCLK_LRCK_RATIOS; i++) {
388 const unsigned int ratio = supported_mclk_lrck_ratios[i];
390 if (freq % ratio == 0)
391 es8316->allowed_rates[count++] = freq / ratio;
394 es8316->sysclk_constraints.list = es8316->allowed_rates;
395 es8316->sysclk_constraints.count = count;
397 return 0;
400 static int es8316_set_dai_fmt(struct snd_soc_dai *codec_dai,
401 unsigned int fmt)
403 struct snd_soc_component *component = codec_dai->component;
404 u8 serdata1 = 0;
405 u8 serdata2 = 0;
406 u8 clksw;
407 u8 mask;
409 if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) {
410 dev_err(component->dev, "Codec driver only supports slave mode\n");
411 return -EINVAL;
414 if ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) != SND_SOC_DAIFMT_I2S) {
415 dev_err(component->dev, "Codec driver only supports I2S format\n");
416 return -EINVAL;
419 /* Clock inversion */
420 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
421 case SND_SOC_DAIFMT_NB_NF:
422 break;
423 case SND_SOC_DAIFMT_IB_IF:
424 serdata1 |= ES8316_SERDATA1_BCLK_INV;
425 serdata2 |= ES8316_SERDATA2_ADCLRP;
426 break;
427 case SND_SOC_DAIFMT_IB_NF:
428 serdata1 |= ES8316_SERDATA1_BCLK_INV;
429 break;
430 case SND_SOC_DAIFMT_NB_IF:
431 serdata2 |= ES8316_SERDATA2_ADCLRP;
432 break;
433 default:
434 return -EINVAL;
437 mask = ES8316_SERDATA1_MASTER | ES8316_SERDATA1_BCLK_INV;
438 snd_soc_component_update_bits(component, ES8316_SERDATA1, mask, serdata1);
440 mask = ES8316_SERDATA2_FMT_MASK | ES8316_SERDATA2_ADCLRP;
441 snd_soc_component_update_bits(component, ES8316_SERDATA_ADC, mask, serdata2);
442 snd_soc_component_update_bits(component, ES8316_SERDATA_DAC, mask, serdata2);
444 /* Enable BCLK and MCLK inputs in slave mode */
445 clksw = ES8316_CLKMGR_CLKSW_MCLK_ON | ES8316_CLKMGR_CLKSW_BCLK_ON;
446 snd_soc_component_update_bits(component, ES8316_CLKMGR_CLKSW, clksw, clksw);
448 return 0;
451 static int es8316_pcm_startup(struct snd_pcm_substream *substream,
452 struct snd_soc_dai *dai)
454 struct snd_soc_component *component = dai->component;
455 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
457 if (es8316->sysclk_constraints.list)
458 snd_pcm_hw_constraint_list(substream->runtime, 0,
459 SNDRV_PCM_HW_PARAM_RATE,
460 &es8316->sysclk_constraints);
462 return 0;
465 static int es8316_pcm_hw_params(struct snd_pcm_substream *substream,
466 struct snd_pcm_hw_params *params,
467 struct snd_soc_dai *dai)
469 struct snd_soc_component *component = dai->component;
470 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
471 u8 wordlen = 0;
472 int i;
474 /* Validate supported sample rates that are autodetected from MCLK */
475 for (i = 0; i < NR_SUPPORTED_MCLK_LRCK_RATIOS; i++) {
476 const unsigned int ratio = supported_mclk_lrck_ratios[i];
478 if (es8316->sysclk % ratio != 0)
479 continue;
480 if (es8316->sysclk / ratio == params_rate(params))
481 break;
483 if (i == NR_SUPPORTED_MCLK_LRCK_RATIOS)
484 return -EINVAL;
486 switch (params_format(params)) {
487 case SNDRV_PCM_FORMAT_S16_LE:
488 wordlen = ES8316_SERDATA2_LEN_16;
489 break;
490 case SNDRV_PCM_FORMAT_S20_3LE:
491 wordlen = ES8316_SERDATA2_LEN_20;
492 break;
493 case SNDRV_PCM_FORMAT_S24_LE:
494 wordlen = ES8316_SERDATA2_LEN_24;
495 break;
496 case SNDRV_PCM_FORMAT_S32_LE:
497 wordlen = ES8316_SERDATA2_LEN_32;
498 break;
499 default:
500 return -EINVAL;
503 snd_soc_component_update_bits(component, ES8316_SERDATA_DAC,
504 ES8316_SERDATA2_LEN_MASK, wordlen);
505 snd_soc_component_update_bits(component, ES8316_SERDATA_ADC,
506 ES8316_SERDATA2_LEN_MASK, wordlen);
507 return 0;
510 static int es8316_mute(struct snd_soc_dai *dai, int mute)
512 snd_soc_component_update_bits(dai->component, ES8316_DAC_SET1, 0x20,
513 mute ? 0x20 : 0);
514 return 0;
517 #define ES8316_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
518 SNDRV_PCM_FMTBIT_S24_LE)
520 static const struct snd_soc_dai_ops es8316_ops = {
521 .startup = es8316_pcm_startup,
522 .hw_params = es8316_pcm_hw_params,
523 .set_fmt = es8316_set_dai_fmt,
524 .set_sysclk = es8316_set_dai_sysclk,
525 .digital_mute = es8316_mute,
528 static struct snd_soc_dai_driver es8316_dai = {
529 .name = "ES8316 HiFi",
530 .playback = {
531 .stream_name = "Playback",
532 .channels_min = 1,
533 .channels_max = 2,
534 .rates = SNDRV_PCM_RATE_8000_48000,
535 .formats = ES8316_FORMATS,
537 .capture = {
538 .stream_name = "Capture",
539 .channels_min = 1,
540 .channels_max = 2,
541 .rates = SNDRV_PCM_RATE_8000_48000,
542 .formats = ES8316_FORMATS,
544 .ops = &es8316_ops,
545 .symmetric_rates = 1,
548 static void es8316_enable_micbias_for_mic_gnd_short_detect(
549 struct snd_soc_component *component)
551 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
553 snd_soc_dapm_mutex_lock(dapm);
554 snd_soc_dapm_force_enable_pin_unlocked(dapm, "Bias");
555 snd_soc_dapm_force_enable_pin_unlocked(dapm, "Analog power");
556 snd_soc_dapm_force_enable_pin_unlocked(dapm, "Mic Bias");
557 snd_soc_dapm_sync_unlocked(dapm);
558 snd_soc_dapm_mutex_unlock(dapm);
560 msleep(20);
563 static void es8316_disable_micbias_for_mic_gnd_short_detect(
564 struct snd_soc_component *component)
566 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
568 snd_soc_dapm_mutex_lock(dapm);
569 snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Bias");
570 snd_soc_dapm_disable_pin_unlocked(dapm, "Analog power");
571 snd_soc_dapm_disable_pin_unlocked(dapm, "Bias");
572 snd_soc_dapm_sync_unlocked(dapm);
573 snd_soc_dapm_mutex_unlock(dapm);
576 static irqreturn_t es8316_irq(int irq, void *data)
578 struct es8316_priv *es8316 = data;
579 struct snd_soc_component *comp = es8316->component;
580 unsigned int flags;
582 mutex_lock(&es8316->lock);
584 regmap_read(es8316->regmap, ES8316_GPIO_FLAG, &flags);
585 if (flags == 0x00)
586 goto out; /* Powered-down / reset */
588 /* Catch spurious IRQ before set_jack is called */
589 if (!es8316->jack)
590 goto out;
592 if (es8316->jd_inverted)
593 flags ^= ES8316_GPIO_FLAG_HP_NOT_INSERTED;
595 dev_dbg(comp->dev, "gpio flags %#04x\n", flags);
596 if (flags & ES8316_GPIO_FLAG_HP_NOT_INSERTED) {
597 /* Jack removed, or spurious IRQ? */
598 if (es8316->jack->status & SND_JACK_MICROPHONE)
599 es8316_disable_micbias_for_mic_gnd_short_detect(comp);
601 if (es8316->jack->status & SND_JACK_HEADPHONE) {
602 snd_soc_jack_report(es8316->jack, 0,
603 SND_JACK_HEADSET | SND_JACK_BTN_0);
604 dev_dbg(comp->dev, "jack unplugged\n");
606 } else if (!(es8316->jack->status & SND_JACK_HEADPHONE)) {
607 /* Jack inserted, determine type */
608 es8316_enable_micbias_for_mic_gnd_short_detect(comp);
609 regmap_read(es8316->regmap, ES8316_GPIO_FLAG, &flags);
610 if (es8316->jd_inverted)
611 flags ^= ES8316_GPIO_FLAG_HP_NOT_INSERTED;
612 dev_dbg(comp->dev, "gpio flags %#04x\n", flags);
613 if (flags & ES8316_GPIO_FLAG_HP_NOT_INSERTED) {
614 /* Jack unplugged underneath us */
615 es8316_disable_micbias_for_mic_gnd_short_detect(comp);
616 } else if (flags & ES8316_GPIO_FLAG_GM_NOT_SHORTED) {
617 /* Open, headset */
618 snd_soc_jack_report(es8316->jack,
619 SND_JACK_HEADSET,
620 SND_JACK_HEADSET);
621 /* Keep mic-gnd-short detection on for button press */
622 } else {
623 /* Shorted, headphones */
624 snd_soc_jack_report(es8316->jack,
625 SND_JACK_HEADPHONE,
626 SND_JACK_HEADSET);
627 /* No longer need mic-gnd-short detection */
628 es8316_disable_micbias_for_mic_gnd_short_detect(comp);
630 } else if (es8316->jack->status & SND_JACK_MICROPHONE) {
631 /* Interrupt while jack inserted, report button state */
632 if (flags & ES8316_GPIO_FLAG_GM_NOT_SHORTED) {
633 /* Open, button release */
634 snd_soc_jack_report(es8316->jack, 0, SND_JACK_BTN_0);
635 } else {
636 /* Short, button press */
637 snd_soc_jack_report(es8316->jack,
638 SND_JACK_BTN_0,
639 SND_JACK_BTN_0);
643 out:
644 mutex_unlock(&es8316->lock);
645 return IRQ_HANDLED;
648 static void es8316_enable_jack_detect(struct snd_soc_component *component,
649 struct snd_soc_jack *jack)
651 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
654 * Init es8316->jd_inverted here and not in the probe, as we cannot
655 * guarantee that the bytchr-es8316 driver, which might set this
656 * property, will probe before us.
658 es8316->jd_inverted = device_property_read_bool(component->dev,
659 "everest,jack-detect-inverted");
661 mutex_lock(&es8316->lock);
663 es8316->jack = jack;
665 if (es8316->jack->status & SND_JACK_MICROPHONE)
666 es8316_enable_micbias_for_mic_gnd_short_detect(component);
668 snd_soc_component_update_bits(component, ES8316_GPIO_DEBOUNCE,
669 ES8316_GPIO_ENABLE_INTERRUPT,
670 ES8316_GPIO_ENABLE_INTERRUPT);
672 mutex_unlock(&es8316->lock);
674 /* Enable irq and sync initial jack state */
675 enable_irq(es8316->irq);
676 es8316_irq(es8316->irq, es8316);
679 static void es8316_disable_jack_detect(struct snd_soc_component *component)
681 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
683 disable_irq(es8316->irq);
685 mutex_lock(&es8316->lock);
687 snd_soc_component_update_bits(component, ES8316_GPIO_DEBOUNCE,
688 ES8316_GPIO_ENABLE_INTERRUPT, 0);
690 if (es8316->jack->status & SND_JACK_MICROPHONE) {
691 es8316_disable_micbias_for_mic_gnd_short_detect(component);
692 snd_soc_jack_report(es8316->jack, 0, SND_JACK_BTN_0);
695 es8316->jack = NULL;
697 mutex_unlock(&es8316->lock);
700 static int es8316_set_jack(struct snd_soc_component *component,
701 struct snd_soc_jack *jack, void *data)
703 if (jack)
704 es8316_enable_jack_detect(component, jack);
705 else
706 es8316_disable_jack_detect(component);
708 return 0;
711 static int es8316_probe(struct snd_soc_component *component)
713 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
714 int ret;
716 es8316->component = component;
718 es8316->mclk = devm_clk_get_optional(component->dev, "mclk");
719 if (IS_ERR(es8316->mclk)) {
720 dev_err(component->dev, "unable to get mclk\n");
721 return PTR_ERR(es8316->mclk);
723 if (!es8316->mclk)
724 dev_warn(component->dev, "assuming static mclk\n");
726 ret = clk_prepare_enable(es8316->mclk);
727 if (ret) {
728 dev_err(component->dev, "unable to enable mclk\n");
729 return ret;
732 /* Reset codec and enable current state machine */
733 snd_soc_component_write(component, ES8316_RESET, 0x3f);
734 usleep_range(5000, 5500);
735 snd_soc_component_write(component, ES8316_RESET, ES8316_RESET_CSM_ON);
736 msleep(30);
739 * Documentation is unclear, but this value from the vendor driver is
740 * needed otherwise audio output is silent.
742 snd_soc_component_write(component, ES8316_SYS_VMIDSEL, 0xff);
745 * Documentation for this register is unclear and incomplete,
746 * but here is a vendor-provided value that improves volume
747 * and quality for Intel CHT platforms.
749 snd_soc_component_write(component, ES8316_CLKMGR_ADCOSR, 0x32);
751 return 0;
754 static void es8316_remove(struct snd_soc_component *component)
756 struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
758 clk_disable_unprepare(es8316->mclk);
761 static const struct snd_soc_component_driver soc_component_dev_es8316 = {
762 .probe = es8316_probe,
763 .remove = es8316_remove,
764 .set_jack = es8316_set_jack,
765 .controls = es8316_snd_controls,
766 .num_controls = ARRAY_SIZE(es8316_snd_controls),
767 .dapm_widgets = es8316_dapm_widgets,
768 .num_dapm_widgets = ARRAY_SIZE(es8316_dapm_widgets),
769 .dapm_routes = es8316_dapm_routes,
770 .num_dapm_routes = ARRAY_SIZE(es8316_dapm_routes),
771 .use_pmdown_time = 1,
772 .endianness = 1,
773 .non_legacy_dai_naming = 1,
776 static const struct regmap_range es8316_volatile_ranges[] = {
777 regmap_reg_range(ES8316_GPIO_FLAG, ES8316_GPIO_FLAG),
780 static const struct regmap_access_table es8316_volatile_table = {
781 .yes_ranges = es8316_volatile_ranges,
782 .n_yes_ranges = ARRAY_SIZE(es8316_volatile_ranges),
785 static const struct regmap_config es8316_regmap = {
786 .reg_bits = 8,
787 .val_bits = 8,
788 .max_register = 0x53,
789 .volatile_table = &es8316_volatile_table,
790 .cache_type = REGCACHE_RBTREE,
793 static int es8316_i2c_probe(struct i2c_client *i2c_client,
794 const struct i2c_device_id *id)
796 struct device *dev = &i2c_client->dev;
797 struct es8316_priv *es8316;
798 int ret;
800 es8316 = devm_kzalloc(&i2c_client->dev, sizeof(struct es8316_priv),
801 GFP_KERNEL);
802 if (es8316 == NULL)
803 return -ENOMEM;
805 i2c_set_clientdata(i2c_client, es8316);
807 es8316->regmap = devm_regmap_init_i2c(i2c_client, &es8316_regmap);
808 if (IS_ERR(es8316->regmap))
809 return PTR_ERR(es8316->regmap);
811 es8316->irq = i2c_client->irq;
812 mutex_init(&es8316->lock);
814 ret = devm_request_threaded_irq(dev, es8316->irq, NULL, es8316_irq,
815 IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
816 "es8316", es8316);
817 if (ret == 0) {
818 /* Gets re-enabled by es8316_set_jack() */
819 disable_irq(es8316->irq);
820 } else {
821 dev_warn(dev, "Failed to get IRQ %d: %d\n", es8316->irq, ret);
822 es8316->irq = -ENXIO;
825 return devm_snd_soc_register_component(&i2c_client->dev,
826 &soc_component_dev_es8316,
827 &es8316_dai, 1);
830 static const struct i2c_device_id es8316_i2c_id[] = {
831 {"es8316", 0 },
834 MODULE_DEVICE_TABLE(i2c, es8316_i2c_id);
836 static const struct of_device_id es8316_of_match[] = {
837 { .compatible = "everest,es8316", },
840 MODULE_DEVICE_TABLE(of, es8316_of_match);
842 static const struct acpi_device_id es8316_acpi_match[] = {
843 {"ESSX8316", 0},
846 MODULE_DEVICE_TABLE(acpi, es8316_acpi_match);
848 static struct i2c_driver es8316_i2c_driver = {
849 .driver = {
850 .name = "es8316",
851 .acpi_match_table = ACPI_PTR(es8316_acpi_match),
852 .of_match_table = of_match_ptr(es8316_of_match),
854 .probe = es8316_i2c_probe,
855 .id_table = es8316_i2c_id,
857 module_i2c_driver(es8316_i2c_driver);
859 MODULE_DESCRIPTION("Everest Semi ES8316 ALSA SoC Codec Driver");
860 MODULE_AUTHOR("David Yang <yangxiaohua@everest-semi.com>");
861 MODULE_LICENSE("GPL v2");