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