ASoC: Fix SND_SOC_ALL_CODECS imply misc fallout
[linux-2.6-microblaze.git] / sound / soc / codecs / jz4770.c
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // Ingenic JZ4770 CODEC driver
4 //
5 // Copyright (C) 2012, Maarten ter Huurne <maarten@treewalker.org>
6 // Copyright (C) 2019, Paul Cercueil <paul@crapouillou.net>
7
8 #include <linux/clk.h>
9 #include <linux/delay.h>
10 #include <linux/iopoll.h>
11 #include <linux/module.h>
12 #include <linux/regmap.h>
13 #include <linux/time64.h>
14
15 #include <sound/pcm_params.h>
16 #include <sound/soc.h>
17 #include <sound/soc-dai.h>
18 #include <sound/soc-dapm.h>
19 #include <sound/tlv.h>
20
21 #define ICDC_RGADW_OFFSET               0x00
22 #define ICDC_RGDATA_OFFSET              0x04
23
24 /* ICDC internal register access control register(RGADW) */
25 #define ICDC_RGADW_RGWR                 BIT(16)
26
27 #define ICDC_RGADW_RGADDR_OFFSET        8
28 #define ICDC_RGADW_RGADDR_MASK          GENMASK(14, ICDC_RGADW_RGADDR_OFFSET)
29
30 #define ICDC_RGADW_RGDIN_OFFSET         0
31 #define ICDC_RGADW_RGDIN_MASK           GENMASK(7, ICDC_RGADW_RGDIN_OFFSET)
32
33 /* ICDC internal register data output register (RGDATA)*/
34 #define ICDC_RGDATA_IRQ                 BIT(8)
35
36 #define ICDC_RGDATA_RGDOUT_OFFSET       0
37 #define ICDC_RGDATA_RGDOUT_MASK         GENMASK(7, ICDC_RGDATA_RGDOUT_OFFSET)
38
39 /* Internal register space, accessed through regmap */
40 enum {
41         JZ4770_CODEC_REG_SR,
42         JZ4770_CODEC_REG_AICR_DAC,
43         JZ4770_CODEC_REG_AICR_ADC,
44         JZ4770_CODEC_REG_CR_LO,
45         JZ4770_CODEC_REG_CR_HP,
46
47         JZ4770_CODEC_REG_MISSING_REG1,
48
49         JZ4770_CODEC_REG_CR_DAC,
50         JZ4770_CODEC_REG_CR_MIC,
51         JZ4770_CODEC_REG_CR_LI,
52         JZ4770_CODEC_REG_CR_ADC,
53         JZ4770_CODEC_REG_CR_MIX,
54         JZ4770_CODEC_REG_CR_VIC,
55         JZ4770_CODEC_REG_CCR,
56         JZ4770_CODEC_REG_FCR_DAC,
57         JZ4770_CODEC_REG_FCR_ADC,
58         JZ4770_CODEC_REG_ICR,
59         JZ4770_CODEC_REG_IMR,
60         JZ4770_CODEC_REG_IFR,
61         JZ4770_CODEC_REG_GCR_HPL,
62         JZ4770_CODEC_REG_GCR_HPR,
63         JZ4770_CODEC_REG_GCR_LIBYL,
64         JZ4770_CODEC_REG_GCR_LIBYR,
65         JZ4770_CODEC_REG_GCR_DACL,
66         JZ4770_CODEC_REG_GCR_DACR,
67         JZ4770_CODEC_REG_GCR_MIC1,
68         JZ4770_CODEC_REG_GCR_MIC2,
69         JZ4770_CODEC_REG_GCR_ADCL,
70         JZ4770_CODEC_REG_GCR_ADCR,
71
72         JZ4770_CODEC_REG_MISSING_REG2,
73
74         JZ4770_CODEC_REG_GCR_MIXADC,
75         JZ4770_CODEC_REG_GCR_MIXDAC,
76         JZ4770_CODEC_REG_AGC1,
77         JZ4770_CODEC_REG_AGC2,
78         JZ4770_CODEC_REG_AGC3,
79         JZ4770_CODEC_REG_AGC4,
80         JZ4770_CODEC_REG_AGC5,
81 };
82
83 #define REG_AICR_DAC_ADWL_OFFSET        6
84 #define REG_AICR_DAC_ADWL_MASK          (0x3 << REG_AICR_DAC_ADWL_OFFSET)
85 #define REG_AICR_DAC_SERIAL             BIT(1)
86 #define REG_AICR_DAC_I2S                BIT(0)
87
88 #define REG_AICR_ADC_ADWL_OFFSET        6
89 #define REG_AICR_ADC_ADWL_MASK          (0x3 << REG_AICR_ADC_ADWL_OFFSET)
90 #define REG_AICR_ADC_SERIAL             BIT(1)
91 #define REG_AICR_ADC_I2S                BIT(0)
92
93 #define REG_CR_LO_MUTE_OFFSET           7
94 #define REG_CR_LO_SB_OFFSET             4
95 #define REG_CR_LO_SEL_OFFSET            0
96 #define REG_CR_LO_SEL_MASK              (0x3 << REG_CR_LO_SEL_OFFSET)
97
98 #define REG_CR_HP_MUTE                  BIT(7)
99 #define REG_CR_HP_LOAD                  BIT(6)
100 #define REG_CR_HP_SB_OFFSET             4
101 #define REG_CR_HP_SB_HPCM               BIT(3)
102 #define REG_CR_HP_SEL_OFFSET            0
103 #define REG_CR_HP_SEL_MASK              (0x3 << REG_CR_HP_SEL_OFFSET)
104
105 #define REG_CR_DAC_MUTE                 BIT(7)
106 #define REG_CR_DAC_MONO                 BIT(6)
107 #define REG_CR_DAC_LEFT_ONLY            BIT(5)
108 #define REG_CR_DAC_SB_OFFSET            4
109 #define REG_CR_DAC_LRSWAP               BIT(3)
110
111 #define REG_CR_MIC_STEREO_OFFSET        7
112 #define REG_CR_MIC_IDIFF_OFFSET         6
113 #define REG_CR_MIC_SB_MIC2_OFFSET       5
114 #define REG_CR_MIC_SB_MIC1_OFFSET       4
115 #define REG_CR_MIC_BIAS_V0_OFFSET       1
116 #define REG_CR_MIC_BIAS_SB_OFFSET       0
117
118 #define REG_CR_LI_LIBY_OFFSET           4
119 #define REG_CR_LI_SB_OFFSET             0
120
121 #define REG_CR_ADC_DMIC_SEL             BIT(7)
122 #define REG_CR_ADC_MONO                 BIT(6)
123 #define REG_CR_ADC_LEFT_ONLY            BIT(5)
124 #define REG_CR_ADC_SB_OFFSET            4
125 #define REG_CR_ADC_LRSWAP               BIT(3)
126 #define REG_CR_ADC_IN_SEL_OFFSET        0
127 #define REG_CR_ADC_IN_SEL_MASK          (0x3 << REG_CR_ADC_IN_SEL_OFFSET)
128
129 #define REG_CR_VIC_SB_SLEEP             BIT(1)
130 #define REG_CR_VIC_SB                   BIT(0)
131
132 #define REG_CCR_CRYSTAL_OFFSET          0
133 #define REG_CCR_CRYSTAL_MASK            (0xf << REG_CCR_CRYSTAL_OFFSET)
134
135 #define REG_FCR_DAC_FREQ_OFFSET         0
136 #define REG_FCR_DAC_FREQ_MASK           (0xf << REG_FCR_DAC_FREQ_OFFSET)
137
138 #define REG_FCR_ADC_FREQ_OFFSET         0
139 #define REG_FCR_ADC_FREQ_MASK           (0xf << REG_FCR_ADC_FREQ_OFFSET)
140
141 #define REG_ICR_INT_FORM_OFFSET         6
142 #define REG_ICR_INT_FORM_MASK           (0x3 << REG_ICR_INT_FORM_OFFSET)
143
144 #define REG_IMR_ALL_MASK                (0x7f)
145 #define REG_IMR_SCLR_MASK               BIT(6)
146 #define REG_IMR_JACK_MASK               BIT(5)
147 #define REG_IMR_SCMC_MASK               BIT(4)
148 #define REG_IMR_RUP_MASK                BIT(3)
149 #define REG_IMR_RDO_MASK                BIT(2)
150 #define REG_IMR_GUP_MASK                BIT(1)
151 #define REG_IMR_GDO_MASK                BIT(0)
152
153 #define REG_IFR_ALL_MASK                (0x7f)
154 #define REG_IFR_SCLR                    BIT(6)
155 #define REG_IFR_JACK                    BIT(5)
156 #define REG_IFR_SCMC                    BIT(4)
157 #define REG_IFR_RUP                     BIT(3)
158 #define REG_IFR_RDO                     BIT(2)
159 #define REG_IFR_GUP                     BIT(1)
160 #define REG_IFR_GDO                     BIT(0)
161
162 #define REG_GCR_HPL_LRGO                BIT(7)
163
164 #define REG_GCR_DACL_RLGOD              BIT(7)
165
166 #define REG_GCR_GAIN_OFFSET             0
167 #define REG_GCR_GAIN_MAX                0x1f
168
169 #define REG_GCR_MIC_GAIN_OFFSET         0
170 #define REG_GCR_MIC_GAIN_MAX            5
171
172 #define REG_GCR_ADC_GAIN_OFFSET         0
173 #define REG_GCR_ADC_GAIN_MAX            23
174
175 #define REG_AGC1_EN                     BIT(7)
176
177 /* codec private data */
178 struct jz_codec {
179         struct device *dev;
180         struct regmap *regmap;
181         void __iomem *base;
182         struct clk *clk;
183 };
184
185 static int jz4770_codec_set_bias_level(struct snd_soc_component *codec,
186                                        enum snd_soc_bias_level level)
187 {
188         struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
189         struct regmap *regmap = jz_codec->regmap;
190
191         switch (level) {
192         case SND_SOC_BIAS_PREPARE:
193                 regmap_update_bits(regmap, JZ4770_CODEC_REG_CR_VIC,
194                                    REG_CR_VIC_SB, 0);
195                 msleep(250);
196                 regmap_update_bits(regmap, JZ4770_CODEC_REG_CR_VIC,
197                                    REG_CR_VIC_SB_SLEEP, 0);
198                 msleep(400);
199                 break;
200         case SND_SOC_BIAS_STANDBY:
201                 regmap_update_bits(regmap, JZ4770_CODEC_REG_CR_VIC,
202                                    REG_CR_VIC_SB_SLEEP, REG_CR_VIC_SB_SLEEP);
203                 regmap_update_bits(regmap, JZ4770_CODEC_REG_CR_VIC,
204                                    REG_CR_VIC_SB, REG_CR_VIC_SB);
205         /* fall-through */
206         default:
207                 break;
208         }
209
210         return 0;
211 }
212
213 static int jz4770_codec_startup(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         /*
220          * SYSCLK output from the codec to the AIC is required to keep the
221          * DMA transfer going during playback when all audible outputs have
222          * been disabled.
223          */
224         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
225                 snd_soc_dapm_force_enable_pin(dapm, "SYSCLK");
226
227         return 0;
228 }
229
230 static void jz4770_codec_shutdown(struct snd_pcm_substream *substream,
231                                   struct snd_soc_dai *dai)
232 {
233         struct snd_soc_component *codec = dai->component;
234         struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(codec);
235
236         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
237                 snd_soc_dapm_disable_pin(dapm, "SYSCLK");
238 }
239
240
241 static int jz4770_codec_pcm_trigger(struct snd_pcm_substream *substream,
242                                     int cmd, struct snd_soc_dai *dai)
243 {
244         struct snd_soc_component *codec = dai->component;
245         int ret = 0;
246
247         switch (cmd) {
248         case SNDRV_PCM_TRIGGER_START:
249         case SNDRV_PCM_TRIGGER_RESUME:
250         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
251                 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
252                         snd_soc_component_force_bias_level(codec,
253                                                            SND_SOC_BIAS_ON);
254                 break;
255         case SNDRV_PCM_TRIGGER_STOP:
256         case SNDRV_PCM_TRIGGER_SUSPEND:
257         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
258                 /* do nothing */
259                 break;
260         default:
261                 ret = -EINVAL;
262         }
263
264         return ret;
265 }
266
267 static int jz4770_codec_digital_mute(struct snd_soc_dai *dai, int mute)
268 {
269         struct snd_soc_component *codec = dai->component;
270         struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
271         unsigned int gain_bit = mute ? REG_IFR_GDO : REG_IFR_GUP;
272         unsigned int val;
273         int change, err;
274
275         change = snd_soc_component_update_bits(codec, JZ4770_CODEC_REG_CR_DAC,
276                                                REG_CR_DAC_MUTE,
277                                                mute ? REG_CR_DAC_MUTE : 0);
278         if (change == 1) {
279                 regmap_read(jz_codec->regmap, JZ4770_CODEC_REG_CR_DAC, &val);
280
281                 if (val & BIT(REG_CR_DAC_SB_OFFSET))
282                         return 1;
283
284                 err = regmap_read_poll_timeout(jz_codec->regmap,
285                                                JZ4770_CODEC_REG_IFR,
286                                                val, val & gain_bit,
287                                                1000, 100 * USEC_PER_MSEC);
288                 if (err) {
289                         dev_err(jz_codec->dev,
290                                 "Timeout while setting digital mute: %d", err);
291                         return err;
292                 }
293
294                 /* clear GUP/GDO flag */
295                 regmap_update_bits(jz_codec->regmap, JZ4770_CODEC_REG_IFR,
296                                    gain_bit, gain_bit);
297         }
298
299         return 0;
300 }
301
302 /* unit: 0.01dB */
303 static const DECLARE_TLV_DB_MINMAX_MUTE(dac_tlv, -3100, 0);
304 static const DECLARE_TLV_DB_SCALE(adc_tlv, 0, 100, 0);
305 static const DECLARE_TLV_DB_MINMAX(out_tlv, -2500, 600);
306 static const DECLARE_TLV_DB_SCALE(mic_boost_tlv, 0, 400, 0);
307 static const DECLARE_TLV_DB_SCALE(linein_tlv, -2500, 100, 0);
308
309 /* Unconditional controls. */
310 static const struct snd_kcontrol_new jz4770_codec_snd_controls[] = {
311         /* record gain control */
312         SOC_DOUBLE_R_TLV("PCM Capture Volume",
313                          JZ4770_CODEC_REG_GCR_ADCL, JZ4770_CODEC_REG_GCR_ADCR,
314                          REG_GCR_ADC_GAIN_OFFSET, REG_GCR_ADC_GAIN_MAX,
315                          0, adc_tlv),
316
317         SOC_DOUBLE_R_TLV("Line In Bypass Playback Volume",
318                          JZ4770_CODEC_REG_GCR_LIBYL, JZ4770_CODEC_REG_GCR_LIBYR,
319                          REG_GCR_GAIN_OFFSET, REG_GCR_GAIN_MAX, 1, linein_tlv),
320 };
321
322 static const struct snd_kcontrol_new jz4770_codec_pcm_playback_controls[] = {
323         {
324                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
325                 .name = "Volume",
326                 .info = snd_soc_info_volsw,
327                 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ
328                         | SNDRV_CTL_ELEM_ACCESS_READWRITE,
329                 .tlv.p = dac_tlv,
330                 .get = snd_soc_dapm_get_volsw,
331                 .put = snd_soc_dapm_put_volsw,
332                 /*
333                  * NOTE: DACR/DACL are inversed; the gain value written to DACR
334                  * seems to affect the left channel, and the gain value written
335                  * to DACL seems to affect the right channel.
336                  */
337                 .private_value = SOC_DOUBLE_R_VALUE(JZ4770_CODEC_REG_GCR_DACR,
338                                                     JZ4770_CODEC_REG_GCR_DACL,
339                                                     REG_GCR_GAIN_OFFSET,
340                                                     REG_GCR_GAIN_MAX, 1),
341         },
342 };
343
344 static const struct snd_kcontrol_new jz4770_codec_hp_playback_controls[] = {
345         {
346                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
347                 .name = "Volume",
348                 .info = snd_soc_info_volsw,
349                 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ
350                         | SNDRV_CTL_ELEM_ACCESS_READWRITE,
351                 .tlv.p = out_tlv,
352                 .get = snd_soc_dapm_get_volsw,
353                 .put = snd_soc_dapm_put_volsw,
354                 /* HPR/HPL inversed for the same reason as above */
355                 .private_value = SOC_DOUBLE_R_VALUE(JZ4770_CODEC_REG_GCR_HPR,
356                                                     JZ4770_CODEC_REG_GCR_HPL,
357                                                     REG_GCR_GAIN_OFFSET,
358                                                     REG_GCR_GAIN_MAX, 1),
359         },
360 };
361
362 static int hpout_event(struct snd_soc_dapm_widget *w,
363                        struct snd_kcontrol *kcontrol, int event)
364 {
365         struct snd_soc_component *codec = snd_soc_dapm_to_component(w->dapm);
366         struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
367         unsigned int val;
368         int err;
369
370         switch (event) {
371         case SND_SOC_DAPM_PRE_PMU:
372                 /* set cap-less, unmute HP */
373                 regmap_update_bits(jz_codec->regmap, JZ4770_CODEC_REG_CR_HP,
374                                    REG_CR_HP_SB_HPCM | REG_CR_HP_MUTE, 0);
375                 break;
376
377         case SND_SOC_DAPM_POST_PMU:
378                 /* wait for ramp-up complete (RUP) */
379                 err = regmap_read_poll_timeout(jz_codec->regmap,
380                                                JZ4770_CODEC_REG_IFR,
381                                                val, val & REG_IFR_RUP,
382                                                1000, 100 * USEC_PER_MSEC);
383                 if (err) {
384                         dev_err(jz_codec->dev, "RUP timeout: %d", err);
385                         return err;
386                 }
387
388                 /* clear RUP flag */
389                 regmap_update_bits(jz_codec->regmap, JZ4770_CODEC_REG_IFR,
390                                    REG_IFR_RUP, REG_IFR_RUP);
391
392                 break;
393
394         case SND_SOC_DAPM_POST_PMD:
395                 /* set cap-couple, mute HP */
396                 regmap_update_bits(jz_codec->regmap, JZ4770_CODEC_REG_CR_HP,
397                                    REG_CR_HP_SB_HPCM | REG_CR_HP_MUTE,
398                                    REG_CR_HP_SB_HPCM | REG_CR_HP_MUTE);
399
400                 err = regmap_read_poll_timeout(jz_codec->regmap,
401                                                JZ4770_CODEC_REG_IFR,
402                                                val, val & REG_IFR_RDO,
403                                                1000, 100 * USEC_PER_MSEC);
404                 if (err) {
405                         dev_err(jz_codec->dev, "RDO timeout: %d", err);
406                         return err;
407                 }
408
409                 /* clear RDO flag */
410                 regmap_update_bits(jz_codec->regmap, JZ4770_CODEC_REG_IFR,
411                                    REG_IFR_RDO, REG_IFR_RDO);
412
413                 break;
414         }
415
416         return 0;
417 }
418
419 static int adc_poweron_event(struct snd_soc_dapm_widget *w,
420                              struct snd_kcontrol *kcontrol, int event)
421 {
422         if (event == SND_SOC_DAPM_POST_PMU)
423                 msleep(1000);
424
425         return 0;
426 }
427
428 static const char * const jz4770_codec_hp_texts[] = {
429         "PCM", "Line In", "Mic 1", "Mic 2"
430 };
431 static const unsigned int jz4770_codec_hp_values[] = { 3, 2, 0, 1 };
432 static SOC_VALUE_ENUM_SINGLE_DECL(jz4770_codec_hp_enum,
433                                   JZ4770_CODEC_REG_CR_HP,
434                                   REG_CR_HP_SEL_OFFSET,
435                                   REG_CR_HP_SEL_MASK,
436                                   jz4770_codec_hp_texts,
437                                   jz4770_codec_hp_values);
438 static const struct snd_kcontrol_new jz4770_codec_hp_source =
439                         SOC_DAPM_ENUM("Route", jz4770_codec_hp_enum);
440
441 static SOC_VALUE_ENUM_SINGLE_DECL(jz4770_codec_lo_enum,
442                                   JZ4770_CODEC_REG_CR_LO,
443                                   REG_CR_LO_SEL_OFFSET,
444                                   REG_CR_LO_SEL_MASK,
445                                   jz4770_codec_hp_texts,
446                                   jz4770_codec_hp_values);
447 static const struct snd_kcontrol_new jz4770_codec_lo_source =
448                         SOC_DAPM_ENUM("Route", jz4770_codec_lo_enum);
449
450 static const char * const jz4770_codec_cap_texts[] = {
451         "Line In", "Mic 1", "Mic 2"
452 };
453 static const unsigned int jz4770_codec_cap_values[] = { 2, 0, 1 };
454 static SOC_VALUE_ENUM_SINGLE_DECL(jz4770_codec_cap_enum,
455                                   JZ4770_CODEC_REG_CR_ADC,
456                                   REG_CR_ADC_IN_SEL_OFFSET,
457                                   REG_CR_ADC_IN_SEL_MASK,
458                                   jz4770_codec_cap_texts,
459                                   jz4770_codec_cap_values);
460 static const struct snd_kcontrol_new jz4770_codec_cap_source =
461                         SOC_DAPM_ENUM("Route", jz4770_codec_cap_enum);
462
463 static const struct snd_kcontrol_new jz4770_codec_mic_controls[] = {
464         SOC_DAPM_SINGLE("Stereo Capture Switch", JZ4770_CODEC_REG_CR_MIC,
465                         REG_CR_MIC_STEREO_OFFSET, 1, 0),
466 };
467
468 static const struct snd_soc_dapm_widget jz4770_codec_dapm_widgets[] = {
469         SND_SOC_DAPM_PGA_E("HP Out", JZ4770_CODEC_REG_CR_HP,
470                            REG_CR_HP_SB_OFFSET, 1, NULL, 0, hpout_event,
471                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
472                            SND_SOC_DAPM_POST_PMD),
473
474         SND_SOC_DAPM_PGA("Line Out", JZ4770_CODEC_REG_CR_LO,
475                          REG_CR_LO_SB_OFFSET, 1, NULL, 0),
476
477         SND_SOC_DAPM_PGA("Line Out Switch 2", JZ4770_CODEC_REG_CR_LO,
478                          REG_CR_LO_MUTE_OFFSET, 1, NULL, 0),
479
480         SND_SOC_DAPM_PGA("Line In", JZ4770_CODEC_REG_CR_LI,
481                          REG_CR_LI_SB_OFFSET, 1, NULL, 0),
482
483         SND_SOC_DAPM_MUX("Headphones Source", SND_SOC_NOPM, 0, 0,
484                          &jz4770_codec_hp_source),
485         SND_SOC_DAPM_MUX("Capture Source", SND_SOC_NOPM, 0, 0,
486                          &jz4770_codec_cap_source),
487         SND_SOC_DAPM_MUX("Line Out Source", SND_SOC_NOPM, 0, 0,
488                          &jz4770_codec_lo_source),
489
490         SND_SOC_DAPM_PGA("Mic 1", JZ4770_CODEC_REG_CR_MIC,
491                          REG_CR_MIC_SB_MIC1_OFFSET, 1, NULL, 0),
492         SND_SOC_DAPM_PGA("Mic 2", JZ4770_CODEC_REG_CR_MIC,
493                          REG_CR_MIC_SB_MIC2_OFFSET, 1, NULL, 0),
494
495         SND_SOC_DAPM_PGA("Mic Diff", JZ4770_CODEC_REG_CR_MIC,
496                          REG_CR_MIC_IDIFF_OFFSET, 0, NULL, 0),
497
498         SND_SOC_DAPM_MIXER("Mic", SND_SOC_NOPM, 0, 0,
499                            jz4770_codec_mic_controls,
500                            ARRAY_SIZE(jz4770_codec_mic_controls)),
501
502         SND_SOC_DAPM_PGA("Line In Bypass", JZ4770_CODEC_REG_CR_LI,
503                          REG_CR_LI_LIBY_OFFSET, 1, NULL, 0),
504
505         SND_SOC_DAPM_ADC_E("ADC", "HiFi Capture", JZ4770_CODEC_REG_CR_ADC,
506                            REG_CR_ADC_SB_OFFSET, 1, adc_poweron_event,
507                            SND_SOC_DAPM_POST_PMU),
508         SND_SOC_DAPM_DAC("DAC", "HiFi Playback", JZ4770_CODEC_REG_CR_DAC,
509                          REG_CR_DAC_SB_OFFSET, 1),
510
511         SND_SOC_DAPM_MIXER("PCM Playback", SND_SOC_NOPM, 0, 0,
512                            jz4770_codec_pcm_playback_controls,
513                            ARRAY_SIZE(jz4770_codec_pcm_playback_controls)),
514         SND_SOC_DAPM_MIXER("Headphones Playback", SND_SOC_NOPM, 0, 0,
515                            jz4770_codec_hp_playback_controls,
516                            ARRAY_SIZE(jz4770_codec_hp_playback_controls)),
517
518         SND_SOC_DAPM_SUPPLY("MICBIAS", JZ4770_CODEC_REG_CR_MIC,
519                             REG_CR_MIC_BIAS_SB_OFFSET, 1, NULL, 0),
520
521         SND_SOC_DAPM_INPUT("MIC1P"),
522         SND_SOC_DAPM_INPUT("MIC1N"),
523         SND_SOC_DAPM_INPUT("MIC2P"),
524         SND_SOC_DAPM_INPUT("MIC2N"),
525
526         SND_SOC_DAPM_OUTPUT("LOUT"),
527         SND_SOC_DAPM_OUTPUT("ROUT"),
528
529         SND_SOC_DAPM_OUTPUT("LHPOUT"),
530         SND_SOC_DAPM_OUTPUT("RHPOUT"),
531
532         SND_SOC_DAPM_INPUT("LLINEIN"),
533         SND_SOC_DAPM_INPUT("RLINEIN"),
534
535         SND_SOC_DAPM_OUTPUT("SYSCLK"),
536 };
537
538 /* Unconditional routes. */
539 static const struct snd_soc_dapm_route jz4770_codec_dapm_routes[] = {
540         { "Mic 1", NULL, "MIC1P" },
541         { "Mic Diff", NULL, "MIC1N" },
542         { "Mic 1", NULL, "Mic Diff" },
543         { "Mic 2", NULL, "MIC2P" },
544         { "Mic Diff", NULL, "MIC2N" },
545         { "Mic 2", NULL, "Mic Diff" },
546
547         { "Line In", NULL, "LLINEIN" },
548         { "Line In", NULL, "RLINEIN" },
549
550         { "Mic", "Stereo Capture Switch", "Mic 1" },
551         { "Mic", "Stereo Capture Switch", "Mic 2" },
552         { "Headphones Source", "Mic 1", "Mic" },
553         { "Headphones Source", "Mic 2", "Mic" },
554         { "Capture Source", "Mic 1", "Mic" },
555         { "Capture Source", "Mic 2", "Mic" },
556
557         { "Headphones Source", "Mic 1", "Mic 1" },
558         { "Headphones Source", "Mic 2", "Mic 2" },
559         { "Headphones Source", "Line In", "Line In Bypass" },
560         { "Headphones Source", "PCM", "Headphones Playback" },
561         { "HP Out", NULL, "Headphones Source" },
562
563         { "Capture Source", "Line In", "Line In" },
564         { "Capture Source", "Mic 1", "Mic 1" },
565         { "Capture Source", "Mic 2", "Mic 2" },
566         { "ADC", NULL, "Capture Source" },
567
568         { "Line In Bypass", NULL, "Line In" },
569         { "Line Out Source", "Line In", "Line In Bypass" },
570         { "Line Out Source", "PCM", "PCM Playback" },
571
572         { "LHPOUT", NULL, "HP Out"},
573         { "RHPOUT", NULL, "HP Out"},
574
575         { "Line Out", NULL, "Line Out Source" },
576         { "Line Out Switch 2", NULL, "Line Out" },
577
578         { "LOUT", NULL, "Line Out Switch 2"},
579         { "ROUT", NULL, "Line Out Switch 2"},
580
581         { "PCM Playback", "Volume", "DAC" },
582         { "Headphones Playback", "Volume", "PCM Playback" },
583
584         { "SYSCLK", NULL, "DAC" },
585 };
586
587 static void jz4770_codec_codec_init_regs(struct snd_soc_component *codec)
588 {
589         struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
590         struct regmap *regmap = jz_codec->regmap;
591
592         /* Collect updates for later sending. */
593         regcache_cache_only(regmap, true);
594
595         /* default HP output to PCM */
596         regmap_update_bits(regmap, JZ4770_CODEC_REG_CR_HP,
597                            REG_CR_HP_SEL_MASK, REG_CR_HP_SEL_MASK);
598
599         /* default line output to PCM */
600         regmap_update_bits(regmap, JZ4770_CODEC_REG_CR_LO,
601                            REG_CR_LO_SEL_MASK, REG_CR_LO_SEL_MASK);
602
603         /* Disable stereo mic */
604         regmap_update_bits(regmap, JZ4770_CODEC_REG_CR_MIC,
605                            BIT(REG_CR_MIC_STEREO_OFFSET), 0);
606
607         /* Set mic 1 as default source for ADC */
608         regmap_update_bits(regmap, JZ4770_CODEC_REG_CR_ADC,
609                            REG_CR_ADC_IN_SEL_MASK, 0);
610
611         /* ADC/DAC: serial + i2s */
612         regmap_update_bits(regmap, JZ4770_CODEC_REG_AICR_ADC,
613                            REG_AICR_ADC_SERIAL | REG_AICR_ADC_I2S,
614                            REG_AICR_ADC_SERIAL | REG_AICR_ADC_I2S);
615         regmap_update_bits(regmap, JZ4770_CODEC_REG_AICR_DAC,
616                            REG_AICR_DAC_SERIAL | REG_AICR_DAC_I2S,
617                            REG_AICR_DAC_SERIAL | REG_AICR_DAC_I2S);
618
619         /* The generated IRQ is a high level */
620         regmap_update_bits(regmap, JZ4770_CODEC_REG_ICR,
621                            REG_ICR_INT_FORM_MASK, 0);
622         regmap_update_bits(regmap, JZ4770_CODEC_REG_IMR, REG_IMR_ALL_MASK,
623                            REG_IMR_JACK_MASK | REG_IMR_RUP_MASK |
624                            REG_IMR_RDO_MASK | REG_IMR_GUP_MASK |
625                            REG_IMR_GDO_MASK);
626
627         /* 12M oscillator */
628         regmap_update_bits(regmap, JZ4770_CODEC_REG_CCR,
629                            REG_CCR_CRYSTAL_MASK, 0);
630
631         /* 0: 16ohm/220uF, 1: 10kohm/1uF */
632         regmap_update_bits(regmap, JZ4770_CODEC_REG_CR_HP,
633                            REG_CR_HP_LOAD, 0);
634
635         /* disable automatic gain */
636         regmap_update_bits(regmap, JZ4770_CODEC_REG_AGC1, REG_AGC1_EN, 0);
637
638         /* Disable DAC lrswap */
639         regmap_update_bits(regmap, JZ4770_CODEC_REG_CR_DAC,
640                            REG_CR_DAC_LRSWAP, REG_CR_DAC_LRSWAP);
641
642         /* Independent L/R DAC gain control */
643         regmap_update_bits(regmap, JZ4770_CODEC_REG_GCR_DACL,
644                            REG_GCR_DACL_RLGOD, 0);
645
646         /* Disable ADC lrswap */
647         regmap_update_bits(regmap, JZ4770_CODEC_REG_CR_ADC,
648                            REG_CR_ADC_LRSWAP, REG_CR_ADC_LRSWAP);
649
650         /* default to cap-less mode(0) */
651         regmap_update_bits(regmap, JZ4770_CODEC_REG_CR_HP,
652                            REG_CR_HP_SB_HPCM, 0);
653
654         /* Send collected updates. */
655         regcache_cache_only(regmap, false);
656         regcache_sync(regmap);
657
658         /* Reset all interrupt flags. */
659         regmap_write(regmap, JZ4770_CODEC_REG_IFR, REG_IFR_ALL_MASK);
660 }
661
662 static int jz4770_codec_codec_probe(struct snd_soc_component *codec)
663 {
664         struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
665
666         clk_prepare_enable(jz_codec->clk);
667
668         jz4770_codec_codec_init_regs(codec);
669
670         return 0;
671 }
672
673 static void jz4770_codec_codec_remove(struct snd_soc_component *codec)
674 {
675         struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
676
677         clk_disable_unprepare(jz_codec->clk);
678 }
679
680 static const struct snd_soc_component_driver jz4770_codec_soc_codec_dev = {
681         .probe                  = jz4770_codec_codec_probe,
682         .remove                 = jz4770_codec_codec_remove,
683         .set_bias_level         = jz4770_codec_set_bias_level,
684         .controls               = jz4770_codec_snd_controls,
685         .num_controls           = ARRAY_SIZE(jz4770_codec_snd_controls),
686         .dapm_widgets           = jz4770_codec_dapm_widgets,
687         .num_dapm_widgets       = ARRAY_SIZE(jz4770_codec_dapm_widgets),
688         .dapm_routes            = jz4770_codec_dapm_routes,
689         .num_dapm_routes        = ARRAY_SIZE(jz4770_codec_dapm_routes),
690         .suspend_bias_off       = 1,
691         .use_pmdown_time        = 1,
692 };
693
694 static const unsigned int jz4770_codec_sample_rates[] = {
695         96000, 48000, 44100, 32000,
696         24000, 22050, 16000, 12000,
697         11025, 9600, 8000,
698 };
699
700 static int jz4770_codec_hw_params(struct snd_pcm_substream *substream,
701                                   struct snd_pcm_hw_params *params,
702                                   struct snd_soc_dai *dai)
703 {
704         struct jz_codec *codec = snd_soc_component_get_drvdata(dai->component);
705         unsigned int rate, bit_width;
706
707         switch (params_format(params)) {
708         case SNDRV_PCM_FORMAT_S16_LE:
709                 bit_width = 0;
710                 break;
711         case SNDRV_PCM_FORMAT_S18_3LE:
712                 bit_width = 1;
713                 break;
714         case SNDRV_PCM_FORMAT_S20_3LE:
715                 bit_width = 2;
716                 break;
717         case SNDRV_PCM_FORMAT_S24_3LE:
718                 bit_width = 3;
719                 break;
720         default:
721                 return -EINVAL;
722         }
723
724         for (rate = 0; rate < ARRAY_SIZE(jz4770_codec_sample_rates); rate++) {
725                 if (jz4770_codec_sample_rates[rate] == params_rate(params))
726                         break;
727         }
728
729         if (rate == ARRAY_SIZE(jz4770_codec_sample_rates))
730                 return -EINVAL;
731
732         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
733                 regmap_update_bits(codec->regmap, JZ4770_CODEC_REG_AICR_DAC,
734                                    REG_AICR_DAC_ADWL_MASK,
735                                    bit_width << REG_AICR_DAC_ADWL_OFFSET);
736                 regmap_update_bits(codec->regmap, JZ4770_CODEC_REG_FCR_DAC,
737                                    REG_FCR_DAC_FREQ_MASK,
738                                    rate << REG_FCR_DAC_FREQ_OFFSET);
739         } else {
740                 regmap_update_bits(codec->regmap, JZ4770_CODEC_REG_AICR_ADC,
741                                    REG_AICR_ADC_ADWL_MASK,
742                                    bit_width << REG_AICR_ADC_ADWL_OFFSET);
743                 regmap_update_bits(codec->regmap, JZ4770_CODEC_REG_FCR_ADC,
744                                    REG_FCR_ADC_FREQ_MASK,
745                                    rate << REG_FCR_ADC_FREQ_OFFSET);
746         }
747
748         return 0;
749 }
750
751 static const struct snd_soc_dai_ops jz4770_codec_dai_ops = {
752         .startup        = jz4770_codec_startup,
753         .shutdown       = jz4770_codec_shutdown,
754         .hw_params      = jz4770_codec_hw_params,
755         .trigger        = jz4770_codec_pcm_trigger,
756         .digital_mute   = jz4770_codec_digital_mute,
757 };
758
759 #define JZ_CODEC_FORMATS (SNDRV_PCM_FMTBIT_S16_LE  | \
760                           SNDRV_PCM_FMTBIT_S18_3LE | \
761                           SNDRV_PCM_FMTBIT_S20_3LE | \
762                           SNDRV_PCM_FMTBIT_S24_3LE)
763
764 static struct snd_soc_dai_driver jz4770_codec_dai = {
765         .name = "jz4770-hifi",
766         .playback = {
767                 .stream_name = "Playback",
768                 .channels_min = 2,
769                 .channels_max = 2,
770                 .rates = SNDRV_PCM_RATE_8000_96000,
771                 .formats = JZ_CODEC_FORMATS,
772         },
773         .capture = {
774                 .stream_name = "Capture",
775                 .channels_min = 2,
776                 .channels_max = 2,
777                 .rates = SNDRV_PCM_RATE_8000_96000,
778                 .formats = JZ_CODEC_FORMATS,
779         },
780         .ops = &jz4770_codec_dai_ops,
781 };
782
783 static bool jz4770_codec_volatile(struct device *dev, unsigned int reg)
784 {
785         return reg == JZ4770_CODEC_REG_SR || reg == JZ4770_CODEC_REG_IFR;
786 }
787
788 static bool jz4770_codec_readable(struct device *dev, unsigned int reg)
789 {
790         switch (reg) {
791         case JZ4770_CODEC_REG_MISSING_REG1:
792         case JZ4770_CODEC_REG_MISSING_REG2:
793                 return false;
794         default:
795                 return true;
796         }
797 }
798
799 static bool jz4770_codec_writeable(struct device *dev, unsigned int reg)
800 {
801         switch (reg) {
802         case JZ4770_CODEC_REG_SR:
803         case JZ4770_CODEC_REG_MISSING_REG1:
804         case JZ4770_CODEC_REG_MISSING_REG2:
805                 return false;
806         default:
807                 return true;
808         }
809 }
810
811 static int jz4770_codec_io_wait(struct jz_codec *codec)
812 {
813         u32 reg;
814
815         return readl_poll_timeout(codec->base + ICDC_RGADW_OFFSET, reg,
816                                   !(reg & ICDC_RGADW_RGWR),
817                                   1000, 10 * USEC_PER_MSEC);
818 }
819
820 static int jz4770_codec_reg_read(void *context, unsigned int reg,
821                                  unsigned int *val)
822 {
823         struct jz_codec *codec = context;
824         unsigned int i;
825         u32 tmp;
826         int ret;
827
828         ret = jz4770_codec_io_wait(codec);
829         if (ret)
830                 return ret;
831
832         tmp = readl(codec->base + ICDC_RGADW_OFFSET);
833         tmp = (tmp & ~ICDC_RGADW_RGADDR_MASK)
834             | (reg << ICDC_RGADW_RGADDR_OFFSET);
835         writel(tmp, codec->base + ICDC_RGADW_OFFSET);
836
837         /* wait 6+ cycles */
838         for (i = 0; i < 6; i++)
839                 *val = readl(codec->base + ICDC_RGDATA_OFFSET) &
840                         ICDC_RGDATA_RGDOUT_MASK;
841
842         return 0;
843 }
844
845 static int jz4770_codec_reg_write(void *context, unsigned int reg,
846                                   unsigned int val)
847 {
848         struct jz_codec *codec = context;
849         int ret;
850
851         ret = jz4770_codec_io_wait(codec);
852         if (ret)
853                 return ret;
854
855         writel(ICDC_RGADW_RGWR | (reg << ICDC_RGADW_RGADDR_OFFSET) | val,
856                codec->base + ICDC_RGADW_OFFSET);
857
858         ret = jz4770_codec_io_wait(codec);
859         if (ret)
860                 return ret;
861
862         return 0;
863 }
864
865 static const u8 jz4770_codec_reg_defaults[] = {
866         0x00, 0xC3, 0xC3, 0x90, 0x98, 0xFF, 0x90, 0xB1,
867         0x11, 0x10, 0x00, 0x03, 0x00, 0x00, 0x40, 0x00,
868         0xFF, 0x00, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00,
869         0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x34,
870         0x07, 0x44, 0x1F, 0x00
871 };
872
873 static struct regmap_config jz4770_codec_regmap_config = {
874         .reg_bits = 7,
875         .val_bits = 8,
876
877         .max_register = JZ4770_CODEC_REG_AGC5,
878         .volatile_reg = jz4770_codec_volatile,
879         .readable_reg = jz4770_codec_readable,
880         .writeable_reg = jz4770_codec_writeable,
881
882         .reg_read = jz4770_codec_reg_read,
883         .reg_write = jz4770_codec_reg_write,
884
885         .reg_defaults_raw = jz4770_codec_reg_defaults,
886         .num_reg_defaults_raw = ARRAY_SIZE(jz4770_codec_reg_defaults),
887         .cache_type = REGCACHE_FLAT,
888 };
889
890 static int jz4770_codec_probe(struct platform_device *pdev)
891 {
892         struct device *dev = &pdev->dev;
893         struct jz_codec *codec;
894         int ret;
895
896         codec = devm_kzalloc(dev, sizeof(*codec), GFP_KERNEL);
897         if (!codec)
898                 return -ENOMEM;
899
900         codec->dev = dev;
901
902         codec->base = devm_platform_ioremap_resource(pdev, 0);
903         if (IS_ERR(codec->base)) {
904                 ret = PTR_ERR(codec->base);
905                 dev_err(dev, "Failed to ioremap mmio memory: %d\n", ret);
906                 return ret;
907         }
908
909         codec->regmap = devm_regmap_init(dev, NULL, codec,
910                                         &jz4770_codec_regmap_config);
911         if (IS_ERR(codec->regmap))
912                 return PTR_ERR(codec->regmap);
913
914         codec->clk = devm_clk_get(dev, "aic");
915         if (IS_ERR(codec->clk))
916                 return PTR_ERR(codec->clk);
917
918         platform_set_drvdata(pdev, codec);
919
920         ret = devm_snd_soc_register_component(dev, &jz4770_codec_soc_codec_dev,
921                                               &jz4770_codec_dai, 1);
922         if (ret) {
923                 dev_err(dev, "Failed to register codec: %d\n", ret);
924                 return ret;
925         }
926
927         return 0;
928 }
929
930 static const struct of_device_id jz4770_codec_of_matches[] = {
931         { .compatible = "ingenic,jz4770-codec", },
932         { /* sentinel */ }
933 };
934 MODULE_DEVICE_TABLE(of, jz4770_codec_of_matches);
935
936 static struct platform_driver jz4770_codec_driver = {
937         .probe                  = jz4770_codec_probe,
938         .driver                 = {
939                 .name           = "jz4770-codec",
940                 .of_match_table = of_match_ptr(jz4770_codec_of_matches),
941         },
942 };
943 module_platform_driver(jz4770_codec_driver);
944
945 MODULE_DESCRIPTION("JZ4770 SoC internal codec driver");
946 MODULE_AUTHOR("Maarten ter Huurne <maarten@treewalker.org>");
947 MODULE_AUTHOR("Paul Cercueil <paul@crapouillou.net>");
948 MODULE_LICENSE("GPL v2");