xref: /linux/sound/soc/codecs/jz4760.c (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // Ingenic JZ4760 CODEC driver
4 //
5 // Copyright (C) 2021, Christophe Branchereau <cbranchereau@gmail.com>
6 // Copyright (C) 2021, Paul Cercueil <paul@crapouillou.net>
7 
8 #include <linux/bitfield.h>
9 #include <linux/clk.h>
10 #include <linux/delay.h>
11 #include <linux/iopoll.h>
12 #include <linux/module.h>
13 #include <linux/regmap.h>
14 #include <linux/time64.h>
15 
16 #include <sound/pcm_params.h>
17 #include <sound/soc.h>
18 #include <sound/soc-dai.h>
19 #include <sound/soc-dapm.h>
20 #include <sound/tlv.h>
21 
22 #define ICDC_RGADW_OFFSET		0x00
23 #define ICDC_RGDATA_OFFSET		0x04
24 
25 /* ICDC internal register access control register(RGADW) */
26 #define ICDC_RGADW_RGWR			BIT(16)
27 #define	ICDC_RGADW_RGADDR_MASK		GENMASK(14, 8)
28 #define	ICDC_RGADW_RGDIN_MASK		GENMASK(7, 0)
29 
30 /* ICDC internal register data output register (RGDATA)*/
31 #define ICDC_RGDATA_IRQ			BIT(8)
32 #define ICDC_RGDATA_RGDOUT_MASK		GENMASK(7, 0)
33 
34 /* Internal register space, accessed through regmap */
35 enum {
36 	JZ4760_CODEC_REG_SR,
37 	JZ4760_CODEC_REG_AICR,
38 	JZ4760_CODEC_REG_CR1,
39 	JZ4760_CODEC_REG_CR2,
40 	JZ4760_CODEC_REG_CR3,
41 	JZ4760_CODEC_REG_CR4,
42 	JZ4760_CODEC_REG_CCR1,
43 	JZ4760_CODEC_REG_CCR2,
44 	JZ4760_CODEC_REG_PMR1,
45 	JZ4760_CODEC_REG_PMR2,
46 	JZ4760_CODEC_REG_ICR,
47 	JZ4760_CODEC_REG_IFR,
48 	JZ4760_CODEC_REG_GCR1,
49 	JZ4760_CODEC_REG_GCR2,
50 	JZ4760_CODEC_REG_GCR3,
51 	JZ4760_CODEC_REG_GCR4,
52 	JZ4760_CODEC_REG_GCR5,
53 	JZ4760_CODEC_REG_GCR6,
54 	JZ4760_CODEC_REG_GCR7,
55 	JZ4760_CODEC_REG_GCR8,
56 	JZ4760_CODEC_REG_GCR9,
57 	JZ4760_CODEC_REG_AGC1,
58 	JZ4760_CODEC_REG_AGC2,
59 	JZ4760_CODEC_REG_AGC3,
60 	JZ4760_CODEC_REG_AGC4,
61 	JZ4760_CODEC_REG_AGC5,
62 	JZ4760_CODEC_REG_MIX1,
63 	JZ4760_CODEC_REG_MIX2,
64 };
65 
66 #define REG_AICR_DAC_ADWL_MASK		GENMASK(7, 6)
67 #define REG_AICR_DAC_SERIAL		BIT(3)
68 #define REG_AICR_DAC_I2S		BIT(1)
69 
70 #define REG_AICR_ADC_ADWL_MASK		GENMASK(5, 4)
71 
72 #define REG_AICR_ADC_SERIAL		BIT(2)
73 #define REG_AICR_ADC_I2S		BIT(0)
74 
75 #define REG_CR1_HP_LOAD			BIT(7)
76 #define REG_CR1_HP_MUTE			BIT(5)
77 #define REG_CR1_LO_MUTE_OFFSET		4
78 #define REG_CR1_BTL_MUTE_OFFSET		3
79 #define REG_CR1_OUTSEL_OFFSET		0
80 #define REG_CR1_OUTSEL_MASK		GENMASK(1, REG_CR1_OUTSEL_OFFSET)
81 
82 #define REG_CR2_DAC_MONO		BIT(7)
83 #define REG_CR2_DAC_MUTE		BIT(5)
84 #define REG_CR2_DAC_NOMAD		BIT(1)
85 #define REG_CR2_DAC_RIGHT_ONLY		BIT(0)
86 
87 #define REG_CR3_ADC_INSEL_OFFSET	2
88 #define REG_CR3_ADC_INSEL_MASK		GENMASK(3, REG_CR3_ADC_INSEL_OFFSET)
89 #define REG_CR3_MICSTEREO_OFFSET	1
90 #define REG_CR3_MICDIFF_OFFSET		0
91 
92 #define REG_CR4_ADC_HPF_OFFSET		7
93 #define REG_CR4_ADC_RIGHT_ONLY		BIT(0)
94 
95 #define REG_CCR1_CRYSTAL_MASK		GENMASK(3, 0)
96 
97 #define REG_CCR2_DAC_FREQ_MASK		GENMASK(7, 4)
98 #define REG_CCR2_ADC_FREQ_MASK		GENMASK(3, 0)
99 
100 #define REG_PMR1_SB			BIT(7)
101 #define REG_PMR1_SB_SLEEP		BIT(6)
102 #define REG_PMR1_SB_AIP_OFFSET		5
103 #define REG_PMR1_SB_LINE_OFFSET		4
104 #define REG_PMR1_SB_MIC1_OFFSET		3
105 #define REG_PMR1_SB_MIC2_OFFSET		2
106 #define REG_PMR1_SB_BYPASS_OFFSET	1
107 #define REG_PMR1_SB_MICBIAS_OFFSET	0
108 
109 #define REG_PMR2_SB_ADC_OFFSET		4
110 #define REG_PMR2_SB_HP_OFFSET		3
111 #define REG_PMR2_SB_BTL_OFFSET		2
112 #define REG_PMR2_SB_LOUT_OFFSET		1
113 #define REG_PMR2_SB_DAC_OFFSET		0
114 
115 #define REG_ICR_INT_FORM_MASK		GENMASK(7, 6)
116 #define REG_ICR_ALL_MASK		GENMASK(5, 0)
117 #define REG_ICR_JACK_MASK		BIT(5)
118 #define REG_ICR_SCMC_MASK		BIT(4)
119 #define REG_ICR_RUP_MASK		BIT(3)
120 #define REG_ICR_RDO_MASK		BIT(2)
121 #define REG_ICR_GUP_MASK		BIT(1)
122 #define REG_ICR_GDO_MASK		BIT(0)
123 
124 #define REG_IFR_ALL_MASK		GENMASK(5, 0)
125 #define REG_IFR_JACK			BIT(6)
126 #define REG_IFR_JACK_EVENT		BIT(5)
127 #define REG_IFR_SCMC			BIT(4)
128 #define REG_IFR_RUP			BIT(3)
129 #define REG_IFR_RDO			BIT(2)
130 #define REG_IFR_GUP			BIT(1)
131 #define REG_IFR_GDO			BIT(0)
132 
133 #define REG_GCR_GAIN_OFFSET		0
134 #define REG_GCR_GAIN_MAX		0x1f
135 
136 #define REG_GCR_RL			BIT(7)
137 
138 #define REG_GCR_GIM1_MASK		GENMASK(5, 3)
139 #define REG_GCR_GIM2_MASK		GENMASK(2, 0)
140 #define REG_GCR_GIM_GAIN_MAX		7
141 
142 #define REG_AGC1_EN			BIT(7)
143 #define REG_AGC1_TARGET_MASK		GENMASK(5, 2)
144 
145 #define REG_AGC2_NG_THR_MASK		GENMASK(6, 4)
146 #define REG_AGC2_HOLD_MASK		GENMASK(3, 0)
147 
148 #define REG_AGC3_ATK_MASK		GENMASK(7, 4)
149 #define REG_AGC3_DCY_MASK		GENMASK(3, 0)
150 
151 #define REG_AGC4_AGC_MAX_MASK		GENMASK(4, 0)
152 
153 #define REG_AGC5_AGC_MIN_MASK		GENMASK(4, 0)
154 
155 #define REG_MIX1_MIX_REC_MASK		GENMASK(7, 6)
156 #define REG_MIX1_GIMIX_MASK		GENMASK(4, 0)
157 
158 #define REG_MIX2_DAC_MIX_MASK		GENMASK(7, 6)
159 #define REG_MIX2_GOMIX_MASK		GENMASK(4, 0)
160 
161 /* codec private data */
162 struct jz_codec {
163 	struct device *dev;
164 	struct regmap *regmap;
165 	void __iomem *base;
166 	struct clk *clk;
167 };
168 
jz4760_codec_set_bias_level(struct snd_soc_component * codec,enum snd_soc_bias_level level)169 static int jz4760_codec_set_bias_level(struct snd_soc_component *codec,
170 				       enum snd_soc_bias_level level)
171 {
172 	struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
173 	struct regmap *regmap = jz_codec->regmap;
174 
175 	switch (level) {
176 	case SND_SOC_BIAS_PREPARE:
177 		/* Reset all interrupt flags. */
178 		regmap_write(regmap, JZ4760_CODEC_REG_IFR, REG_IFR_ALL_MASK);
179 
180 		regmap_clear_bits(regmap, JZ4760_CODEC_REG_PMR1, REG_PMR1_SB);
181 		msleep(250);
182 		regmap_clear_bits(regmap, JZ4760_CODEC_REG_PMR1, REG_PMR1_SB_SLEEP);
183 		msleep(400);
184 		break;
185 	case SND_SOC_BIAS_STANDBY:
186 		regmap_set_bits(regmap, JZ4760_CODEC_REG_PMR1, REG_PMR1_SB_SLEEP);
187 		regmap_set_bits(regmap, JZ4760_CODEC_REG_PMR1, REG_PMR1_SB);
188 		break;
189 	default:
190 		break;
191 	}
192 
193 	return 0;
194 }
195 
jz4760_codec_startup(struct snd_pcm_substream * substream,struct snd_soc_dai * dai)196 static int jz4760_codec_startup(struct snd_pcm_substream *substream,
197 				struct snd_soc_dai *dai)
198 {
199 	struct snd_soc_component *codec = dai->component;
200 	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(codec);
201 	int ret = 0;
202 
203 	/*
204 	 * SYSCLK output from the codec to the AIC is required to keep the
205 	 * DMA transfer going during playback when all audible outputs have
206 	 * been disabled.
207 	 */
208 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
209 		ret = snd_soc_dapm_force_enable_pin(dapm, "SYSCLK");
210 	return ret;
211 }
212 
jz4760_codec_shutdown(struct snd_pcm_substream * substream,struct snd_soc_dai * dai)213 static void jz4760_codec_shutdown(struct snd_pcm_substream *substream,
214 				  struct snd_soc_dai *dai)
215 {
216 	struct snd_soc_component *codec = dai->component;
217 	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(codec);
218 
219 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
220 		snd_soc_dapm_disable_pin(dapm, "SYSCLK");
221 }
222 
223 
jz4760_codec_pcm_trigger(struct snd_pcm_substream * substream,int cmd,struct snd_soc_dai * dai)224 static int jz4760_codec_pcm_trigger(struct snd_pcm_substream *substream,
225 				    int cmd, struct snd_soc_dai *dai)
226 {
227 	struct snd_soc_component *codec = dai->component;
228 	int ret = 0;
229 
230 	switch (cmd) {
231 	case SNDRV_PCM_TRIGGER_START:
232 	case SNDRV_PCM_TRIGGER_RESUME:
233 	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
234 		if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
235 			snd_soc_component_force_bias_level(codec, SND_SOC_BIAS_ON);
236 		break;
237 	case SNDRV_PCM_TRIGGER_STOP:
238 	case SNDRV_PCM_TRIGGER_SUSPEND:
239 	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
240 		/* do nothing */
241 		break;
242 	default:
243 		ret = -EINVAL;
244 	}
245 
246 	return ret;
247 }
248 
jz4760_codec_mute_stream(struct snd_soc_dai * dai,int mute,int direction)249 static int jz4760_codec_mute_stream(struct snd_soc_dai *dai, int mute, int direction)
250 {
251 	struct snd_soc_component *codec = dai->component;
252 	struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
253 	unsigned int gain_bit = mute ? REG_IFR_GDO : REG_IFR_GUP;
254 	unsigned int val, reg;
255 	int change, err;
256 
257 	change = snd_soc_component_update_bits(codec, JZ4760_CODEC_REG_CR2,
258 					       REG_CR2_DAC_MUTE,
259 					       mute ? REG_CR2_DAC_MUTE : 0);
260 	if (change == 1) {
261 		regmap_read(jz_codec->regmap, JZ4760_CODEC_REG_PMR2, &val);
262 
263 		if (val & BIT(REG_PMR2_SB_DAC_OFFSET))
264 			return 1;
265 
266 		err = regmap_read_poll_timeout(jz_codec->regmap,
267 					       JZ4760_CODEC_REG_IFR,
268 					       val, val & gain_bit,
269 					       1000, 1 * USEC_PER_SEC);
270 		if (err) {
271 			dev_err(jz_codec->dev,
272 				"Timeout while setting digital mute: %d", err);
273 			return err;
274 		}
275 
276 		/* clear GUP/GDO flag */
277 		regmap_write(jz_codec->regmap, JZ4760_CODEC_REG_IFR, gain_bit);
278 	}
279 
280 	regmap_read(jz_codec->regmap, JZ4760_CODEC_REG_CR2, &reg);
281 
282 	return 0;
283 }
284 
285 /* unit: 0.01dB */
286 static const DECLARE_TLV_DB_MINMAX_MUTE(dac_tlv, -3100, 100);
287 static const DECLARE_TLV_DB_SCALE(adc_tlv, 0, 100, 0);
288 static const DECLARE_TLV_DB_MINMAX(out_tlv, -2500, 100);
289 static const DECLARE_TLV_DB_SCALE(linein_tlv, -2500, 100, 0);
290 static const DECLARE_TLV_DB_MINMAX(mixer_tlv, -3100, 0);
291 
292 /* Unconditional controls. */
293 static const struct snd_kcontrol_new jz4760_codec_snd_controls[] = {
294 	/* record gain control */
295 	SOC_DOUBLE_R_TLV("PCM Capture Volume",
296 			 JZ4760_CODEC_REG_GCR9, JZ4760_CODEC_REG_GCR8,
297 			 REG_GCR_GAIN_OFFSET, REG_GCR_GAIN_MAX, 0, adc_tlv),
298 
299 	SOC_DOUBLE_R_TLV("Line In Bypass Playback Volume",
300 			 JZ4760_CODEC_REG_GCR4, JZ4760_CODEC_REG_GCR3,
301 			 REG_GCR_GAIN_OFFSET, REG_GCR_GAIN_MAX, 1, linein_tlv),
302 
303 	SOC_SINGLE_TLV("Mixer Capture Volume",
304 		       JZ4760_CODEC_REG_MIX1,
305 		       REG_GCR_GAIN_OFFSET, REG_GCR_GAIN_MAX, 1, mixer_tlv),
306 
307 	SOC_SINGLE_TLV("Mixer Playback Volume",
308 		       JZ4760_CODEC_REG_MIX2,
309 		       REG_GCR_GAIN_OFFSET, REG_GCR_GAIN_MAX, 1, mixer_tlv),
310 
311 	SOC_SINGLE("High-Pass Filter Capture Switch",
312 		   JZ4760_CODEC_REG_CR4,
313 		   REG_CR4_ADC_HPF_OFFSET, 1, 0),
314 };
315 
316 static const struct snd_kcontrol_new jz4760_codec_pcm_playback_controls[] = {
317 	SOC_DAPM_DOUBLE_R_TLV("Volume", JZ4760_CODEC_REG_GCR6, JZ4760_CODEC_REG_GCR5,
318 			      REG_GCR_GAIN_OFFSET, REG_GCR_GAIN_MAX, 1, dac_tlv),
319 };
320 
321 static const struct snd_kcontrol_new jz4760_codec_hp_playback_controls[] = {
322 	SOC_DAPM_DOUBLE_R_TLV("Volume", JZ4760_CODEC_REG_GCR2, JZ4760_CODEC_REG_GCR1,
323 			      REG_GCR_GAIN_OFFSET, REG_GCR_GAIN_MAX, 1, out_tlv),
324 };
325 
hpout_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)326 static int hpout_event(struct snd_soc_dapm_widget *w,
327 		       struct snd_kcontrol *kcontrol, int event)
328 {
329 	struct snd_soc_component *codec = snd_soc_dapm_to_component(w->dapm);
330 	struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
331 	unsigned int val;
332 	int err;
333 
334 	switch (event) {
335 	case SND_SOC_DAPM_PRE_PMU:
336 		/* unmute HP */
337 		regmap_clear_bits(jz_codec->regmap, JZ4760_CODEC_REG_CR1,
338 				  REG_CR1_HP_MUTE);
339 		break;
340 
341 	case SND_SOC_DAPM_POST_PMU:
342 		/* wait for ramp-up complete (RUP) */
343 		err = regmap_read_poll_timeout(jz_codec->regmap,
344 					       JZ4760_CODEC_REG_IFR,
345 					       val, val & REG_IFR_RUP,
346 					       1000, 1 * USEC_PER_SEC);
347 		if (err) {
348 			dev_err(jz_codec->dev, "RUP timeout: %d", err);
349 			return err;
350 		}
351 
352 		/* clear RUP flag */
353 		regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_IFR,
354 				REG_IFR_RUP);
355 
356 		break;
357 
358 	case SND_SOC_DAPM_POST_PMD:
359 		/* mute HP */
360 		regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_CR1,
361 				REG_CR1_HP_MUTE);
362 
363 		err = regmap_read_poll_timeout(jz_codec->regmap,
364 					       JZ4760_CODEC_REG_IFR,
365 					       val, val & REG_IFR_RDO,
366 					       1000, 1 * USEC_PER_SEC);
367 		if (err) {
368 			dev_err(jz_codec->dev, "RDO timeout: %d", err);
369 			return err;
370 		}
371 
372 		/* clear RDO flag */
373 		regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_IFR,
374 				REG_IFR_RDO);
375 
376 		break;
377 	}
378 
379 	return 0;
380 }
381 
382 static const char * const jz4760_codec_hp_texts[] = {
383 	"PCM", "Line In", "Mic 1", "Mic 2"
384 };
385 
386 static const unsigned int jz4760_codec_hp_values[] = { 3, 2, 0, 1 };
387 
388 static SOC_VALUE_ENUM_SINGLE_DECL(jz4760_codec_hp_enum,
389 				  JZ4760_CODEC_REG_CR1,
390 				  REG_CR1_OUTSEL_OFFSET,
391 				  REG_CR1_OUTSEL_MASK >> REG_CR1_OUTSEL_OFFSET,
392 				  jz4760_codec_hp_texts,
393 				  jz4760_codec_hp_values);
394 static const struct snd_kcontrol_new jz4760_codec_hp_source =
395 			SOC_DAPM_ENUM("Route", jz4760_codec_hp_enum);
396 
397 static const char * const jz4760_codec_cap_texts[] = {
398 	"Line In", "Mic 1", "Mic 2"
399 };
400 
401 static const unsigned int jz4760_codec_cap_values[] = { 2, 0, 1 };
402 
403 static SOC_VALUE_ENUM_SINGLE_DECL(jz4760_codec_cap_enum,
404 				  JZ4760_CODEC_REG_CR3,
405 				  REG_CR3_ADC_INSEL_OFFSET,
406 				  REG_CR3_ADC_INSEL_MASK >> REG_CR3_ADC_INSEL_OFFSET,
407 				  jz4760_codec_cap_texts,
408 				  jz4760_codec_cap_values);
409 static const struct snd_kcontrol_new jz4760_codec_cap_source =
410 			SOC_DAPM_ENUM("Route", jz4760_codec_cap_enum);
411 
412 static const struct snd_kcontrol_new jz4760_codec_mic_controls[] = {
413 	SOC_DAPM_SINGLE("Stereo Capture Switch", JZ4760_CODEC_REG_CR3,
414 			REG_CR3_MICSTEREO_OFFSET, 1, 0),
415 };
416 
417 static const struct snd_kcontrol_new jz4760_codec_line_out_switch =
418 	SOC_DAPM_SINGLE("Switch", JZ4760_CODEC_REG_CR1,
419 			REG_CR1_LO_MUTE_OFFSET, 0, 0);
420 static const struct snd_kcontrol_new jz4760_codec_btl_out_switch =
421 	SOC_DAPM_SINGLE("Switch", JZ4760_CODEC_REG_CR1,
422 			REG_CR1_BTL_MUTE_OFFSET, 0, 0);
423 
424 static const struct snd_soc_dapm_widget jz4760_codec_dapm_widgets[] = {
425 	SND_SOC_DAPM_PGA_E("HP Out", JZ4760_CODEC_REG_PMR2,
426 			   REG_PMR2_SB_HP_OFFSET, 1, NULL, 0, hpout_event,
427 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
428 			   SND_SOC_DAPM_POST_PMD),
429 
430 	SND_SOC_DAPM_SWITCH("Line Out", JZ4760_CODEC_REG_PMR2,
431 			    REG_PMR2_SB_LOUT_OFFSET, 1,
432 			    &jz4760_codec_line_out_switch),
433 
434 	SND_SOC_DAPM_SWITCH("BTL Out", JZ4760_CODEC_REG_PMR2,
435 			    REG_PMR2_SB_BTL_OFFSET, 1,
436 			    &jz4760_codec_btl_out_switch),
437 
438 	SND_SOC_DAPM_PGA("Line In", JZ4760_CODEC_REG_PMR1,
439 			 REG_PMR1_SB_LINE_OFFSET, 1, NULL, 0),
440 
441 	SND_SOC_DAPM_MUX("Headphones Source", SND_SOC_NOPM, 0, 0,
442 			 &jz4760_codec_hp_source),
443 
444 	SND_SOC_DAPM_MUX("Capture Source", SND_SOC_NOPM, 0, 0,
445 			 &jz4760_codec_cap_source),
446 
447 	SND_SOC_DAPM_PGA("Mic 1", JZ4760_CODEC_REG_PMR1,
448 			 REG_PMR1_SB_MIC1_OFFSET, 1, NULL, 0),
449 
450 	SND_SOC_DAPM_PGA("Mic 2", JZ4760_CODEC_REG_PMR1,
451 			 REG_PMR1_SB_MIC2_OFFSET, 1, NULL, 0),
452 
453 	SND_SOC_DAPM_PGA("Mic Diff", JZ4760_CODEC_REG_CR3,
454 			 REG_CR3_MICDIFF_OFFSET, 0, NULL, 0),
455 
456 	SND_SOC_DAPM_MIXER("Mic", SND_SOC_NOPM, 0, 0,
457 			   jz4760_codec_mic_controls,
458 			   ARRAY_SIZE(jz4760_codec_mic_controls)),
459 
460 	SND_SOC_DAPM_PGA("Line In Bypass", JZ4760_CODEC_REG_PMR1,
461 			 REG_PMR1_SB_BYPASS_OFFSET, 1, NULL, 0),
462 
463 	SND_SOC_DAPM_ADC("ADC", "Capture", JZ4760_CODEC_REG_PMR2,
464 			 REG_PMR2_SB_ADC_OFFSET, 1),
465 
466 	SND_SOC_DAPM_DAC("DAC", "Playback", JZ4760_CODEC_REG_PMR2,
467 			 REG_PMR2_SB_DAC_OFFSET, 1),
468 
469 	SND_SOC_DAPM_MIXER("PCM Playback", SND_SOC_NOPM, 0, 0,
470 			   jz4760_codec_pcm_playback_controls,
471 			   ARRAY_SIZE(jz4760_codec_pcm_playback_controls)),
472 
473 	SND_SOC_DAPM_MIXER("Headphones Playback", SND_SOC_NOPM, 0, 0,
474 			   jz4760_codec_hp_playback_controls,
475 			   ARRAY_SIZE(jz4760_codec_hp_playback_controls)),
476 
477 	SND_SOC_DAPM_SUPPLY("MICBIAS", JZ4760_CODEC_REG_PMR1,
478 			    REG_PMR1_SB_MICBIAS_OFFSET, 1, NULL, 0),
479 
480 	SND_SOC_DAPM_INPUT("MIC1P"),
481 	SND_SOC_DAPM_INPUT("MIC1N"),
482 	SND_SOC_DAPM_INPUT("MIC2P"),
483 	SND_SOC_DAPM_INPUT("MIC2N"),
484 
485 	SND_SOC_DAPM_INPUT("LLINEIN"),
486 	SND_SOC_DAPM_INPUT("RLINEIN"),
487 
488 	SND_SOC_DAPM_OUTPUT("LHPOUT"),
489 	SND_SOC_DAPM_OUTPUT("RHPOUT"),
490 
491 	SND_SOC_DAPM_OUTPUT("LOUT"),
492 	SND_SOC_DAPM_OUTPUT("ROUT"),
493 
494 	SND_SOC_DAPM_OUTPUT("BTLP"),
495 	SND_SOC_DAPM_OUTPUT("BTLN"),
496 
497 	SND_SOC_DAPM_OUTPUT("SYSCLK"),
498 };
499 
500 /* Unconditional routes. */
501 static const struct snd_soc_dapm_route jz4760_codec_dapm_routes[] = {
502 	{ "Mic 1", NULL, "MIC1P" },
503 	{ "Mic Diff", NULL, "MIC1N" },
504 	{ "Mic 1", NULL, "Mic Diff" },
505 	{ "Mic 2", NULL, "MIC2P" },
506 	{ "Mic Diff", NULL, "MIC2N" },
507 	{ "Mic 2", NULL, "Mic Diff" },
508 
509 	{ "Line In", NULL, "LLINEIN" },
510 	{ "Line In", NULL, "RLINEIN" },
511 
512 	{ "Mic", "Stereo Capture Switch", "Mic 1" },
513 	{ "Mic", "Stereo Capture Switch", "Mic 2" },
514 	{ "Headphones Source", "Mic 1", "Mic" },
515 	{ "Headphones Source", "Mic 2", "Mic" },
516 	{ "Capture Source", "Mic 1", "Mic" },
517 	{ "Capture Source", "Mic 2", "Mic" },
518 
519 	{ "Capture Source", "Line In", "Line In" },
520 	{ "Capture Source", "Mic 1", "Mic 1" },
521 	{ "Capture Source", "Mic 2", "Mic 2" },
522 	{ "ADC", NULL, "Capture Source" },
523 
524 	{ "Line In Bypass", NULL, "Line In" },
525 
526 	{ "Headphones Source", "Mic 1", "Mic 1" },
527 	{ "Headphones Source", "Mic 2", "Mic 2" },
528 	{ "Headphones Source", "Line In", "Line In Bypass" },
529 	{ "Headphones Source", "PCM", "Headphones Playback" },
530 	{ "HP Out", NULL, "Headphones Source" },
531 
532 	{ "LHPOUT", NULL, "HP Out" },
533 	{ "RHPOUT", NULL, "HP Out" },
534 	{ "Line Out", "Switch", "HP Out" },
535 
536 	{ "LOUT", NULL, "Line Out" },
537 	{ "ROUT", NULL, "Line Out" },
538 	{ "BTL Out", "Switch", "Line Out" },
539 
540 	{ "BTLP", NULL, "BTL Out"},
541 	{ "BTLN", NULL, "BTL Out"},
542 
543 	{ "PCM Playback", "Volume", "DAC" },
544 	{ "Headphones Playback", "Volume", "PCM Playback" },
545 
546 	{ "SYSCLK", NULL, "DAC" },
547 };
548 
jz4760_codec_codec_init_regs(struct snd_soc_component * codec)549 static void jz4760_codec_codec_init_regs(struct snd_soc_component *codec)
550 {
551 	struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
552 	struct regmap *regmap = jz_codec->regmap;
553 
554 	/* Collect updates for later sending. */
555 	regcache_cache_only(regmap, true);
556 
557 	/* default Amp output to PCM */
558 	regmap_set_bits(regmap, JZ4760_CODEC_REG_CR1, REG_CR1_OUTSEL_MASK);
559 
560 	/* Disable stereo mic */
561 	regmap_clear_bits(regmap, JZ4760_CODEC_REG_CR3,
562 			  BIT(REG_CR3_MICSTEREO_OFFSET));
563 
564 	/* Set mic 1 as default source for ADC */
565 	regmap_clear_bits(regmap, JZ4760_CODEC_REG_CR3,
566 			  REG_CR3_ADC_INSEL_MASK);
567 
568 	/* ADC/DAC: serial + i2s */
569 	regmap_set_bits(regmap, JZ4760_CODEC_REG_AICR,
570 			REG_AICR_ADC_SERIAL | REG_AICR_ADC_I2S |
571 			REG_AICR_DAC_SERIAL | REG_AICR_DAC_I2S);
572 
573 	/* The generated IRQ is a high level */
574 	regmap_clear_bits(regmap, JZ4760_CODEC_REG_ICR, REG_ICR_INT_FORM_MASK);
575 	regmap_update_bits(regmap, JZ4760_CODEC_REG_ICR, REG_ICR_ALL_MASK,
576 			   REG_ICR_JACK_MASK | REG_ICR_RUP_MASK |
577 			   REG_ICR_RDO_MASK  | REG_ICR_GUP_MASK |
578 			   REG_ICR_GDO_MASK);
579 
580 	/* 12M oscillator */
581 	regmap_clear_bits(regmap, JZ4760_CODEC_REG_CCR1, REG_CCR1_CRYSTAL_MASK);
582 
583 	/* 0: 16ohm/220uF, 1: 10kohm/1uF */
584 	regmap_clear_bits(regmap, JZ4760_CODEC_REG_CR1, REG_CR1_HP_LOAD);
585 
586 	/* default to NOMAD */
587 	regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_CR2,
588 			REG_CR2_DAC_NOMAD);
589 
590 	/* disable automatic gain */
591 	regmap_clear_bits(regmap, JZ4760_CODEC_REG_AGC1, REG_AGC1_EN);
592 
593 	/* Independent L/R DAC gain control */
594 	regmap_clear_bits(regmap, JZ4760_CODEC_REG_GCR5,
595 			  REG_GCR_RL);
596 
597 	/* Send collected updates. */
598 	regcache_cache_only(regmap, false);
599 	regcache_sync(regmap);
600 }
601 
jz4760_codec_codec_probe(struct snd_soc_component * codec)602 static int jz4760_codec_codec_probe(struct snd_soc_component *codec)
603 {
604 	struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
605 
606 	clk_prepare_enable(jz_codec->clk);
607 
608 	jz4760_codec_codec_init_regs(codec);
609 
610 	return 0;
611 }
612 
jz4760_codec_codec_remove(struct snd_soc_component * codec)613 static void jz4760_codec_codec_remove(struct snd_soc_component *codec)
614 {
615 	struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
616 
617 	clk_disable_unprepare(jz_codec->clk);
618 }
619 
620 static const struct snd_soc_component_driver jz4760_codec_soc_codec_dev = {
621 	.probe			= jz4760_codec_codec_probe,
622 	.remove			= jz4760_codec_codec_remove,
623 	.set_bias_level		= jz4760_codec_set_bias_level,
624 	.controls		= jz4760_codec_snd_controls,
625 	.num_controls		= ARRAY_SIZE(jz4760_codec_snd_controls),
626 	.dapm_widgets		= jz4760_codec_dapm_widgets,
627 	.num_dapm_widgets	= ARRAY_SIZE(jz4760_codec_dapm_widgets),
628 	.dapm_routes		= jz4760_codec_dapm_routes,
629 	.num_dapm_routes	= ARRAY_SIZE(jz4760_codec_dapm_routes),
630 	.suspend_bias_off	= 1,
631 	.use_pmdown_time	= 1,
632 };
633 
634 static const unsigned int jz4760_codec_sample_rates[] = {
635 	96000, 48000, 44100, 32000,
636 	24000, 22050, 16000, 12000,
637 	11025, 9600, 8000,
638 };
639 
jz4760_codec_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)640 static int jz4760_codec_hw_params(struct snd_pcm_substream *substream,
641 				  struct snd_pcm_hw_params *params,
642 				  struct snd_soc_dai *dai)
643 {
644 	struct jz_codec *codec = snd_soc_component_get_drvdata(dai->component);
645 	unsigned int rate, bit_width;
646 
647 	switch (params_format(params)) {
648 	case SNDRV_PCM_FORMAT_S16_LE:
649 		bit_width = 0;
650 		break;
651 	case SNDRV_PCM_FORMAT_S18_3LE:
652 		bit_width = 1;
653 		break;
654 	case SNDRV_PCM_FORMAT_S20_3LE:
655 		bit_width = 2;
656 		break;
657 	case SNDRV_PCM_FORMAT_S24_3LE:
658 		bit_width = 3;
659 		break;
660 	default:
661 		return -EINVAL;
662 	}
663 
664 	for (rate = 0; rate < ARRAY_SIZE(jz4760_codec_sample_rates); rate++) {
665 		if (jz4760_codec_sample_rates[rate] == params_rate(params))
666 			break;
667 	}
668 
669 	if (rate == ARRAY_SIZE(jz4760_codec_sample_rates))
670 		return -EINVAL;
671 
672 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
673 		regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_AICR,
674 				   REG_AICR_DAC_ADWL_MASK,
675 				   FIELD_PREP(REG_AICR_DAC_ADWL_MASK, bit_width));
676 		regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_CCR2,
677 				   REG_CCR2_DAC_FREQ_MASK,
678 				   FIELD_PREP(REG_CCR2_DAC_FREQ_MASK, rate));
679 	} else {
680 		regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_AICR,
681 				   REG_AICR_ADC_ADWL_MASK,
682 				   FIELD_PREP(REG_AICR_ADC_ADWL_MASK, bit_width));
683 		regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_CCR2,
684 				   REG_CCR2_ADC_FREQ_MASK,
685 				   FIELD_PREP(REG_CCR2_ADC_FREQ_MASK, rate));
686 	}
687 
688 	return 0;
689 }
690 
691 static const struct snd_soc_dai_ops jz4760_codec_dai_ops = {
692 	.startup	= jz4760_codec_startup,
693 	.shutdown	= jz4760_codec_shutdown,
694 	.hw_params	= jz4760_codec_hw_params,
695 	.trigger	= jz4760_codec_pcm_trigger,
696 	.mute_stream	= jz4760_codec_mute_stream,
697 	.no_capture_mute = 1,
698 };
699 
700 #define JZ_CODEC_FORMATS (SNDRV_PCM_FMTBIT_S16_LE  | \
701 			  SNDRV_PCM_FMTBIT_S18_3LE | \
702 			  SNDRV_PCM_FMTBIT_S20_3LE | \
703 			  SNDRV_PCM_FMTBIT_S24_3LE)
704 
705 static struct snd_soc_dai_driver jz4760_codec_dai = {
706 	.name = "jz4760-hifi",
707 	.playback = {
708 		.stream_name = "Playback",
709 		.channels_min = 2,
710 		.channels_max = 2,
711 		.rates = SNDRV_PCM_RATE_8000_96000,
712 		.formats = JZ_CODEC_FORMATS,
713 	},
714 	.capture = {
715 		.stream_name = "Capture",
716 		.channels_min = 2,
717 		.channels_max = 2,
718 		.rates = SNDRV_PCM_RATE_8000_96000,
719 		.formats = JZ_CODEC_FORMATS,
720 	},
721 	.ops = &jz4760_codec_dai_ops,
722 };
723 
jz4760_codec_volatile(struct device * dev,unsigned int reg)724 static bool jz4760_codec_volatile(struct device *dev, unsigned int reg)
725 {
726 	return reg == JZ4760_CODEC_REG_SR || reg == JZ4760_CODEC_REG_IFR;
727 }
728 
jz4760_codec_writeable(struct device * dev,unsigned int reg)729 static bool jz4760_codec_writeable(struct device *dev, unsigned int reg)
730 {
731 	switch (reg) {
732 	case JZ4760_CODEC_REG_SR:
733 		return false;
734 	default:
735 		return true;
736 	}
737 }
738 
jz4760_codec_io_wait(struct jz_codec * codec)739 static int jz4760_codec_io_wait(struct jz_codec *codec)
740 {
741 	u32 reg;
742 
743 	return readl_poll_timeout(codec->base + ICDC_RGADW_OFFSET, reg,
744 				  !(reg & ICDC_RGADW_RGWR),
745 				  1000, 1 * USEC_PER_SEC);
746 }
747 
jz4760_codec_reg_read(void * context,unsigned int reg,unsigned int * val)748 static int jz4760_codec_reg_read(void *context, unsigned int reg,
749 				 unsigned int *val)
750 {
751 	struct jz_codec *codec = context;
752 	unsigned int i;
753 	u32 tmp;
754 	int ret;
755 
756 	ret = jz4760_codec_io_wait(codec);
757 	if (ret)
758 		return ret;
759 
760 	tmp = readl(codec->base + ICDC_RGADW_OFFSET);
761 	tmp &= ~ICDC_RGADW_RGADDR_MASK;
762 	tmp |= FIELD_PREP(ICDC_RGADW_RGADDR_MASK, reg);
763 	writel(tmp, codec->base + ICDC_RGADW_OFFSET);
764 
765 	/* wait 6+ cycles */
766 	for (i = 0; i < 6; i++)
767 		*val = readl(codec->base + ICDC_RGDATA_OFFSET) &
768 			ICDC_RGDATA_RGDOUT_MASK;
769 
770 	return 0;
771 }
772 
jz4760_codec_reg_write(void * context,unsigned int reg,unsigned int val)773 static int jz4760_codec_reg_write(void *context, unsigned int reg,
774 				  unsigned int val)
775 {
776 	struct jz_codec *codec = context;
777 	int ret;
778 
779 	ret = jz4760_codec_io_wait(codec);
780 	if (ret)
781 		return ret;
782 
783 	writel(ICDC_RGADW_RGWR | FIELD_PREP(ICDC_RGADW_RGADDR_MASK, reg) | val,
784 	       codec->base + ICDC_RGADW_OFFSET);
785 
786 	ret = jz4760_codec_io_wait(codec);
787 	if (ret)
788 		return ret;
789 
790 	return 0;
791 }
792 
793 static const u8 jz4760_codec_reg_defaults[] = {
794 	0x00, 0xFC, 0x1B, 0x20, 0x00, 0x80, 0x00, 0x00,
795 	0xFF, 0x1F, 0x3F, 0x00, 0x06, 0x06, 0x06, 0x06,
796 	0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x07, 0x44,
797 	0x1F, 0x00, 0x00, 0x00
798 };
799 
800 static const struct regmap_config jz4760_codec_regmap_config = {
801 	.reg_bits = 7,
802 	.val_bits = 8,
803 
804 	.max_register = JZ4760_CODEC_REG_MIX2,
805 	.volatile_reg = jz4760_codec_volatile,
806 	.writeable_reg = jz4760_codec_writeable,
807 
808 	.reg_read = jz4760_codec_reg_read,
809 	.reg_write = jz4760_codec_reg_write,
810 
811 	.reg_defaults_raw = jz4760_codec_reg_defaults,
812 	.num_reg_defaults_raw = ARRAY_SIZE(jz4760_codec_reg_defaults),
813 	.cache_type = REGCACHE_FLAT,
814 };
815 
jz4760_codec_probe(struct platform_device * pdev)816 static int jz4760_codec_probe(struct platform_device *pdev)
817 {
818 	struct device *dev = &pdev->dev;
819 	struct jz_codec *codec;
820 	int ret;
821 
822 	codec = devm_kzalloc(dev, sizeof(*codec), GFP_KERNEL);
823 	if (!codec)
824 		return -ENOMEM;
825 
826 	codec->dev = dev;
827 
828 	codec->base = devm_platform_ioremap_resource(pdev, 0);
829 	if (IS_ERR(codec->base))
830 		return PTR_ERR(codec->base);
831 
832 	codec->regmap = devm_regmap_init(dev, NULL, codec,
833 					&jz4760_codec_regmap_config);
834 	if (IS_ERR(codec->regmap))
835 		return PTR_ERR(codec->regmap);
836 
837 	codec->clk = devm_clk_get(dev, "aic");
838 	if (IS_ERR(codec->clk))
839 		return PTR_ERR(codec->clk);
840 
841 	platform_set_drvdata(pdev, codec);
842 
843 	ret = devm_snd_soc_register_component(dev, &jz4760_codec_soc_codec_dev,
844 					      &jz4760_codec_dai, 1);
845 	if (ret) {
846 		dev_err(dev, "Failed to register codec: %d\n", ret);
847 		return ret;
848 	}
849 
850 	return 0;
851 }
852 
853 static const struct of_device_id jz4760_codec_of_matches[] = {
854 	{ .compatible = "ingenic,jz4760-codec", },
855 	{ /* sentinel */ }
856 };
857 MODULE_DEVICE_TABLE(of, jz4760_codec_of_matches);
858 
859 static struct platform_driver jz4760_codec_driver = {
860 	.probe			= jz4760_codec_probe,
861 	.driver			= {
862 		.name		= "jz4760-codec",
863 		.of_match_table = jz4760_codec_of_matches,
864 	},
865 };
866 module_platform_driver(jz4760_codec_driver);
867 
868 MODULE_DESCRIPTION("JZ4760 SoC internal codec driver");
869 MODULE_AUTHOR("Christophe Branchereau <cbranchereau@gmail.com>");
870 MODULE_AUTHOR("Paul Cercueil <paul@crapouillou.net>");
871 MODULE_LICENSE("GPL v2");
872