/* * Copyright 2019 The ChromiumOS Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "audio_codec.h" #include "console.h" #include "host_command.h" #define CPRINTS(format, args...) cprints(CC_AUDIO_CODEC, format, ##args) static enum ec_status dmic_get_max_gain(struct host_cmd_handler_args *args) { struct ec_response_ec_codec_dmic_get_max_gain *r = args->response; if (audio_codec_dmic_get_max_gain(&r->max_gain) != EC_SUCCESS) return EC_RES_ERROR; args->response_size = sizeof(*r); return EC_RES_SUCCESS; } static enum ec_status dmic_set_gain_idx(struct host_cmd_handler_args *args) { const struct ec_param_ec_codec_dmic *p = args->params; if (audio_codec_dmic_set_gain_idx(p->set_gain_idx_param.channel, p->set_gain_idx_param.gain) != EC_SUCCESS) return EC_RES_ERROR; return EC_RES_SUCCESS; } static enum ec_status dmic_get_gain_idx(struct host_cmd_handler_args *args) { const struct ec_param_ec_codec_dmic *p = args->params; struct ec_response_ec_codec_dmic_get_gain_idx *r = args->response; if (audio_codec_dmic_get_gain_idx(p->get_gain_idx_param.channel, &r->gain) != EC_SUCCESS) return EC_RES_ERROR; args->response_size = sizeof(*r); return EC_RES_SUCCESS; } static enum ec_status (*sub_cmds[])(struct host_cmd_handler_args *) = { [EC_CODEC_DMIC_GET_MAX_GAIN] = dmic_get_max_gain, [EC_CODEC_DMIC_SET_GAIN_IDX] = dmic_set_gain_idx, [EC_CODEC_DMIC_GET_GAIN_IDX] = dmic_get_gain_idx, }; #ifdef DEBUG_AUDIO_CODEC static char *strcmd[] = { [EC_CODEC_DMIC_GET_MAX_GAIN] = "EC_CODEC_DMIC_GET_MAX_GAIN", [EC_CODEC_DMIC_SET_GAIN_IDX] = "EC_CODEC_DMIC_SET_GAIN_IDX", [EC_CODEC_DMIC_GET_GAIN_IDX] = "EC_CODEC_DMIC_GET_GAIN_IDX", }; BUILD_ASSERT(ARRAY_SIZE(sub_cmds) == ARRAY_SIZE(strcmd)); #endif static enum ec_status dmic_host_command(struct host_cmd_handler_args *args) { const struct ec_param_ec_codec_dmic *p = args->params; #ifdef DEBUG_AUDIO_CODEC CPRINTS("DMIC subcommand: %s", strcmd[p->cmd]); #endif if (p->cmd < EC_CODEC_DMIC_SUBCMD_COUNT) return sub_cmds[p->cmd](args); return EC_RES_INVALID_PARAM; } DECLARE_HOST_COMMAND(EC_CMD_EC_CODEC_DMIC, dmic_host_command, EC_VER_MASK(0)); #ifdef CONFIG_AUDIO_CODEC_DMIC_SOFTWARE_GAIN static uint8_t channel_gains[EC_CODEC_DMIC_CHANNEL_COUNT]; int audio_codec_dmic_get_max_gain(uint8_t *gain) { *gain = CONFIG_AUDIO_CODEC_DMIC_MAX_SOFTWARE_GAIN; return EC_SUCCESS; } int audio_codec_dmic_set_gain_idx(uint8_t channel, uint8_t gain) { if (channel >= ARRAY_SIZE(channel_gains)) return EC_ERROR_INVAL; if (gain > CONFIG_AUDIO_CODEC_DMIC_MAX_SOFTWARE_GAIN) return EC_ERROR_INVAL; channel_gains[channel] = gain; return EC_SUCCESS; } int audio_codec_dmic_get_gain_idx(uint8_t channel, uint8_t *gain) { if (channel >= ARRAY_SIZE(channel_gains)) return EC_ERROR_INVAL; *gain = channel_gains[channel]; return EC_SUCCESS; } #endif