@@ -623,8 +623,6 @@ static const struct cs35l41_otp_packed_element_t otp_map_2[CS35L41_NUM_OTP_ELEM]
623
623
};
624
624
625
625
static const struct reg_sequence cs35l41_reva0_errata_patch [] = {
626
- { 0x00000040 , 0x00005555 },
627
- { 0x00000040 , 0x0000AAAA },
628
626
{ 0x00003854 , 0x05180240 },
629
627
{ CS35L41_VIMON_SPKMON_RESYNC , 0x00000000 },
630
628
{ 0x00004310 , 0x00000000 },
@@ -637,38 +635,28 @@ static const struct reg_sequence cs35l41_reva0_errata_patch[] = {
637
635
{ CS35L41_IRQ2_DB3 , 0x00000000 },
638
636
{ CS35L41_DSP1_YM_ACCEL_PL0_PRI , 0x00000000 },
639
637
{ CS35L41_DSP1_XM_ACCEL_PL0_PRI , 0x00000000 },
640
- { 0x00000040 , 0x0000CCCC },
641
- { 0x00000040 , 0x00003333 },
642
638
{ CS35L41_PWR_CTRL2 , 0x00000000 },
643
639
{ CS35L41_AMP_GAIN_CTRL , 0x00000000 },
644
640
};
645
641
646
642
static const struct reg_sequence cs35l41_revb0_errata_patch [] = {
647
- { 0x00000040 , 0x00005555 },
648
- { 0x00000040 , 0x0000AAAA },
649
643
{ CS35L41_VIMON_SPKMON_RESYNC , 0x00000000 },
650
644
{ 0x00004310 , 0x00000000 },
651
645
{ CS35L41_VPVBST_FS_SEL , 0x00000000 },
652
646
{ CS35L41_BSTCVRT_DCM_CTRL , 0x00000051 },
653
647
{ CS35L41_DSP1_YM_ACCEL_PL0_PRI , 0x00000000 },
654
648
{ CS35L41_DSP1_XM_ACCEL_PL0_PRI , 0x00000000 },
655
- { 0x00000040 , 0x0000CCCC },
656
- { 0x00000040 , 0x00003333 },
657
649
{ CS35L41_PWR_CTRL2 , 0x00000000 },
658
650
{ CS35L41_AMP_GAIN_CTRL , 0x00000000 },
659
651
};
660
652
661
653
static const struct reg_sequence cs35l41_revb2_errata_patch [] = {
662
- { 0x00000040 , 0x00005555 },
663
- { 0x00000040 , 0x0000AAAA },
664
654
{ CS35L41_VIMON_SPKMON_RESYNC , 0x00000000 },
665
655
{ 0x00004310 , 0x00000000 },
666
656
{ CS35L41_VPVBST_FS_SEL , 0x00000000 },
667
657
{ CS35L41_BSTCVRT_DCM_CTRL , 0x00000051 },
668
658
{ CS35L41_DSP1_YM_ACCEL_PL0_PRI , 0x00000000 },
669
659
{ CS35L41_DSP1_XM_ACCEL_PL0_PRI , 0x00000000 },
670
- { 0x00000040 , 0x0000CCCC },
671
- { 0x00000040 , 0x00003333 },
672
660
{ CS35L41_PWR_CTRL2 , 0x00000000 },
673
661
{ CS35L41_AMP_GAIN_CTRL , 0x00000000 },
674
662
};
@@ -756,6 +744,39 @@ static const struct cs35l41_otp_map_element_t *cs35l41_find_otp_map(u32 otp_id)
756
744
return NULL ;
757
745
}
758
746
747
+ int cs35l41_test_key_unlock (struct device * dev , struct regmap * regmap )
748
+ {
749
+ static const struct reg_sequence unlock [] = {
750
+ { CS35L41_TEST_KEY_CTL , 0x00000055 },
751
+ { CS35L41_TEST_KEY_CTL , 0x000000AA },
752
+ };
753
+ int ret ;
754
+
755
+ ret = regmap_multi_reg_write (regmap , unlock , ARRAY_SIZE (unlock ));
756
+ if (ret )
757
+ dev_err (dev , "Failed to unlock test key: %d\n" , ret );
758
+
759
+ return ret ;
760
+ }
761
+ EXPORT_SYMBOL_GPL (cs35l41_test_key_unlock );
762
+
763
+ int cs35l41_test_key_lock (struct device * dev , struct regmap * regmap )
764
+ {
765
+ static const struct reg_sequence unlock [] = {
766
+ { CS35L41_TEST_KEY_CTL , 0x000000CC },
767
+ { CS35L41_TEST_KEY_CTL , 0x00000033 },
768
+ };
769
+ int ret ;
770
+
771
+ ret = regmap_multi_reg_write (regmap , unlock , ARRAY_SIZE (unlock ));
772
+ if (ret )
773
+ dev_err (dev , "Failed to lock test key: %d\n" , ret );
774
+
775
+ return ret ;
776
+ }
777
+ EXPORT_SYMBOL_GPL (cs35l41_test_key_lock );
778
+
779
+ /* Must be called with the TEST_KEY unlocked */
759
780
int cs35l41_otp_unpack (struct device * dev , struct regmap * regmap )
760
781
{
761
782
const struct cs35l41_otp_map_element_t * otp_map_match ;
@@ -794,17 +815,6 @@ int cs35l41_otp_unpack(struct device *dev, struct regmap *regmap)
794
815
bit_offset = otp_map_match -> bit_offset ;
795
816
word_offset = otp_map_match -> word_offset ;
796
817
797
- ret = regmap_write (regmap , CS35L41_TEST_KEY_CTL , 0x00000055 );
798
- if (ret ) {
799
- dev_err (dev , "Write Unlock key failed 1/2: %d\n" , ret );
800
- goto err_otp_unpack ;
801
- }
802
- ret = regmap_write (regmap , CS35L41_TEST_KEY_CTL , 0x000000AA );
803
- if (ret ) {
804
- dev_err (dev , "Write Unlock key failed 2/2: %d\n" , ret );
805
- goto err_otp_unpack ;
806
- }
807
-
808
818
for (i = 0 ; i < otp_map_match -> num_elements ; i ++ ) {
809
819
dev_dbg (dev , "bitoffset= %d, word_offset=%d, bit_sum mod 32=%d\n" ,
810
820
bit_offset , word_offset , bit_sum % 32 );
@@ -840,16 +850,6 @@ int cs35l41_otp_unpack(struct device *dev, struct regmap *regmap)
840
850
}
841
851
}
842
852
843
- ret = regmap_write (regmap , CS35L41_TEST_KEY_CTL , 0x000000CC );
844
- if (ret ) {
845
- dev_err (dev , "Write Lock key failed 1/2: %d\n" , ret );
846
- goto err_otp_unpack ;
847
- }
848
- ret = regmap_write (regmap , CS35L41_TEST_KEY_CTL , 0x00000033 );
849
- if (ret ) {
850
- dev_err (dev , "Write Lock key failed 2/2: %d\n" , ret );
851
- goto err_otp_unpack ;
852
- }
853
853
ret = 0 ;
854
854
855
855
err_otp_unpack :
@@ -859,6 +859,7 @@ int cs35l41_otp_unpack(struct device *dev, struct regmap *regmap)
859
859
}
860
860
EXPORT_SYMBOL_GPL (cs35l41_otp_unpack );
861
861
862
+ /* Must be called with the TEST_KEY unlocked */
862
863
int cs35l41_register_errata_patch (struct device * dev , struct regmap * reg , unsigned int reg_revid )
863
864
{
864
865
char * rev ;
0 commit comments