@@ -115,9 +115,14 @@ const struct reg_default cs42l43_reg_default[CS42L43_N_DEFAULTS] = {
115115 { CS42L43_DECIM_HPF_WNF_CTRL2 , 0x00000001 },
116116 { CS42L43_DECIM_HPF_WNF_CTRL3 , 0x00000001 },
117117 { CS42L43_DECIM_HPF_WNF_CTRL4 , 0x00000001 },
118+ { CS42L43B_DECIM_HPF_WNF_CTRL5 , 0x00000001 },
119+ { CS42L43B_DECIM_HPF_WNF_CTRL6 , 0x00000001 },
118120 { CS42L43_DMIC_PDM_CTRL , 0x00000000 },
119121 { CS42L43_DECIM_VOL_CTRL_CH1_CH2 , 0x20122012 },
120122 { CS42L43_DECIM_VOL_CTRL_CH3_CH4 , 0x20122012 },
123+ { CS42L43B_DECIM_VOL_CTRL_CH1_CH2 , 0x20122012 },
124+ { CS42L43B_DECIM_VOL_CTRL_CH3_CH4 , 0x20122012 },
125+ { CS42L43B_DECIM_VOL_CTRL_CH5_CH6 , 0x20122012 },
121126 { CS42L43_INTP_VOLUME_CTRL1 , 0x00000180 },
122127 { CS42L43_INTP_VOLUME_CTRL2 , 0x00000180 },
123128 { CS42L43_AMP1_2_VOL_RAMP , 0x00000022 },
@@ -155,8 +160,12 @@ const struct reg_default cs42l43_reg_default[CS42L43_N_DEFAULTS] = {
155160 { CS42L43_SWIRE_DP2_CH2_INPUT , 0x00000000 },
156161 { CS42L43_SWIRE_DP3_CH1_INPUT , 0x00000000 },
157162 { CS42L43_SWIRE_DP3_CH2_INPUT , 0x00000000 },
163+ { CS42L43B_SWIRE_DP3_CH3_INPUT , 0x00000000 },
164+ { CS42L43B_SWIRE_DP3_CH4_INPUT , 0x00000000 },
158165 { CS42L43_SWIRE_DP4_CH1_INPUT , 0x00000000 },
159166 { CS42L43_SWIRE_DP4_CH2_INPUT , 0x00000000 },
167+ { CS42L43B_SWIRE_DP4_CH3_INPUT , 0x00000000 },
168+ { CS42L43B_SWIRE_DP4_CH4_INPUT , 0x00000000 },
160169 { CS42L43_ASRC_INT1_INPUT1 , 0x00000000 },
161170 { CS42L43_ASRC_INT2_INPUT1 , 0x00000000 },
162171 { CS42L43_ASRC_INT3_INPUT1 , 0x00000000 },
@@ -169,10 +178,14 @@ const struct reg_default cs42l43_reg_default[CS42L43_N_DEFAULTS] = {
169178 { CS42L43_ISRC1INT2_INPUT1 , 0x00000000 },
170179 { CS42L43_ISRC1DEC1_INPUT1 , 0x00000000 },
171180 { CS42L43_ISRC1DEC2_INPUT1 , 0x00000000 },
181+ { CS42L43B_ISRC1DEC3_INPUT1 , 0x00000000 },
182+ { CS42L43B_ISRC1DEC4_INPUT1 , 0x00000000 },
172183 { CS42L43_ISRC2INT1_INPUT1 , 0x00000000 },
173184 { CS42L43_ISRC2INT2_INPUT1 , 0x00000000 },
174185 { CS42L43_ISRC2DEC1_INPUT1 , 0x00000000 },
175186 { CS42L43_ISRC2DEC2_INPUT1 , 0x00000000 },
187+ { CS42L43B_ISRC2DEC3_INPUT1 , 0x00000000 },
188+ { CS42L43B_ISRC2DEC4_INPUT1 , 0x00000000 },
176189 { CS42L43_EQ1MIX_INPUT1 , 0x00800000 },
177190 { CS42L43_EQ1MIX_INPUT2 , 0x00800000 },
178191 { CS42L43_EQ1MIX_INPUT3 , 0x00800000 },
@@ -269,6 +282,8 @@ EXPORT_SYMBOL_NS_GPL(cs42l43_reg_default, "MFD_CS42L43");
269282
270283bool cs42l43_readable_register (struct device * dev , unsigned int reg )
271284{
285+ struct cs42l43 * cs42l43 = dev_get_drvdata (dev );
286+
272287 switch (reg ) {
273288 case CS42L43_DEVID :
274289 case CS42L43_REVID :
@@ -292,7 +307,6 @@ bool cs42l43_readable_register(struct device *dev, unsigned int reg)
292307 case CS42L43_ADC_B_CTRL1 ... CS42L43_ADC_B_CTRL2 :
293308 case CS42L43_DECIM_HPF_WNF_CTRL1 ... CS42L43_DECIM_HPF_WNF_CTRL4 :
294309 case CS42L43_DMIC_PDM_CTRL :
295- case CS42L43_DECIM_VOL_CTRL_CH1_CH2 ... CS42L43_DECIM_VOL_CTRL_CH3_CH4 :
296310 case CS42L43_INTP_VOLUME_CTRL1 ... CS42L43_INTP_VOLUME_CTRL2 :
297311 case CS42L43_AMP1_2_VOL_RAMP :
298312 case CS42L43_ASP_CTRL :
@@ -387,8 +401,16 @@ bool cs42l43_readable_register(struct device *dev, unsigned int reg)
387401 case CS42L43_BOOT_CONTROL :
388402 case CS42L43_BLOCK_EN :
389403 case CS42L43_SHUTTER_CONTROL :
390- case CS42L43_MCU_SW_REV ... CS42L43_MCU_RAM_MAX :
391- return true;
404+ case CS42L43B_MCU_SW_REV ... CS42L43B_MCU_RAM_MAX :
405+ return true; // registers present on all variants
406+ case CS42L43_MCU_SW_REV ... CS42L43B_MCU_SW_REV - 1 :
407+ case CS42L43B_MCU_RAM_MAX + 1 ... CS42L43_MCU_RAM_MAX :
408+ case CS42L43_DECIM_VOL_CTRL_CH1_CH2 ... CS42L43_DECIM_VOL_CTRL_CH3_CH4 :
409+ return cs42l43 -> variant_id == CS42L43_DEVID_VAL ; // regs only in CS42L43 variant
410+ case CS42L43B_DECIM_VOL_CTRL_CH1_CH2 ... CS42L43B_DECIM_HPF_WNF_CTRL6 :
411+ case CS42L43B_SWIRE_DP3_CH3_INPUT ... CS42L43B_SWIRE_DP4_CH4_INPUT :
412+ case CS42L43B_ISRC1DEC3_INPUT1 ... CS42L43B_ISRC2DEC4_INPUT1 :
413+ return cs42l43 -> variant_id == CS42L43B_DEVID_VAL ; // regs only in CS42L43B variant
392414 default :
393415 return false;
394416 }
@@ -597,15 +619,27 @@ static int cs42l43_wait_for_attach(struct cs42l43 *cs42l43)
597619static int cs42l43_mcu_stage_2_3 (struct cs42l43 * cs42l43 , bool shadow )
598620{
599621 unsigned int need_reg = CS42L43_NEED_CONFIGS ;
622+ unsigned int boot_reg ;
600623 unsigned int val ;
601624 int ret ;
602625
603- if (shadow )
604- need_reg = CS42L43_FW_SH_BOOT_CFG_NEED_CONFIGS ;
626+ switch (cs42l43 -> variant_id ) {
627+ case CS42L43_DEVID_VAL :
628+ if (shadow )
629+ need_reg = CS42L43_FW_SH_BOOT_CFG_NEED_CONFIGS ;
630+ boot_reg = CS42L43_BOOT_STATUS ;
631+ break ;
632+ case CS42L43B_DEVID_VAL :
633+ need_reg = CS42L43B_NEED_CONFIGS ;
634+ boot_reg = CS42L43B_BOOT_STATUS ;
635+ break ;
636+ default :
637+ return - EINVAL ;
638+ }
605639
606640 regmap_write (cs42l43 -> regmap , need_reg , 0 );
607641
608- ret = regmap_read_poll_timeout (cs42l43 -> regmap , CS42L43_BOOT_STATUS ,
642+ ret = regmap_read_poll_timeout (cs42l43 -> regmap , boot_reg ,
609643 val , (val == CS42L43_MCU_BOOT_STAGE3 ),
610644 CS42L43_MCU_POLL_US , CS42L43_MCU_CMD_TIMEOUT_US );
611645 if (ret ) {
@@ -644,13 +678,25 @@ static int cs42l43_mcu_stage_3_2(struct cs42l43 *cs42l43)
644678 */
645679static int cs42l43_mcu_disable (struct cs42l43 * cs42l43 )
646680{
647- unsigned int val ;
681+ unsigned int val , cfg_reg , ctrl_reg ;
648682 int ret ;
649683
650- regmap_write (cs42l43 -> regmap , CS42L43_FW_MISSION_CTRL_MM_MCU_CFG_REG ,
651- CS42L43_FW_MISSION_CTRL_MM_MCU_CFG_DISABLE_VAL );
652- regmap_write (cs42l43 -> regmap , CS42L43_FW_MISSION_CTRL_MM_CTRL_SELECTION ,
653- CS42L43_FW_MM_CTRL_MCU_SEL_MASK );
684+ switch (cs42l43 -> variant_id ) {
685+ case CS42L43_DEVID_VAL :
686+ cfg_reg = CS42L43_FW_MISSION_CTRL_MM_MCU_CFG_REG ;
687+ ctrl_reg = CS42L43_FW_MISSION_CTRL_MM_CTRL_SELECTION ;
688+ break ;
689+ case CS42L43B_DEVID_VAL :
690+ cfg_reg = CS42L43B_FW_MISSION_CTRL_MM_MCU_CFG_REG ;
691+ ctrl_reg = CS42L43B_FW_MISSION_CTRL_MM_CTRL_SELECTION ;
692+ break ;
693+ default :
694+ return - EINVAL ;
695+ }
696+
697+ regmap_write (cs42l43 -> regmap , cfg_reg , CS42L43_FW_MISSION_CTRL_MM_MCU_CFG_DISABLE_VAL );
698+ regmap_write (cs42l43 -> regmap , ctrl_reg , CS42L43_FW_MM_CTRL_MCU_SEL_MASK );
699+
654700 regmap_write (cs42l43 -> regmap , CS42L43_MCU_SW_INTERRUPT , CS42L43_CONTROL_IND_MASK );
655701 regmap_write (cs42l43 -> regmap , CS42L43_MCU_SW_INTERRUPT , 0 );
656702
@@ -740,18 +786,32 @@ static int cs42l43_mcu_update_step(struct cs42l43 *cs42l43)
740786{
741787 unsigned int mcu_rev , bios_rev , boot_status , secure_cfg ;
742788 bool patched , shadow ;
789+ int boot_status_reg , mcu_sw_rev_reg ;
743790 int ret ;
744791
792+ switch (cs42l43 -> variant_id ) {
793+ case CS42L43_DEVID_VAL :
794+ boot_status_reg = CS42L43_BOOT_STATUS ;
795+ mcu_sw_rev_reg = CS42L43_MCU_SW_REV ;
796+ break ;
797+ case CS42L43B_DEVID_VAL :
798+ boot_status_reg = CS42L43B_BOOT_STATUS ;
799+ mcu_sw_rev_reg = CS42L43B_MCU_SW_REV ;
800+ break ;
801+ default :
802+ return - EINVAL ;
803+ }
804+
745805 /* Clear any stale software interrupt bits. */
746806 regmap_read (cs42l43 -> regmap , CS42L43_SOFT_INT , & mcu_rev );
747807
748- ret = regmap_read (cs42l43 -> regmap , CS42L43_BOOT_STATUS , & boot_status );
808+ ret = regmap_read (cs42l43 -> regmap , boot_status_reg , & boot_status );
749809 if (ret ) {
750810 dev_err (cs42l43 -> dev , "Failed to read boot status: %d\n" , ret );
751811 return ret ;
752812 }
753813
754- ret = regmap_read (cs42l43 -> regmap , CS42L43_MCU_SW_REV , & mcu_rev );
814+ ret = regmap_read (cs42l43 -> regmap , mcu_sw_rev_reg , & mcu_rev );
755815 if (ret ) {
756816 dev_err (cs42l43 -> dev , "Failed to read firmware revision: %d\n" , ret );
757817 return ret ;
@@ -918,6 +978,13 @@ static void cs42l43_boot_work(struct work_struct *work)
918978
919979 switch (devid ) {
920980 case CS42L43_DEVID_VAL :
981+ case CS42L43B_DEVID_VAL :
982+ if (devid != cs42l43 -> variant_id ) {
983+ dev_err (cs42l43 -> dev ,
984+ "Device ID (0x%06x) does not match variant ID (0x%06lx)\n" ,
985+ devid , cs42l43 -> variant_id );
986+ goto err ;
987+ }
921988 break ;
922989 default :
923990 dev_err (cs42l43 -> dev , "Unrecognised devid: 0x%06x\n" , devid );
0 commit comments