@@ -730,6 +730,34 @@ static int cs35l41_hda_channel_map(struct device *dev, unsigned int tx_num, unsi
730
730
rx_slot );
731
731
}
732
732
733
+ int cs35l41_verify_id (struct cs35l41_hda * cs35l41 , unsigned int * regid , unsigned int * reg_revid )
734
+ {
735
+ unsigned int mtl_revid , chipid ;
736
+ int ret ;
737
+
738
+ ret = regmap_read (cs35l41 -> regmap , CS35L41_DEVID , regid );
739
+ if (ret ) {
740
+ dev_err_probe (cs35l41 -> dev , ret , "Get Device ID failed\n" );
741
+ return ret ;
742
+ }
743
+
744
+ ret = regmap_read (cs35l41 -> regmap , CS35L41_REVID , reg_revid );
745
+ if (ret ) {
746
+ dev_err_probe (cs35l41 -> dev , ret , "Get Revision ID failed\n" );
747
+ return ret ;
748
+ }
749
+
750
+ mtl_revid = * reg_revid & CS35L41_MTLREVID_MASK ;
751
+
752
+ chipid = (mtl_revid % 2 ) ? CS35L41R_CHIP_ID : CS35L41_CHIP_ID ;
753
+ if (* regid != chipid ) {
754
+ dev_err (cs35l41 -> dev , "CS35L41 Device ID (%X). Expected ID %X\n" , * regid , chipid );
755
+ return - ENODEV ;
756
+ }
757
+
758
+ return 0 ;
759
+ }
760
+
733
761
static int cs35l41_ready_for_reset (struct cs35l41_hda * cs35l41 )
734
762
{
735
763
int ret = 0 ;
@@ -827,6 +855,30 @@ static int cs35l41_system_suspend(struct device *dev)
827
855
return ret ;
828
856
}
829
857
858
+ static int cs35l41_wait_boot_done (struct cs35l41_hda * cs35l41 )
859
+ {
860
+ unsigned int int_status ;
861
+ int ret ;
862
+
863
+ ret = regmap_read_poll_timeout (cs35l41 -> regmap , CS35L41_IRQ1_STATUS4 , int_status ,
864
+ int_status & CS35L41_OTP_BOOT_DONE , 1000 , 100000 );
865
+ if (ret ) {
866
+ dev_err (cs35l41 -> dev , "Failed waiting for OTP_BOOT_DONE\n" );
867
+ return ret ;
868
+ }
869
+
870
+ ret = regmap_read (cs35l41 -> regmap , CS35L41_IRQ1_STATUS3 , & int_status );
871
+ if (ret || (int_status & CS35L41_OTP_BOOT_ERR )) {
872
+ dev_err (cs35l41 -> dev , "OTP Boot status %x error\n" ,
873
+ int_status & CS35L41_OTP_BOOT_ERR );
874
+ if (!ret )
875
+ ret = - EIO ;
876
+ return ret ;
877
+ }
878
+
879
+ return 0 ;
880
+ }
881
+
830
882
static int cs35l41_system_resume (struct device * dev )
831
883
{
832
884
struct cs35l41_hda * cs35l41 = dev_get_drvdata (dev );
@@ -847,6 +899,14 @@ static int cs35l41_system_resume(struct device *dev)
847
899
848
900
usleep_range (2000 , 2100 );
849
901
902
+ regcache_cache_only (cs35l41 -> regmap , false);
903
+
904
+ ret = cs35l41_wait_boot_done (cs35l41 );
905
+ if (ret )
906
+ return ret ;
907
+
908
+ regcache_cache_only (cs35l41 -> regmap , true);
909
+
850
910
ret = pm_runtime_force_resume (dev );
851
911
if (ret ) {
852
912
dev_err (dev , "System Resume Failed: Unable to runtime resume: %d\n" , ret );
@@ -908,6 +968,7 @@ static int cs35l41_runtime_suspend(struct device *dev)
908
968
static int cs35l41_runtime_resume (struct device * dev )
909
969
{
910
970
struct cs35l41_hda * cs35l41 = dev_get_drvdata (dev );
971
+ unsigned int regid , reg_revid ;
911
972
int ret = 0 ;
912
973
913
974
dev_dbg (cs35l41 -> dev , "Runtime Resume\n" );
@@ -929,6 +990,10 @@ static int cs35l41_runtime_resume(struct device *dev)
929
990
}
930
991
}
931
992
993
+ ret = cs35l41_verify_id (cs35l41 , & regid , & reg_revid );
994
+ if (ret )
995
+ goto err ;
996
+
932
997
/* Test key needs to be unlocked to allow the OTP settings to re-apply */
933
998
cs35l41_test_key_unlock (cs35l41 -> dev , cs35l41 -> regmap );
934
999
ret = regcache_sync (cs35l41 -> regmap );
@@ -941,6 +1006,8 @@ static int cs35l41_runtime_resume(struct device *dev)
941
1006
if (cs35l41 -> hw_cfg .bst_type == CS35L41_EXT_BOOST )
942
1007
cs35l41_init_boost (cs35l41 -> dev , cs35l41 -> regmap , & cs35l41 -> hw_cfg );
943
1008
1009
+ dev_dbg (cs35l41 -> dev , "CS35L41 Resumed (%x), Revision: %02X\n" , regid , reg_revid );
1010
+
944
1011
err :
945
1012
mutex_unlock (& cs35l41 -> fw_mutex );
946
1013
@@ -1660,7 +1727,7 @@ static int cs35l41_hda_read_acpi(struct cs35l41_hda *cs35l41, const char *hid, i
1660
1727
int cs35l41_hda_probe (struct device * dev , const char * device_name , int id , int irq ,
1661
1728
struct regmap * regmap )
1662
1729
{
1663
- unsigned int int_sts , regid , reg_revid , mtl_revid , chipid , int_status ;
1730
+ unsigned int regid , reg_revid ;
1664
1731
struct cs35l41_hda * cs35l41 ;
1665
1732
int ret ;
1666
1733
@@ -1701,41 +1768,13 @@ int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int i
1701
1768
1702
1769
usleep_range (2000 , 2100 );
1703
1770
1704
- ret = regmap_read_poll_timeout (cs35l41 -> regmap , CS35L41_IRQ1_STATUS4 , int_status ,
1705
- int_status & CS35L41_OTP_BOOT_DONE , 1000 , 100000 );
1706
- if (ret ) {
1707
- dev_err_probe (cs35l41 -> dev , ret , "Failed waiting for OTP_BOOT_DONE\n" );
1708
- goto err ;
1709
- }
1710
-
1711
- ret = regmap_read (cs35l41 -> regmap , CS35L41_IRQ1_STATUS3 , & int_sts );
1712
- if (ret || (int_sts & CS35L41_OTP_BOOT_ERR )) {
1713
- dev_err_probe (cs35l41 -> dev , ret , "OTP Boot status %x error\n" ,
1714
- int_sts & CS35L41_OTP_BOOT_ERR );
1715
- ret = - EIO ;
1716
- goto err ;
1717
- }
1718
-
1719
- ret = regmap_read (cs35l41 -> regmap , CS35L41_DEVID , & regid );
1720
- if (ret ) {
1721
- dev_err_probe (cs35l41 -> dev , ret , "Get Device ID failed\n" );
1722
- goto err ;
1723
- }
1724
-
1725
- ret = regmap_read (cs35l41 -> regmap , CS35L41_REVID , & reg_revid );
1726
- if (ret ) {
1727
- dev_err_probe (cs35l41 -> dev , ret , "Get Revision ID failed\n" );
1771
+ ret = cs35l41_wait_boot_done (cs35l41 );
1772
+ if (ret )
1728
1773
goto err ;
1729
- }
1730
-
1731
- mtl_revid = reg_revid & CS35L41_MTLREVID_MASK ;
1732
1774
1733
- chipid = (mtl_revid % 2 ) ? CS35L41R_CHIP_ID : CS35L41_CHIP_ID ;
1734
- if (regid != chipid ) {
1735
- dev_err (cs35l41 -> dev , "CS35L41 Device ID (%X). Expected ID %X\n" , regid , chipid );
1736
- ret = - ENODEV ;
1775
+ ret = cs35l41_verify_id (cs35l41 , & regid , & reg_revid );
1776
+ if (ret )
1737
1777
goto err ;
1738
- }
1739
1778
1740
1779
ret = cs35l41_test_key_unlock (cs35l41 -> dev , cs35l41 -> regmap );
1741
1780
if (ret )
0 commit comments