100
100
#define SUN8I_I2S_CTRL_MODE_PCM (0 << 4)
101
101
102
102
#define SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK BIT(19)
103
- #define SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED (1 << 19)
104
- #define SUN8I_I2S_FMT0_LRCLK_POLARITY_NORMAL (0 << 19)
103
+ #define SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH (1 << 19)
104
+ #define SUN8I_I2S_FMT0_LRCLK_POLARITY_START_LOW (0 << 19)
105
105
#define SUN8I_I2S_FMT0_LRCK_PERIOD_MASK GENMASK(17, 8)
106
106
#define SUN8I_I2S_FMT0_LRCK_PERIOD (period ) ((period - 1) << 8)
107
107
#define SUN8I_I2S_FMT0_BCLK_POLARITY_MASK BIT(7)
@@ -729,65 +729,37 @@ static int sun4i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,
729
729
static int sun8i_i2s_set_soc_fmt (const struct sun4i_i2s * i2s ,
730
730
unsigned int fmt )
731
731
{
732
- u32 mode , val ;
732
+ u32 mode , lrclk_pol , bclk_pol , val ;
733
733
u8 offset ;
734
734
735
- /*
736
- * DAI clock polarity
737
- *
738
- * The setup for LRCK contradicts the datasheet, but under a
739
- * scope it's clear that the LRCK polarity is reversed
740
- * compared to the expected polarity on the bus.
741
- */
742
- switch (fmt & SND_SOC_DAIFMT_INV_MASK ) {
743
- case SND_SOC_DAIFMT_IB_IF :
744
- /* Invert both clocks */
745
- val = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED ;
746
- break ;
747
- case SND_SOC_DAIFMT_IB_NF :
748
- /* Invert bit clock */
749
- val = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED |
750
- SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED ;
751
- break ;
752
- case SND_SOC_DAIFMT_NB_IF :
753
- /* Invert frame clock */
754
- val = 0 ;
755
- break ;
756
- case SND_SOC_DAIFMT_NB_NF :
757
- val = SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED ;
758
- break ;
759
- default :
760
- return - EINVAL ;
761
- }
762
-
763
- regmap_update_bits (i2s -> regmap , SUN4I_I2S_FMT0_REG ,
764
- SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK |
765
- SUN8I_I2S_FMT0_BCLK_POLARITY_MASK ,
766
- val );
767
-
768
735
/* DAI Mode */
769
736
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK ) {
770
737
case SND_SOC_DAIFMT_DSP_A :
738
+ lrclk_pol = SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ;
771
739
mode = SUN8I_I2S_CTRL_MODE_PCM ;
772
740
offset = 1 ;
773
741
break ;
774
742
775
743
case SND_SOC_DAIFMT_DSP_B :
744
+ lrclk_pol = SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ;
776
745
mode = SUN8I_I2S_CTRL_MODE_PCM ;
777
746
offset = 0 ;
778
747
break ;
779
748
780
749
case SND_SOC_DAIFMT_I2S :
750
+ lrclk_pol = SUN8I_I2S_FMT0_LRCLK_POLARITY_START_LOW ;
781
751
mode = SUN8I_I2S_CTRL_MODE_LEFT ;
782
752
offset = 1 ;
783
753
break ;
784
754
785
755
case SND_SOC_DAIFMT_LEFT_J :
756
+ lrclk_pol = SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ;
786
757
mode = SUN8I_I2S_CTRL_MODE_LEFT ;
787
758
offset = 0 ;
788
759
break ;
789
760
790
761
case SND_SOC_DAIFMT_RIGHT_J :
762
+ lrclk_pol = SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ;
791
763
mode = SUN8I_I2S_CTRL_MODE_RIGHT ;
792
764
offset = 0 ;
793
765
break ;
@@ -805,6 +777,35 @@ static int sun8i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,
805
777
SUN8I_I2S_TX_CHAN_OFFSET_MASK ,
806
778
SUN8I_I2S_TX_CHAN_OFFSET (offset ));
807
779
780
+ /* DAI clock polarity */
781
+ bclk_pol = SUN8I_I2S_FMT0_BCLK_POLARITY_NORMAL ;
782
+
783
+ switch (fmt & SND_SOC_DAIFMT_INV_MASK ) {
784
+ case SND_SOC_DAIFMT_IB_IF :
785
+ /* Invert both clocks */
786
+ lrclk_pol ^= SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK ;
787
+ bclk_pol = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED ;
788
+ break ;
789
+ case SND_SOC_DAIFMT_IB_NF :
790
+ /* Invert bit clock */
791
+ bclk_pol = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED ;
792
+ break ;
793
+ case SND_SOC_DAIFMT_NB_IF :
794
+ /* Invert frame clock */
795
+ lrclk_pol ^= SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK ;
796
+ break ;
797
+ case SND_SOC_DAIFMT_NB_NF :
798
+ /* No inversion */
799
+ break ;
800
+ default :
801
+ return - EINVAL ;
802
+ }
803
+
804
+ regmap_update_bits (i2s -> regmap , SUN4I_I2S_FMT0_REG ,
805
+ SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK |
806
+ SUN8I_I2S_FMT0_BCLK_POLARITY_MASK ,
807
+ lrclk_pol | bclk_pol );
808
+
808
809
/* DAI clock master masks */
809
810
switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK ) {
810
811
case SND_SOC_DAIFMT_BP_FP :
@@ -836,65 +837,37 @@ static int sun8i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,
836
837
static int sun50i_h6_i2s_set_soc_fmt (const struct sun4i_i2s * i2s ,
837
838
unsigned int fmt )
838
839
{
839
- u32 mode , val ;
840
+ u32 mode , lrclk_pol , bclk_pol , val ;
840
841
u8 offset ;
841
842
842
- /*
843
- * DAI clock polarity
844
- *
845
- * The setup for LRCK contradicts the datasheet, but under a
846
- * scope it's clear that the LRCK polarity is reversed
847
- * compared to the expected polarity on the bus.
848
- */
849
- switch (fmt & SND_SOC_DAIFMT_INV_MASK ) {
850
- case SND_SOC_DAIFMT_IB_IF :
851
- /* Invert both clocks */
852
- val = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED ;
853
- break ;
854
- case SND_SOC_DAIFMT_IB_NF :
855
- /* Invert bit clock */
856
- val = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED |
857
- SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED ;
858
- break ;
859
- case SND_SOC_DAIFMT_NB_IF :
860
- /* Invert frame clock */
861
- val = 0 ;
862
- break ;
863
- case SND_SOC_DAIFMT_NB_NF :
864
- val = SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED ;
865
- break ;
866
- default :
867
- return - EINVAL ;
868
- }
869
-
870
- regmap_update_bits (i2s -> regmap , SUN4I_I2S_FMT0_REG ,
871
- SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK |
872
- SUN8I_I2S_FMT0_BCLK_POLARITY_MASK ,
873
- val );
874
-
875
843
/* DAI Mode */
876
844
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK ) {
877
845
case SND_SOC_DAIFMT_DSP_A :
846
+ lrclk_pol = SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ;
878
847
mode = SUN8I_I2S_CTRL_MODE_PCM ;
879
848
offset = 1 ;
880
849
break ;
881
850
882
851
case SND_SOC_DAIFMT_DSP_B :
852
+ lrclk_pol = SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ;
883
853
mode = SUN8I_I2S_CTRL_MODE_PCM ;
884
854
offset = 0 ;
885
855
break ;
886
856
887
857
case SND_SOC_DAIFMT_I2S :
858
+ lrclk_pol = SUN8I_I2S_FMT0_LRCLK_POLARITY_START_LOW ;
888
859
mode = SUN8I_I2S_CTRL_MODE_LEFT ;
889
860
offset = 1 ;
890
861
break ;
891
862
892
863
case SND_SOC_DAIFMT_LEFT_J :
864
+ lrclk_pol = SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ;
893
865
mode = SUN8I_I2S_CTRL_MODE_LEFT ;
894
866
offset = 0 ;
895
867
break ;
896
868
897
869
case SND_SOC_DAIFMT_RIGHT_J :
870
+ lrclk_pol = SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ;
898
871
mode = SUN8I_I2S_CTRL_MODE_RIGHT ;
899
872
offset = 0 ;
900
873
break ;
@@ -912,6 +885,36 @@ static int sun50i_h6_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,
912
885
SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK ,
913
886
SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET (offset ));
914
887
888
+ /* DAI clock polarity */
889
+ bclk_pol = SUN8I_I2S_FMT0_BCLK_POLARITY_NORMAL ;
890
+
891
+ switch (fmt & SND_SOC_DAIFMT_INV_MASK ) {
892
+ case SND_SOC_DAIFMT_IB_IF :
893
+ /* Invert both clocks */
894
+ lrclk_pol ^= SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK ;
895
+ bclk_pol = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED ;
896
+ break ;
897
+ case SND_SOC_DAIFMT_IB_NF :
898
+ /* Invert bit clock */
899
+ bclk_pol = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED ;
900
+ break ;
901
+ case SND_SOC_DAIFMT_NB_IF :
902
+ /* Invert frame clock */
903
+ lrclk_pol ^= SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK ;
904
+ break ;
905
+ case SND_SOC_DAIFMT_NB_NF :
906
+ /* No inversion */
907
+ break ;
908
+ default :
909
+ return - EINVAL ;
910
+ }
911
+
912
+ regmap_update_bits (i2s -> regmap , SUN4I_I2S_FMT0_REG ,
913
+ SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK |
914
+ SUN8I_I2S_FMT0_BCLK_POLARITY_MASK ,
915
+ lrclk_pol | bclk_pol );
916
+
917
+
915
918
/* DAI clock master masks */
916
919
switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK ) {
917
920
case SND_SOC_DAIFMT_BP_FP :
0 commit comments