Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: cs35l56: Add support for CS35L56 B2 silicon

This adds support for changed firmware addresses on the B2 revision of
CS35L56 silicon.

Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>

authored by

Richard Fitzgerald and committed by
Takashi Iwai
33da2d89 ab91835e

+38 -4
+2
include/sound/cs35l56.h
··· 85 85 #define CS35L56_DSP1_XMEM_UNPACKED24_0 0x2800000 86 86 #define CS35L56_DSP1_FW_VER 0x2800010 87 87 #define CS35L56_DSP1_HALO_STATE 0x28021E0 88 + #define CS35L56_B2_DSP1_HALO_STATE 0x2803D20 88 89 #define CS35L56_DSP1_PM_CUR_STATE 0x2804308 90 + #define CS35L56_B2_DSP1_PM_CUR_STATE 0x2804678 89 91 #define CS35L56_DSP1_XMEM_UNPACKED24_8191 0x2807FFC 90 92 #define CS35L56_DSP1_CORE_BASE 0x2B80000 91 93 #define CS35L56_DSP1_SCRATCH1 0x2B805C0
+36 -4
sound/soc/codecs/cs35l56-shared.c
··· 320 320 .posture_number = CS35L56_MAIN_POSTURE_NUMBER, 321 321 }; 322 322 323 + static const struct cs35l56_fw_reg cs35l56_b2_fw_reg = { 324 + .fw_ver = CS35L56_DSP1_FW_VER, 325 + .halo_state = CS35L56_B2_DSP1_HALO_STATE, 326 + .pm_cur_stat = CS35L56_B2_DSP1_PM_CUR_STATE, 327 + .prot_sts = CS35L56_PROTECTION_STATUS, 328 + .transducer_actual_ps = CS35L56_TRANSDUCER_ACTUAL_PS, 329 + .user_mute = CS35L56_MAIN_RENDER_USER_MUTE, 330 + .user_volume = CS35L56_MAIN_RENDER_USER_VOLUME, 331 + .posture_number = CS35L56_MAIN_POSTURE_NUMBER, 332 + }; 333 + 323 334 static const struct cs35l56_fw_reg cs35l63_fw_reg = { 324 335 .fw_ver = CS35L63_DSP1_FW_VER, 325 336 .halo_state = CS35L63_DSP1_HALO_STATE, ··· 346 335 { 347 336 switch (cs35l56_base->type) { 348 337 default: 349 - cs35l56_base->fw_reg = &cs35l56_fw_reg; 338 + switch (cs35l56_base->rev) { 339 + case 0xb0: 340 + cs35l56_base->fw_reg = &cs35l56_fw_reg; 341 + break; 342 + default: 343 + cs35l56_base->fw_reg = &cs35l56_b2_fw_reg; 344 + break; 345 + } 350 346 break; 351 347 case 0x63: 352 348 cs35l56_base->fw_reg = &cs35l63_fw_reg; ··· 520 502 REG_SEQ0(CS35L56_DSP_VIRTUAL1_MBOX_1, CS35L56_MBOX_CMD_SYSTEM_RESET), 521 503 }; 522 504 505 + static const struct reg_sequence cs35l56_b2_system_reset_seq[] = { 506 + REG_SEQ0(CS35L56_B2_DSP1_HALO_STATE, 0), 507 + REG_SEQ0(CS35L56_DSP_VIRTUAL1_MBOX_1, CS35L56_MBOX_CMD_SYSTEM_RESET), 508 + }; 509 + 523 510 static const struct reg_sequence cs35l63_system_reset_seq[] = { 524 511 REG_SEQ0(CS35L63_DSP1_HALO_STATE, 0), 525 512 REG_SEQ0(CS35L56_DSP_VIRTUAL1_MBOX_1, CS35L56_MBOX_CMD_SYSTEM_RESET), ··· 547 524 case 0x54: 548 525 case 0x56: 549 526 case 0x57: 550 - regmap_multi_reg_write_bypassed(cs35l56_base->regmap, 551 - cs35l56_system_reset_seq, 552 - ARRAY_SIZE(cs35l56_system_reset_seq)); 527 + switch (cs35l56_base->rev) { 528 + case 0xb0: 529 + regmap_multi_reg_write_bypassed(cs35l56_base->regmap, 530 + cs35l56_system_reset_seq, 531 + ARRAY_SIZE(cs35l56_system_reset_seq)); 532 + break; 533 + default: 534 + regmap_multi_reg_write_bypassed(cs35l56_base->regmap, 535 + cs35l56_b2_system_reset_seq, 536 + ARRAY_SIZE(cs35l56_b2_system_reset_seq)); 537 + break; 538 + } 553 539 break; 554 540 case 0x63: 555 541 regmap_multi_reg_write_bypassed(cs35l56_base->regmap,