Commit 20694ad278742ed982b24117d8525f0673529f63

Authored by Mark Brown

Merge remote-tracking branch 'asoc/topic/cs42l73' into asoc-next

Showing 1 changed file Side-by-side Diff

sound/soc/codecs/cs42l73.c
... ... @@ -40,6 +40,7 @@
40 40 u32 sysclk;
41 41 u8 mclksel;
42 42 u32 mclk;
  43 + int shutdwn_delay;
43 44 };
44 45  
45 46 static const struct reg_default cs42l73_reg_defaults[] = {
46 47  
... ... @@ -588,7 +589,60 @@
588 589 SOC_ENUM("XSPOUT Mono/Stereo Select", xsp_output_mux_enum),
589 590 };
590 591  
  592 +static int cs42l73_spklo_spk_amp_event(struct snd_soc_dapm_widget *w,
  593 + struct snd_kcontrol *kcontrol, int event)
  594 +{
  595 + struct snd_soc_codec *codec = w->codec;
  596 + struct cs42l73_private *priv = snd_soc_codec_get_drvdata(codec);
  597 + switch (event) {
  598 + case SND_SOC_DAPM_POST_PMD:
  599 + /* 150 ms delay between setting PDN and MCLKDIS */
  600 + priv->shutdwn_delay = 150;
  601 + break;
  602 + default:
  603 + pr_err("Invalid event = 0x%x\n", event);
  604 + }
  605 + return 0;
  606 +}
  607 +
  608 +static int cs42l73_ear_amp_event(struct snd_soc_dapm_widget *w,
  609 + struct snd_kcontrol *kcontrol, int event)
  610 +{
  611 + struct snd_soc_codec *codec = w->codec;
  612 + struct cs42l73_private *priv = snd_soc_codec_get_drvdata(codec);
  613 + switch (event) {
  614 + case SND_SOC_DAPM_POST_PMD:
  615 + /* 50 ms delay between setting PDN and MCLKDIS */
  616 + if (priv->shutdwn_delay < 50)
  617 + priv->shutdwn_delay = 50;
  618 + break;
  619 + default:
  620 + pr_err("Invalid event = 0x%x\n", event);
  621 + }
  622 + return 0;
  623 +}
  624 +
  625 +
  626 +static int cs42l73_hp_amp_event(struct snd_soc_dapm_widget *w,
  627 + struct snd_kcontrol *kcontrol, int event)
  628 +{
  629 + struct snd_soc_codec *codec = w->codec;
  630 + struct cs42l73_private *priv = snd_soc_codec_get_drvdata(codec);
  631 + switch (event) {
  632 + case SND_SOC_DAPM_POST_PMD:
  633 + /* 30 ms delay between setting PDN and MCLKDIS */
  634 + if (priv->shutdwn_delay < 30)
  635 + priv->shutdwn_delay = 30;
  636 + break;
  637 + default:
  638 + pr_err("Invalid event = 0x%x\n", event);
  639 + }
  640 + return 0;
  641 +}
  642 +
