File Index
Files and directories
Sign in
FILE

es8389.c

File preview with syntax highlighting.

linux-6.19.14/sound/soc/codecs/es8389.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * es8389.c  --  ES8389 ALSA SoC Audio Codec
  4 *
  5 * Copyright Everest Semiconductor Co., Ltd
  6 *
  7 * Authors:  Michael Zhang (zhangyi@everest-semi.com)
  8 *
  9 * This program is free software; you can redistribute it and/or modify
 10 * it under the terms of the GNU General Public License version 2 as
 11 * published by the Free Software Foundation.
 12 */
 13
 14#include <linux/clk.h>
 15#include <linux/module.h>
 16#include <linux/kernel.h>
 17#include <linux/delay.h>
 18#include <linux/i2c.h>
 19#include <linux/regmap.h>
 20#include <sound/core.h>
 21#include <sound/pcm.h>
 22#include <sound/pcm_params.h>
 23#include <sound/tlv.h>
 24#include <sound/soc.h>
 25
 26#include "es8389.h"
 27
 28
 29/* codec private data */
 30
 31struct	es8389_private {
 32	struct regmap *regmap;
 33	struct clk *mclk;
 34	unsigned int sysclk;
 35	int mastermode;
 36
 37	u8 mclk_src;
 38	enum snd_soc_bias_level bias_level;
 39};
 40
 41static bool es8389_volatile_register(struct device *dev,
 42			unsigned int reg)
 43{
 44	if ((reg  <= 0xff))
 45		return true;
 46	else
 47		return false;
 48}
 49
 50static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -9550, 50, 0);
 51static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -9550, 50, 0);
 52static const DECLARE_TLV_DB_SCALE(pga_vol_tlv, 0, 300, 0);
 53static const DECLARE_TLV_DB_SCALE(mix_vol_tlv, -9500, 100, 0);
 54static const DECLARE_TLV_DB_SCALE(alc_target_tlv, -3200, 200, 0);
 55static const DECLARE_TLV_DB_SCALE(alc_max_level, -3200, 200, 0);
 56
 57static int es8389_dmic_set(struct snd_kcontrol *kcontrol,
 58	struct snd_ctl_elem_value *ucontrol)
 59{
 60	struct snd_soc_component *component = snd_soc_dapm_kcontrol_to_component(kcontrol);
 61	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_to_dapm(kcontrol);
 62	struct es8389_private *es8389 = snd_soc_component_get_drvdata(component);
 63	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
 64	unsigned int val;
 65	bool changed1, changed2;
 66
 67	val = ucontrol->value.integer.value[0];
 68	if (val > 1)
 69		return -EINVAL;
 70
 71	if (val) {
 72		regmap_update_bits_check(es8389->regmap, ES8389_DMIC_EN, 0xC0, 0xC0, &changed1);
 73		regmap_update_bits_check(es8389->regmap, ES8389_ADC_MODE, 0x03, 0x03, &changed2);
 74	} else {
 75		regmap_update_bits_check(es8389->regmap, ES8389_DMIC_EN, 0xC0, 0x00, &changed1);
 76		regmap_update_bits_check(es8389->regmap, ES8389_ADC_MODE, 0x03, 0x00, &changed2);
 77	}
 78
 79	if (changed1 & changed2)
 80		return snd_soc_dapm_mux_update_power(dapm, kcontrol, val, e, NULL);
 81	else
 82		return 0;
 83}
 84
 85static const char *const alc[] = {
 86	"ALC OFF",
 87	"ADCR ALC ON",
 88	"ADCL ALC ON",
 89	"ADCL & ADCL ALC ON",
 90};
 91
 92static const char *const ramprate[] = {
 93	"0.125db/1  LRCK",
 94	"0.125db/4  LRCK",
 95	"0.125db/8  LRCK",
 96	"0.125db/16  LRCK",
 97	"0.125db/32  LRCK",
 98	"0.125db/64  LRCK",
 99	"0.125db/128  LRCK",
100	"0.125db/256  LRCK",
101	"0.125db/512  LRCK",
102	"0.125db/1024  LRCK",
103	"0.125db/2048  LRCK",
104	"0.125db/4096  LRCK",
105	"0.125db/8192  LRCK",
106	"0.125db/16384  LRCK",
107	"0.125db/32768  LRCK",
108	"0.125db/65536  LRCK",
109};
110
111static const char *const winsize[] = {
112	"2 LRCK",
113	"4  LRCK",
114	"8  LRCK",
115	"16  LRCK",
116	"32  LRCK",
117	"64  LRCK",
118	"128  LRCK",
119	"256  LRCK",
120	"512  LRCK",
121	"1024  LRCK",
122	"2048  LRCK",
123	"4096  LRCK",
124	"8192  LRCK",
125	"16384  LRCK",
126	"32768  LRCK",
127	"65536  LRCK",
128};
129
130static const struct soc_enum alc_enable =
131	SOC_ENUM_SINGLE(ES8389_ALC_ON, 5, 4, alc);
132static const struct soc_enum alc_ramprate =
133	SOC_ENUM_SINGLE(ES8389_ALC_CTL, 4, 16, ramprate);
134static const struct soc_enum alc_winsize =
135	SOC_ENUM_SINGLE(ES8389_ALC_CTL, 0, 16, winsize);
136
137static const char *const es8389_outl_mux_txt[] = {
138	"Normal",
139	"DAC2 channel to DAC1 channel",
140};
141
142static const char *const es8389_outr_mux_txt[] = {
143	"Normal",
144	"DAC1 channel to DAC2 channel",
145};
146
147static const char *const es8389_dmic_mux_txt[] = {
148	"AMIC",
149	"DMIC",
150};
151
152static const char *const es8389_pga1_texts[] = {
153	"DifferentialL",  "Line 1P", "Line 2P"
154};
155
156static const char *const es8389_pga2_texts[] = {
157	"DifferentialR",  "Line 2N", "Line 1N"
158};
159
160static const unsigned int es8389_pga_values[] = {
161	1, 5, 6
162};
163
164static const struct soc_enum es8389_outl_mux_enum =
165	SOC_ENUM_SINGLE(ES8389_DAC_MIX, 5,
166			ARRAY_SIZE(es8389_outl_mux_txt), es8389_outl_mux_txt);
167
168static const struct snd_kcontrol_new es8389_outl_mux_controls =
169	SOC_DAPM_ENUM("OUTL MUX", es8389_outl_mux_enum);
170
171static const struct soc_enum es8389_outr_mux_enum =
172	SOC_ENUM_SINGLE(ES8389_DAC_MIX, 4,
173			ARRAY_SIZE(es8389_outr_mux_txt), es8389_outr_mux_txt);
174
175static const struct snd_kcontrol_new es8389_outr_mux_controls =
176	SOC_DAPM_ENUM("OUTR MUX", es8389_outr_mux_enum);
177
178static SOC_ENUM_SINGLE_DECL(
179	es8389_dmic_mux_enum, ES8389_DMIC_EN, 6, es8389_dmic_mux_txt);
180
181static const struct soc_enum es8389_pgal_enum =
182	SOC_VALUE_ENUM_SINGLE(ES8389_MIC1_GAIN, 4, 7,
183			ARRAY_SIZE(es8389_pga1_texts), es8389_pga1_texts,
184			es8389_pga_values);
185
186static const struct soc_enum es8389_pgar_enum =
187	SOC_VALUE_ENUM_SINGLE(ES8389_MIC2_GAIN, 4, 7,
188			ARRAY_SIZE(es8389_pga2_texts), es8389_pga2_texts,
189			es8389_pga_values);
190
191static const struct snd_kcontrol_new es8389_dmic_mux_controls =
192	SOC_DAPM_ENUM_EXT("ADC MUX", es8389_dmic_mux_enum,
193			snd_soc_dapm_get_enum_double, es8389_dmic_set);
194
195static const struct snd_kcontrol_new es8389_left_mixer_controls[] = {
196	SOC_DAPM_SINGLE("DACR DACL Mixer", ES8389_DAC_MIX, 3, 1, 0),
197};
198
199static const struct snd_kcontrol_new es8389_right_mixer_controls[] = {
200	SOC_DAPM_SINGLE("DACL DACR Mixer", ES8389_DAC_MIX, 2, 1, 0),
201};
202
203static const struct snd_kcontrol_new es8389_leftadc_mixer_controls[] = {
204	SOC_DAPM_SINGLE("ADCL DACL Mixer", ES8389_DAC_MIX, 1, 1, 0),
205};
206
207static const struct snd_kcontrol_new es8389_rightadc_mixer_controls[] = {
208	SOC_DAPM_SINGLE("ADCR DACR Mixer", ES8389_DAC_MIX, 0, 1, 0),
209};
210
211static const struct snd_kcontrol_new es8389_adc_mixer_controls[] = {
212	SOC_DAPM_SINGLE("DACL ADCL Mixer", ES8389_ADC_RESET, 7, 1, 0),
213	SOC_DAPM_SINGLE("DACR ADCR Mixer", ES8389_ADC_RESET, 6, 1, 0),
214};
215
216static const struct snd_kcontrol_new es8389_snd_controls[] = {
217	SOC_SINGLE_TLV("ADCL Capture Volume", ES8389_ADCL_VOL, 0, 0xFF, 0, adc_vol_tlv),
218	SOC_SINGLE_TLV("ADCR Capture Volume", ES8389_ADCR_VOL, 0, 0xFF, 0, adc_vol_tlv),
219	SOC_SINGLE_TLV("ADCL PGA Volume", ES8389_MIC1_GAIN, 0, 0x0E, 0, pga_vol_tlv),
220	SOC_SINGLE_TLV("ADCR PGA Volume", ES8389_MIC2_GAIN, 0, 0x0E, 0, pga_vol_tlv),
221
222	SOC_ENUM("PGAL Select", es8389_pgal_enum),
223	SOC_ENUM("PGAR Select", es8389_pgar_enum),
224	SOC_ENUM("ALC Capture Switch", alc_enable),
225	SOC_SINGLE_TLV("ALC Capture Target Level", ES8389_ALC_TARGET,
226			0, 0x0f, 0, alc_target_tlv),
227	SOC_SINGLE_TLV("ALC Capture Max Gain", ES8389_ALC_GAIN,
228			0, 0x0f, 0, alc_max_level),
229	SOC_ENUM("ADC Ramp Rate", alc_ramprate),
230	SOC_ENUM("ALC Capture Winsize", alc_winsize),
231	SOC_DOUBLE("ADC OSR Volume ON Switch", ES8389_ADC_MUTE, 6, 7, 1, 0),
232	SOC_SINGLE_TLV("ADC OSR Volume", ES8389_OSR_VOL, 0, 0xFF, 0, adc_vol_tlv),
233	SOC_DOUBLE("ADC OUTPUT Invert Switch", ES8389_ADC_HPF2, 5, 6, 1, 0),
234
235	SOC_SINGLE_TLV("DACL Playback Volume", ES8389_DACL_VOL, 0, 0xFF, 0, dac_vol_tlv),
236	SOC_SINGLE_TLV("DACR Playback Volume", ES8389_DACR_VOL, 0, 0xFF, 0, dac_vol_tlv),
237	SOC_DOUBLE("DAC OUTPUT Invert Switch", ES8389_DAC_INV, 5, 6, 1, 0),
238	SOC_SINGLE_TLV("ADC2DAC Mixer Volume", ES8389_MIX_VOL, 0, 0x7F, 0, mix_vol_tlv),
239};
240
241static const struct snd_soc_dapm_widget es8389_dapm_widgets[] = {
242	/*Input Side*/
243	SND_SOC_DAPM_INPUT("INPUT1"),
244	SND_SOC_DAPM_INPUT("INPUT2"),
245	SND_SOC_DAPM_INPUT("DMIC"),
246	SND_SOC_DAPM_PGA("PGAL", SND_SOC_NOPM, 4, 0, NULL, 0),
247	SND_SOC_DAPM_PGA("PGAR", SND_SOC_NOPM, 4, 0, NULL, 0),
248
249	/*ADCs*/
250	SND_SOC_DAPM_ADC("ADCL", NULL, SND_SOC_NOPM, 0, 0),
251	SND_SOC_DAPM_ADC("ADCR", NULL, SND_SOC_NOPM, 0, 0),
252
253	/* Audio Interface */
254	SND_SOC_DAPM_AIF_OUT("I2S OUT", "I2S Capture", 0, SND_SOC_NOPM, 0, 0),
255	SND_SOC_DAPM_AIF_IN("I2S IN", "I2S Playback", 0, SND_SOC_NOPM, 0, 0),
256
257	/*DACs*/
258	SND_SOC_DAPM_DAC("DACL", NULL, SND_SOC_NOPM, 0, 0),
259	SND_SOC_DAPM_DAC("DACR", NULL, SND_SOC_NOPM, 0, 0),
260
261	/*Output Side*/
262	SND_SOC_DAPM_OUTPUT("HPOL"),
263	SND_SOC_DAPM_OUTPUT("HPOR"),
264
265	/* Digital Interface */
266	SND_SOC_DAPM_PGA("IF DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
267	SND_SOC_DAPM_PGA("IF DACL1", SND_SOC_NOPM, 0, 0, NULL, 0),
268	SND_SOC_DAPM_PGA("IF DACR1", SND_SOC_NOPM, 0, 0, NULL, 0),
269	SND_SOC_DAPM_PGA("IF DACL2", SND_SOC_NOPM, 0, 0, NULL, 0),
270	SND_SOC_DAPM_PGA("IF DACR2", SND_SOC_NOPM, 0, 0, NULL, 0),
271	SND_SOC_DAPM_PGA("IF DACL3", SND_SOC_NOPM, 0, 0, NULL, 0),
272	SND_SOC_DAPM_PGA("IF DACR3", SND_SOC_NOPM, 0, 0, NULL, 0),
273
274	/* Digital Interface Select */
275	SND_SOC_DAPM_MIXER("IF DACL Mixer", SND_SOC_NOPM, 0, 0,
276			   &es8389_left_mixer_controls[0],
277			   ARRAY_SIZE(es8389_left_mixer_controls)),
278	SND_SOC_DAPM_MIXER("IF DACR Mixer", SND_SOC_NOPM, 0, 0,
279			   &es8389_right_mixer_controls[0],
280			   ARRAY_SIZE(es8389_right_mixer_controls)),
281	SND_SOC_DAPM_MIXER("IF ADCDACL Mixer", SND_SOC_NOPM, 0, 0,
282			   &es8389_leftadc_mixer_controls[0],
283			   ARRAY_SIZE(es8389_leftadc_mixer_controls)),
284	SND_SOC_DAPM_MIXER("IF ADCDACR Mixer", SND_SOC_NOPM, 0, 0,
285			   &es8389_rightadc_mixer_controls[0],
286			   ARRAY_SIZE(es8389_rightadc_mixer_controls)),
287
288	SND_SOC_DAPM_MIXER("ADC Mixer", SND_SOC_NOPM, 0, 0,
289			   &es8389_adc_mixer_controls[0],
290			   ARRAY_SIZE(es8389_adc_mixer_controls)),
291	SND_SOC_DAPM_MUX("ADC MUX", SND_SOC_NOPM, 0, 0, &es8389_dmic_mux_controls),
292
293	SND_SOC_DAPM_MUX("OUTL MUX", SND_SOC_NOPM, 0, 0, &es8389_outl_mux_controls),
294	SND_SOC_DAPM_MUX("OUTR MUX", SND_SOC_NOPM, 0, 0, &es8389_outr_mux_controls),
295};
296
297
298static const struct snd_soc_dapm_route es8389_dapm_routes[] = {
299	{"PGAL", NULL, "INPUT1"},
300	{"PGAR", NULL, "INPUT2"},
301
302	{"ADCL", NULL, "PGAL"},
303	{"ADCR", NULL, "PGAR"},
304
305	{"ADC Mixer", "DACL ADCL Mixer", "DACL"},
306	{"ADC Mixer", "DACR ADCR Mixer", "DACR"},
307	{"ADC Mixer", NULL, "ADCL"},
308	{"ADC Mixer", NULL, "ADCR"},
309
310	{"ADC MUX", "AMIC", "ADC Mixer"},
311	{"ADC MUX", "DMIC", "DMIC"},
312
313	{"I2S OUT", NULL, "ADC MUX"},
314
315	{"DACL", NULL, "I2S IN"},
316	{"DACR", NULL, "I2S IN"},
317
318	{"IF DACL1", NULL, "DACL"},
319	{"IF DACR1", NULL, "DACR"},
320	{"IF DACL2", NULL, "DACL"},
321	{"IF DACR2", NULL, "DACR"},
322	{"IF DACL3", NULL, "DACL"},
323	{"IF DACR3", NULL, "DACR"},
324
325	{"IF DACL Mixer", NULL, "IF DACL2"},
326	{"IF DACL Mixer", "DACR DACL Mixer", "IF DACR1"},
327	{"IF DACR Mixer", NULL, "IF DACR2"},
328	{"IF DACR Mixer", "DACL DACR Mixer", "IF DACL1"},
329
330	{"IF ADCDACL Mixer", NULL, "IF DACL Mixer"},
331	{"IF ADCDACL Mixer", "ADCL DACL Mixer", "IF DACL3"},
332	{"IF ADCDACR Mixer", NULL, "IF DACR Mixer"},
333	{"IF ADCDACR Mixer", "ADCR DACR Mixer", "IF DACR3"},
334
335	{"OUTL MUX", "Normal", "IF ADCDACL Mixer"},
336	{"OUTL MUX", "DAC2 channel to DAC1 channel", "IF ADCDACR Mixer"},
337	{"OUTR MUX", "Normal", "IF ADCDACR Mixer"},
338	{"OUTR MUX", "DAC1 channel to DAC2 channel", "IF ADCDACL Mixer"},
339
340	{"HPOL", NULL, "OUTL MUX"},
341	{"HPOR", NULL, "OUTR MUX"},
342
343};
344
345struct _coeff_div {
346	u16 fs;
347	u32 mclk;
348	u32 rate;
349	u8 Reg0x04;
350	u8 Reg0x05;
351	u8 Reg0x06;
352	u8 Reg0x07;
353	u8 Reg0x08;
354	u8 Reg0x09;
355	u8 Reg0x0A;
356	u8 Reg0x0F;
357	u8 Reg0x11;
358	u8 Reg0x21;
359	u8 Reg0x22;
360	u8 Reg0x26;
361	u8 Reg0x30;
362	u8 Reg0x41;
363	u8 Reg0x42;
364	u8 Reg0x43;
365	u8 Reg0xF0;
366	u8 Reg0xF1;
367	u8 Reg0x16;
368	u8 Reg0x18;
369	u8 Reg0x19;
370};
371
372/* codec hifi mclk clock divider coefficients */
373static const struct _coeff_div  coeff_div[] = {
374	{32, 256000, 8000, 0x00, 0x57, 0x84, 0xD0, 0x03, 0xC1, 0xB0, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
375	{36, 288000, 8000, 0x00, 0x55, 0x84, 0xD0, 0x01, 0xC1, 0x90, 0x00, 0x00, 0x23, 0x8F, 0xB7, 0xC0, 0x1F, 0x8F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
376	{48, 384000, 8000, 0x02, 0x5F, 0x04, 0xC0, 0x03, 0xC1, 0xB0, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
377	{64, 512000, 8000, 0x00, 0x4D, 0x24, 0xC0, 0x03, 0xD1, 0xB0, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
378	{72, 576000, 8000, 0x00, 0x45, 0x24, 0xC0, 0x01, 0xD1, 0x90, 0x00, 0x00, 0x23, 0x8F, 0xB7, 0xC0, 0x1F, 0x8F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
379	{96, 768000, 8000, 0x02, 0x57, 0x84, 0xD0, 0x03, 0xC1, 0xB0, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
380	{128, 1024000, 8000, 0x00, 0x45, 0x04, 0xD0, 0x03, 0xC1, 0xB0, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
381	{192, 1536000, 8000, 0x02, 0x4D, 0x24, 0xC0, 0x03, 0xD1, 0xB0, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
382	{256, 2048000, 8000, 0x01, 0x45, 0x04, 0xD0, 0x03, 0xC1, 0xB0, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
383	{288, 2304000, 8000, 0x01, 0x51, 0x00, 0xC0, 0x01, 0xC1, 0x90, 0x00, 0x00, 0x23, 0x8F, 0xB7, 0xC0, 0x1F, 0x8F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
384	{384, 3072000, 8000, 0x02, 0x45, 0x04, 0xD0, 0x03, 0xC1, 0xB0, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
385	{512, 4096000, 8000, 0x00, 0x41, 0x04, 0xE0, 0x00, 0xD1, 0xB0, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
386	{768, 6144000, 8000, 0x05, 0x45, 0x04, 0xD0, 0x03, 0xC1, 0xB0, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
387	{1024, 8192000, 8000, 0x01, 0x41, 0x06, 0xE0, 0x00, 0xD1, 0xB0, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
388	{1536, 12288000, 8000, 0x02, 0x41, 0x04, 0xE0, 0x00, 0xD1, 0xB0, 0x40, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
389	{1625, 13000000, 8000, 0x40, 0x6E, 0x05, 0xC8, 0x01, 0xC2, 0x90, 0x40, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0x63, 0x95, 0x00, 0x12, 0x00, 0x09, 0x19, 0x07},
390	{2048, 16384000, 8000, 0x03, 0x44, 0x01, 0xC0, 0x00, 0xD2, 0x80, 0x40, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
391	{2304, 18432000, 8000, 0x11, 0x45, 0x25, 0xF0, 0x00, 0xD1, 0xB0, 0x40, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
392	{3072, 24576000, 8000, 0x05, 0x44, 0x01, 0xC0, 0x00, 0xD2, 0x80, 0x40, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
393	{32, 512000, 16000, 0x00, 0x55, 0x84, 0xD0, 0x01, 0xC1, 0x90, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
394	{36, 576000, 16000, 0x00, 0x55, 0x84, 0xD0, 0x01, 0xC1, 0x90, 0x00, 0x00, 0x23, 0x8F, 0xB7, 0xC0, 0x1F, 0x8F, 0x01, 0x12, 0x00, 0x12, 0x31, 0x0E},
395	{48, 768000, 16000, 0x02, 0x57, 0x04, 0xC0, 0x01, 0xC1, 0x90, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
396	{50, 800000, 16000, 0x00, 0x7E, 0x01, 0xD9, 0x00, 0xC2, 0x80, 0x00, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0xC7, 0x95, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
397	{64, 1024000, 16000, 0x00, 0x45, 0x24, 0xC0, 0x01, 0xD1, 0x90, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
398	{72, 1152000, 16000, 0x00, 0x45, 0x24, 0xC0, 0x01, 0xD1, 0x90, 0x00, 0x00, 0x23, 0x8F, 0xB7, 0xC0, 0x1F, 0x8F, 0x01, 0x12, 0x00, 0x12, 0x31, 0x0E},
399	{96, 1536000, 16000, 0x02, 0x55, 0x84, 0xD0, 0x01, 0xC1, 0x90, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
400	{128, 2048000, 16000, 0x00, 0x51, 0x04, 0xD0, 0x01, 0xC1, 0x90, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
401	{144, 2304000, 16000, 0x00, 0x51, 0x00, 0xC0, 0x01, 0xC1, 0x90, 0x00, 0x00, 0x23, 0x8F, 0xB7, 0xC0, 0x1F, 0x8F, 0x01, 0x12, 0x00, 0x12, 0x31, 0x0E},
402	{192, 3072000, 16000, 0x02, 0x65, 0x25, 0xE0, 0x00, 0xE1, 0x90, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
403	{256, 4096000, 16000, 0x00, 0x41, 0x04, 0xC0, 0x01, 0xD1, 0x90, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
404	{300, 4800000, 16000, 0x02, 0x66, 0x01, 0xD9, 0x00, 0xC2, 0x80, 0x00, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0xC7, 0x95, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
405	{384, 6144000, 16000, 0x02, 0x51, 0x04, 0xD0, 0x01, 0xC1, 0x90, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
406	{512, 8192000, 16000, 0x01, 0x41, 0x04, 0xC0, 0x01, 0xD1, 0x90, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
407	{750, 12000000, 16000, 0x0E, 0x7E, 0x01, 0xC9, 0x00, 0xC2, 0x80, 0x40, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0xC7, 0x95, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
408	{768, 12288000, 16000, 0x02, 0x41, 0x04, 0xC0, 0x01, 0xD1, 0x90, 0x40, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
409	{1024, 16384000, 16000, 0x03, 0x41, 0x04, 0xC0, 0x01, 0xD1, 0x90, 0x40, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
410	{1152, 18432000, 16000, 0x08, 0x51, 0x04, 0xD0, 0x01, 0xC1, 0x90, 0x40, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
411	{1200, 19200000, 16000, 0x0B, 0x66, 0x01, 0xD9, 0x00, 0xC2, 0x80, 0x40, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0xC7, 0x95, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
412	{1500, 24000000, 16000, 0x0E, 0x26, 0x01, 0xD9, 0x00, 0xC2, 0x80, 0xC0, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0xC7, 0x95, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
413	{1536, 24576000, 16000, 0x05, 0x41, 0x04, 0xC0, 0x01, 0xD1, 0x90, 0xC0, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0xFF, 0x7F, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
414	{1625, 26000000, 16000, 0x40, 0x6E, 0x05, 0xC8, 0x01, 0xC2, 0x90, 0xC0, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0x63, 0x95, 0x00, 0x12, 0x00, 0x12, 0x31, 0x0E},
415	{800, 19200000, 24000, 0x07, 0x66, 0x01, 0xD9, 0x00, 0xC2, 0x80, 0x40, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0xC7, 0x95, 0x00, 0x12, 0x00, 0x1A, 0x49, 0x14},
416	{600, 19200000, 32000, 0x05, 0x46, 0x01, 0xD8, 0x10, 0xD2, 0x80, 0x40, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0x63, 0x95, 0x00, 0x12, 0x00, 0x23, 0x61, 0x1B},
417	{32, 1411200, 44100, 0x00, 0x45, 0xA4, 0xD0, 0x10, 0xD1, 0x80, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
418	{64, 2822400, 44100, 0x00, 0x51, 0x00, 0xC0, 0x10, 0xC1, 0x80, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
419	{128, 5644800, 44100, 0x00, 0x41, 0x04, 0xD0, 0x10, 0xD1, 0x80, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
420	{256, 11289600, 44100, 0x01, 0x41, 0x04, 0xD0, 0x10, 0xD1, 0x80, 0x40, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
421	{512, 22579200, 44100, 0x03, 0x41, 0x04, 0xD0, 0x10, 0xD1, 0x80, 0xC0, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
422	{32, 1536000, 48000, 0x00, 0x45, 0xA4, 0xD0, 0x10, 0xD1, 0x80, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
423	{48, 2304000, 48000, 0x02, 0x55, 0x04, 0xC0, 0x10, 0xC1, 0x80, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
424	{50, 2400000, 48000, 0x00, 0x76, 0x01, 0xC8, 0x10, 0xC2, 0x80, 0x00, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0x63, 0x95, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
425	{64, 3072000, 48000, 0x00, 0x51, 0x04, 0xC0, 0x10, 0xC1, 0x80, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
426	{100, 4800000, 48000, 0x00, 0x46, 0x01, 0xD8, 0x10, 0xD2, 0x80, 0x00, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0x63, 0x95, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
427	{125, 6000000, 48000, 0x04, 0x6E, 0x05, 0xC8, 0x10, 0xC2, 0x80, 0x00, 0x01, 0x18, 0x95, 0xD0, 0xC0, 0x63, 0x95, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
428	{128, 6144000, 48000, 0x00, 0x41, 0x04, 0xD0, 0x10, 0xD1, 0x80, 0x00, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
429	{200, 9600000, 48000, 0x01, 0x46, 0x01, 0xD8, 0x10, 0xD2, 0x80, 0x00, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0x63, 0x95, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
430	{250, 12000000, 48000, 0x04, 0x76, 0x01, 0xC8, 0x10, 0xC2, 0x80, 0x40, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0x63, 0x95, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
431	{256, 12288000, 48000, 0x01, 0x41, 0x04, 0xD0, 0x10, 0xD1, 0x80, 0x40, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
432	{384, 18432000, 48000, 0x02, 0x41, 0x04, 0xD0, 0x10, 0xD1, 0x80, 0x40, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
433	{400, 19200000, 48000, 0x03, 0x46, 0x01, 0xD8, 0x10, 0xD2, 0x80, 0x40, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0x63, 0x95, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
434	{500, 24000000, 48000, 0x04, 0x46, 0x01, 0xD8, 0x10, 0xD2, 0x80, 0xC0, 0x00, 0x18, 0x95, 0xD0, 0xC0, 0x63, 0x95, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
435	{512, 24576000, 48000, 0x03, 0x41, 0x04, 0xD0, 0x10, 0xD1, 0x80, 0xC0, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
436	{800, 38400000, 48000, 0x18, 0x45, 0x04, 0xC0, 0x10, 0xC1, 0x80, 0xC0, 0x00, 0x1F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x12, 0x00, 0x35, 0x91, 0x28},
437	{128, 11289600, 88200, 0x00, 0x50, 0x00, 0xC0, 0x10, 0xC1, 0x80, 0x40, 0x00, 0x9F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x80, 0x12, 0xC0, 0x32, 0x89, 0x25},
438	{64, 6144000, 96000, 0x00, 0x41, 0x00, 0xD0, 0x10, 0xD1, 0x80, 0x00, 0x00, 0x9F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x80, 0x12, 0xC0, 0x35, 0x91, 0x28},
439	{128, 12288000, 96000, 0x00, 0x50, 0x00, 0xC0, 0x10, 0xC1, 0x80, 0xC0, 0x00, 0x9F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x80, 0x12, 0xC0, 0x35, 0x91, 0x28},
440	{256, 24576000, 96000, 0x00, 0x40, 0x00, 0xC0, 0x10, 0xC1, 0x80, 0xC0, 0x00, 0x9F, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x80, 0x12, 0xC0, 0x35, 0x91, 0x28},
441	{128, 24576000, 192000, 0x00, 0x50, 0x00, 0xC0, 0x18, 0xC1, 0x81, 0xC0, 0x00, 0x8F, 0x7F, 0xEF, 0xC0, 0x3F, 0x7F, 0x80, 0x12, 0xC0, 0x3F, 0xF9, 0x3F},
442
443	{50, 400000, 8000, 0x00, 0x75, 0x05, 0xC8, 0x01, 0xC1, 0x90, 0x10, 0x00, 0x18, 0xC7, 0xD0, 0xC0, 0x8F, 0xC7, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
444	{600, 4800000, 8000, 0x05, 0x65, 0x25, 0xF9, 0x00, 0xD1, 0x90, 0x10, 0x00, 0x18, 0xC7, 0xD0, 0xC0, 0x8F, 0xC7, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
445	{1500, 12000000, 8000, 0x0E, 0x25, 0x25, 0xE8, 0x00, 0xD1, 0x90, 0x40, 0x00, 0x31, 0xC7, 0xC5, 0x00, 0x8F, 0xC7, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
446	{2400, 19200000, 8000, 0x0B, 0x01, 0x00, 0xD0, 0x00, 0xD1, 0x80, 0x90, 0x00, 0x31, 0xC7, 0xC5, 0x00, 0xC7, 0xC7, 0x00, 0x12, 0x00, 0x09, 0x19, 0x07},
447	{3000, 24000000, 8000, 0x0E, 0x24, 0x05, 0xD0, 0x00, 0xC2, 0x80, 0xC0, 0x00, 0x31, 0xC7, 0xC5, 0x00, 0x8F, 0xC7, 0x01, 0x12, 0x00, 0x09, 0x19, 0x07},
448	{3250, 26000000, 8000, 0x40, 0x05, 0xA4, 0xC0, 0x00, 0xD1, 0x80, 0xD0, 0x00, 0x31, 0xC7, 0xC5, 0x00, 0xC7, 0xC7, 0x00, 0x12, 0x00, 0x09, 0x19, 0x07},
449};
450
451static inline int get_coeff(int mclk, int rate)
452{
453	int i;
454
455	for (i = 0; i < ARRAY_SIZE(coeff_div); i++) {
456		if (coeff_div[i].rate == rate &&  coeff_div[i].mclk == mclk)
457			return i;
458	}
459	return -EINVAL;
460}
461
462/*
463 * if PLL not be used, use internal clk1 for mclk,otherwise, use internal clk2 for PLL source.
464 */
465static int es8389_set_dai_sysclk(struct snd_soc_dai *dai,
466			int clk_id, unsigned int freq, int dir)
467{
468	struct snd_soc_component *component = dai->component;
469	struct es8389_private *es8389 = snd_soc_component_get_drvdata(component);
470
471	es8389->sysclk = freq;
472
473	return 0;
474}
475
476static int es8389_set_tdm_slot(struct snd_soc_dai *dai,
477	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
478{
479	struct snd_soc_component *component = dai->component;
480	struct es8389_private *es8389 = snd_soc_component_get_drvdata(component);
481
482	regmap_update_bits(es8389->regmap, ES8389_PTDM_SLOT,
483				ES8389_TDM_SLOT, (slots << ES8389_TDM_SHIFT));
484	regmap_update_bits(es8389->regmap, ES8389_DAC_RAMP,
485				ES8389_TDM_SLOT, (slots << ES8389_TDM_SHIFT));
486
487	return 0;
488}
489
490static int es8389_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
491{
492	struct snd_soc_component *component = dai->component;
493	struct es8389_private *es8389 = snd_soc_component_get_drvdata(component);
494	u8 state = 0;
495
496	switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
497	case SND_SOC_DAIFMT_CBC_CFP:
498		regmap_update_bits(es8389->regmap, ES8389_MASTER_MODE,
499				ES8389_MASTER_MODE_EN, ES8389_MASTER_MODE_EN);
500		es8389->mastermode = 1;
501		break;
502	case SND_SOC_DAIFMT_CBC_CFC:
503		es8389->mastermode = 0;
504		break;
505	default:
506		return -EINVAL;
507	}
508
509	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
510	case SND_SOC_DAIFMT_I2S:
511		state |= ES8389_DAIFMT_I2S;
512		break;
513	case SND_SOC_DAIFMT_RIGHT_J:
514		dev_err(component->dev, "component driver does not support right justified\n");
515		return -EINVAL;
516	case SND_SOC_DAIFMT_LEFT_J:
517		state |= ES8389_DAIFMT_LEFT_J;
518		break;
519	case SND_SOC_DAIFMT_DSP_A:
520		state |= ES8389_DAIFMT_DSP_A;
521		break;
522	case SND_SOC_DAIFMT_DSP_B:
523		state |= ES8389_DAIFMT_DSP_B;
524		break;
525	default:
526		break;
527	}
528	regmap_update_bits(es8389->regmap, ES8389_ADC_FORMAT_MUTE, ES8389_DAIFMT_MASK, state);
529	regmap_update_bits(es8389->regmap, ES8389_DAC_FORMAT_MUTE, ES8389_DAIFMT_MASK, state);
530
531	return 0;
532}
533
534static int es8389_pcm_hw_params(struct snd_pcm_substream *substream,
535			struct snd_pcm_hw_params *params,
536			struct snd_soc_dai *dai)
537{
538	struct snd_soc_component *component = dai->component;
539	struct es8389_private *es8389 = snd_soc_component_get_drvdata(component);
540	int coeff;
541	u8 state = 0;
542
543	switch (params_format(params)) {
544	case SNDRV_PCM_FORMAT_S16_LE:
545		state |= ES8389_S16_LE;
546		break;
547	case SNDRV_PCM_FORMAT_S20_3LE:
548		state |= ES8389_S20_3_LE;
549		break;
550	case SNDRV_PCM_FORMAT_S18_3LE:
551		state |= ES8389_S18_LE;
552		break;
553	case SNDRV_PCM_FORMAT_S24_LE:
554		state |= ES8389_S24_LE;
555		break;
556	case SNDRV_PCM_FORMAT_S32_LE:
557		state |= ES8389_S32_LE;
558		break;
559	default:
560		return -EINVAL;
561	}
562
563	regmap_update_bits(es8389->regmap, ES8389_ADC_FORMAT_MUTE, ES8389_DATA_LEN_MASK, state);
564	regmap_update_bits(es8389->regmap, ES8389_DAC_FORMAT_MUTE, ES8389_DATA_LEN_MASK, state);
565
566	if (es8389->mclk_src == ES8389_SCLK_PIN) {
567		regmap_update_bits(es8389->regmap, ES8389_MASTER_CLK,
568					ES8389_MCLK_SOURCE, es8389->mclk_src);
569		es8389->sysclk = params_channels(params) * params_width(params) * params_rate(params);
570	}
571
572	coeff = get_coeff(es8389->sysclk, params_rate(params));
573	if (coeff >= 0) {
574		regmap_write(es8389->regmap, ES8389_CLK_DIV1, coeff_div[coeff].Reg0x04);
575		regmap_write(es8389->regmap, ES8389_CLK_MUL, coeff_div[coeff].Reg0x05);
576		regmap_write(es8389->regmap, ES8389_CLK_MUX1, coeff_div[coeff].Reg0x06);
577		regmap_write(es8389->regmap, ES8389_CLK_MUX2, coeff_div[coeff].Reg0x07);
578		regmap_write(es8389->regmap, ES8389_CLK_CTL1, coeff_div[coeff].Reg0x08);
579		regmap_write(es8389->regmap, ES8389_CLK_CTL2, coeff_div[coeff].Reg0x09);
580		regmap_write(es8389->regmap, ES8389_CLK_CTL3, coeff_div[coeff].Reg0x0A);
581		regmap_update_bits(es8389->regmap, ES8389_OSC_CLK,
582						0xC0, coeff_div[coeff].Reg0x0F);
583		regmap_write(es8389->regmap, ES8389_CLK_DIV2, coeff_div[coeff].Reg0x11);
584		regmap_write(es8389->regmap, ES8389_ADC_OSR, coeff_div[coeff].Reg0x21);
585		regmap_write(es8389->regmap, ES8389_ADC_DSP, coeff_div[coeff].Reg0x22);
586		regmap_write(es8389->regmap, ES8389_OSR_VOL, coeff_div[coeff].Reg0x26);
587		regmap_update_bits(es8389->regmap, ES8389_SYSTEM30,
588						0xC0, coeff_div[coeff].Reg0x30);
589		regmap_write(es8389->regmap, ES8389_DAC_DSM_OSR, coeff_div[coeff].Reg0x41);
590		regmap_write(es8389->regmap, ES8389_DAC_DSP_OSR, coeff_div[coeff].Reg0x42);
591		regmap_update_bits(es8389->regmap, ES8389_DAC_MISC,
592						0x81, coeff_div[coeff].Reg0x43);
593		regmap_update_bits(es8389->regmap, ES8389_CHIP_MISC,
594						0x72, coeff_div[coeff].Reg0xF0);
595		regmap_write(es8389->regmap, ES8389_CSM_STATE1, coeff_div[coeff].Reg0xF1);
596		regmap_write(es8389->regmap, ES8389_SYSTEM16, coeff_div[coeff].Reg0x16);
597		regmap_write(es8389->regmap, ES8389_SYSTEM18, coeff_div[coeff].Reg0x18);
598		regmap_write(es8389->regmap, ES8389_SYSTEM19, coeff_div[coeff].Reg0x19);
599	} else {
600		dev_warn(component->dev, "Clock coefficients do not match");
601	}
602
603	return 0;
604}
605
606static int es8389_set_bias_level(struct snd_soc_component *component,
607			enum snd_soc_bias_level level)
608{
609	int ret;
610	struct es8389_private *es8389 = snd_soc_component_get_drvdata(component);
611
612	switch (level) {
613	case SND_SOC_BIAS_ON:
614		ret = clk_prepare_enable(es8389->mclk);
615		if (ret)
616			return ret;
617
618		regmap_update_bits(es8389->regmap, ES8389_HPSW, 0x20, 0x20);
619		regmap_write(es8389->regmap, ES8389_ANA_CTL1, 0xD9);
620		regmap_write(es8389->regmap, ES8389_ADC_EN, 0x8F);
621		regmap_write(es8389->regmap, ES8389_CSM_JUMP, 0xE4);
622		regmap_write(es8389->regmap, ES8389_RESET, 0x01);
623		regmap_write(es8389->regmap, ES8389_CLK_OFF1, 0xC3);
624		regmap_update_bits(es8389->regmap, ES8389_ADC_HPF1, 0x0f, 0x0a);
625		regmap_update_bits(es8389->regmap, ES8389_ADC_HPF2, 0x0f, 0x0a);
626		usleep_range(70000, 72000);
627		regmap_write(es8389->regmap, ES8389_DAC_RESET, 0X00);
628		break;
629	case SND_SOC_BIAS_PREPARE:
630		break;
631	case SND_SOC_BIAS_STANDBY:
632		regmap_update_bits(es8389->regmap, ES8389_ADC_HPF1, 0x0f, 0x04);
633		regmap_update_bits(es8389->regmap, ES8389_ADC_HPF2, 0x0f, 0x04);
634		regmap_write(es8389->regmap, ES8389_CSM_JUMP, 0xD4);
635		usleep_range(70000, 72000);
636		regmap_write(es8389->regmap, ES8389_ANA_CTL1, 0x59);
637		regmap_write(es8389->regmap, ES8389_ADC_EN, 0x00);
638		regmap_write(es8389->regmap, ES8389_CLK_OFF1, 0x00);
639		regmap_write(es8389->regmap, ES8389_RESET, 0x3E);
640		regmap_update_bits(es8389->regmap, ES8389_DAC_INV, 0x80, 0x80);
641		usleep_range(8000, 8500);
642		regmap_update_bits(es8389->regmap, ES8389_DAC_INV, 0x80, 0x00);
643
644		clk_disable_unprepare(es8389->mclk);
645		break;
646	case SND_SOC_BIAS_OFF:
647		break;
648	}
649	return 0;
650}
651
652
653
654static int es8389_mute(struct snd_soc_dai *dai, int mute, int direction)
655{
656	struct snd_soc_component *component = dai->component;
657	struct es8389_private *es8389 = snd_soc_component_get_drvdata(component);
658
659	if (mute) {
660		if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
661			regmap_update_bits(es8389->regmap, ES8389_DAC_FORMAT_MUTE,
662						0x03, 0x03);
663		} else {
664			regmap_update_bits(es8389->regmap, ES8389_ADC_FORMAT_MUTE,
665						0x03, 0x03);
666		}
667	} else {
668		if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
669			regmap_update_bits(es8389->regmap, ES8389_DAC_FORMAT_MUTE,
670						0x03, 0x00);
671		} else {
672			regmap_update_bits(es8389->regmap, ES8389_ADC_FORMAT_MUTE,
673						0x03, 0x00);
674		}
675	}
676
677	return 0;
678}
679
680#define es8389_RATES SNDRV_PCM_RATE_8000_96000
681
682#define es8389_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
683		SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)
684
685static const struct snd_soc_dai_ops es8389_ops = {
686	.hw_params = es8389_pcm_hw_params,
687	.set_fmt = es8389_set_dai_fmt,
688	.set_sysclk = es8389_set_dai_sysclk,
689	.set_tdm_slot = es8389_set_tdm_slot,
690	.mute_stream = es8389_mute,
691};
692
693static struct snd_soc_dai_driver es8389_dai = {
694	.name = "ES8389 HiFi",
695	.playback = {
696		.stream_name = "Playback",
697		.channels_min = 1,
698		.channels_max = 2,
699		.rates = es8389_RATES,
700		.formats = es8389_FORMATS,
701	},
702	.capture = {
703		.stream_name = "Capture",
704		.channels_min = 1,
705		.channels_max = 2,
706		.rates = es8389_RATES,
707		.formats = es8389_FORMATS,
708	},
709	.ops = &es8389_ops,
710	.symmetric_rate = 1,
711};
712
713static void es8389_init(struct snd_soc_component *component)
714{
715	struct es8389_private *es8389 = snd_soc_component_get_drvdata(component);
716
717	regmap_write(es8389->regmap, ES8389_ISO_CTL, 0x00);
718	regmap_write(es8389->regmap, ES8389_RESET, 0x7E);
719	regmap_write(es8389->regmap, ES8389_ISO_CTL, 0x38);
720	regmap_write(es8389->regmap, ES8389_ADC_HPF1, 0x64);
721	regmap_write(es8389->regmap, ES8389_ADC_HPF2, 0x04);
722	regmap_write(es8389->regmap, ES8389_DAC_INV, 0x03);
723
724	regmap_write(es8389->regmap, ES8389_VMID, 0x2A);
725	regmap_write(es8389->regmap, ES8389_ANA_CTL1, 0xC9);
726	regmap_write(es8389->regmap, ES8389_ANA_VSEL, 0x4F);
727	regmap_write(es8389->regmap, ES8389_ANA_CTL2, 0x06);
728	regmap_write(es8389->regmap, ES8389_LOW_POWER1, 0x00);
729	regmap_write(es8389->regmap, ES8389_DMIC_EN, 0x16);
730
731	regmap_write(es8389->regmap, ES8389_PGA_SW, 0xAA);
732	regmap_write(es8389->regmap, ES8389_MOD_SW1, 0x66);
733	regmap_write(es8389->regmap, ES8389_MOD_SW2, 0x99);
734	regmap_write(es8389->regmap, ES8389_ADC_MODE, (0x00 | ES8389_TDM_MODE));
735	regmap_update_bits(es8389->regmap, ES8389_DMIC_EN, 0xC0, 0x00);
736	regmap_update_bits(es8389->regmap, ES8389_ADC_MODE, 0x03, 0x00);
737
738	regmap_update_bits(es8389->regmap, ES8389_MIC1_GAIN,
739					ES8389_MIC_SEL_MASK, ES8389_MIC_DEFAULT);
740	regmap_update_bits(es8389->regmap, ES8389_MIC2_GAIN,
741					ES8389_MIC_SEL_MASK, ES8389_MIC_DEFAULT);
742	regmap_write(es8389->regmap, ES8389_CSM_JUMP, 0xC4);
743	regmap_write(es8389->regmap, ES8389_MASTER_MODE, 0x08);
744	regmap_write(es8389->regmap, ES8389_CSM_STATE1, 0x00);
745	regmap_write(es8389->regmap, ES8389_SYSTEM12, 0x01);
746	regmap_write(es8389->regmap, ES8389_SYSTEM13, 0x01);
747	regmap_write(es8389->regmap, ES8389_SYSTEM14, 0x01);
748	regmap_write(es8389->regmap, ES8389_SYSTEM15, 0x01);
749	regmap_write(es8389->regmap, ES8389_SYSTEM16, 0x35);
750	regmap_write(es8389->regmap, ES8389_SYSTEM17, 0x09);
751	regmap_write(es8389->regmap, ES8389_SYSTEM18, 0x91);
752	regmap_write(es8389->regmap, ES8389_SYSTEM19, 0x28);
753	regmap_write(es8389->regmap, ES8389_SYSTEM1A, 0x01);
754	regmap_write(es8389->regmap, ES8389_SYSTEM1B, 0x01);
755	regmap_write(es8389->regmap, ES8389_SYSTEM1C, 0x11);
756
757	regmap_write(es8389->regmap, ES8389_CHIP_MISC, 0x13);
758	regmap_write(es8389->regmap, ES8389_MASTER_CLK, 0x00);
759	regmap_write(es8389->regmap, ES8389_CLK_DIV1, 0x00);
760	regmap_write(es8389->regmap, ES8389_CLK_MUL, 0x10);
761	regmap_write(es8389->regmap, ES8389_CLK_MUX1, 0x00);
762	regmap_write(es8389->regmap, ES8389_CLK_MUX2, 0xC0);
763	regmap_write(es8389->regmap, ES8389_CLK_CTL1, 0x00);
764	regmap_write(es8389->regmap, ES8389_CLK_CTL2, 0xC0);
765	regmap_write(es8389->regmap, ES8389_CLK_CTL3, 0x80);
766	regmap_write(es8389->regmap, ES8389_SCLK_DIV, 0x04);
767	regmap_write(es8389->regmap, ES8389_LRCK_DIV1, 0x01);
768	regmap_write(es8389->regmap, ES8389_LRCK_DIV2, 0x00);
769	regmap_write(es8389->regmap, ES8389_OSC_CLK, 0x00);
770	regmap_write(es8389->regmap, ES8389_ADC_OSR, 0x1F);
771	regmap_write(es8389->regmap, ES8389_ADC_DSP, 0x7F);
772	regmap_write(es8389->regmap, ES8389_ADC_MUTE, 0xC0);
773	regmap_write(es8389->regmap, ES8389_SYSTEM30, 0xF4);
774	regmap_write(es8389->regmap, ES8389_DAC_DSM_OSR, 0x7F);
775	regmap_write(es8389->regmap, ES8389_DAC_DSP_OSR, 0x7F);
776	regmap_write(es8389->regmap, ES8389_DAC_MISC, 0x10);
777	regmap_write(es8389->regmap, ES8389_DAC_RAMP, 0x0F);
778	regmap_write(es8389->regmap, ES8389_SYSTEM4C, 0xC0);
779	regmap_write(es8389->regmap, ES8389_RESET, 0x00);
780	regmap_write(es8389->regmap, ES8389_CLK_OFF1, 0xC1);
781	regmap_write(es8389->regmap, ES8389_RESET, 0x01);
782	regmap_write(es8389->regmap, ES8389_DAC_RESET, 0x02);
783
784	regmap_update_bits(es8389->regmap, ES8389_ADC_FORMAT_MUTE, 0x03, 0x03);
785	regmap_update_bits(es8389->regmap, ES8389_DAC_FORMAT_MUTE, 0x03, 0x03);
786}
787
788static int es8389_suspend(struct snd_soc_component *component)
789{
790	struct es8389_private *es8389 = snd_soc_component_get_drvdata(component);
791
792	es8389_set_bias_level(component, SND_SOC_BIAS_STANDBY);
793	regcache_cache_only(es8389->regmap, true);
794	regcache_mark_dirty(es8389->regmap);
795
796	return 0;
797}
798
799static int es8389_resume(struct snd_soc_component *component)
800{
801	struct es8389_private *es8389 = snd_soc_component_get_drvdata(component);
802	unsigned int regv;
803
804	regcache_cache_only(es8389->regmap, false);
805	regcache_cache_bypass(es8389->regmap, true);
806	regmap_read(es8389->regmap, ES8389_RESET, &regv);
807	regcache_cache_bypass(es8389->regmap, false);
808
809	if (regv == 0xff)
810		es8389_init(component);
811	else
812		es8389_set_bias_level(component, SND_SOC_BIAS_ON);
813
814	regcache_sync(es8389->regmap);
815
816	return 0;
817}
818
819static int es8389_probe(struct snd_soc_component *component)
820{
821	int ret;
822	struct es8389_private *es8389 = snd_soc_component_get_drvdata(component);
823
824	ret = device_property_read_u8(component->dev, "everest,mclk-src", &es8389->mclk_src);
825	if (ret != 0) {
826		dev_dbg(component->dev, "mclk-src return %d", ret);
827		es8389->mclk_src = ES8389_MCLK_SOURCE;
828	}
829
830	es8389->mclk = devm_clk_get(component->dev, "mclk");
831	if (IS_ERR(es8389->mclk))
832		return dev_err_probe(component->dev, PTR_ERR(es8389->mclk),
833			"ES8389 is unable to get mclk\n");
834
835	if (!es8389->mclk)
836		dev_err(component->dev, "%s, assuming static mclk\n", __func__);
837
838	ret = clk_prepare_enable(es8389->mclk);
839	if (ret) {
840		dev_err(component->dev, "%s, unable to enable mclk\n", __func__);
841		return ret;
842	}
843
844	es8389_init(component);
845	es8389_set_bias_level(component, SND_SOC_BIAS_STANDBY);
846
847	return 0;
848}
849
850static void es8389_remove(struct snd_soc_component *component)
851{
852	struct es8389_private *es8389 = snd_soc_component_get_drvdata(component);
853
854	regmap_write(es8389->regmap, ES8389_MASTER_MODE, 0x28);
855	regmap_write(es8389->regmap, ES8389_HPSW, 0x00);
856	regmap_write(es8389->regmap, ES8389_VMID, 0x00);
857	regmap_write(es8389->regmap, ES8389_RESET, 0x00);
858	regmap_write(es8389->regmap, ES8389_CSM_JUMP, 0xCC);
859	usleep_range(500000, 550000);//500MS
860	regmap_write(es8389->regmap, ES8389_CSM_JUMP, 0x00);
861	regmap_write(es8389->regmap, ES8389_ANA_CTL1, 0x08);
862	regmap_write(es8389->regmap, ES8389_ISO_CTL, 0xC1);
863	regmap_write(es8389->regmap, ES8389_PULL_DOWN, 0x00);
864
865}
866
867static const struct snd_soc_component_driver soc_codec_dev_es8389 = {
868	.probe = es8389_probe,
869	.remove = es8389_remove,
870	.suspend = es8389_suspend,
871	.resume = es8389_resume,
872	.set_bias_level = es8389_set_bias_level,
873
874	.controls = es8389_snd_controls,
875	.num_controls = ARRAY_SIZE(es8389_snd_controls),
876	.dapm_widgets = es8389_dapm_widgets,
877	.num_dapm_widgets = ARRAY_SIZE(es8389_dapm_widgets),
878	.dapm_routes = es8389_dapm_routes,
879	.num_dapm_routes = ARRAY_SIZE(es8389_dapm_routes),
880	.idle_bias_on = 1,
881	.use_pmdown_time = 1,
882};
883
884static const struct regmap_config es8389_regmap = {
885	.reg_bits = 8,
886	.val_bits = 8,
887
888	.max_register = ES8389_MAX_REGISTER,
889
890	.volatile_reg = es8389_volatile_register,
891	.cache_type = REGCACHE_MAPLE,
892};
893
894static void es8389_i2c_shutdown(struct i2c_client *i2c)
895{
896	struct es8389_private *es8389;
897
898	es8389 = i2c_get_clientdata(i2c);
899
900	regmap_write(es8389->regmap, ES8389_MASTER_MODE, 0x28);
901	regmap_write(es8389->regmap, ES8389_HPSW, 0x00);
902	regmap_write(es8389->regmap, ES8389_VMID, 0x00);
903	regmap_write(es8389->regmap, ES8389_RESET, 0x00);
904	regmap_write(es8389->regmap, ES8389_CSM_JUMP, 0xCC);
905	usleep_range(500000, 550000);//500MS
906	regmap_write(es8389->regmap, ES8389_CSM_JUMP, 0x00);
907	regmap_write(es8389->regmap, ES8389_ANA_CTL1, 0x08);
908	regmap_write(es8389->regmap, ES8389_ISO_CTL, 0xC1);
909	regmap_write(es8389->regmap, ES8389_PULL_DOWN, 0x00);
910}
911
912static int es8389_i2c_probe(struct i2c_client *i2c_client)
913{
914	struct es8389_private *es8389;
915	int ret;
916
917	es8389 = devm_kzalloc(&i2c_client->dev, sizeof(*es8389), GFP_KERNEL);
918	if (es8389 == NULL)
919		return -ENOMEM;
920
921	i2c_set_clientdata(i2c_client, es8389);
922	es8389->regmap = devm_regmap_init_i2c(i2c_client, &es8389_regmap);
923	if (IS_ERR(es8389->regmap))
924		return dev_err_probe(&i2c_client->dev, PTR_ERR(es8389->regmap),
925			"regmap_init() failed\n");
926
927	ret =  devm_snd_soc_register_component(&i2c_client->dev,
928			&soc_codec_dev_es8389,
929			&es8389_dai,
930			1);
931
932	return ret;
933}
934
935#ifdef CONFIG_OF
936static const struct of_device_id es8389_if_dt_ids[] = {
937	{ .compatible = "everest,es8389", },
938	{ }
939};
940MODULE_DEVICE_TABLE(of, es8389_if_dt_ids);
941#endif
942
943static const struct i2c_device_id es8389_i2c_id[] = {
944	{"es8389"},
945	{ }
946};
947MODULE_DEVICE_TABLE(i2c, es8389_i2c_id);
948
949static struct i2c_driver es8389_i2c_driver = {
950	.driver = {
951		.name	= "es8389",
952		.of_match_table = of_match_ptr(es8389_if_dt_ids),
953	},
954	.shutdown = es8389_i2c_shutdown,
955	.probe = es8389_i2c_probe,
956	.id_table = es8389_i2c_id,
957};
958module_i2c_driver(es8389_i2c_driver);
959
960MODULE_DESCRIPTION("ASoC es8389 driver");
961MODULE_AUTHOR("Michael Zhang <zhangyi@everest-semi.com>");
962MODULE_LICENSE("GPL");
~/ Read-only file preview.