1c72fcc34Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause 2c72fcc34Sopenharmony_ci// 3c72fcc34Sopenharmony_ci// Copyright(c) 2021 Intel Corporation. All rights reserved. 4c72fcc34Sopenharmony_ci// 5c72fcc34Sopenharmony_ci// Author: Jaska Uimonen <jaska.uimonen@linux.intel.com> 6c72fcc34Sopenharmony_ci 7c72fcc34Sopenharmony_ci#include "aconfig.h" 8c72fcc34Sopenharmony_ci#include "intel-nhlt.h" 9c72fcc34Sopenharmony_ci 10c72fcc34Sopenharmony_cistatic int get_int_val(snd_config_t *input, long *int_val, snd_config_t *top) 11c72fcc34Sopenharmony_ci{ 12c72fcc34Sopenharmony_ci char tplg_define[128] = "Define."; 13c72fcc34Sopenharmony_ci snd_config_t *n; 14c72fcc34Sopenharmony_ci const char *s; 15c72fcc34Sopenharmony_ci int ret; 16c72fcc34Sopenharmony_ci 17c72fcc34Sopenharmony_ci if (snd_config_get_string(input, &s) < 0) 18c72fcc34Sopenharmony_ci return snd_config_get_integer(input, int_val); 19c72fcc34Sopenharmony_ci 20c72fcc34Sopenharmony_ci if (*s != '$') 21c72fcc34Sopenharmony_ci return 0; 22c72fcc34Sopenharmony_ci 23c72fcc34Sopenharmony_ci strcat(tplg_define, s + 1); 24c72fcc34Sopenharmony_ci 25c72fcc34Sopenharmony_ci ret = snd_config_search(top, tplg_define, &n); 26c72fcc34Sopenharmony_ci if (ret < 0) 27c72fcc34Sopenharmony_ci return ret; 28c72fcc34Sopenharmony_ci 29c72fcc34Sopenharmony_ci return snd_config_get_integer(n, int_val); 30c72fcc34Sopenharmony_ci} 31c72fcc34Sopenharmony_ci 32c72fcc34Sopenharmony_cistatic int get_string_val(snd_config_t *input, const char **string_val, snd_config_t *top) 33c72fcc34Sopenharmony_ci{ 34c72fcc34Sopenharmony_ci char tplg_define[128] = "Define."; 35c72fcc34Sopenharmony_ci snd_config_t *n; 36c72fcc34Sopenharmony_ci int ret; 37c72fcc34Sopenharmony_ci 38c72fcc34Sopenharmony_ci if (snd_config_get_string(input, string_val) < 0) 39c72fcc34Sopenharmony_ci return -EINVAL; 40c72fcc34Sopenharmony_ci 41c72fcc34Sopenharmony_ci if (**string_val != '$') 42c72fcc34Sopenharmony_ci return 0; 43c72fcc34Sopenharmony_ci 44c72fcc34Sopenharmony_ci strcat(tplg_define, *string_val + 1); 45c72fcc34Sopenharmony_ci 46c72fcc34Sopenharmony_ci ret = snd_config_search(top, tplg_define, &n); 47c72fcc34Sopenharmony_ci if (ret < 0) 48c72fcc34Sopenharmony_ci return ret; 49c72fcc34Sopenharmony_ci 50c72fcc34Sopenharmony_ci return snd_config_get_string(n, string_val); 51c72fcc34Sopenharmony_ci} 52c72fcc34Sopenharmony_ci 53c72fcc34Sopenharmony_ci#ifdef NHLT_DEBUG 54c72fcc34Sopenharmony_cistatic void print_array_values(struct dai_values *values, int size) 55c72fcc34Sopenharmony_ci{ 56c72fcc34Sopenharmony_ci int i; 57c72fcc34Sopenharmony_ci 58c72fcc34Sopenharmony_ci fprintf(stdout, "print parsed array:\n"); 59c72fcc34Sopenharmony_ci for (i = 0; i < size; i++, values++) { 60c72fcc34Sopenharmony_ci if (values->type == SND_CONFIG_TYPE_INTEGER) 61c72fcc34Sopenharmony_ci fprintf(stdout, "%s %ld\n", values->name, *values->int_val); 62c72fcc34Sopenharmony_ci else 63c72fcc34Sopenharmony_ci fprintf(stdout, "%s %s\n", values->name, *values->string_val); 64c72fcc34Sopenharmony_ci } 65c72fcc34Sopenharmony_ci fprintf(stdout, "\n"); 66c72fcc34Sopenharmony_ci} 67c72fcc34Sopenharmony_ci#endif 68c72fcc34Sopenharmony_ci 69c72fcc34Sopenharmony_ciint find_set_values(struct dai_values *values, int size, snd_config_t *dai_cfg, 70c72fcc34Sopenharmony_ci snd_config_t *top, const char *class_name) 71c72fcc34Sopenharmony_ci{ 72c72fcc34Sopenharmony_ci snd_config_iterator_t i, next; 73c72fcc34Sopenharmony_ci struct dai_values *temp_val; 74c72fcc34Sopenharmony_ci snd_config_t *class_cfg; 75c72fcc34Sopenharmony_ci snd_config_t *n; 76c72fcc34Sopenharmony_ci const char *id; 77c72fcc34Sopenharmony_ci int ret; 78c72fcc34Sopenharmony_ci int j; 79c72fcc34Sopenharmony_ci 80c72fcc34Sopenharmony_ci /* get default values from class definition */ 81c72fcc34Sopenharmony_ci ret = snd_config_search(top, class_name, &class_cfg); 82c72fcc34Sopenharmony_ci if (ret < 0) 83c72fcc34Sopenharmony_ci return ret; 84c72fcc34Sopenharmony_ci 85c72fcc34Sopenharmony_ci snd_config_for_each(i, next, class_cfg) { 86c72fcc34Sopenharmony_ci n = snd_config_iterator_entry(i); 87c72fcc34Sopenharmony_ci 88c72fcc34Sopenharmony_ci if (snd_config_get_id(n, &id) < 0) 89c72fcc34Sopenharmony_ci continue; 90c72fcc34Sopenharmony_ci 91c72fcc34Sopenharmony_ci for (j = 0, temp_val = values; j < size; j++, temp_val++) { 92c72fcc34Sopenharmony_ci if (!strcmp(id, temp_val->name)) { 93c72fcc34Sopenharmony_ci temp_val->data = n; 94c72fcc34Sopenharmony_ci break; 95c72fcc34Sopenharmony_ci } 96c72fcc34Sopenharmony_ci } 97c72fcc34Sopenharmony_ci } 98c72fcc34Sopenharmony_ci 99c72fcc34Sopenharmony_ci /* set instance specific values */ 100c72fcc34Sopenharmony_ci snd_config_for_each(i, next, dai_cfg) { 101c72fcc34Sopenharmony_ci n = snd_config_iterator_entry(i); 102c72fcc34Sopenharmony_ci 103c72fcc34Sopenharmony_ci if (snd_config_get_id(n, &id) < 0) 104c72fcc34Sopenharmony_ci continue; 105c72fcc34Sopenharmony_ci 106c72fcc34Sopenharmony_ci for (j = 0, temp_val = values; j < size; j++, temp_val++) { 107c72fcc34Sopenharmony_ci if (!strcmp(id, temp_val->name)) { 108c72fcc34Sopenharmony_ci temp_val->data = n; 109c72fcc34Sopenharmony_ci break; 110c72fcc34Sopenharmony_ci } 111c72fcc34Sopenharmony_ci } 112c72fcc34Sopenharmony_ci } 113c72fcc34Sopenharmony_ci 114c72fcc34Sopenharmony_ci for (j = 0, temp_val = values; j < size; j++, temp_val++) { 115c72fcc34Sopenharmony_ci if (!temp_val->data) 116c72fcc34Sopenharmony_ci continue; 117c72fcc34Sopenharmony_ci if (temp_val->type == SND_CONFIG_TYPE_INTEGER) 118c72fcc34Sopenharmony_ci get_int_val(temp_val->data, temp_val->int_val, top); 119c72fcc34Sopenharmony_ci else 120c72fcc34Sopenharmony_ci get_string_val(temp_val->data, temp_val->string_val, top); 121c72fcc34Sopenharmony_ci } 122c72fcc34Sopenharmony_ci 123c72fcc34Sopenharmony_ci#ifdef NHLT_DEBUG 124c72fcc34Sopenharmony_ci print_array_values(values, size); 125c72fcc34Sopenharmony_ci#endif 126c72fcc34Sopenharmony_ci return 0; 127c72fcc34Sopenharmony_ci} 128