1 // SPDX-License-Identifier: GPL-2.0-only
3 * rt274.c -- RT274 ALSA SoC audio codec driver
5 * Copyright 2017 Realtek Semiconductor Corp.
6 * Author: Bard Liao <bardliao@realtek.com>
9 #include <linux/module.h>
10 #include <linux/moduleparam.h>
11 #include <linux/init.h>
12 #include <linux/delay.h>
14 #include <linux/i2c.h>
15 #include <linux/platform_device.h>
16 #include <linux/spi/spi.h>
17 #include <linux/dmi.h>
18 #include <linux/acpi.h>
19 #include <sound/core.h>
20 #include <sound/pcm.h>
21 #include <sound/pcm_params.h>
22 #include <sound/soc.h>
23 #include <sound/soc-dapm.h>
24 #include <sound/initval.h>
25 #include <sound/tlv.h>
26 #include <sound/jack.h>
27 #include <linux/workqueue.h>
32 #define RT274_VENDOR_ID 0x10ec0274
35 struct reg_default
*index_cache
;
37 struct regmap
*regmap
;
38 struct snd_soc_component
*component
;
39 struct i2c_client
*i2c
;
40 struct snd_soc_jack
*jack
;
41 struct delayed_work jack_detect_work
;
48 static const struct reg_default rt274_index_def
[] = {
178 #define INDEX_CACHE_SIZE ARRAY_SIZE(rt274_index_def)
180 static const struct reg_default rt274_reg
[] = {
181 { 0x00170500, 0x00000400 },
182 { 0x00220000, 0x00000031 },
183 { 0x00239000, 0x00000057 },
184 { 0x0023a000, 0x00000057 },
185 { 0x00270500, 0x00000400 },
186 { 0x00370500, 0x00000400 },
187 { 0x00870500, 0x00000400 },
188 { 0x00920000, 0x00000031 },
189 { 0x00935000, 0x00000097 },
190 { 0x00936000, 0x00000097 },
191 { 0x00970500, 0x00000400 },
192 { 0x00b37000, 0x00000400 },
193 { 0x00b37200, 0x00000400 },
194 { 0x00b37300, 0x00000400 },
195 { 0x00c37000, 0x00000400 },
196 { 0x00c37100, 0x00000400 },
197 { 0x01270500, 0x00000400 },
198 { 0x01370500, 0x00000400 },
199 { 0x01371f00, 0x411111f0 },
200 { 0x01937000, 0x00000000 },
201 { 0x01970500, 0x00000400 },
202 { 0x02050000, 0x0000001b },
203 { 0x02139000, 0x00000080 },
204 { 0x0213a000, 0x00000080 },
205 { 0x02170100, 0x00000001 },
206 { 0x02170500, 0x00000400 },
207 { 0x02170700, 0x00000000 },
208 { 0x02270100, 0x00000000 },
209 { 0x02370100, 0x00000000 },
210 { 0x01970700, 0x00000020 },
211 { 0x00830000, 0x00000097 },
212 { 0x00930000, 0x00000097 },
213 { 0x01270700, 0x00000000 },
216 static bool rt274_volatile_register(struct device
*dev
, unsigned int reg
)
220 case RT274_GET_PARAM(AC_NODE_ROOT
, AC_PAR_VENDOR_ID
):
221 case RT274_GET_HP_SENSE
:
222 case RT274_GET_MIC_SENSE
:
223 case RT274_PROC_COEF
:
224 case VERB_CMD(AC_VERB_GET_EAPD_BTLENABLE
, RT274_MIC
, 0):
225 case VERB_CMD(AC_VERB_GET_EAPD_BTLENABLE
, RT274_HP_OUT
, 0):
226 case VERB_CMD(AC_VERB_GET_STREAM_FORMAT
, RT274_DAC_OUT0
, 0):
227 case VERB_CMD(AC_VERB_GET_STREAM_FORMAT
, RT274_DAC_OUT1
, 0):
228 case VERB_CMD(AC_VERB_GET_STREAM_FORMAT
, RT274_ADC_IN1
, 0):
229 case VERB_CMD(AC_VERB_GET_STREAM_FORMAT
, RT274_ADC_IN2
, 0):
230 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_DAC_OUT0
, 0):
231 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_DAC_OUT1
, 0):
232 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_ADC_IN1
, 0):
233 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_ADC_IN2
, 0):
234 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_DMIC1
, 0):
235 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_DMIC2
, 0):
236 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_MIC
, 0):
237 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_LINE1
, 0):
238 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_LINE2
, 0):
239 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_HP_OUT
, 0):
240 case VERB_CMD(AC_VERB_GET_CONNECT_SEL
, RT274_HP_OUT
, 0):
241 case VERB_CMD(AC_VERB_GET_CONNECT_SEL
, RT274_MIXER_IN1
, 0):
242 case VERB_CMD(AC_VERB_GET_CONNECT_SEL
, RT274_MIXER_IN2
, 0):
243 case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL
, RT274_DMIC1
, 0):
244 case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL
, RT274_DMIC2
, 0):
245 case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL
, RT274_MIC
, 0):
246 case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL
, RT274_LINE1
, 0):
247 case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL
, RT274_LINE2
, 0):
248 case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL
, RT274_HP_OUT
, 0):
249 case VERB_CMD(AC_VERB_GET_UNSOLICITED_RESPONSE
, RT274_HP_OUT
, 0):
250 case VERB_CMD(AC_VERB_GET_UNSOLICITED_RESPONSE
, RT274_MIC
, 0):
251 case VERB_CMD(AC_VERB_GET_UNSOLICITED_RESPONSE
, RT274_INLINE_CMD
, 0):
260 static bool rt274_readable_register(struct device
*dev
, unsigned int reg
)
264 case RT274_GET_PARAM(AC_NODE_ROOT
, AC_PAR_VENDOR_ID
):
265 case RT274_GET_HP_SENSE
:
266 case RT274_GET_MIC_SENSE
:
267 case RT274_SET_AUDIO_POWER
:
268 case RT274_SET_HPO_POWER
:
269 case RT274_SET_DMIC1_POWER
:
275 case RT274_SET_PIN_HPO
:
276 case RT274_SET_PIN_LOUT3
:
277 case RT274_SET_PIN_DMIC1
:
278 case RT274_SET_AMP_GAIN_HPO
:
279 case RT274_SET_DMIC2_DEFAULT
:
280 case RT274_DAC0L_GAIN
:
281 case RT274_DAC0R_GAIN
:
282 case RT274_DAC1L_GAIN
:
283 case RT274_DAC1R_GAIN
:
284 case RT274_ADCL_GAIN
:
285 case RT274_ADCR_GAIN
:
287 case RT274_HPOL_GAIN
:
288 case RT274_HPOR_GAIN
:
289 case RT274_LOUTL_GAIN
:
290 case RT274_LOUTR_GAIN
:
291 case RT274_DAC_FORMAT
:
292 case RT274_ADC_FORMAT
:
293 case RT274_COEF_INDEX
:
294 case RT274_PROC_COEF
:
295 case RT274_SET_AMP_GAIN_ADC_IN1
:
296 case RT274_SET_AMP_GAIN_ADC_IN2
:
297 case RT274_SET_POWER(RT274_DAC_OUT0
):
298 case RT274_SET_POWER(RT274_DAC_OUT1
):
299 case RT274_SET_POWER(RT274_ADC_IN1
):
300 case RT274_SET_POWER(RT274_ADC_IN2
):
301 case RT274_SET_POWER(RT274_DMIC2
):
302 case RT274_SET_POWER(RT274_MIC
):
303 case VERB_CMD(AC_VERB_GET_EAPD_BTLENABLE
, RT274_MIC
, 0):
304 case VERB_CMD(AC_VERB_GET_EAPD_BTLENABLE
, RT274_HP_OUT
, 0):
305 case VERB_CMD(AC_VERB_GET_STREAM_FORMAT
, RT274_DAC_OUT0
, 0):
306 case VERB_CMD(AC_VERB_GET_STREAM_FORMAT
, RT274_DAC_OUT1
, 0):
307 case VERB_CMD(AC_VERB_GET_STREAM_FORMAT
, RT274_ADC_IN1
, 0):
308 case VERB_CMD(AC_VERB_GET_STREAM_FORMAT
, RT274_ADC_IN2
, 0):
309 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_DAC_OUT0
, 0):
310 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_DAC_OUT1
, 0):
311 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_ADC_IN1
, 0):
312 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_ADC_IN2
, 0):
313 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_DMIC1
, 0):
314 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_DMIC2
, 0):
315 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_MIC
, 0):
316 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_LINE1
, 0):
317 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_LINE2
, 0):
318 case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE
, RT274_HP_OUT
, 0):
319 case VERB_CMD(AC_VERB_GET_CONNECT_SEL
, RT274_HP_OUT
, 0):
320 case VERB_CMD(AC_VERB_GET_CONNECT_SEL
, RT274_MIXER_IN1
, 0):
321 case VERB_CMD(AC_VERB_GET_CONNECT_SEL
, RT274_MIXER_IN2
, 0):
322 case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL
, RT274_DMIC1
, 0):
323 case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL
, RT274_DMIC2
, 0):
324 case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL
, RT274_MIC
, 0):
325 case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL
, RT274_LINE1
, 0):
326 case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL
, RT274_LINE2
, 0):
327 case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL
, RT274_HP_OUT
, 0):
328 case VERB_CMD(AC_VERB_GET_UNSOLICITED_RESPONSE
, RT274_HP_OUT
, 0):
329 case VERB_CMD(AC_VERB_GET_UNSOLICITED_RESPONSE
, RT274_MIC
, 0):
330 case VERB_CMD(AC_VERB_GET_UNSOLICITED_RESPONSE
, RT274_INLINE_CMD
, 0):
338 static void rt274_index_sync(struct snd_soc_component
*component
)
340 struct rt274_priv
*rt274
= snd_soc_component_get_drvdata(component
);
343 for (i
= 0; i
< INDEX_CACHE_SIZE
; i
++) {
344 snd_soc_component_write(component
, rt274
->index_cache
[i
].reg
,
345 rt274
->index_cache
[i
].def
);
350 static int rt274_jack_detect(struct rt274_priv
*rt274
, bool *hp
, bool *mic
)
358 if (!rt274
->component
)
361 ret
= regmap_read(rt274
->regmap
, RT274_GET_HP_SENSE
, &buf
);
365 *hp
= buf
& 0x80000000;
366 ret
= regmap_read(rt274
->regmap
, RT274_GET_MIC_SENSE
, &buf
);
370 *mic
= buf
& 0x80000000;
372 pr_debug("*hp = %d *mic = %d\n", *hp
, *mic
);
377 static void rt274_jack_detect_work(struct work_struct
*work
)
379 struct rt274_priv
*rt274
=
380 container_of(work
, struct rt274_priv
, jack_detect_work
.work
);
385 if (rt274_jack_detect(rt274
, &hp
, &mic
) < 0)
389 status
|= SND_JACK_HEADPHONE
;
392 status
|= SND_JACK_MICROPHONE
;
394 snd_soc_jack_report(rt274
->jack
, status
,
395 SND_JACK_MICROPHONE
| SND_JACK_HEADPHONE
);
398 static irqreturn_t
rt274_irq(int irq
, void *data
);
400 static int rt274_mic_detect(struct snd_soc_component
*component
,
401 struct snd_soc_jack
*jack
, void *data
)
403 struct rt274_priv
*rt274
= snd_soc_component_get_drvdata(component
);
408 /* Disable jack detection */
409 regmap_update_bits(rt274
->regmap
, RT274_EAPD_GPIO_IRQ_CTRL
,
410 RT274_IRQ_EN
, RT274_IRQ_DIS
);
415 regmap_update_bits(rt274
->regmap
, RT274_EAPD_GPIO_IRQ_CTRL
,
416 RT274_IRQ_EN
, RT274_IRQ_EN
);
418 /* Send an initial report */
424 static const DECLARE_TLV_DB_SCALE(out_vol_tlv
, -6350, 50, 0);
425 static const DECLARE_TLV_DB_SCALE(mic_vol_tlv
, 0, 1000, 0);
427 static const struct snd_kcontrol_new rt274_snd_controls
[] = {
428 SOC_DOUBLE_R_TLV("DAC0 Playback Volume", RT274_DAC0L_GAIN
,
429 RT274_DAC0R_GAIN
, 0, 0x7f, 0, out_vol_tlv
),
430 SOC_DOUBLE_R_TLV("DAC1 Playback Volume", RT274_DAC1L_GAIN
,
431 RT274_DAC1R_GAIN
, 0, 0x7f, 0, out_vol_tlv
),
432 SOC_DOUBLE_R_TLV("ADC0 Capture Volume", RT274_ADCL_GAIN
,
433 RT274_ADCR_GAIN
, 0, 0x7f, 0, out_vol_tlv
),
434 SOC_DOUBLE_R("ADC0 Capture Switch", RT274_ADCL_GAIN
,
435 RT274_ADCR_GAIN
, RT274_MUTE_SFT
, 1, 1),
436 SOC_SINGLE_TLV("AMIC Volume", RT274_MIC_GAIN
,
437 0, 0x3, 0, mic_vol_tlv
),
440 static const struct snd_kcontrol_new hpol_enable_control
=
441 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT274_HPOL_GAIN
,
442 RT274_MUTE_SFT
, 1, 1);
444 static const struct snd_kcontrol_new hpor_enable_control
=
445 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT274_HPOR_GAIN
,
446 RT274_MUTE_SFT
, 1, 1);
448 static const struct snd_kcontrol_new loutl_enable_control
=
449 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT274_LOUTL_GAIN
,
450 RT274_MUTE_SFT
, 1, 1);
452 static const struct snd_kcontrol_new loutr_enable_control
=
453 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT274_LOUTR_GAIN
,
454 RT274_MUTE_SFT
, 1, 1);
457 static const char * const rt274_adc_src
[] = {
458 "Mic", "Line1", "Line2", "Dmic"
461 static SOC_ENUM_SINGLE_DECL(
462 rt274_adc0_enum
, RT274_ADC0_MUX
, RT274_ADC_SEL_SFT
,
465 static const struct snd_kcontrol_new rt274_adc0_mux
=
466 SOC_DAPM_ENUM("ADC 0 source", rt274_adc0_enum
);
468 static SOC_ENUM_SINGLE_DECL(
469 rt274_adc1_enum
, RT274_ADC1_MUX
, RT274_ADC_SEL_SFT
,
472 static const struct snd_kcontrol_new rt274_adc1_mux
=
473 SOC_DAPM_ENUM("ADC 1 source", rt274_adc1_enum
);
475 static const char * const rt274_dac_src
[] = {
476 "DAC OUT0", "DAC OUT1"
479 static SOC_ENUM_SINGLE_DECL(rt274_hpo_enum
, RT274_HPO_MUX
,
482 static const struct snd_kcontrol_new rt274_hpo_mux
=
483 SOC_DAPM_ENUM("HPO source", rt274_hpo_enum
);
485 /* Line out source */
486 static SOC_ENUM_SINGLE_DECL(rt274_lout_enum
, RT274_LOUT_MUX
,
489 static const struct snd_kcontrol_new rt274_lout_mux
=
490 SOC_DAPM_ENUM("LOUT source", rt274_lout_enum
);
492 static const struct snd_soc_dapm_widget rt274_dapm_widgets
[] = {
494 SND_SOC_DAPM_INPUT("DMIC1 Pin"),
495 SND_SOC_DAPM_INPUT("DMIC2 Pin"),
496 SND_SOC_DAPM_INPUT("MIC"),
497 SND_SOC_DAPM_INPUT("LINE1"),
498 SND_SOC_DAPM_INPUT("LINE2"),
501 SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM
, 0, 0, NULL
, 0),
502 SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM
, 0, 0, NULL
, 0),
505 SND_SOC_DAPM_ADC("ADC 0", NULL
, RT274_SET_STREAMID_ADC1
, 4, 0),
506 SND_SOC_DAPM_ADC("ADC 1", NULL
, RT274_SET_STREAMID_ADC2
, 4, 0),
509 SND_SOC_DAPM_MUX("ADC 0 Mux", SND_SOC_NOPM
, 0, 0,
511 SND_SOC_DAPM_MUX("ADC 1 Mux", SND_SOC_NOPM
, 0, 0,
514 /* Audio Interface */
515 SND_SOC_DAPM_AIF_IN("AIF1RXL", "AIF1 Playback", 0, SND_SOC_NOPM
, 0, 0),
516 SND_SOC_DAPM_AIF_IN("AIF1RXR", "AIF1 Playback", 1, SND_SOC_NOPM
, 0, 0),
517 SND_SOC_DAPM_AIF_OUT("AIF1TXL", "AIF1 Capture", 0, SND_SOC_NOPM
, 0, 0),
518 SND_SOC_DAPM_AIF_OUT("AIF1TXR", "AIF1 Capture", 1, SND_SOC_NOPM
, 0, 0),
519 SND_SOC_DAPM_AIF_IN("AIF2RXL", "AIF1 Playback", 2, SND_SOC_NOPM
, 0, 0),
520 SND_SOC_DAPM_AIF_IN("AIF2RXR", "AIF1 Playback", 3, SND_SOC_NOPM
, 0, 0),
521 SND_SOC_DAPM_AIF_OUT("AIF2TXL", "AIF1 Capture", 2, SND_SOC_NOPM
, 0, 0),
522 SND_SOC_DAPM_AIF_OUT("AIF2TXR", "AIF1 Capture", 3, SND_SOC_NOPM
, 0, 0),
526 SND_SOC_DAPM_DAC("DAC 0", NULL
, RT274_SET_STREAMID_DAC0
, 4, 0),
527 SND_SOC_DAPM_DAC("DAC 1", NULL
, RT274_SET_STREAMID_DAC1
, 4, 0),
530 SND_SOC_DAPM_MUX("HPO Mux", SND_SOC_NOPM
, 0, 0, &rt274_hpo_mux
),
531 SND_SOC_DAPM_MUX("LOUT Mux", SND_SOC_NOPM
, 0, 0, &rt274_lout_mux
),
533 SND_SOC_DAPM_SUPPLY("HP Power", RT274_SET_PIN_HPO
,
534 RT274_SET_PIN_SFT
, 0, NULL
, 0),
535 SND_SOC_DAPM_SUPPLY("LOUT Power", RT274_SET_PIN_LOUT3
,
536 RT274_SET_PIN_SFT
, 0, NULL
, 0),
539 SND_SOC_DAPM_PGA("DAC OUT0", SND_SOC_NOPM
, 0, 0,
541 SND_SOC_DAPM_PGA("DAC OUT1", SND_SOC_NOPM
, 0, 0,
545 SND_SOC_DAPM_SWITCH("LOUT L", SND_SOC_NOPM
, 0, 0,
546 &loutl_enable_control
),
547 SND_SOC_DAPM_SWITCH("LOUT R", SND_SOC_NOPM
, 0, 0,
548 &loutr_enable_control
),
549 SND_SOC_DAPM_SWITCH("HPO L", SND_SOC_NOPM
, 0, 0,
550 &hpol_enable_control
),
551 SND_SOC_DAPM_SWITCH("HPO R", SND_SOC_NOPM
, 0, 0,
552 &hpor_enable_control
),
555 SND_SOC_DAPM_OUTPUT("HPO Pin"),
556 SND_SOC_DAPM_OUTPUT("SPDIF"),
557 SND_SOC_DAPM_OUTPUT("LINE3"),
560 static const struct snd_soc_dapm_route rt274_dapm_routes
[] = {
561 {"DMIC1", NULL
, "DMIC1 Pin"},
562 {"DMIC2", NULL
, "DMIC2 Pin"},
564 {"ADC 0 Mux", "Mic", "MIC"},
565 {"ADC 0 Mux", "Dmic", "DMIC1"},
566 {"ADC 0 Mux", "Line1", "LINE1"},
567 {"ADC 0 Mux", "Line2", "LINE2"},
568 {"ADC 1 Mux", "Mic", "MIC"},
569 {"ADC 1 Mux", "Dmic", "DMIC2"},
570 {"ADC 1 Mux", "Line1", "LINE1"},
571 {"ADC 1 Mux", "Line2", "LINE2"},
573 {"ADC 0", NULL
, "ADC 0 Mux"},
574 {"ADC 1", NULL
, "ADC 1 Mux"},
576 {"AIF1TXL", NULL
, "ADC 0"},
577 {"AIF1TXR", NULL
, "ADC 0"},
578 {"AIF2TXL", NULL
, "ADC 1"},
579 {"AIF2TXR", NULL
, "ADC 1"},
581 {"DAC 0", NULL
, "AIF1RXL"},
582 {"DAC 0", NULL
, "AIF1RXR"},
583 {"DAC 1", NULL
, "AIF2RXL"},
584 {"DAC 1", NULL
, "AIF2RXR"},
586 {"DAC OUT0", NULL
, "DAC 0"},
588 {"DAC OUT1", NULL
, "DAC 1"},
590 {"LOUT Mux", "DAC OUT0", "DAC OUT0"},
591 {"LOUT Mux", "DAC OUT1", "DAC OUT1"},
593 {"LOUT L", "Switch", "LOUT Mux"},
594 {"LOUT R", "Switch", "LOUT Mux"},
595 {"LOUT L", NULL
, "LOUT Power"},
596 {"LOUT R", NULL
, "LOUT Power"},
598 {"LINE3", NULL
, "LOUT L"},
599 {"LINE3", NULL
, "LOUT R"},
601 {"HPO Mux", "DAC OUT0", "DAC OUT0"},
602 {"HPO Mux", "DAC OUT1", "DAC OUT1"},
604 {"HPO L", "Switch", "HPO Mux"},
605 {"HPO R", "Switch", "HPO Mux"},
606 {"HPO L", NULL
, "HP Power"},
607 {"HPO R", NULL
, "HP Power"},
609 {"HPO Pin", NULL
, "HPO L"},
610 {"HPO Pin", NULL
, "HPO R"},
613 static int rt274_hw_params(struct snd_pcm_substream
*substream
,
614 struct snd_pcm_hw_params
*params
,
615 struct snd_soc_dai
*dai
)
617 struct snd_soc_component
*component
= dai
->component
;
618 struct rt274_priv
*rt274
= snd_soc_component_get_drvdata(component
);
619 unsigned int val
= 0;
620 int d_len_code
= 0, c_len_code
= 0;
622 switch (params_rate(params
)) {
623 /* bit 14 0:48K 1:44.1K */
628 dev_err(component
->dev
, "Unsupported sample rate %d\n",
629 params_rate(params
));
632 switch (rt274
->sys_clk
) {
635 if (params_rate(params
) != 48000) {
636 dev_err(component
->dev
, "Sys_clk is not matched (%d %d)\n",
637 params_rate(params
), rt274
->sys_clk
);
643 if (params_rate(params
) != 44100) {
644 dev_err(component
->dev
, "Sys_clk is not matched (%d %d)\n",
645 params_rate(params
), rt274
->sys_clk
);
651 if (params_channels(params
) <= 16) {
652 /* bit 3:0 Number of Channel */
653 val
|= (params_channels(params
) - 1);
655 dev_err(component
->dev
, "Unsupported channels %d\n",
656 params_channels(params
));
660 switch (params_width(params
)) {
661 /* bit 6:4 Bits per Sample */
693 snd_soc_component_update_bits(component
,
694 RT274_I2S_CTRL1
, 0xc018, d_len_code
<< 3 | c_len_code
<< 14);
695 dev_dbg(component
->dev
, "format val = 0x%x\n", val
);
697 snd_soc_component_update_bits(component
, RT274_DAC_FORMAT
, 0x407f, val
);
698 snd_soc_component_update_bits(component
, RT274_ADC_FORMAT
, 0x407f, val
);
703 static int rt274_set_dai_fmt(struct snd_soc_dai
*dai
, unsigned int fmt
)
705 struct snd_soc_component
*component
= dai
->component
;
706 struct rt274_priv
*rt274
= snd_soc_component_get_drvdata(component
);
708 switch (fmt
& SND_SOC_DAIFMT_MASTER_MASK
) {
709 case SND_SOC_DAIFMT_CBM_CFM
:
710 snd_soc_component_update_bits(component
,
711 RT274_I2S_CTRL1
, RT274_I2S_MODE_MASK
, RT274_I2S_MODE_M
);
712 rt274
->master
= true;
714 case SND_SOC_DAIFMT_CBS_CFS
:
715 snd_soc_component_update_bits(component
,
716 RT274_I2S_CTRL1
, RT274_I2S_MODE_MASK
, RT274_I2S_MODE_S
);
717 rt274
->master
= false;
723 switch (fmt
& SND_SOC_DAIFMT_FORMAT_MASK
) {
724 case SND_SOC_DAIFMT_I2S
:
725 snd_soc_component_update_bits(component
, RT274_I2S_CTRL1
,
726 RT274_I2S_FMT_MASK
, RT274_I2S_FMT_I2S
);
728 case SND_SOC_DAIFMT_LEFT_J
:
729 snd_soc_component_update_bits(component
, RT274_I2S_CTRL1
,
730 RT274_I2S_FMT_MASK
, RT274_I2S_FMT_LJ
);
732 case SND_SOC_DAIFMT_DSP_A
:
733 snd_soc_component_update_bits(component
, RT274_I2S_CTRL1
,
734 RT274_I2S_FMT_MASK
, RT274_I2S_FMT_PCMA
);
736 case SND_SOC_DAIFMT_DSP_B
:
737 snd_soc_component_update_bits(component
, RT274_I2S_CTRL1
,
738 RT274_I2S_FMT_MASK
, RT274_I2S_FMT_PCMB
);
743 /* bit 15 Stream Type 0:PCM 1:Non-PCM */
744 snd_soc_component_update_bits(component
, RT274_DAC_FORMAT
, 0x8000, 0);
745 snd_soc_component_update_bits(component
, RT274_ADC_FORMAT
, 0x8000, 0);
750 static int rt274_set_dai_pll(struct snd_soc_dai
*dai
, int pll_id
, int source
,
751 unsigned int freq_in
, unsigned int freq_out
)
753 struct snd_soc_component
*component
= dai
->component
;
754 struct rt274_priv
*rt274
= snd_soc_component_get_drvdata(component
);
757 case RT274_PLL2_S_MCLK
:
758 snd_soc_component_update_bits(component
, RT274_PLL2_CTRL
,
759 RT274_PLL2_SRC_MASK
, RT274_PLL2_SRC_MCLK
);
762 dev_warn(component
->dev
, "invalid pll source, use BCLK\n");
764 case RT274_PLL2_S_BCLK
:
765 snd_soc_component_update_bits(component
, RT274_PLL2_CTRL
,
766 RT274_PLL2_SRC_MASK
, RT274_PLL2_SRC_BCLK
);
770 if (source
== RT274_PLL2_S_BCLK
) {
771 snd_soc_component_update_bits(component
, RT274_MCLK_CTRL
,
772 (0x3 << 12), (0x3 << 12));
775 snd_soc_component_write(component
, 0x7a, 0xaab6);
776 snd_soc_component_write(component
, 0x7b, 0x0301);
777 snd_soc_component_write(component
, 0x7c, 0x04fe);
780 snd_soc_component_write(component
, 0x7a, 0xaa96);
781 snd_soc_component_write(component
, 0x7b, 0x8003);
782 snd_soc_component_write(component
, 0x7c, 0x081e);
785 snd_soc_component_write(component
, 0x7a, 0xaa96);
786 snd_soc_component_write(component
, 0x7b, 0x8003);
787 snd_soc_component_write(component
, 0x7c, 0x080e);
790 dev_warn(component
->dev
, "invalid freq_in, assume 4.8M\n");
793 snd_soc_component_write(component
, 0x7a, 0xaab6);
794 snd_soc_component_write(component
, 0x7b, 0x0301);
795 snd_soc_component_write(component
, 0x7c, 0x047e);
803 static int rt274_set_dai_sysclk(struct snd_soc_dai
*dai
,
804 int clk_id
, unsigned int freq
, int dir
)
806 struct snd_soc_component
*component
= dai
->component
;
807 struct rt274_priv
*rt274
= snd_soc_component_get_drvdata(component
);
808 unsigned int clk_src
, mclk_en
;
810 dev_dbg(component
->dev
, "%s freq=%d\n", __func__
, freq
);
813 case RT274_SCLK_S_MCLK
:
814 mclk_en
= RT274_MCLK_MODE_EN
;
815 clk_src
= RT274_CLK_SRC_MCLK
;
817 case RT274_SCLK_S_PLL1
:
818 mclk_en
= RT274_MCLK_MODE_DIS
;
819 clk_src
= RT274_CLK_SRC_MCLK
;
821 case RT274_SCLK_S_PLL2
:
822 mclk_en
= RT274_MCLK_MODE_EN
;
823 clk_src
= RT274_CLK_SRC_PLL2
;
826 mclk_en
= RT274_MCLK_MODE_DIS
;
827 clk_src
= RT274_CLK_SRC_MCLK
;
828 dev_warn(component
->dev
, "invalid sysclk source, use PLL1\n");
831 snd_soc_component_update_bits(component
, RT274_MCLK_CTRL
,
832 RT274_MCLK_MODE_MASK
, mclk_en
);
833 snd_soc_component_update_bits(component
, RT274_CLK_CTRL
,
834 RT274_CLK_SRC_MASK
, clk_src
);
838 if (clk_id
== RT274_SCLK_S_MCLK
) {
839 dev_err(component
->dev
, "Should not use MCLK\n");
842 snd_soc_component_update_bits(component
,
843 RT274_I2S_CTRL2
, 0x40, 0x40);
846 if (clk_id
== RT274_SCLK_S_MCLK
) {
847 dev_err(component
->dev
, "Should not use MCLK\n");
850 snd_soc_component_update_bits(component
,
851 RT274_I2S_CTRL2
, 0x40, 0x0);
855 snd_soc_component_update_bits(component
,
856 RT274_MCLK_CTRL
, 0x1fcf, 0x0008);
860 snd_soc_component_update_bits(component
,
861 RT274_MCLK_CTRL
, 0x1fcf, 0x1543);
864 dev_err(component
->dev
, "Unsupported system clock\n");
868 rt274
->sys_clk
= freq
;
869 rt274
->clk_id
= clk_id
;
874 static int rt274_set_bclk_ratio(struct snd_soc_dai
*dai
, unsigned int ratio
)
876 struct snd_soc_component
*component
= dai
->component
;
877 struct rt274_priv
*rt274
= snd_soc_component_get_drvdata(component
);
879 dev_dbg(component
->dev
, "%s ratio=%d\n", __func__
, ratio
);
881 if ((ratio
/ 50) == 0)
882 snd_soc_component_update_bits(component
,
883 RT274_I2S_CTRL1
, 0x1000, 0x1000);
885 snd_soc_component_update_bits(component
,
886 RT274_I2S_CTRL1
, 0x1000, 0x0);
892 static int rt274_set_tdm_slot(struct snd_soc_dai
*dai
, unsigned int tx_mask
,
893 unsigned int rx_mask
, int slots
, int slot_width
)
896 struct snd_soc_component
*component
= dai
->component
;
898 if (rx_mask
|| tx_mask
) {
899 snd_soc_component_update_bits(component
,
900 RT274_I2S_CTRL1
, RT274_TDM_EN
, RT274_TDM_EN
);
902 snd_soc_component_update_bits(component
,
903 RT274_I2S_CTRL1
, RT274_TDM_EN
, RT274_TDM_DIS
);
909 snd_soc_component_update_bits(component
,
910 RT274_I2S_CTRL1
, RT274_TDM_CH_NUM
, RT274_TDM_4CH
);
913 snd_soc_component_update_bits(component
,
914 RT274_I2S_CTRL1
, RT274_TDM_CH_NUM
, RT274_TDM_2CH
);
917 dev_err(component
->dev
,
918 "Support 2 or 4 slots TDM only\n");
925 static int rt274_set_bias_level(struct snd_soc_component
*component
,
926 enum snd_soc_bias_level level
)
929 case SND_SOC_BIAS_PREPARE
:
930 if (SND_SOC_BIAS_STANDBY
==
931 snd_soc_component_get_bias_level(component
)) {
932 snd_soc_component_write(component
,
933 RT274_SET_AUDIO_POWER
, AC_PWRST_D0
);
937 case SND_SOC_BIAS_STANDBY
:
938 snd_soc_component_write(component
,
939 RT274_SET_AUDIO_POWER
, AC_PWRST_D3
);
949 static irqreturn_t
rt274_irq(int irq
, void *data
)
951 struct rt274_priv
*rt274
= data
;
957 regmap_update_bits(rt274
->regmap
, RT274_EAPD_GPIO_IRQ_CTRL
,
958 RT274_IRQ_CLR
, RT274_IRQ_CLR
);
960 ret
= rt274_jack_detect(rt274
, &hp
, &mic
);
964 status
|= SND_JACK_HEADPHONE
;
967 status
|= SND_JACK_MICROPHONE
;
969 snd_soc_jack_report(rt274
->jack
, status
,
970 SND_JACK_MICROPHONE
| SND_JACK_HEADPHONE
);
972 pm_wakeup_event(&rt274
->i2c
->dev
, 300);
978 static int rt274_probe(struct snd_soc_component
*component
)
980 struct rt274_priv
*rt274
= snd_soc_component_get_drvdata(component
);
982 rt274
->component
= component
;
984 if (rt274
->i2c
->irq
) {
985 INIT_DELAYED_WORK(&rt274
->jack_detect_work
,
986 rt274_jack_detect_work
);
987 schedule_delayed_work(&rt274
->jack_detect_work
,
988 msecs_to_jiffies(1250));
994 static void rt274_remove(struct snd_soc_component
*component
)
996 struct rt274_priv
*rt274
= snd_soc_component_get_drvdata(component
);
998 cancel_delayed_work_sync(&rt274
->jack_detect_work
);
1002 static int rt274_suspend(struct snd_soc_component
*component
)
1004 struct rt274_priv
*rt274
= snd_soc_component_get_drvdata(component
);
1006 regcache_cache_only(rt274
->regmap
, true);
1007 regcache_mark_dirty(rt274
->regmap
);
1012 static int rt274_resume(struct snd_soc_component
*component
)
1014 struct rt274_priv
*rt274
= snd_soc_component_get_drvdata(component
);
1016 regcache_cache_only(rt274
->regmap
, false);
1017 rt274_index_sync(component
);
1018 regcache_sync(rt274
->regmap
);
1023 #define rt274_suspend NULL
1024 #define rt274_resume NULL
1027 #define RT274_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
1028 #define RT274_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
1029 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
1031 static const struct snd_soc_dai_ops rt274_aif_dai_ops
= {
1032 .hw_params
= rt274_hw_params
,
1033 .set_fmt
= rt274_set_dai_fmt
,
1034 .set_sysclk
= rt274_set_dai_sysclk
,
1035 .set_pll
= rt274_set_dai_pll
,
1036 .set_bclk_ratio
= rt274_set_bclk_ratio
,
1037 .set_tdm_slot
= rt274_set_tdm_slot
,
1040 static struct snd_soc_dai_driver rt274_dai
[] = {
1042 .name
= "rt274-aif1",
1045 .stream_name
= "AIF1 Playback",
1048 .rates
= RT274_STEREO_RATES
,
1049 .formats
= RT274_FORMATS
,
1052 .stream_name
= "AIF1 Capture",
1055 .rates
= RT274_STEREO_RATES
,
1056 .formats
= RT274_FORMATS
,
1058 .ops
= &rt274_aif_dai_ops
,
1059 .symmetric_rates
= 1,
1063 static const struct snd_soc_component_driver soc_component_dev_rt274
= {
1064 .probe
= rt274_probe
,
1065 .remove
= rt274_remove
,
1066 .suspend
= rt274_suspend
,
1067 .resume
= rt274_resume
,
1068 .set_bias_level
= rt274_set_bias_level
,
1069 .set_jack
= rt274_mic_detect
,
1070 .controls
= rt274_snd_controls
,
1071 .num_controls
= ARRAY_SIZE(rt274_snd_controls
),
1072 .dapm_widgets
= rt274_dapm_widgets
,
1073 .num_dapm_widgets
= ARRAY_SIZE(rt274_dapm_widgets
),
1074 .dapm_routes
= rt274_dapm_routes
,
1075 .num_dapm_routes
= ARRAY_SIZE(rt274_dapm_routes
),
1076 .use_pmdown_time
= 1,
1078 .non_legacy_dai_naming
= 1,
1081 static const struct regmap_config rt274_regmap
= {
1084 .max_register
= 0x05bfffff,
1085 .volatile_reg
= rt274_volatile_register
,
1086 .readable_reg
= rt274_readable_register
,
1087 .reg_write
= rl6347a_hw_write
,
1088 .reg_read
= rl6347a_hw_read
,
1089 .cache_type
= REGCACHE_RBTREE
,
1090 .reg_defaults
= rt274_reg
,
1091 .num_reg_defaults
= ARRAY_SIZE(rt274_reg
),
1095 static const struct of_device_id rt274_of_match
[] = {
1096 {.compatible
= "realtek,rt274"},
1099 MODULE_DEVICE_TABLE(of
, rt274_of_match
);
1102 static const struct i2c_device_id rt274_i2c_id
[] = {
1106 MODULE_DEVICE_TABLE(i2c
, rt274_i2c_id
);
1108 static const struct acpi_device_id rt274_acpi_match
[] = {
1113 MODULE_DEVICE_TABLE(acpi
, rt274_acpi_match
);
1115 static int rt274_i2c_probe(struct i2c_client
*i2c
,
1116 const struct i2c_device_id
*id
)
1118 struct rt274_priv
*rt274
;
1123 rt274
= devm_kzalloc(&i2c
->dev
, sizeof(*rt274
),
1128 rt274
->regmap
= devm_regmap_init(&i2c
->dev
, NULL
, i2c
, &rt274_regmap
);
1129 if (IS_ERR(rt274
->regmap
)) {
1130 ret
= PTR_ERR(rt274
->regmap
);
1131 dev_err(&i2c
->dev
, "Failed to allocate register map: %d\n",
1136 ret
= regmap_read(rt274
->regmap
,
1137 RT274_GET_PARAM(AC_NODE_ROOT
, AC_PAR_VENDOR_ID
), &val
);
1141 if (val
!= RT274_VENDOR_ID
) {
1143 "Device with ID register %#x is not rt274\n", val
);
1147 rt274
->index_cache
= devm_kmemdup(&i2c
->dev
, rt274_index_def
,
1148 sizeof(rt274_index_def
), GFP_KERNEL
);
1149 if (!rt274
->index_cache
)
1152 rt274
->index_cache_size
= INDEX_CACHE_SIZE
;
1154 i2c_set_clientdata(i2c
, rt274
);
1157 regmap_write(rt274
->regmap
, RT274_RESET
, 0);
1158 regmap_update_bits(rt274
->regmap
, 0x1a, 0x4000, 0x4000);
1160 /* Set Pad PDB is floating */
1161 regmap_update_bits(rt274
->regmap
, RT274_PAD_CTRL12
, 0x3, 0x0);
1162 regmap_write(rt274
->regmap
, RT274_COEF5b_INDEX
, 0x01);
1163 regmap_write(rt274
->regmap
, RT274_COEF5b_COEF
, 0x8540);
1164 regmap_update_bits(rt274
->regmap
, 0x6f, 0x0100, 0x0100);
1165 /* Combo jack auto detect */
1166 regmap_write(rt274
->regmap
, 0x4a, 0x201b);
1168 regmap_update_bits(rt274
->regmap
, 0x6f, 0x3000, 0x2000);
1169 /* HP DC Calibration */
1170 regmap_update_bits(rt274
->regmap
, 0x6f, 0xf, 0x0);
1171 /* Set NID=58h.Index 00h [15]= 1b; */
1172 regmap_write(rt274
->regmap
, RT274_COEF58_INDEX
, 0x00);
1173 regmap_write(rt274
->regmap
, RT274_COEF58_COEF
, 0xb888);
1175 regmap_update_bits(rt274
->regmap
, 0x6f, 0xf, 0xb);
1176 regmap_write(rt274
->regmap
, RT274_COEF58_INDEX
, 0x00);
1177 regmap_write(rt274
->regmap
, RT274_COEF58_COEF
, 0x3888);
1178 /* Set pin widget */
1179 regmap_write(rt274
->regmap
, RT274_SET_PIN_HPO
, 0x40);
1180 regmap_write(rt274
->regmap
, RT274_SET_PIN_LOUT3
, 0x40);
1181 regmap_write(rt274
->regmap
, RT274_SET_MIC
, 0x20);
1182 regmap_write(rt274
->regmap
, RT274_SET_PIN_DMIC1
, 0x20);
1184 regmap_update_bits(rt274
->regmap
, RT274_I2S_CTRL2
, 0xc004, 0x4004);
1185 regmap_update_bits(rt274
->regmap
, RT274_EAPD_GPIO_IRQ_CTRL
,
1186 RT274_GPI2_SEL_MASK
, RT274_GPI2_SEL_DMIC_CLK
);
1188 /* jack detection */
1189 regmap_write(rt274
->regmap
, RT274_UNSOLICITED_HP_OUT
, 0x81);
1190 regmap_write(rt274
->regmap
, RT274_UNSOLICITED_MIC
, 0x82);
1192 if (rt274
->i2c
->irq
) {
1193 ret
= request_threaded_irq(rt274
->i2c
->irq
, NULL
, rt274_irq
,
1194 IRQF_TRIGGER_HIGH
| IRQF_ONESHOT
, "rt274", rt274
);
1197 "Failed to reguest IRQ: %d\n", ret
);
1202 ret
= devm_snd_soc_register_component(&i2c
->dev
,
1203 &soc_component_dev_rt274
,
1204 rt274_dai
, ARRAY_SIZE(rt274_dai
));
1209 static int rt274_i2c_remove(struct i2c_client
*i2c
)
1211 struct rt274_priv
*rt274
= i2c_get_clientdata(i2c
);
1214 free_irq(i2c
->irq
, rt274
);
1220 static struct i2c_driver rt274_i2c_driver
= {
1223 .acpi_match_table
= ACPI_PTR(rt274_acpi_match
),
1225 .of_match_table
= of_match_ptr(rt274_of_match
),
1228 .probe
= rt274_i2c_probe
,
1229 .remove
= rt274_i2c_remove
,
1230 .id_table
= rt274_i2c_id
,
1233 module_i2c_driver(rt274_i2c_driver
);
1235 MODULE_DESCRIPTION("ASoC RT274 driver");
1236 MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
1237 MODULE_LICENSE("GPL v2");