arm64: dts: qcom: sm8550: add TRNG node
[linux-modified.git] / sound / soc / codecs / jz4760.c
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
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
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
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
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
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         {
318                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
319                 .name = "Volume",
320                 .info = snd_soc_info_volsw,
321                 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ
322                         | SNDRV_CTL_ELEM_ACCESS_READWRITE,
323                 .tlv.p = dac_tlv,
324                 .get = snd_soc_dapm_get_volsw,
325                 .put = snd_soc_dapm_put_volsw,
326                 .private_value = SOC_DOUBLE_R_VALUE(JZ4760_CODEC_REG_GCR6,
327                                                     JZ4760_CODEC_REG_GCR5,
328                                                     REG_GCR_GAIN_OFFSET,
329                                                     REG_GCR_GAIN_MAX, 1),
330         },
331 };
332
333 static const struct snd_kcontrol_new jz4760_codec_hp_playback_controls[] = {
334         {
335                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
336                 .name = "Volume",
337                 .info = snd_soc_info_volsw,
338                 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ
339                         | SNDRV_CTL_ELEM_ACCESS_READWRITE,
340                 .tlv.p = out_tlv,
341                 .get = snd_soc_dapm_get_volsw,
342                 .put = snd_soc_dapm_put_volsw,
343                 .private_value = SOC_DOUBLE_R_VALUE(JZ4760_CODEC_REG_GCR2,
344                                                     JZ4760_CODEC_REG_GCR1,
345                                                     REG_GCR_GAIN_OFFSET,
346                                                     REG_GCR_GAIN_MAX, 1),
347         },
348 };
349
350 static int hpout_event(struct snd_soc_dapm_widget *w,
351                        struct snd_kcontrol *kcontrol, int event)
352 {
353         struct snd_soc_component *codec = snd_soc_dapm_to_component(w->dapm);
354         struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
355         unsigned int val;
356         int err;
357
358         switch (event) {
359         case SND_SOC_DAPM_PRE_PMU:
360                 /* unmute HP */
361                 regmap_clear_bits(jz_codec->regmap, JZ4760_CODEC_REG_CR1,
362                                   REG_CR1_HP_MUTE);
363                 break;
364
365         case SND_SOC_DAPM_POST_PMU:
366                 /* wait for ramp-up complete (RUP) */
367                 err = regmap_read_poll_timeout(jz_codec->regmap,
368                                                JZ4760_CODEC_REG_IFR,
369                                                val, val & REG_IFR_RUP,
370                                                1000, 1 * USEC_PER_SEC);
371                 if (err) {
372                         dev_err(jz_codec->dev, "RUP timeout: %d", err);
373                         return err;
374                 }
375
376                 /* clear RUP flag */
377                 regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_IFR,
378                                 REG_IFR_RUP);
379
380                 break;
381
382         case SND_SOC_DAPM_POST_PMD:
383                 /* mute HP */
384                 regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_CR1,
385                                 REG_CR1_HP_MUTE);
386
387                 err = regmap_read_poll_timeout(jz_codec->regmap,
388                                                JZ4760_CODEC_REG_IFR,
389                                                val, val & REG_IFR_RDO,
390                                                1000, 1 * USEC_PER_SEC);
391                 if (err) {
392                         dev_err(jz_codec->dev, "RDO timeout: %d", err);
393                         return err;
394                 }
395
396                 /* clear RDO flag */
397                 regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_IFR,
398                                 REG_IFR_RDO);
399
400                 break;
401         }
402
403         return 0;
404 }
405
406 static const char * const jz4760_codec_hp_texts[] = {
407         "PCM", "Line In", "Mic 1", "Mic 2"
408 };
409
410 static const unsigned int jz4760_codec_hp_values[] = { 3, 2, 0, 1 };
411
412 static SOC_VALUE_ENUM_SINGLE_DECL(jz4760_codec_hp_enum,
413                                   JZ4760_CODEC_REG_CR1,
414                                   REG_CR1_OUTSEL_OFFSET,
415                                   REG_CR1_OUTSEL_MASK >> REG_CR1_OUTSEL_OFFSET,
416                                   jz4760_codec_hp_texts,
417                                   jz4760_codec_hp_values);
418 static const struct snd_kcontrol_new jz4760_codec_hp_source =
419                         SOC_DAPM_ENUM("Route", jz4760_codec_hp_enum);
420
421 static const char * const jz4760_codec_cap_texts[] = {
422         "Line In", "Mic 1", "Mic 2"
423 };
424
425 static const unsigned int jz4760_codec_cap_values[] = { 2, 0, 1 };
426
427 static SOC_VALUE_ENUM_SINGLE_DECL(jz4760_codec_cap_enum,
428                                   JZ4760_CODEC_REG_CR3,
429                                   REG_CR3_ADC_INSEL_OFFSET,
430                                   REG_CR3_ADC_INSEL_MASK >> REG_CR3_ADC_INSEL_OFFSET,
431                                   jz4760_codec_cap_texts,
432                                   jz4760_codec_cap_values);
433 static const struct snd_kcontrol_new jz4760_codec_cap_source =
434                         SOC_DAPM_ENUM("Route", jz4760_codec_cap_enum);
435
436 static const struct snd_kcontrol_new jz4760_codec_mic_controls[] = {
437         SOC_DAPM_SINGLE("Stereo Capture Switch", JZ4760_CODEC_REG_CR3,
438                         REG_CR3_MICSTEREO_OFFSET, 1, 0),
439 };
440
441 static const struct snd_kcontrol_new jz4760_codec_line_out_switch =
442         SOC_DAPM_SINGLE("Switch", JZ4760_CODEC_REG_CR1,
443                         REG_CR1_LO_MUTE_OFFSET, 0, 0);
444 static const struct snd_kcontrol_new jz4760_codec_btl_out_switch =
445         SOC_DAPM_SINGLE("Switch", JZ4760_CODEC_REG_CR1,
446                         REG_CR1_BTL_MUTE_OFFSET, 0, 0);
447
448 static const struct snd_soc_dapm_widget jz4760_codec_dapm_widgets[] = {
449         SND_SOC_DAPM_PGA_E("HP Out", JZ4760_CODEC_REG_PMR2,
450                            REG_PMR2_SB_HP_OFFSET, 1, NULL, 0, hpout_event,
451                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
452                            SND_SOC_DAPM_POST_PMD),
453
454         SND_SOC_DAPM_SWITCH("Line Out", JZ4760_CODEC_REG_PMR2,
455                             REG_PMR2_SB_LOUT_OFFSET, 1,
456                             &jz4760_codec_line_out_switch),
457
458         SND_SOC_DAPM_SWITCH("BTL Out", JZ4760_CODEC_REG_PMR2,
459                             REG_PMR2_SB_BTL_OFFSET, 1,
460                             &jz4760_codec_btl_out_switch),
461
462         SND_SOC_DAPM_PGA("Line In", JZ4760_CODEC_REG_PMR1,
463                          REG_PMR1_SB_LINE_OFFSET, 1, NULL, 0),
464
465         SND_SOC_DAPM_MUX("Headphones Source", SND_SOC_NOPM, 0, 0,
466                          &jz4760_codec_hp_source),
467
468         SND_SOC_DAPM_MUX("Capture Source", SND_SOC_NOPM, 0, 0,
469                          &jz4760_codec_cap_source),
470
471         SND_SOC_DAPM_PGA("Mic 1", JZ4760_CODEC_REG_PMR1,
472                          REG_PMR1_SB_MIC1_OFFSET, 1, NULL, 0),
473
474         SND_SOC_DAPM_PGA("Mic 2", JZ4760_CODEC_REG_PMR1,
475                          REG_PMR1_SB_MIC2_OFFSET, 1, NULL, 0),
476
477         SND_SOC_DAPM_PGA("Mic Diff", JZ4760_CODEC_REG_CR3,
478                          REG_CR3_MICDIFF_OFFSET, 0, NULL, 0),
479
480         SND_SOC_DAPM_MIXER("Mic", SND_SOC_NOPM, 0, 0,
481                            jz4760_codec_mic_controls,
482                            ARRAY_SIZE(jz4760_codec_mic_controls)),
483
484         SND_SOC_DAPM_PGA("Line In Bypass", JZ4760_CODEC_REG_PMR1,
485                          REG_PMR1_SB_BYPASS_OFFSET, 1, NULL, 0),
486
487         SND_SOC_DAPM_ADC("ADC", "Capture", JZ4760_CODEC_REG_PMR2,
488                          REG_PMR2_SB_ADC_OFFSET, 1),
489
490         SND_SOC_DAPM_DAC("DAC", "Playback", JZ4760_CODEC_REG_PMR2,
491                          REG_PMR2_SB_DAC_OFFSET, 1),
492
493         SND_SOC_DAPM_MIXER("PCM Playback", SND_SOC_NOPM, 0, 0,
494                            jz4760_codec_pcm_playback_controls,
495                            ARRAY_SIZE(jz4760_codec_pcm_playback_controls)),
496
497         SND_SOC_DAPM_MIXER("Headphones Playback", SND_SOC_NOPM, 0, 0,
498                            jz4760_codec_hp_playback_controls,
499                            ARRAY_SIZE(jz4760_codec_hp_playback_controls)),
500
501         SND_SOC_DAPM_SUPPLY("MICBIAS", JZ4760_CODEC_REG_PMR1,
502                             REG_PMR1_SB_MICBIAS_OFFSET, 1, NULL, 0),
503
504         SND_SOC_DAPM_INPUT("MIC1P"),
505         SND_SOC_DAPM_INPUT("MIC1N"),
506         SND_SOC_DAPM_INPUT("MIC2P"),
507         SND_SOC_DAPM_INPUT("MIC2N"),
508
509         SND_SOC_DAPM_INPUT("LLINEIN"),
510         SND_SOC_DAPM_INPUT("RLINEIN"),
511
512         SND_SOC_DAPM_OUTPUT("LHPOUT"),
513         SND_SOC_DAPM_OUTPUT("RHPOUT"),
514
515         SND_SOC_DAPM_OUTPUT("LOUT"),
516         SND_SOC_DAPM_OUTPUT("ROUT"),
517
518         SND_SOC_DAPM_OUTPUT("BTLP"),
519         SND_SOC_DAPM_OUTPUT("BTLN"),
520
521         SND_SOC_DAPM_OUTPUT("SYSCLK"),
522 };
523
524 /* Unconditional routes. */
525 static const struct snd_soc_dapm_route jz4760_codec_dapm_routes[] = {
526         { "Mic 1", NULL, "MIC1P" },
527         { "Mic Diff", NULL, "MIC1N" },
528         { "Mic 1", NULL, "Mic Diff" },
529         { "Mic 2", NULL, "MIC2P" },
530         { "Mic Diff", NULL, "MIC2N" },
531         { "Mic 2", NULL, "Mic Diff" },
532
533         { "Line In", NULL, "LLINEIN" },
534         { "Line In", NULL, "RLINEIN" },
535
536         { "Mic", "Stereo Capture Switch", "Mic 1" },
537         { "Mic", "Stereo Capture Switch", "Mic 2" },
538         { "Headphones Source", "Mic 1", "Mic" },
539         { "Headphones Source", "Mic 2", "Mic" },
540         { "Capture Source", "Mic 1", "Mic" },
541         { "Capture Source", "Mic 2", "Mic" },
542
543         { "Capture Source", "Line In", "Line In" },
544         { "Capture Source", "Mic 1", "Mic 1" },
545         { "Capture Source", "Mic 2", "Mic 2" },
546         { "ADC", NULL, "Capture Source" },
547
548         { "Line In Bypass", NULL, "Line In" },
549
550         { "Headphones Source", "Mic 1", "Mic 1" },
551         { "Headphones Source", "Mic 2", "Mic 2" },
552         { "Headphones Source", "Line In", "Line In Bypass" },
553         { "Headphones Source", "PCM", "Headphones Playback" },
554         { "HP Out", NULL, "Headphones Source" },
555
556         { "LHPOUT", NULL, "HP Out" },
557         { "RHPOUT", NULL, "HP Out" },
558         { "Line Out", "Switch", "HP Out" },
559
560         { "LOUT", NULL, "Line Out" },
561         { "ROUT", NULL, "Line Out" },
562         { "BTL Out", "Switch", "Line Out" },
563
564         { "BTLP", NULL, "BTL Out"},
565         { "BTLN", NULL, "BTL Out"},
566
567         { "PCM Playback", "Volume", "DAC" },
568         { "Headphones Playback", "Volume", "PCM Playback" },
569
570         { "SYSCLK", NULL, "DAC" },
571 };
572
573 static void jz4760_codec_codec_init_regs(struct snd_soc_component *codec)
574 {
575         struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
576         struct regmap *regmap = jz_codec->regmap;
577
578         /* Collect updates for later sending. */
579         regcache_cache_only(regmap, true);
580
581         /* default Amp output to PCM */
582         regmap_set_bits(regmap, JZ4760_CODEC_REG_CR1, REG_CR1_OUTSEL_MASK);
583
584         /* Disable stereo mic */
585         regmap_clear_bits(regmap, JZ4760_CODEC_REG_CR3,
586                           BIT(REG_CR3_MICSTEREO_OFFSET));
587
588         /* Set mic 1 as default source for ADC */
589         regmap_clear_bits(regmap, JZ4760_CODEC_REG_CR3,
590                           REG_CR3_ADC_INSEL_MASK);
591
592         /* ADC/DAC: serial + i2s */
593         regmap_set_bits(regmap, JZ4760_CODEC_REG_AICR,
594                         REG_AICR_ADC_SERIAL | REG_AICR_ADC_I2S |
595                         REG_AICR_DAC_SERIAL | REG_AICR_DAC_I2S);
596
597         /* The generated IRQ is a high level */
598         regmap_clear_bits(regmap, JZ4760_CODEC_REG_ICR, REG_ICR_INT_FORM_MASK);
599         regmap_update_bits(regmap, JZ4760_CODEC_REG_ICR, REG_ICR_ALL_MASK,
600                            REG_ICR_JACK_MASK | REG_ICR_RUP_MASK |
601                            REG_ICR_RDO_MASK  | REG_ICR_GUP_MASK |
602                            REG_ICR_GDO_MASK);
603
604         /* 12M oscillator */
605         regmap_clear_bits(regmap, JZ4760_CODEC_REG_CCR1, REG_CCR1_CRYSTAL_MASK);
606
607         /* 0: 16ohm/220uF, 1: 10kohm/1uF */
608         regmap_clear_bits(regmap, JZ4760_CODEC_REG_CR1, REG_CR1_HP_LOAD);
609
610         /* default to NOMAD */
611         regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_CR2,
612                         REG_CR2_DAC_NOMAD);
613
614         /* disable automatic gain */
615         regmap_clear_bits(regmap, JZ4760_CODEC_REG_AGC1, REG_AGC1_EN);
616
617         /* Independent L/R DAC gain control */
618         regmap_clear_bits(regmap, JZ4760_CODEC_REG_GCR5,
619                           REG_GCR_RL);
620
621         /* Send collected updates. */
622         regcache_cache_only(regmap, false);
623         regcache_sync(regmap);
624 }
625
626 static int jz4760_codec_codec_probe(struct snd_soc_component *codec)
627 {
628         struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
629
630         clk_prepare_enable(jz_codec->clk);
631
632         jz4760_codec_codec_init_regs(codec);
633
634         return 0;
635 }
636
637 static void jz4760_codec_codec_remove(struct snd_soc_component *codec)
638 {
639         struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
640
641         clk_disable_unprepare(jz_codec->clk);
642 }
643
644 static const struct snd_soc_component_driver jz4760_codec_soc_codec_dev = {
645         .probe                  = jz4760_codec_codec_probe,
646         .remove                 = jz4760_codec_codec_remove,
647         .set_bias_level         = jz4760_codec_set_bias_level,
648         .controls               = jz4760_codec_snd_controls,
649         .num_controls           = ARRAY_SIZE(jz4760_codec_snd_controls),
650         .dapm_widgets           = jz4760_codec_dapm_widgets,
651         .num_dapm_widgets       = ARRAY_SIZE(jz4760_codec_dapm_widgets),
652         .dapm_routes            = jz4760_codec_dapm_routes,
653         .num_dapm_routes        = ARRAY_SIZE(jz4760_codec_dapm_routes),
654         .suspend_bias_off       = 1,
655         .use_pmdown_time        = 1,
656 };
657
658 static const unsigned int jz4760_codec_sample_rates[] = {
659         96000, 48000, 44100, 32000,
660         24000, 22050, 16000, 12000,
661         11025, 9600, 8000,
662 };
663
664 static int jz4760_codec_hw_params(struct snd_pcm_substream *substream,
665                                   struct snd_pcm_hw_params *params,
666                                   struct snd_soc_dai *dai)
667 {
668         struct jz_codec *codec = snd_soc_component_get_drvdata(dai->component);
669         unsigned int rate, bit_width;
670
671         switch (params_format(params)) {
672         case SNDRV_PCM_FORMAT_S16_LE:
673                 bit_width = 0;
674                 break;
675         case SNDRV_PCM_FORMAT_S18_3LE:
676                 bit_width = 1;
677                 break;
678         case SNDRV_PCM_FORMAT_S20_3LE:
679                 bit_width = 2;
680                 break;
681         case SNDRV_PCM_FORMAT_S24_3LE:
682                 bit_width = 3;
683                 break;
684         default:
685                 return -EINVAL;
686         }
687
688         for (rate = 0; rate < ARRAY_SIZE(jz4760_codec_sample_rates); rate++) {
689                 if (jz4760_codec_sample_rates[rate] == params_rate(params))
690                         break;
691         }
692
693         if (rate == ARRAY_SIZE(jz4760_codec_sample_rates))
694                 return -EINVAL;
695
696         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
697                 regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_AICR,
698                                    REG_AICR_DAC_ADWL_MASK,
699                                    FIELD_PREP(REG_AICR_DAC_ADWL_MASK, bit_width));
700                 regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_CCR2,
701                                    REG_CCR2_DAC_FREQ_MASK,
702                                    FIELD_PREP(REG_CCR2_DAC_FREQ_MASK, rate));
703         } else {
704                 regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_AICR,
705                                    REG_AICR_ADC_ADWL_MASK,
706                                    FIELD_PREP(REG_AICR_ADC_ADWL_MASK, bit_width));
707                 regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_CCR2,
708                                    REG_CCR2_ADC_FREQ_MASK,
709                                    FIELD_PREP(REG_CCR2_ADC_FREQ_MASK, rate));
710         }
711
712         return 0;
713 }
714
715 static const struct snd_soc_dai_ops jz4760_codec_dai_ops = {
716         .startup        = jz4760_codec_startup,
717         .shutdown       = jz4760_codec_shutdown,
718         .hw_params      = jz4760_codec_hw_params,
719         .trigger        = jz4760_codec_pcm_trigger,
720         .mute_stream    = jz4760_codec_mute_stream,
721         .no_capture_mute = 1,
722 };
723
724 #define JZ_CODEC_FORMATS (SNDRV_PCM_FMTBIT_S16_LE  | \
725                           SNDRV_PCM_FMTBIT_S18_3LE | \
726                           SNDRV_PCM_FMTBIT_S20_3LE | \
727                           SNDRV_PCM_FMTBIT_S24_3LE)
728
729 static struct snd_soc_dai_driver jz4760_codec_dai = {
730         .name = "jz4760-hifi",
731         .playback = {
732                 .stream_name = "Playback",
733                 .channels_min = 2,
734                 .channels_max = 2,
735                 .rates = SNDRV_PCM_RATE_8000_96000,
736                 .formats = JZ_CODEC_FORMATS,
737         },
738         .capture = {
739                 .stream_name = "Capture",
740                 .channels_min = 2,
741                 .channels_max = 2,
742                 .rates = SNDRV_PCM_RATE_8000_96000,
743                 .formats = JZ_CODEC_FORMATS,
744         },
745         .ops = &jz4760_codec_dai_ops,
746 };
747
748 static bool jz4760_codec_volatile(struct device *dev, unsigned int reg)
749 {
750         return reg == JZ4760_CODEC_REG_SR || reg == JZ4760_CODEC_REG_IFR;
751 }
752
753 static bool jz4760_codec_writeable(struct device *dev, unsigned int reg)
754 {
755         switch (reg) {
756         case JZ4760_CODEC_REG_SR:
757                 return false;
758         default:
759                 return true;
760         }
761 }
762
763 static int jz4760_codec_io_wait(struct jz_codec *codec)
764 {
765         u32 reg;
766
767         return readl_poll_timeout(codec->base + ICDC_RGADW_OFFSET, reg,
768                                   !(reg & ICDC_RGADW_RGWR),
769                                   1000, 1 * USEC_PER_SEC);
770 }
771
772 static int jz4760_codec_reg_read(void *context, unsigned int reg,
773                                  unsigned int *val)
774 {
775         struct jz_codec *codec = context;
776         unsigned int i;
777         u32 tmp;
778         int ret;
779
780         ret = jz4760_codec_io_wait(codec);
781         if (ret)
782                 return ret;
783
784         tmp = readl(codec->base + ICDC_RGADW_OFFSET);
785         tmp &= ~ICDC_RGADW_RGADDR_MASK;
786         tmp |= FIELD_PREP(ICDC_RGADW_RGADDR_MASK, reg);
787         writel(tmp, codec->base + ICDC_RGADW_OFFSET);
788
789         /* wait 6+ cycles */
790         for (i = 0; i < 6; i++)
791                 *val = readl(codec->base + ICDC_RGDATA_OFFSET) &
792                         ICDC_RGDATA_RGDOUT_MASK;
793
794         return 0;
795 }
796
797 static int jz4760_codec_reg_write(void *context, unsigned int reg,
798                                   unsigned int val)
799 {
800         struct jz_codec *codec = context;
801         int ret;
802
803         ret = jz4760_codec_io_wait(codec);
804         if (ret)
805                 return ret;
806
807         writel(ICDC_RGADW_RGWR | FIELD_PREP(ICDC_RGADW_RGADDR_MASK, reg) | val,
808                codec->base + ICDC_RGADW_OFFSET);
809
810         ret = jz4760_codec_io_wait(codec);
811         if (ret)
812                 return ret;
813
814         return 0;
815 }
816
817 static const u8 jz4760_codec_reg_defaults[] = {
818         0x00, 0xFC, 0x1B, 0x20, 0x00, 0x80, 0x00, 0x00,
819         0xFF, 0x1F, 0x3F, 0x00, 0x06, 0x06, 0x06, 0x06,
820         0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x07, 0x44,
821         0x1F, 0x00, 0x00, 0x00
822 };
823
824 static struct regmap_config jz4760_codec_regmap_config = {
825         .reg_bits = 7,
826         .val_bits = 8,
827
828         .max_register = JZ4760_CODEC_REG_MIX2,
829         .volatile_reg = jz4760_codec_volatile,
830         .writeable_reg = jz4760_codec_writeable,
831
832         .reg_read = jz4760_codec_reg_read,
833         .reg_write = jz4760_codec_reg_write,
834
835         .reg_defaults_raw = jz4760_codec_reg_defaults,
836         .num_reg_defaults_raw = ARRAY_SIZE(jz4760_codec_reg_defaults),
837         .cache_type = REGCACHE_FLAT,
838 };
839
840 static int jz4760_codec_probe(struct platform_device *pdev)
841 {
842         struct device *dev = &pdev->dev;
843         struct jz_codec *codec;
844         int ret;
845
846         codec = devm_kzalloc(dev, sizeof(*codec), GFP_KERNEL);
847         if (!codec)
848                 return -ENOMEM;
849
850         codec->dev = dev;
851
852         codec->base = devm_platform_ioremap_resource(pdev, 0);
853         if (IS_ERR(codec->base))
854                 return PTR_ERR(codec->base);
855
856         codec->regmap = devm_regmap_init(dev, NULL, codec,
857                                         &jz4760_codec_regmap_config);
858         if (IS_ERR(codec->regmap))
859                 return PTR_ERR(codec->regmap);
860
861         codec->clk = devm_clk_get(dev, "aic");
862         if (IS_ERR(codec->clk))
863                 return PTR_ERR(codec->clk);
864
865         platform_set_drvdata(pdev, codec);
866
867         ret = devm_snd_soc_register_component(dev, &jz4760_codec_soc_codec_dev,
868                                               &jz4760_codec_dai, 1);
869         if (ret) {
870                 dev_err(dev, "Failed to register codec: %d\n", ret);
871                 return ret;
872         }
873
874         return 0;
875 }
876
877 static const struct of_device_id jz4760_codec_of_matches[] = {
878         { .compatible = "ingenic,jz4760-codec", },
879         { /* sentinel */ }
880 };
881 MODULE_DEVICE_TABLE(of, jz4760_codec_of_matches);
882
883 static struct platform_driver jz4760_codec_driver = {
884         .probe                  = jz4760_codec_probe,
885         .driver                 = {
886                 .name           = "jz4760-codec",
887                 .of_match_table = jz4760_codec_of_matches,
888         },
889 };
890 module_platform_driver(jz4760_codec_driver);
891
892 MODULE_DESCRIPTION("JZ4760 SoC internal codec driver");
893 MODULE_AUTHOR("Christophe Branchereau <cbranchereau@gmail.com>");
894 MODULE_AUTHOR("Paul Cercueil <paul@crapouillou.net>");
895 MODULE_LICENSE("GPL v2");