591 643 static const struct snd_soc_dapm_widget cs42l73_dapm_widgets[] = {
  644 + SND_SOC_DAPM_INPUT("DMICA"),
  645 + SND_SOC_DAPM_INPUT("DMICB"),
592 646 SND_SOC_DAPM_INPUT("LINEINA"),
593 647 SND_SOC_DAPM_INPUT("LINEINB"),
594 648 SND_SOC_DAPM_INPUT("MIC1"),
595 649  
... ... @@ -604,10 +658,8 @@
604 658 CS42L73_PWRCTL2, 3, 1),
605 659 SND_SOC_DAPM_AIF_OUT("ASPOUTR", NULL, 0,
606 660 CS42L73_PWRCTL2, 3, 1),
607   - SND_SOC_DAPM_AIF_OUT("VSPOUTL", NULL, 0,
  661 + SND_SOC_DAPM_AIF_OUT("VSPINOUT", NULL, 0,
608 662 CS42L73_PWRCTL2, 4, 1),
609   - SND_SOC_DAPM_AIF_OUT("VSPOUTR", NULL, 0,
610   - CS42L73_PWRCTL2, 4, 1),
611 663  
612 664 SND_SOC_DAPM_PGA("PGA Left", SND_SOC_NOPM, 0, 0, NULL, 0),
613 665 SND_SOC_DAPM_PGA("PGA Right", SND_SOC_NOPM, 0, 0, NULL, 0),
... ... @@ -632,8 +684,7 @@
632 684 SND_SOC_DAPM_MIXER("ASPR Output Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
633 685 SND_SOC_DAPM_MIXER("XSPL Output Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
634 686 SND_SOC_DAPM_MIXER("XSPR Output Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
635   - SND_SOC_DAPM_MIXER("VSPL Output Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
636   - SND_SOC_DAPM_MIXER("VSPR Output Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
  687 + SND_SOC_DAPM_MIXER("VSP Output Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
637 688  
638 689 SND_SOC_DAPM_AIF_IN("XSPINL", NULL, 0,
639 690 CS42L73_PWRCTL2, 0, 1),
... ... @@ -649,7 +700,7 @@
649 700 SND_SOC_DAPM_AIF_IN("ASPINM", NULL, 0,
650 701 CS42L73_PWRCTL2, 2, 1),
651 702  
652   - SND_SOC_DAPM_AIF_IN("VSPIN", NULL, 0,
  703 + SND_SOC_DAPM_AIF_IN("VSPINOUT", NULL, 0,
653 704 CS42L73_PWRCTL2, 4, 1),
654 705  
655 706 SND_SOC_DAPM_MIXER("HL Left Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
656 707  
... ... @@ -674,16 +725,20 @@
674 725 SND_SOC_DAPM_PGA("SPK DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
675 726 SND_SOC_DAPM_PGA("ESL DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
676 727  
677   - SND_SOC_DAPM_SWITCH("HP Amp", CS42L73_PWRCTL3, 0, 1,
678   - &hp_amp_ctl),
  728 + SND_SOC_DAPM_SWITCH_E("HP Amp", CS42L73_PWRCTL3, 0, 1,
  729 + &hp_amp_ctl, cs42l73_hp_amp_event,
  730 + SND_SOC_DAPM_POST_PMD),
679 731 SND_SOC_DAPM_SWITCH("LO Amp", CS42L73_PWRCTL3, 1, 1,
680 732 &lo_amp_ctl),
681   - SND_SOC_DAPM_SWITCH("SPK Amp", CS42L73_PWRCTL3, 2, 1,
682   - &spk_amp_ctl),
683   - SND_SOC_DAPM_SWITCH("EAR Amp", CS42L73_PWRCTL3, 3, 1,
684   - &ear_amp_ctl),
685   - SND_SOC_DAPM_SWITCH("SPKLO Amp", CS42L73_PWRCTL3, 4, 1,
686   - &spklo_amp_ctl),
  733 + SND_SOC_DAPM_SWITCH_E("SPK Amp", CS42L73_PWRCTL3, 2, 1,
  734 + &spk_amp_ctl, cs42l73_spklo_spk_amp_event,
  735 + SND_SOC_DAPM_POST_PMD),
  736 + SND_SOC_DAPM_SWITCH_E("EAR Amp", CS42L73_PWRCTL3, 3, 1,
  737 + &ear_amp_ctl, cs42l73_ear_amp_event,
  738 + SND_SOC_DAPM_POST_PMD),
  739 + SND_SOC_DAPM_SWITCH_E("SPKLO Amp", CS42L73_PWRCTL3, 4, 1,
  740 + &spklo_amp_ctl, cs42l73_spklo_spk_amp_event,
  741 + SND_SOC_DAPM_POST_PMD),
687 742  
688 743 SND_SOC_DAPM_OUTPUT("HPOUTA"),
689 744 SND_SOC_DAPM_OUTPUT("HPOUTB"),
... ... @@ -705,7 +760,7 @@
705 760  
706 761 {"ESL DAC", "ESL-ASP Mono Volume", "ESL Mixer"},
707 762 {"ESL DAC", "ESL-XSP Mono Volume", "ESL Mixer"},
708   - {"ESL DAC", "ESL-VSP Mono Volume", "VSPIN"},
  763 + {"ESL DAC", "ESL-VSP Mono Volume", "VSPINOUT"},
709 764 /* Loopback */
710 765 {"ESL DAC", "ESL-IP Mono Volume", "Input Left Capture"},
711 766 {"ESL DAC", "ESL-IP Mono Volume", "Input Right Capture"},
... ... @@ -727,7 +782,7 @@
727 782  
728 783 {"SPK DAC", "SPK-ASP Mono Volume", "SPK Mixer"},
729 784 {"SPK DAC", "SPK-XSP Mono Volume", "SPK Mixer"},
730   - {"SPK DAC", "SPK-VSP Mono Volume", "VSPIN"},
  785 + {"SPK DAC", "SPK-VSP Mono Volume", "VSPINOUT"},
731 786 /* Loopback */
732 787 {"SPK DAC", "SPK-IP Mono Volume", "Input Left Capture"},
733 788 {"SPK DAC", "SPK-IP Mono Volume", "Input Right Capture"},
... ... @@ -770,8 +825,8 @@
770 825 {"HL Right Mixer", NULL, "ASPINR"},
771 826 {"HL Left Mixer", NULL, "XSPINL"},
772 827 {"HL Right Mixer", NULL, "XSPINR"},
773   - {"HL Left Mixer", NULL, "VSPIN"},
774   - {"HL Right Mixer", NULL, "VSPIN"},
  828 + {"HL Left Mixer", NULL, "VSPINOUT"},
  829 + {"HL Right Mixer", NULL, "VSPINOUT"},
775 830  
776 831 {"ASPINL", NULL, "ASP Playback"},
777 832 {"ASPINM", NULL, "ASP Playback"},
... ... @@ -779,7 +834,7 @@
779 834 {"XSPINL", NULL, "XSP Playback"},
780 835 {"XSPINM", NULL, "XSP Playback"},
781 836 {"XSPINR", NULL, "XSP Playback"},
782   - {"VSPIN", NULL, "VSP Playback"},
  837 + {"VSPINOUT", NULL, "VSP Playback"},
783 838  
784 839 /* Capture Paths */
785 840 {"MIC1", NULL, "MIC1 Bias"},
... ... @@ -795,6 +850,8 @@
795 850  
796 851 {"ADC Left", NULL, "PGA Left"},
797 852 {"ADC Right", NULL, "PGA Right"},
  853 + {"DMIC Left", NULL, "DMICA"},
  854 + {"DMIC Right", NULL, "DMICB"},
798 855  
799 856 {"Input Left Capture", "ADC Left Input", "ADC Left"},
800 857 {"Input Right Capture", "ADC Right Input", "ADC Right"},
801 858  
802 859  
803 860  
... ... @@ -819,21 +876,18 @@
819 876 {"XSPOUTR", NULL, "XSPR Output Mixer"},
820 877  
821 878 /* Voice Capture */
822   - {"VSPL Output Mixer", NULL, "Input Left Capture"},
823   - {"VSPR Output Mixer", NULL, "Input Left Capture"},
  879 + {"VSP Output Mixer", NULL, "Input Left Capture"},
  880 + {"VSP Output Mixer", NULL, "Input Right Capture"},
824 881  
825   - {"VSPOUTL", "VSP-IP Volume", "VSPL Output Mixer"},
826   - {"VSPOUTR", "VSP-IP Volume", "VSPR Output Mixer"},
  882 + {"VSPINOUT", "VSP-IP Volume", "VSP Output Mixer"},
827 883  
828   - {"VSPOUTL", NULL, "VSPL Output Mixer"},
829   - {"VSPOUTR", NULL, "VSPR Output Mixer"},
  884 + {"VSPINOUT", NULL, "VSP Output Mixer"},
830 885  
831 886 {"ASP Capture", NULL, "ASPOUTL"},
832 887 {"ASP Capture", NULL, "ASPOUTR"},
833 888 {"XSP Capture", NULL, "XSPOUTL"},
834 889 {"XSP Capture", NULL, "XSPOUTR"},
835   - {"VSP Capture", NULL, "VSPOUTL"},
836   - {"VSP Capture", NULL, "VSPOUTR"},
  890 + {"VSP Capture", NULL, "VSPINOUT"},
837 891 };
838 892  
839 893 struct cs42l73_mclk_div {
... ... @@ -1167,6 +1221,14 @@
1167 1221  
1168 1222 case SND_SOC_BIAS_OFF:
1169 1223 snd_soc_update_bits(codec, CS42L73_PWRCTL1, PDN, 1);
  1224 + if (cs42l73->shutdwn_delay > 0) {
  1225 + mdelay(cs42l73->shutdwn_delay);
  1226 + cs42l73->shutdwn_delay = 0;
  1227 + } else {
  1228 + mdelay(15); /* Min amount of time requred to power
  1229 + * down.
  1230 + */
  1231 + }
1170 1232 snd_soc_update_bits(codec, CS42L73_DMMCC, MCLKDIS, 1);
1171 1233 break;
1172 1234 }