diff options
-rw-r--r-- | sound/soc/codecs/tlv320dac33.c | 55 |
1 files changed, 50 insertions, 5 deletions
diff --git a/sound/soc/codecs/tlv320dac33.c b/sound/soc/codecs/tlv320dac33.c index 13d521cfe393..71d7be8ac488 100644 --- a/sound/soc/codecs/tlv320dac33.c +++ b/sound/soc/codecs/tlv320dac33.c | |||
@@ -298,7 +298,6 @@ static void dac33_init_chip(struct snd_soc_codec *codec) | |||
298 | if (unlikely(!dac33->chip_power)) | 298 | if (unlikely(!dac33->chip_power)) |
299 | return; | 299 | return; |
300 | 300 | ||
301 | /* 44-46: DAC Control Registers */ | ||
302 | /* A : DAC sample rate Fsref/1.5 */ | 301 | /* A : DAC sample rate Fsref/1.5 */ |
303 | dac33_write(codec, DAC33_DAC_CTRL_A, DAC33_DACRATE(0)); | 302 | dac33_write(codec, DAC33_DAC_CTRL_A, DAC33_DACRATE(0)); |
304 | /* B : DAC src=normal, not muted */ | 303 | /* B : DAC src=normal, not muted */ |
@@ -321,6 +320,10 @@ static void dac33_init_chip(struct snd_soc_codec *codec) | |||
321 | dac33_read_reg_cache(codec, DAC33_LINEL_TO_LLO_VOL)); | 320 | dac33_read_reg_cache(codec, DAC33_LINEL_TO_LLO_VOL)); |
322 | dac33_write(codec, DAC33_LINER_TO_RLO_VOL, | 321 | dac33_write(codec, DAC33_LINER_TO_RLO_VOL, |
323 | dac33_read_reg_cache(codec, DAC33_LINER_TO_RLO_VOL)); | 322 | dac33_read_reg_cache(codec, DAC33_LINER_TO_RLO_VOL)); |
323 | |||
324 | dac33_write(codec, DAC33_OUT_AMP_CTRL, | ||
325 | dac33_read_reg_cache(codec, DAC33_OUT_AMP_CTRL)); | ||
326 | |||
324 | } | 327 | } |
325 | 328 | ||
326 | static inline int dac33_read_id(struct snd_soc_codec *codec) | 329 | static inline int dac33_read_id(struct snd_soc_codec *codec) |
@@ -523,6 +526,25 @@ static const struct snd_kcontrol_new dac33_dapm_abypassl_control = | |||
523 | static const struct snd_kcontrol_new dac33_dapm_abypassr_control = | 526 | static const struct snd_kcontrol_new dac33_dapm_abypassr_control = |
524 | SOC_DAPM_SINGLE("Switch", DAC33_LINER_TO_RLO_VOL, 7, 1, 1); | 527 | SOC_DAPM_SINGLE("Switch", DAC33_LINER_TO_RLO_VOL, 7, 1, 1); |
525 | 528 | ||
529 | /* LOP L/R invert selection */ | ||
530 | static const char *dac33_lr_lom_texts[] = {"DAC", "LOP"}; | ||
531 | |||
532 | static const struct soc_enum dac33_left_lom_enum = | ||
533 | SOC_ENUM_SINGLE(DAC33_OUT_AMP_CTRL, 3, | ||
534 | ARRAY_SIZE(dac33_lr_lom_texts), | ||
535 | dac33_lr_lom_texts); | ||
536 | |||
537 | static const struct snd_kcontrol_new dac33_dapm_left_lom_control = | ||
538 | SOC_DAPM_ENUM("Route", dac33_left_lom_enum); | ||
539 | |||
540 | static const struct soc_enum dac33_right_lom_enum = | ||
541 | SOC_ENUM_SINGLE(DAC33_OUT_AMP_CTRL, 2, | ||
542 | ARRAY_SIZE(dac33_lr_lom_texts), | ||
543 | dac33_lr_lom_texts); | ||
544 | |||
545 | static const struct snd_kcontrol_new dac33_dapm_right_lom_control = | ||
546 | SOC_DAPM_ENUM("Route", dac33_right_lom_enum); | ||
547 | |||
526 | static const struct snd_soc_dapm_widget dac33_dapm_widgets[] = { | 548 | static const struct snd_soc_dapm_widget dac33_dapm_widgets[] = { |
527 | SND_SOC_DAPM_OUTPUT("LEFT_LO"), | 549 | SND_SOC_DAPM_OUTPUT("LEFT_LO"), |
528 | SND_SOC_DAPM_OUTPUT("RIGHT_LO"), | 550 | SND_SOC_DAPM_OUTPUT("RIGHT_LO"), |
@@ -539,6 +561,18 @@ static const struct snd_soc_dapm_widget dac33_dapm_widgets[] = { | |||
539 | SND_SOC_DAPM_SWITCH("Analog Right Bypass", SND_SOC_NOPM, 0, 0, | 561 | SND_SOC_DAPM_SWITCH("Analog Right Bypass", SND_SOC_NOPM, 0, 0, |
540 | &dac33_dapm_abypassr_control), | 562 | &dac33_dapm_abypassr_control), |
541 | 563 | ||
564 | SND_SOC_DAPM_MUX("Left LOM Inverted From", SND_SOC_NOPM, 0, 0, | ||
565 | &dac33_dapm_left_lom_control), | ||
566 | SND_SOC_DAPM_MUX("Right LOM Inverted From", SND_SOC_NOPM, 0, 0, | ||
567 | &dac33_dapm_right_lom_control), | ||
568 | /* | ||
569 | * For DAPM path, when only the anlog bypass path is enabled, and the | ||
570 | * LOP inverted from the corresponding DAC side. | ||
571 | * This is needed, so we can attach the DAC power supply in this case. | ||
572 | */ | ||
573 | SND_SOC_DAPM_PGA("Left Bypass PGA", SND_SOC_NOPM, 0, 0, NULL, 0), | ||
574 | SND_SOC_DAPM_PGA("Right Bypass PGA", SND_SOC_NOPM, 0, 0, NULL, 0), | ||
575 | |||
542 | SND_SOC_DAPM_REG(snd_soc_dapm_mixer, "Output Left Amplifier", | 576 | SND_SOC_DAPM_REG(snd_soc_dapm_mixer, "Output Left Amplifier", |
543 | DAC33_OUT_AMP_PWR_CTRL, 6, 3, 3, 0), | 577 | DAC33_OUT_AMP_PWR_CTRL, 6, 3, 3, 0), |
544 | SND_SOC_DAPM_REG(snd_soc_dapm_mixer, "Output Right Amplifier", | 578 | SND_SOC_DAPM_REG(snd_soc_dapm_mixer, "Output Right Amplifier", |
@@ -561,11 +595,22 @@ static const struct snd_soc_dapm_route audio_map[] = { | |||
561 | {"Output Left Amplifier", NULL, "DACL"}, | 595 | {"Output Left Amplifier", NULL, "DACL"}, |
562 | {"Output Right Amplifier", NULL, "DACR"}, | 596 | {"Output Right Amplifier", NULL, "DACR"}, |
563 | 597 | ||
564 | {"Output Left Amplifier", NULL, "Analog Left Bypass"}, | 598 | {"Left Bypass PGA", NULL, "Analog Left Bypass"}, |
565 | {"Output Right Amplifier", NULL, "Analog Right Bypass"}, | 599 | {"Right Bypass PGA", NULL, "Analog Right Bypass"}, |
600 | |||
601 | {"Left LOM Inverted From", "DAC", "Left Bypass PGA"}, | ||
602 | {"Right LOM Inverted From", "DAC", "Right Bypass PGA"}, | ||
603 | {"Left LOM Inverted From", "LOP", "Analog Left Bypass"}, | ||
604 | {"Right LOM Inverted From", "LOP", "Analog Right Bypass"}, | ||
605 | |||
606 | {"Output Left Amplifier", NULL, "Left LOM Inverted From"}, | ||
607 | {"Output Right Amplifier", NULL, "Right LOM Inverted From"}, | ||
608 | |||
609 | {"DACL", NULL, "Left DAC Power"}, | ||
610 | {"DACR", NULL, "Right DAC Power"}, | ||
566 | 611 | ||
567 | {"Output Left Amplifier", NULL, "Left DAC Power"}, | 612 | {"Left Bypass PGA", NULL, "Left DAC Power"}, |
568 | {"Output Right Amplifier", NULL, "Right DAC Power"}, | 613 | {"Right Bypass PGA", NULL, "Right DAC Power"}, |
569 | 614 | ||
570 | /* output */ | 615 | /* output */ |
571 | {"LEFT_LO", NULL, "Output Left Amplifier"}, | 616 | {"LEFT_LO", NULL, "Output Left Amplifier"}, |