diff options
Diffstat (limited to 'src/mainboard/google/octopus/variants/baseboard/cbi_ssfc.c')
-rw-r--r-- | src/mainboard/google/octopus/variants/baseboard/cbi_ssfc.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/mainboard/google/octopus/variants/baseboard/cbi_ssfc.c b/src/mainboard/google/octopus/variants/baseboard/cbi_ssfc.c new file mode 100644 index 0000000000..589f92e139 --- /dev/null +++ b/src/mainboard/google/octopus/variants/baseboard/cbi_ssfc.c @@ -0,0 +1,70 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include <baseboard/cbi_ssfc.h> +#include <console/console.h> +#include <ec/google/chromeec/ec.h> + +static int get_ssfc(uint32_t *val) +{ + static uint32_t known_value; + static enum { + SSFC_NOT_READ, + SSFC_AVAILABLE, + } ssfc_state = SSFC_NOT_READ; + + if (ssfc_state == SSFC_AVAILABLE) { + *val = known_value; + return 0; + } + + /* + * If SSFC field is not in the CBI then the value of SSFC will be 0 for + * further processing later since 0 of each bits group means default + * component in a variant. For more detail, please refer to cbi_ssfc.h. + */ + if (google_chromeec_cbi_get_ssfc(&known_value) != 0) { + printk(BIOS_DEBUG, "SSFC not set in CBI\n"); + return -1; + } + + ssfc_state = SSFC_AVAILABLE; + *val = known_value; + printk(BIOS_INFO, "SSFC 0x%x.\n", known_value); + + return 0; +} + +static unsigned int extract_field(uint32_t mask, int shift) +{ + uint32_t ssfc; + + /* On errors nothing is assumed to be set. */ + if (get_ssfc(&ssfc)) + return 0; + + return (ssfc >> shift) & mask; +} + +static enum ssfc_audio_codec ssfc_get_default_audio_codec(void) +{ + /* + * Octopus has two reference boards; yorp is with DA7219 and bip is with + * RT5682. Currently only AMPTON derived from bip so only it uses + * RT5682 as the default source in the first MP devices. + */ + if (CONFIG(BOARD_GOOGLE_AMPTON)) + return SSFC_AUDIO_CODEC_RT5682; + + return SSFC_AUDIO_CODEC_DA7219; +} + +enum ssfc_audio_codec ssfc_get_audio_codec(void) +{ + uint32_t codec = extract_field( + SSFC_AUDIO_CODEC_MASK, SSFC_AUDIO_CODEC_OFFSET); + + if (codec != SSFC_AUDIO_CODEC_DEFAULT) + return codec; + + return ssfc_get_default_audio_codec(); +} |