@@ -47,6 +47,13 @@ static const struct reg_sequence cs35l56_patch_fw[] = {
4747 { CS35L56_MAIN_POSTURE_NUMBER , 0x00000000 },
4848};
4949
50+ static const struct reg_sequence cs35l63_patch_fw [] = {
51+ /* These are not reset by a soft-reset, so patch to defaults. */
52+ { CS35L63_MAIN_RENDER_USER_MUTE , 0x00000000 },
53+ { CS35L63_MAIN_RENDER_USER_VOLUME , 0x00000000 },
54+ { CS35L63_MAIN_POSTURE_NUMBER , 0x00000000 },
55+ };
56+
5057int cs35l56_set_patch (struct cs35l56_base * cs35l56_base )
5158{
5259 int ret ;
@@ -64,6 +71,10 @@ int cs35l56_set_patch(struct cs35l56_base *cs35l56_base)
6471 ret = regmap_register_patch (cs35l56_base -> regmap , cs35l56_patch_fw ,
6572 ARRAY_SIZE (cs35l56_patch_fw ));
6673 break ;
74+ case 0x63 :
75+ ret = regmap_register_patch (cs35l56_base -> regmap , cs35l63_patch_fw ,
76+ ARRAY_SIZE (cs35l63_patch_fw ));
77+ break ;
6778 default :
6879 break ;
6980 }
@@ -102,6 +113,36 @@ static const struct reg_default cs35l56_reg_defaults[] = {
102113 { CS35L56_MAIN_POSTURE_NUMBER , 0x00000000 },
103114};
104115
116+ static const struct reg_default cs35l63_reg_defaults [] = {
117+ /* no defaults for OTP_MEM - first read populates cache */
118+
119+ { CS35L56_ASP1_ENABLES1 , 0x00000000 },
120+ { CS35L56_ASP1_CONTROL1 , 0x00000028 },
121+ { CS35L56_ASP1_CONTROL2 , 0x18180200 },
122+ { CS35L56_ASP1_CONTROL3 , 0x00000002 },
123+ { CS35L56_ASP1_FRAME_CONTROL1 , 0x03020100 },
124+ { CS35L56_ASP1_FRAME_CONTROL5 , 0x00020100 },
125+ { CS35L56_ASP1_DATA_CONTROL1 , 0x00000018 },
126+ { CS35L56_ASP1_DATA_CONTROL5 , 0x00000018 },
127+ { CS35L56_ASP1TX1_INPUT , 0x00000000 },
128+ { CS35L56_ASP1TX2_INPUT , 0x00000000 },
129+ { CS35L56_ASP1TX3_INPUT , 0x00000000 },
130+ { CS35L56_ASP1TX4_INPUT , 0x00000000 },
131+ { CS35L56_SWIRE_DP3_CH1_INPUT , 0x00000018 },
132+ { CS35L56_SWIRE_DP3_CH2_INPUT , 0x00000019 },
133+ { CS35L56_SWIRE_DP3_CH3_INPUT , 0x00000029 },
134+ { CS35L56_SWIRE_DP3_CH4_INPUT , 0x00000028 },
135+ { CS35L56_IRQ1_MASK_1 , 0x8003ffff },
136+ { CS35L56_IRQ1_MASK_2 , 0xffff7fff },
137+ { CS35L56_IRQ1_MASK_4 , 0xe0ffffff },
138+ { CS35L56_IRQ1_MASK_8 , 0x8c000fff },
139+ { CS35L56_IRQ1_MASK_18 , 0x0760f000 },
140+ { CS35L56_IRQ1_MASK_20 , 0x15c00000 },
141+ { CS35L63_MAIN_RENDER_USER_MUTE , 0x00000000 },
142+ { CS35L63_MAIN_RENDER_USER_VOLUME , 0x00000000 },
143+ { CS35L63_MAIN_POSTURE_NUMBER , 0x00000000 },
144+ };
145+
105146static bool cs35l56_is_dsp_memory (unsigned int reg )
106147{
107148 switch (reg ) {
@@ -199,7 +240,7 @@ static bool cs35l56_precious_reg(struct device *dev, unsigned int reg)
199240 }
200241}
201242
202- static bool cs35l56_volatile_reg ( struct device * dev , unsigned int reg )
243+ static bool cs35l56_common_volatile_reg ( unsigned int reg )
203244{
204245 switch (reg ) {
205246 case CS35L56_DEVID :
@@ -237,12 +278,32 @@ static bool cs35l56_volatile_reg(struct device *dev, unsigned int reg)
237278 case CS35L56_DSP1_SCRATCH3 :
238279 case CS35L56_DSP1_SCRATCH4 :
239280 return true;
281+ default :
282+ return cs35l56_is_dsp_memory (reg );
283+ }
284+ }
285+
286+ static bool cs35l56_volatile_reg (struct device * dev , unsigned int reg )
287+ {
288+ switch (reg ) {
240289 case CS35L56_MAIN_RENDER_USER_MUTE :
241290 case CS35L56_MAIN_RENDER_USER_VOLUME :
242291 case CS35L56_MAIN_POSTURE_NUMBER :
243292 return false;
244293 default :
245- return cs35l56_is_dsp_memory (reg );
294+ return cs35l56_common_volatile_reg (reg );
295+ }
296+ }
297+
298+ static bool cs35l63_volatile_reg (struct device * dev , unsigned int reg )
299+ {
300+ switch (reg ) {
301+ case CS35L63_MAIN_RENDER_USER_MUTE :
302+ case CS35L63_MAIN_RENDER_USER_VOLUME :
303+ case CS35L63_MAIN_POSTURE_NUMBER :
304+ return false;
305+ default :
306+ return cs35l56_common_volatile_reg (reg );
246307 }
247308}
248309
@@ -405,6 +466,11 @@ static const struct reg_sequence cs35l56_system_reset_seq[] = {
405466 REG_SEQ0 (CS35L56_DSP_VIRTUAL1_MBOX_1 , CS35L56_MBOX_CMD_SYSTEM_RESET ),
406467};
407468
469+ static const struct reg_sequence cs35l63_system_reset_seq [] = {
470+ REG_SEQ0 (CS35L63_DSP1_HALO_STATE , 0 ),
471+ REG_SEQ0 (CS35L56_DSP_VIRTUAL1_MBOX_1 , CS35L56_MBOX_CMD_SYSTEM_RESET ),
472+ };
473+
408474void cs35l56_system_reset (struct cs35l56_base * cs35l56_base , bool is_soundwire )
409475{
410476 /*
@@ -426,6 +492,11 @@ void cs35l56_system_reset(struct cs35l56_base *cs35l56_base, bool is_soundwire)
426492 cs35l56_system_reset_seq ,
427493 ARRAY_SIZE (cs35l56_system_reset_seq ));
428494 break ;
495+ case 0x63 :
496+ regmap_multi_reg_write_bypassed (cs35l56_base -> regmap ,
497+ cs35l63_system_reset_seq ,
498+ ARRAY_SIZE (cs35l63_system_reset_seq ));
499+ break ;
429500 default :
430501 break ;
431502 }
@@ -844,6 +915,9 @@ int cs35l56_hw_init(struct cs35l56_base *cs35l56_base)
844915 case 0x35A56 :
845916 case 0x35A57 :
846917 break ;
918+ case 0x35A630 :
919+ devid = devid >> 4 ;
920+ break ;
847921 default :
848922 dev_err (cs35l56_base -> dev , "Unknown device %x\n" , devid );
849923 return ret ;
@@ -1080,6 +1154,39 @@ const struct regmap_config cs35l56_regmap_sdw = {
10801154};
10811155EXPORT_SYMBOL_NS_GPL (cs35l56_regmap_sdw , "SND_SOC_CS35L56_SHARED" );
10821156
1157+ const struct regmap_config cs35l63_regmap_i2c = {
1158+ .reg_bits = 32 ,
1159+ .val_bits = 32 ,
1160+ .reg_stride = 4 ,
1161+ .reg_base = 0x8000 ,
1162+ .reg_format_endian = REGMAP_ENDIAN_BIG ,
1163+ .val_format_endian = REGMAP_ENDIAN_BIG ,
1164+ .max_register = CS35L56_DSP1_PMEM_5114 ,
1165+ .reg_defaults = cs35l63_reg_defaults ,
1166+ .num_reg_defaults = ARRAY_SIZE (cs35l63_reg_defaults ),
1167+ .volatile_reg = cs35l63_volatile_reg ,
1168+ .readable_reg = cs35l56_readable_reg ,
1169+ .precious_reg = cs35l56_precious_reg ,
1170+ .cache_type = REGCACHE_MAPLE ,
1171+ };
1172+ EXPORT_SYMBOL_NS_GPL (cs35l63_regmap_i2c , "SND_SOC_CS35L56_SHARED" );
1173+
1174+ const struct regmap_config cs35l63_regmap_sdw = {
1175+ .reg_bits = 32 ,
1176+ .val_bits = 32 ,
1177+ .reg_stride = 4 ,
1178+ .reg_format_endian = REGMAP_ENDIAN_LITTLE ,
1179+ .val_format_endian = REGMAP_ENDIAN_BIG ,
1180+ .max_register = CS35L56_DSP1_PMEM_5114 ,
1181+ .reg_defaults = cs35l63_reg_defaults ,
1182+ .num_reg_defaults = ARRAY_SIZE (cs35l63_reg_defaults ),
1183+ .volatile_reg = cs35l63_volatile_reg ,
1184+ .readable_reg = cs35l56_readable_reg ,
1185+ .precious_reg = cs35l56_precious_reg ,
1186+ .cache_type = REGCACHE_MAPLE ,
1187+ };
1188+ EXPORT_SYMBOL_NS_GPL (cs35l63_regmap_sdw , "SND_SOC_CS35L56_SHARED" );
1189+
10831190const struct cs35l56_fw_reg cs35l56_fw_reg = {
10841191 .fw_ver = CS35L56_DSP1_FW_VER ,
10851192 .halo_state = CS35L56_DSP1_HALO_STATE ,
@@ -1092,6 +1199,18 @@ const struct cs35l56_fw_reg cs35l56_fw_reg = {
10921199};
10931200EXPORT_SYMBOL_NS_GPL (cs35l56_fw_reg , "SND_SOC_CS35L56_SHARED" );
10941201
1202+ const struct cs35l56_fw_reg cs35l63_fw_reg = {
1203+ .fw_ver = CS35L63_DSP1_FW_VER ,
1204+ .halo_state = CS35L63_DSP1_HALO_STATE ,
1205+ .pm_cur_stat = CS35L63_DSP1_PM_CUR_STATE ,
1206+ .prot_sts = CS35L63_PROTECTION_STATUS ,
1207+ .transducer_actual_ps = CS35L63_TRANSDUCER_ACTUAL_PS ,
1208+ .user_mute = CS35L63_MAIN_RENDER_USER_MUTE ,
1209+ .user_volume = CS35L63_MAIN_RENDER_USER_VOLUME ,
1210+ .posture_number = CS35L63_MAIN_POSTURE_NUMBER ,
1211+ };
1212+ EXPORT_SYMBOL_NS_GPL (cs35l63_fw_reg , "SND_SOC_CS35L56_SHARED" );
1213+
10951214MODULE_DESCRIPTION ("ASoC CS35L56 Shared" );
10961215MODULE_AUTHOR ("Richard Fitzgerald <rf@opensource.cirrus.com>" );
10971216MODULE_AUTHOR ("Simon Trimmer <simont@opensource.cirrus.com>" );
0 commit comments