1 // SPDX-License-Identifier: GPL-2.0-only
3 // nau8325.c -- Nuvoton NAU8325 audio codec driver
5 // Copyright 2023 Nuvoton Technology Crop.
6 // Author: Seven Lee <WTLI@nuvoton.com>
7 // David Lin <CTLIN0@nuvoton.com>
10 #include <linux/clk.h>
11 #include <linux/delay.h>
12 #include <linux/init.h>
13 #include <linux/i2c.h>
14 #include <linux/module.h>
15 #include <linux/regmap.h>
16 #include <linux/slab.h>
17 #include <sound/core.h>
18 #include <sound/initval.h>
19 #include <sound/pcm.h>
20 #include <sound/pcm_params.h>
21 #include <sound/soc.h>
22 #include <sound/tlv.h>
25 /* Range of Master Clock MCLK (Hz) */
26 #define MASTER_CLK_MAX 49152000
27 #define MASTER_CLK_MIN 2048000
29 /* scaling for MCLK source */
30 #define CLK_PROC_BYPASS (-1)
32 /* the maximum CLK_DAC */
33 #define CLK_DA_AD_MAX 6144000
38 static const struct nau8325_src_attr mclk_n1_div
[] = {
44 /* over sampling rate */
45 static const struct nau8325_osr_attr osr_dac_sel
[] = {
46 { 64, 2 }, /* OSR 64, SRC 1/4 */
47 { 256, 0 }, /* OSR 256, SRC 1 */
48 { 128, 1 }, /* OSR 128, SRC 1/2 */
50 { 32, 3 }, /* OSR 32, SRC 1/8 */
53 static const struct nau8325_src_attr mclk_n2_div
[] = {
61 static const struct nau8325_src_attr mclk_n3_mult
[] = {
68 /* Sample Rate and MCLK_SRC selections */
69 static const struct nau8325_srate_attr target_srate_table
[] = {
70 /* { FS, range, max, { MCLK source }} */
71 { 48000, 2, true, { 12288000, 19200000, 24000000 } },
72 { 16000, 1, false, { 4096000, 6400000, 8000000 } },
73 { 8000, 0, false, { 2048000, 3200000, 4000000 }},
74 { 44100, 2, true, { 11289600, 17640000, 22050000 }},
75 { 64000, 3, false, { 16384000, 25600000, 32000000 } },
76 { 96000, 3, true, { 24576000, 38400000, 48000000 } },
77 { 12000, 0, true, { 3072000, 4800000, 6000000 } },
78 { 24000, 1, true, { 6144000, 9600000, 12000000 } },
79 { 32000, 2, false, { 8192000, 12800000, 16000000 } },
82 static const struct reg_default nau8325_reg_defaults
[] = {
83 { NAU8325_R00_HARDWARE_RST
, 0x0000 },
84 { NAU8325_R01_SOFTWARE_RST
, 0x0000 },
85 { NAU8325_R03_CLK_CTRL
, 0x0000 },
86 { NAU8325_R04_ENA_CTRL
, 0x0000 },
87 { NAU8325_R05_INTERRUPT_CTRL
, 0x007f },
88 { NAU8325_R09_IRQOUT
, 0x0000 },
89 { NAU8325_R0A_IO_CTRL
, 0x0000 },
90 { NAU8325_R0B_PDM_CTRL
, 0x0000 },
91 { NAU8325_R0C_TDM_CTRL
, 0x0000 },
92 { NAU8325_R0D_I2S_PCM_CTRL1
, 0x000a },
93 { NAU8325_R0E_I2S_PCM_CTRL2
, 0x0000 },
94 { NAU8325_R0F_L_TIME_SLOT
, 0x0000 },
95 { NAU8325_R10_R_TIME_SLOT
, 0x0000 },
96 { NAU8325_R11_HPF_CTRL
, 0x0000 },
97 { NAU8325_R12_MUTE_CTRL
, 0x0000 },
98 { NAU8325_R13_DAC_VOLUME
, 0xf3f3 },
99 { NAU8325_R29_DAC_CTRL1
, 0x0081 },
100 { NAU8325_R2A_DAC_CTRL2
, 0x0000 },
101 { NAU8325_R2C_ALC_CTRL1
, 0x000e },
102 { NAU8325_R2D_ALC_CTRL2
, 0x8400 },
103 { NAU8325_R2E_ALC_CTRL3
, 0x0000 },
104 { NAU8325_R2F_ALC_CTRL4
, 0x003f },
105 { NAU8325_R40_CLK_DET_CTRL
, 0xa801 },
106 { NAU8325_R50_MIXER_CTRL
, 0x0000 },
107 { NAU8325_R55_MISC_CTRL
, 0x0000 },
108 { NAU8325_R60_BIAS_ADJ
, 0x0000 },
109 { NAU8325_R61_ANALOG_CONTROL_1
, 0x0000 },
110 { NAU8325_R62_ANALOG_CONTROL_2
, 0x0000 },
111 { NAU8325_R63_ANALOG_CONTROL_3
, 0x0000 },
112 { NAU8325_R64_ANALOG_CONTROL_4
, 0x0000 },
113 { NAU8325_R65_ANALOG_CONTROL_5
, 0x0000 },
114 { NAU8325_R66_ANALOG_CONTROL_6
, 0x0000 },
115 { NAU8325_R69_CLIP_CTRL
, 0x0000 },
116 { NAU8325_R73_RDAC
, 0x0008 },
119 static bool nau8325_readable_reg(struct device
*dev
, unsigned int reg
)
122 case NAU8325_R02_DEVICE_ID
... NAU8325_R06_INT_CLR_STATUS
:
123 case NAU8325_R09_IRQOUT
... NAU8325_R13_DAC_VOLUME
:
124 case NAU8325_R1D_DEBUG_READ1
:
125 case NAU8325_R1F_DEBUG_READ2
:
126 case NAU8325_R22_DEBUG_READ3
:
127 case NAU8325_R29_DAC_CTRL1
... NAU8325_R2A_DAC_CTRL2
:
128 case NAU8325_R2C_ALC_CTRL1
... NAU8325_R2F_ALC_CTRL4
:
129 case NAU8325_R40_CLK_DET_CTRL
:
130 case NAU8325_R49_TEST_STATUS
... NAU8325_R4A_ANALOG_READ
:
131 case NAU8325_R50_MIXER_CTRL
:
132 case NAU8325_R55_MISC_CTRL
:
133 case NAU8325_R60_BIAS_ADJ
... NAU8325_R66_ANALOG_CONTROL_6
:
134 case NAU8325_R69_CLIP_CTRL
:
135 case NAU8325_R73_RDAC
:
142 static bool nau8325_writeable_reg(struct device
*dev
, unsigned int reg
)
145 case NAU8325_R00_HARDWARE_RST
:
146 case NAU8325_R03_CLK_CTRL
... NAU8325_R06_INT_CLR_STATUS
:
147 case NAU8325_R09_IRQOUT
... NAU8325_R13_DAC_VOLUME
:
148 case NAU8325_R29_DAC_CTRL1
... NAU8325_R2A_DAC_CTRL2
:
149 case NAU8325_R2C_ALC_CTRL1
... NAU8325_R2F_ALC_CTRL4
:
150 case NAU8325_R40_CLK_DET_CTRL
:
151 case NAU8325_R50_MIXER_CTRL
:
152 case NAU8325_R55_MISC_CTRL
:
153 case NAU8325_R60_BIAS_ADJ
... NAU8325_R66_ANALOG_CONTROL_6
:
154 case NAU8325_R69_CLIP_CTRL
:
155 case NAU8325_R73_RDAC
:
162 static bool nau8325_volatile_reg(struct device
*dev
, unsigned int reg
)
165 case NAU8325_R00_HARDWARE_RST
... NAU8325_R02_DEVICE_ID
:
166 case NAU8325_R06_INT_CLR_STATUS
:
167 case NAU8325_R1D_DEBUG_READ1
:
168 case NAU8325_R1F_DEBUG_READ2
:
169 case NAU8325_R22_DEBUG_READ3
:
170 case NAU8325_R4A_ANALOG_READ
:
177 static const char * const nau8325_dac_oversampl_texts
[] = {
178 "64", "256", "128", "32",
181 static const unsigned int nau8325_dac_oversampl_values
[] = {
185 static const struct soc_enum nau8325_dac_oversampl_enum
=
186 SOC_VALUE_ENUM_SINGLE(NAU8325_R29_DAC_CTRL1
,
187 NAU8325_DAC_OVERSAMPLE_SFT
, 0x7,
188 ARRAY_SIZE(nau8325_dac_oversampl_texts
),
189 nau8325_dac_oversampl_texts
,
190 nau8325_dac_oversampl_values
);
192 static const DECLARE_TLV_DB_MINMAX_MUTE(dac_vol_tlv
, -8000, 600);
194 static const struct snd_kcontrol_new nau8325_snd_controls
[] = {
195 SOC_ENUM("DAC Oversampling Rate", nau8325_dac_oversampl_enum
),
196 SOC_DOUBLE_TLV("Speaker Volume", NAU8325_R13_DAC_VOLUME
,
197 NAU8325_DAC_VOLUME_L_SFT
, NAU8325_DAC_VOLUME_R_SFT
,
198 NAU8325_DAC_VOLUME_R_EN
, 0, dac_vol_tlv
),
199 SOC_SINGLE("ALC Max Gain", NAU8325_R2C_ALC_CTRL1
,
200 NAU8325_ALC_MAXGAIN_SFT
, NAU8325_ALC_MAXGAIN_MAX
, 0),
201 SOC_SINGLE("ALC Min Gain", NAU8325_R2C_ALC_CTRL1
,
202 NAU8325_ALC_MINGAIN_SFT
, NAU8325_ALC_MINGAIN_MAX
, 0),
203 SOC_SINGLE("ALC Decay Timer", NAU8325_R2D_ALC_CTRL2
,
204 NAU8325_ALC_DCY_SFT
, NAU8325_ALC_DCY_MAX
, 0),
205 SOC_SINGLE("ALC Attack Timer", NAU8325_R2D_ALC_CTRL2
,
206 NAU8325_ALC_ATK_SFT
, NAU8325_ALC_ATK_MAX
, 0),
207 SOC_SINGLE("ALC Hold Time", NAU8325_R2D_ALC_CTRL2
,
208 NAU8325_ALC_HLD_SFT
, NAU8325_ALC_HLD_MAX
, 0),
209 SOC_SINGLE("ALC Target Level", NAU8325_R2D_ALC_CTRL2
,
210 NAU8325_ALC_LVL_SFT
, NAU8325_ALC_LVL_MAX
, 0),
211 SOC_SINGLE("ALC Enable Switch", NAU8325_R2E_ALC_CTRL3
,
212 NAU8325_ALC_EN_SFT
, 1, 0),
215 static int nau8325_dac_event(struct snd_soc_dapm_widget
*w
,
216 struct snd_kcontrol
*kcontrol
, int event
)
218 struct snd_soc_component
*component
=
219 snd_soc_dapm_to_component(w
->dapm
);
220 struct nau8325
*nau8325
= snd_soc_component_get_drvdata(component
);
223 case SND_SOC_DAPM_POST_PMU
:
224 regmap_update_bits(nau8325
->regmap
, NAU8325_R12_MUTE_CTRL
,
225 NAU8325_SOFT_MUTE
, 0);
228 case SND_SOC_DAPM_PRE_PMD
:
229 /* Soft mute the output to prevent the pop noise. */
230 regmap_update_bits(nau8325
->regmap
, NAU8325_R12_MUTE_CTRL
,
231 NAU8325_SOFT_MUTE
, NAU8325_SOFT_MUTE
);
241 static int nau8325_powerup_event(struct snd_soc_dapm_widget
*w
,
242 struct snd_kcontrol
*kcontrol
, int event
)
244 struct snd_soc_component
*component
=
245 snd_soc_dapm_to_component(w
->dapm
);
246 struct nau8325
*nau8325
= snd_soc_component_get_drvdata(component
);
248 if (nau8325
->clock_detection
)
252 case SND_SOC_DAPM_POST_PMU
:
253 regmap_update_bits(nau8325
->regmap
, NAU8325_R40_CLK_DET_CTRL
,
254 NAU8325_PWRUP_DFT
, NAU8325_PWRUP_DFT
);
256 case SND_SOC_DAPM_POST_PMD
:
257 regmap_update_bits(nau8325
->regmap
, NAU8325_R40_CLK_DET_CTRL
,
258 NAU8325_PWRUP_DFT
, 0);
267 static const struct snd_soc_dapm_widget nau8325_dapm_widgets
[] = {
268 SND_SOC_DAPM_SUPPLY("Power Up", SND_SOC_NOPM
, 0, 0,
269 nau8325_powerup_event
, SND_SOC_DAPM_POST_PMU
|
270 SND_SOC_DAPM_POST_PMD
),
271 SND_SOC_DAPM_DAC_E("DACL", NULL
, NAU8325_R04_ENA_CTRL
,
272 NAU8325_DAC_LEFT_CH_EN_SFT
, 0, nau8325_dac_event
,
273 SND_SOC_DAPM_POST_PMU
| SND_SOC_DAPM_PRE_PMD
),
274 SND_SOC_DAPM_DAC_E("DACR", NULL
, NAU8325_R04_ENA_CTRL
,
275 NAU8325_DAC_RIGHT_CH_EN_SFT
, 0, nau8325_dac_event
,
276 SND_SOC_DAPM_POST_PMU
| SND_SOC_DAPM_PRE_PMD
),
277 SND_SOC_DAPM_AIF_IN("AIFRX", "Playback", 0, SND_SOC_NOPM
, 0, 0),
279 SND_SOC_DAPM_OUTPUT("SPKL"),
280 SND_SOC_DAPM_OUTPUT("SPKR"),
283 static const struct snd_soc_dapm_route nau8325_dapm_routes
[] = {
284 { "DACL", NULL
, "Power Up" },
285 { "DACR", NULL
, "Power Up" },
287 { "DACL", NULL
, "AIFRX" },
288 { "DACR", NULL
, "AIFRX" },
289 { "SPKL", NULL
, "DACL" },
290 { "SPKR", NULL
, "DACR" },
293 static int nau8325_srate_clk_apply(struct nau8325
*nau8325
,
294 const struct nau8325_srate_attr
*srate_table
,
295 int n1_sel
, int mclk_mult_sel
, int n2_sel
)
297 if (!srate_table
|| n2_sel
< 0 || n2_sel
>= ARRAY_SIZE(mclk_n2_div
) ||
298 n1_sel
< 0 || n1_sel
>= ARRAY_SIZE(mclk_n1_div
)) {
299 dev_dbg(nau8325
->dev
, "The CLK isn't supported.");
303 regmap_update_bits(nau8325
->regmap
, NAU8325_R40_CLK_DET_CTRL
,
304 NAU8325_REG_SRATE_MASK
| NAU8325_REG_DIV_MAX
,
305 (srate_table
->range
<< NAU8325_REG_SRATE_SFT
) |
306 (srate_table
->max
? NAU8325_REG_DIV_MAX
: 0));
307 regmap_update_bits(nau8325
->regmap
, NAU8325_R03_CLK_CTRL
,
308 NAU8325_MCLK_SRC_MASK
, mclk_n2_div
[n2_sel
].val
);
309 regmap_update_bits(nau8325
->regmap
, NAU8325_R03_CLK_CTRL
,
310 NAU8325_CLK_MUL_SRC_MASK
,
311 mclk_n1_div
[n1_sel
].val
<< NAU8325_CLK_MUL_SRC_SFT
);
313 if (mclk_mult_sel
!= CLK_PROC_BYPASS
) {
314 regmap_update_bits(nau8325
->regmap
, NAU8325_R03_CLK_CTRL
,
315 NAU8325_MCLK_SEL_MASK
,
316 mclk_n3_mult
[mclk_mult_sel
].val
<<
317 NAU8325_MCLK_SEL_SFT
);
319 regmap_update_bits(nau8325
->regmap
, NAU8325_R03_CLK_CTRL
,
320 NAU8325_MCLK_SEL_MASK
, 0);
323 switch (mclk_mult_sel
) {
325 regmap_update_bits(nau8325
->regmap
, NAU8325_R65_ANALOG_CONTROL_5
,
326 NAU8325_MCLK4XEN_EN
, NAU8325_MCLK4XEN_EN
);
329 regmap_update_bits(nau8325
->regmap
, NAU8325_R65_ANALOG_CONTROL_5
,
330 NAU8325_MCLK4XEN_EN
| NAU8325_MCLK8XEN_EN
,
331 NAU8325_MCLK4XEN_EN
| NAU8325_MCLK8XEN_EN
);
334 regmap_update_bits(nau8325
->regmap
, NAU8325_R65_ANALOG_CONTROL_5
,
335 NAU8325_MCLK4XEN_EN
| NAU8325_MCLK8XEN_EN
, 0);
342 static int nau8325_clksrc_n2(struct nau8325
*nau8325
,
343 const struct nau8325_srate_attr
*srate_table
,
344 int mclk
, int *n2_sel
)
346 int i
, mclk_src
, ratio
;
348 ratio
= NAU8325_MCLK_FS_RATIO_NUM
;
349 for (i
= 0; i
< ARRAY_SIZE(mclk_n2_div
); i
++) {
350 mclk_src
= mclk
>> mclk_n2_div
[i
].param
;
351 if (srate_table
->mclk_src
[NAU8325_MCLK_FS_RATIO_256
] == mclk_src
) {
352 ratio
= NAU8325_MCLK_FS_RATIO_256
;
354 } else if (srate_table
->mclk_src
[NAU8325_MCLK_FS_RATIO_400
] == mclk_src
) {
355 ratio
= NAU8325_MCLK_FS_RATIO_400
;
357 } else if (srate_table
->mclk_src
[NAU8325_MCLK_FS_RATIO_500
] == mclk_src
) {
358 ratio
= NAU8325_MCLK_FS_RATIO_500
;
362 if (ratio
!= NAU8325_MCLK_FS_RATIO_NUM
)
368 static const struct nau8325_srate_attr
*target_srate_attribute(int srate
)
372 for (i
= 0; i
< ARRAY_SIZE(target_srate_table
); i
++)
373 if (target_srate_table
[i
].fs
== srate
)
376 if (i
== ARRAY_SIZE(target_srate_table
))
379 return &target_srate_table
[i
];
385 static int nau8325_clksrc_choose(struct nau8325
*nau8325
,
386 const struct nau8325_srate_attr
**srate_table
,
387 int *n1_sel
, int *mult_sel
, int *n2_sel
)
389 int i
, j
, mclk
, mclk_max
, ratio
, ratio_sel
, n2_max
;
391 if (!nau8325
->mclk
|| !nau8325
->fs
)
394 /* select sampling rate and MCLK_SRC */
395 *srate_table
= target_srate_attribute(nau8325
->fs
);
399 /* First check clock from MCLK directly, decide N2 for MCLK_SRC.
400 * If not good, consider 1/N1 and Multiplier.
402 ratio
= nau8325_clksrc_n2(nau8325
, *srate_table
, nau8325
->mclk
, n2_sel
);
403 if (ratio
!= NAU8325_MCLK_FS_RATIO_NUM
) {
405 *mult_sel
= CLK_PROC_BYPASS
;
410 /* Get MCLK_SRC through 1/N, Multiplier, and then 1/N2. */
412 for (i
= 0; i
< ARRAY_SIZE(mclk_n1_div
); i
++) {
413 for (j
= 0; j
< ARRAY_SIZE(mclk_n3_mult
); j
++) {
414 mclk
= nau8325
->mclk
<< mclk_n3_mult
[j
].param
;
415 mclk
= mclk
/ mclk_n1_div
[i
].param
;
416 ratio
= nau8325_clksrc_n2(nau8325
,
417 *srate_table
, mclk
, n2_sel
);
418 if (ratio
!= NAU8325_MCLK_FS_RATIO_NUM
&&
419 (mclk_max
< mclk
|| i
> *n1_sel
)) {
436 dev_dbg(nau8325
->dev
, "The MCLK %d is invalid. It can't get MCLK_SRC of 256/400/500 FS (%d)",
437 nau8325
->mclk
, nau8325
->fs
);
440 dev_dbg(nau8325
->dev
, "nau8325->fs=%d,range=0x%x, %s, (n1,mu,n2,dmu):(%d,%d,%d), MCLK_SRC=%uHz (%d)",
441 nau8325
->fs
, (*srate_table
)->range
,
442 (*srate_table
)->max
? "MAX" : "MIN",
443 *n1_sel
== CLK_PROC_BYPASS
?
444 CLK_PROC_BYPASS
: mclk_n1_div
[*n1_sel
].param
,
445 *mult_sel
== CLK_PROC_BYPASS
?
446 CLK_PROC_BYPASS
: 1 << mclk_n3_mult
[*mult_sel
].param
,
447 1 << mclk_n2_div
[*n2_sel
].param
,
448 (*srate_table
)->mclk_src
[ratio
],
449 (*srate_table
)->mclk_src
[ratio
] / nau8325
->fs
);
454 static int nau8325_clock_config(struct nau8325
*nau8325
)
456 const struct nau8325_srate_attr
*srate_table
;
457 int ret
, n1_sel
, mult_sel
, n2_sel
;
459 ret
= nau8325_clksrc_choose(nau8325
, &srate_table
,
460 &n1_sel
, &mult_sel
, &n2_sel
);
464 ret
= nau8325_srate_clk_apply(nau8325
, srate_table
,
465 n1_sel
, mult_sel
, n2_sel
);
474 static const struct nau8325_osr_attr
*nau8325_get_osr(struct nau8325
*nau8325
)
478 regmap_read(nau8325
->regmap
, NAU8325_R29_DAC_CTRL1
, &osr
);
479 osr
&= NAU8325_DAC_OVERSAMPLE_MASK
;
480 if (osr
>= ARRAY_SIZE(osr_dac_sel
))
483 return &osr_dac_sel
[osr
];
486 static int nau8325_dai_startup(struct snd_pcm_substream
*substream
,
487 struct snd_soc_dai
*dai
)
489 struct snd_soc_component
*component
= dai
->component
;
490 struct nau8325
*nau8325
= snd_soc_component_get_drvdata(component
);
491 const struct nau8325_osr_attr
*osr
;
493 osr
= nau8325_get_osr(nau8325
);
494 if (!osr
|| !osr
->osr
)
497 return snd_pcm_hw_constraint_minmax(substream
->runtime
,
498 SNDRV_PCM_HW_PARAM_RATE
,
499 0, CLK_DA_AD_MAX
/ osr
->osr
);
502 static int nau8325_hw_params(struct snd_pcm_substream
*substream
,
503 struct snd_pcm_hw_params
*params
,
504 struct snd_soc_dai
*dai
)
506 struct snd_soc_component
*component
= dai
->component
;
507 struct nau8325
*nau8325
= snd_soc_component_get_drvdata(component
);
508 unsigned int val_len
= 0;
509 const struct nau8325_osr_attr
*osr
;
512 nau8325
->fs
= params_rate(params
);
513 osr
= nau8325_get_osr(nau8325
);
514 if (!osr
|| !osr
->osr
|| nau8325
->fs
* osr
->osr
> CLK_DA_AD_MAX
) {
518 regmap_update_bits(nau8325
->regmap
, NAU8325_R03_CLK_CTRL
,
519 NAU8325_CLK_DAC_SRC_MASK
,
520 osr
->clk_src
<< NAU8325_CLK_DAC_SRC_SFT
);
522 ret
= nau8325_clock_config(nau8325
);
526 switch (params_width(params
)) {
528 val_len
|= NAU8325_I2S_DL_16
;
531 val_len
|= NAU8325_I2S_DL_20
;
534 val_len
|= NAU8325_I2S_DL_24
;
537 val_len
|= NAU8325_I2S_DL_32
;
544 regmap_update_bits(nau8325
->regmap
, NAU8325_R0D_I2S_PCM_CTRL1
,
545 NAU8325_I2S_DL_MASK
, val_len
);
553 static int nau8325_set_fmt(struct snd_soc_dai
*dai
, unsigned int fmt
)
555 struct snd_soc_component
*component
= dai
->component
;
556 struct nau8325
*nau8325
= snd_soc_component_get_drvdata(component
);
557 unsigned int ctrl1_val
= 0;
559 switch (fmt
& SND_SOC_DAIFMT_MASTER_MASK
) {
560 case SND_SOC_DAIFMT_CBC_CFC
:
566 switch (fmt
& SND_SOC_DAIFMT_INV_MASK
) {
567 case SND_SOC_DAIFMT_NB_NF
:
569 case SND_SOC_DAIFMT_IB_NF
:
570 ctrl1_val
|= NAU8325_I2S_BP_INV
;
576 switch (fmt
& SND_SOC_DAIFMT_FORMAT_MASK
) {
577 case SND_SOC_DAIFMT_I2S
:
578 ctrl1_val
|= NAU8325_I2S_DF_I2S
;
580 case SND_SOC_DAIFMT_LEFT_J
:
581 ctrl1_val
|= NAU8325_I2S_DF_LEFT
;
583 case SND_SOC_DAIFMT_RIGHT_J
:
584 ctrl1_val
|= NAU8325_I2S_DF_RIGTH
;
586 case SND_SOC_DAIFMT_DSP_A
:
587 ctrl1_val
|= NAU8325_I2S_DF_PCM_AB
;
589 case SND_SOC_DAIFMT_DSP_B
:
590 ctrl1_val
|= NAU8325_I2S_DF_PCM_AB
;
591 ctrl1_val
|= NAU8325_I2S_PCMB_EN
;
597 regmap_update_bits(nau8325
->regmap
, NAU8325_R0D_I2S_PCM_CTRL1
,
598 NAU8325_I2S_DF_MASK
| NAU8325_I2S_BP_MASK
|
599 NAU8325_I2S_PCMB_EN
, ctrl1_val
);
604 static int nau8325_set_sysclk(struct snd_soc_component
*component
, int clk_id
,
605 int source
, unsigned int freq
, int dir
)
607 struct nau8325
*nau8325
= snd_soc_component_get_drvdata(component
);
609 if (freq
< MASTER_CLK_MIN
|| freq
> MASTER_CLK_MAX
) {
610 dev_dbg(nau8325
->dev
, "MCLK exceeds the range, MCLK:%d", freq
);
614 nau8325
->mclk
= freq
;
615 dev_dbg(nau8325
->dev
, "MCLK %dHz", nau8325
->mclk
);
620 static const struct snd_soc_component_driver nau8325_component_driver
= {
621 .set_sysclk
= nau8325_set_sysclk
,
622 .suspend_bias_off
= true,
623 .controls
= nau8325_snd_controls
,
624 .num_controls
= ARRAY_SIZE(nau8325_snd_controls
),
625 .dapm_widgets
= nau8325_dapm_widgets
,
626 .num_dapm_widgets
= ARRAY_SIZE(nau8325_dapm_widgets
),
627 .dapm_routes
= nau8325_dapm_routes
,
628 .num_dapm_routes
= ARRAY_SIZE(nau8325_dapm_routes
),
631 static const struct snd_soc_dai_ops nau8325_dai_ops
= {
632 .startup
= nau8325_dai_startup
,
633 .hw_params
= nau8325_hw_params
,
634 .set_fmt
= nau8325_set_fmt
,
637 #define NAU8325_RATES SNDRV_PCM_RATE_8000_96000
638 #define NAU8325_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE \
639 | SNDRV_PCM_FMTBIT_S24_3LE)
641 static struct snd_soc_dai_driver nau8325_dai
= {
642 .name
= NAU8325_CODEC_DAI
,
644 .stream_name
= "Playback",
647 .rates
= NAU8325_RATES
,
648 .formats
= NAU8325_FORMATS
,
650 .ops
= &nau8325_dai_ops
,
653 static const struct regmap_config nau8325_regmap_config
= {
654 .reg_bits
= NAU8325_REG_ADDR_LEN
,
655 .val_bits
= NAU8325_REG_DATA_LEN
,
657 .max_register
= NAU8325_REG_MAX
,
658 .readable_reg
= nau8325_readable_reg
,
659 .writeable_reg
= nau8325_writeable_reg
,
660 .volatile_reg
= nau8325_volatile_reg
,
662 .cache_type
= REGCACHE_RBTREE
,
663 .reg_defaults
= nau8325_reg_defaults
,
664 .num_reg_defaults
= ARRAY_SIZE(nau8325_reg_defaults
),
667 static void nau8325_reset_chip(struct regmap
*regmap
)
669 regmap_write(regmap
, NAU8325_R00_HARDWARE_RST
, 0x0001);
670 regmap_write(regmap
, NAU8325_R00_HARDWARE_RST
, 0x0000);
673 static void nau8325_init_regs(struct nau8325
*nau8325
)
675 struct regmap
*regmap
= nau8325
->regmap
;
676 struct device
*dev
= nau8325
->dev
;
678 /* set ALC parameters */
679 regmap_update_bits(regmap
, NAU8325_R2C_ALC_CTRL1
,
680 NAU8325_ALC_MAXGAIN_MASK
,
681 0x7 << NAU8325_ALC_MAXGAIN_SFT
);
682 regmap_update_bits(regmap
, NAU8325_R2D_ALC_CTRL2
,
683 NAU8325_ALC_DCY_MASK
| NAU8325_ALC_ATK_MASK
|
684 NAU8325_ALC_HLD_MASK
, (0x5 << NAU8325_ALC_DCY_SFT
) |
685 (0x3 << NAU8325_ALC_ATK_SFT
) |
686 (0x5 << NAU8325_ALC_HLD_SFT
));
687 /* Enable ALC to avoid signal distortion when battery low. */
688 if (nau8325
->alc_enable
)
689 regmap_update_bits(regmap
, NAU8325_R2E_ALC_CTRL3
,
690 NAU8325_ALC_EN
, NAU8325_ALC_EN
);
691 if (nau8325
->clock_detection
)
692 regmap_update_bits(regmap
, NAU8325_R40_CLK_DET_CTRL
,
693 NAU8325_CLKPWRUP_DIS
|
694 NAU8325_PWRUP_DFT
, 0);
696 regmap_update_bits(regmap
, NAU8325_R40_CLK_DET_CTRL
,
697 NAU8325_CLKPWRUP_DIS
| NAU8325_PWRUP_DFT
,
698 NAU8325_CLKPWRUP_DIS
);
699 if (nau8325
->clock_det_data
)
700 regmap_update_bits(regmap
, NAU8325_R40_CLK_DET_CTRL
,
701 NAU8325_APWRUP_EN
, NAU8325_APWRUP_EN
);
703 regmap_update_bits(regmap
, NAU8325_R40_CLK_DET_CTRL
,
704 NAU8325_APWRUP_EN
, 0);
706 /* DAC Reference Voltage Setting */
707 switch (nau8325
->dac_vref_microvolt
) {
709 regmap_update_bits(regmap
, NAU8325_R73_RDAC
,
710 NAU8325_DACVREFSEL_MASK
, 0 << NAU8325_DACVREFSEL_SFT
);
713 regmap_update_bits(regmap
, NAU8325_R73_RDAC
,
714 NAU8325_DACVREFSEL_MASK
, 1 << NAU8325_DACVREFSEL_SFT
);
717 regmap_update_bits(regmap
, NAU8325_R73_RDAC
,
718 NAU8325_DACVREFSEL_MASK
, 2 << NAU8325_DACVREFSEL_SFT
);
721 regmap_update_bits(regmap
, NAU8325_R73_RDAC
,
722 NAU8325_DACVREFSEL_MASK
, 3 << NAU8325_DACVREFSEL_SFT
);
725 dev_dbg(dev
, "Invalid dac-vref-microvolt %d", nau8325
->dac_vref_microvolt
);
729 /* DAC Reference Voltage Decoupling Capacitors. */
730 regmap_update_bits(regmap
, NAU8325_R63_ANALOG_CONTROL_3
,
731 NAU8325_CLASSD_COARSE_GAIN_MASK
, 0x4);
732 /* Auto-Att Min Gain 0dB, Class-D N Driver Slew Rate -25%. */
733 regmap_update_bits(regmap
, NAU8325_R64_ANALOG_CONTROL_4
,
734 NAU8325_CLASSD_SLEWN_MASK
, 0x7);
736 /* VMID Tieoff (VMID Resistor Selection) */
737 switch (nau8325
->vref_impedance_ohms
) {
739 regmap_update_bits(regmap
, NAU8325_R60_BIAS_ADJ
,
740 NAU8325_BIAS_VMID_SEL_MASK
, 0 << NAU8325_BIAS_VMID_SEL_SFT
);
743 regmap_update_bits(regmap
, NAU8325_R60_BIAS_ADJ
,
744 NAU8325_BIAS_VMID_SEL_MASK
, 1 << NAU8325_BIAS_VMID_SEL_SFT
);
747 regmap_update_bits(regmap
, NAU8325_R60_BIAS_ADJ
,
748 NAU8325_BIAS_VMID_SEL_MASK
, 2 << NAU8325_BIAS_VMID_SEL_SFT
);
751 regmap_update_bits(regmap
, NAU8325_R60_BIAS_ADJ
,
752 NAU8325_BIAS_VMID_SEL_MASK
, 3 << NAU8325_BIAS_VMID_SEL_SFT
);
755 dev_dbg(dev
, "Invalid vref-impedance-ohms %d", nau8325
->vref_impedance_ohms
);
759 /* enable VMID, BIAS, DAC, DCA CLOCK, Voltage/Current Amps
761 regmap_update_bits(regmap
, NAU8325_R61_ANALOG_CONTROL_1
,
762 NAU8325_DACEN_MASK
| NAU8325_DACCLKEN_MASK
|
763 NAU8325_DACEN_R_MASK
| NAU8325_DACCLKEN_R_MASK
|
764 NAU8325_CLASSDEN_MASK
| NAU8325_VMDFSTENB_MASK
|
765 NAU8325_BIASEN_MASK
| NAU8325_VMIDEN_MASK
,
766 (0x1 << NAU8325_DACEN_SFT
) |
767 (0x1 << NAU8325_DACCLKEN_SFT
) |
768 (0x1 << NAU8325_DACEN_R_SFT
) |
769 (0x1 << NAU8325_DACCLKEN_R_SFT
) |
770 (0x1 << NAU8325_CLASSDEN_SFT
) |
771 (0x1 << NAU8325_VMDFSTENB_SFT
) |
772 (0x1 << NAU8325_BIASEN_SFT
) | 0x3);
774 /* Enable ALC to avoid signal distortion when battery low. */
775 if (nau8325
->alc_enable
)
776 regmap_update_bits(regmap
, NAU8325_R2E_ALC_CTRL3
,
777 NAU8325_ALC_EN
, NAU8325_ALC_EN
);
778 if (nau8325
->clock_det_data
)
779 regmap_update_bits(regmap
, NAU8325_R40_CLK_DET_CTRL
,
780 NAU8325_APWRUP_EN
, NAU8325_APWRUP_EN
);
782 regmap_update_bits(regmap
, NAU8325_R40_CLK_DET_CTRL
,
783 NAU8325_APWRUP_EN
, 0);
784 if (nau8325
->clock_detection
)
785 regmap_update_bits(regmap
, NAU8325_R40_CLK_DET_CTRL
,
786 NAU8325_CLKPWRUP_DIS
|
787 NAU8325_PWRUP_DFT
, 0);
789 regmap_update_bits(regmap
, NAU8325_R40_CLK_DET_CTRL
,
790 NAU8325_CLKPWRUP_DIS
| NAU8325_PWRUP_DFT
,
791 NAU8325_CLKPWRUP_DIS
);
792 regmap_update_bits(regmap
, NAU8325_R29_DAC_CTRL1
,
793 NAU8325_DAC_OVERSAMPLE_MASK
,
794 NAU8325_DAC_OVERSAMPLE_128
);
797 static void nau8325_print_device_properties(struct nau8325
*nau8325
)
799 struct device
*dev
= nau8325
->dev
;
801 dev_dbg(dev
, "vref-impedance-ohms: %d", nau8325
->vref_impedance_ohms
);
802 dev_dbg(dev
, "dac-vref-microvolt: %d", nau8325
->dac_vref_microvolt
);
803 dev_dbg(dev
, "alc-enable: %d", nau8325
->alc_enable
);
804 dev_dbg(dev
, "clock-det-data: %d", nau8325
->clock_det_data
);
805 dev_dbg(dev
, "clock-detection-disable: %d", nau8325
->clock_detection
);
808 static int nau8325_read_device_properties(struct device
*dev
,
809 struct nau8325
*nau8325
)
813 nau8325
->alc_enable
=
814 device_property_read_bool(dev
, "nuvoton,alc-enable");
815 nau8325
->clock_det_data
=
816 device_property_read_bool(dev
, "nuvoton,clock-det-data");
817 nau8325
->clock_detection
=
818 !device_property_read_bool(dev
, "nuvoton,clock-detection-disable");
820 ret
= device_property_read_u32(dev
, "nuvoton,vref-impedance-ohms",
821 &nau8325
->vref_impedance_ohms
);
823 nau8325
->vref_impedance_ohms
= 125000;
824 ret
= device_property_read_u32(dev
, "nuvoton,dac-vref-microvolt",
825 &nau8325
->dac_vref_microvolt
);
827 nau8325
->dac_vref_microvolt
= 2880000;
832 static int nau8325_i2c_probe(struct i2c_client
*i2c
,
833 const struct i2c_device_id
*id
)
835 struct device
*dev
= &i2c
->dev
;
836 struct nau8325
*nau8325
= dev_get_platdata(dev
);
840 nau8325
= devm_kzalloc(dev
, sizeof(*nau8325
), GFP_KERNEL
);
845 ret
= nau8325_read_device_properties(dev
, nau8325
);
849 i2c_set_clientdata(i2c
, nau8325
);
851 nau8325
->regmap
= devm_regmap_init_i2c(i2c
, &nau8325_regmap_config
);
852 if (IS_ERR(nau8325
->regmap
)) {
853 ret
= PTR_ERR(nau8325
->regmap
);
857 nau8325_print_device_properties(nau8325
);
859 nau8325_reset_chip(nau8325
->regmap
);
860 ret
= regmap_read(nau8325
->regmap
, NAU8325_R02_DEVICE_ID
, &value
);
862 dev_dbg(dev
, "Failed to read device id (%d)", ret
);
865 nau8325_init_regs(nau8325
);
867 ret
= devm_snd_soc_register_component(dev
, &nau8325_component_driver
,
873 static const struct i2c_device_id nau8325_i2c_ids
[] = {
877 MODULE_DEVICE_TABLE(i2c
, nau8325_i2c_ids
);
880 static const struct of_device_id nau8325_of_ids
[] = {
881 { .compatible
= "nuvoton,nau8325", },
884 MODULE_DEVICE_TABLE(of
, nau8325_of_ids
);
887 static struct i2c_driver nau8325_i2c_driver
= {
890 .of_match_table
= of_match_ptr(nau8325_of_ids
),
892 .probe
= nau8325_i2c_probe
,
893 .id_table
= nau8325_i2c_ids
,
895 module_i2c_driver(nau8325_i2c_driver
);
897 MODULE_DESCRIPTION("ASoC NAU8325 driver");
898 MODULE_AUTHOR("Seven Lee <WTLI@nuvoton.com>");
899 MODULE_AUTHOR("David Lin <CTLIN0@nuvoton.com>");
900 MODULE_LICENSE("GPL");