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

ASoC: SDCA: Add terminal type into input/output widget name

There have been some complaints around the UCM files for SDCA
devices that the control system is quite hard to follow. This is
definitely true without the specification handy the naming can be
a little cryptic. However, as most of the information is parsed
from DisCo there are some limits to what the driver can safely do
to improve this.

However, one area that can be improved is the non-streaming
input/output terminals. These have a field (enum sdca_terminal_type)
that describes the usage of that terminal. These types can be
appended to the entity name to give the users a better clue as
to the purpose. For example "OT 43", would now become "OT 43
Headphone". This would follow through into the jack controls which
would change from "OT 43 Jack" to "OT 43 Headphone Jack", making the
purpose much more obvious to the user.

This provides slightly more readable controls without relying on
implicit knowledge that individual parts might not conform to.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://patch.msgid.link/20251127163426.2500633-3-ckeepax@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Charles Keepax and committed by
Mark Brown
48fa77af 5fee9edf

+59 -47
+2
include/sound/sdca_function.h
··· 1456 1456 struct sdca_function_desc *desc, 1457 1457 struct sdca_function_data *function); 1458 1458 1459 + const char *sdca_find_terminal_name(enum sdca_terminal_type type); 1460 + 1459 1461 struct sdca_control *sdca_selector_find_control(struct device *dev, 1460 1462 struct sdca_entity *entity, 1461 1463 const int sel);
+2 -46
sound/soc/sdca/sdca_asoc.c
··· 115 115 } 116 116 EXPORT_SYMBOL_NS(sdca_asoc_count_component, "SND_SOC_SDCA"); 117 117 118 - static const char *get_terminal_name(enum sdca_terminal_type type) 119 - { 120 - switch (type) { 121 - case SDCA_TERM_TYPE_LINEIN_STEREO: 122 - return SDCA_TERM_TYPE_LINEIN_STEREO_NAME; 123 - case SDCA_TERM_TYPE_LINEIN_FRONT_LR: 124 - return SDCA_TERM_TYPE_LINEIN_FRONT_LR_NAME; 125 - case SDCA_TERM_TYPE_LINEIN_CENTER_LFE: 126 - return SDCA_TERM_TYPE_LINEIN_CENTER_LFE_NAME; 127 - case SDCA_TERM_TYPE_LINEIN_SURROUND_LR: 128 - return SDCA_TERM_TYPE_LINEIN_SURROUND_LR_NAME; 129 - case SDCA_TERM_TYPE_LINEIN_REAR_LR: 130 - return SDCA_TERM_TYPE_LINEIN_REAR_LR_NAME; 131 - case SDCA_TERM_TYPE_LINEOUT_STEREO: 132 - return SDCA_TERM_TYPE_LINEOUT_STEREO_NAME; 133 - case SDCA_TERM_TYPE_LINEOUT_FRONT_LR: 134 - return SDCA_TERM_TYPE_LINEOUT_FRONT_LR_NAME; 135 - case SDCA_TERM_TYPE_LINEOUT_CENTER_LFE: 136 - return SDCA_TERM_TYPE_LINEOUT_CENTER_LFE_NAME; 137 - case SDCA_TERM_TYPE_LINEOUT_SURROUND_LR: 138 - return SDCA_TERM_TYPE_LINEOUT_SURROUND_LR_NAME; 139 - case SDCA_TERM_TYPE_LINEOUT_REAR_LR: 140 - return SDCA_TERM_TYPE_LINEOUT_REAR_LR_NAME; 141 - case SDCA_TERM_TYPE_MIC_JACK: 142 - return SDCA_TERM_TYPE_MIC_JACK_NAME; 143 - case SDCA_TERM_TYPE_STEREO_JACK: 144 - return SDCA_TERM_TYPE_STEREO_JACK_NAME; 145 - case SDCA_TERM_TYPE_FRONT_LR_JACK: 146 - return SDCA_TERM_TYPE_FRONT_LR_JACK_NAME; 147 - case SDCA_TERM_TYPE_CENTER_LFE_JACK: 148 - return SDCA_TERM_TYPE_CENTER_LFE_JACK_NAME; 149 - case SDCA_TERM_TYPE_SURROUND_LR_JACK: 150 - return SDCA_TERM_TYPE_SURROUND_LR_JACK_NAME; 151 - case SDCA_TERM_TYPE_REAR_LR_JACK: 152 - return SDCA_TERM_TYPE_REAR_LR_JACK_NAME; 153 - case SDCA_TERM_TYPE_HEADPHONE_JACK: 154 - return SDCA_TERM_TYPE_HEADPHONE_JACK_NAME; 155 - case SDCA_TERM_TYPE_HEADSET_JACK: 156 - return SDCA_TERM_TYPE_HEADSET_JACK_NAME; 157 - default: 158 - return NULL; 159 - } 160 - } 161 - 162 118 static int entity_early_parse_ge(struct device *dev, 163 119 struct sdca_function_data *function, 164 120 struct sdca_entity *entity) ··· 173 217 type = sdca_range(range, SDCA_SELECTED_MODE_TERM_TYPE, i); 174 218 175 219 values[i + 3] = sdca_range(range, SDCA_SELECTED_MODE_INDEX, i); 176 - texts[i + 3] = get_terminal_name(type); 220 + texts[i + 3] = sdca_find_terminal_name(type); 177 221 if (!texts[i + 3]) { 178 222 dev_err(dev, "%s: unrecognised terminal type: %#x\n", 179 223 entity->label, type); ··· 455 499 return -EINVAL; 456 500 } 457 501 458 - add_route(route, entity->label, get_terminal_name(term), 502 + add_route(route, entity->label, sdca_find_terminal_name(term), 459 503 entity->sources[affected->val - 1]->label); 460 504 } 461 505 }
+55 -1
sound/soc/sdca/sdca_functions.c
··· 14 14 #include <linux/module.h> 15 15 #include <linux/property.h> 16 16 #include <linux/soundwire/sdw.h> 17 + #include <linux/string.h> 17 18 #include <linux/types.h> 18 19 #include <sound/sdca.h> 19 20 #include <sound/sdca_function.h> ··· 1121 1120 terminal->type = tmp; 1122 1121 terminal->is_dataport = find_sdca_iot_dataport(terminal); 1123 1122 1123 + if (!terminal->is_dataport) { 1124 + const char *type_name = sdca_find_terminal_name(terminal->type); 1125 + 1126 + if (type_name) 1127 + entity->label = devm_kasprintf(dev, GFP_KERNEL, "%s %s", 1128 + entity->label, type_name); 1129 + } 1130 + 1124 1131 ret = fwnode_property_read_u32(entity_node, 1125 1132 "mipi-sdca-terminal-reference-number", &tmp); 1126 1133 if (!ret) ··· 1574 1565 for (i = 0; i < function->num_entities; i++) { 1575 1566 struct sdca_entity *entity = &function->entities[i]; 1576 1567 1577 - if (!strcmp(entity->label, entity_label)) 1568 + if (!strncmp(entity->label, entity_label, strlen(entity_label))) 1578 1569 return entity; 1579 1570 } 1580 1571 ··· 2164 2155 return 0; 2165 2156 } 2166 2157 EXPORT_SYMBOL_NS(sdca_parse_function, "SND_SOC_SDCA"); 2158 + 2159 + const char *sdca_find_terminal_name(enum sdca_terminal_type type) 2160 + { 2161 + switch (type) { 2162 + case SDCA_TERM_TYPE_LINEIN_STEREO: 2163 + return SDCA_TERM_TYPE_LINEIN_STEREO_NAME; 2164 + case SDCA_TERM_TYPE_LINEIN_FRONT_LR: 2165 + return SDCA_TERM_TYPE_LINEIN_FRONT_LR_NAME; 2166 + case SDCA_TERM_TYPE_LINEIN_CENTER_LFE: 2167 + return SDCA_TERM_TYPE_LINEIN_CENTER_LFE_NAME; 2168 + case SDCA_TERM_TYPE_LINEIN_SURROUND_LR: 2169 + return SDCA_TERM_TYPE_LINEIN_SURROUND_LR_NAME; 2170 + case SDCA_TERM_TYPE_LINEIN_REAR_LR: 2171 + return SDCA_TERM_TYPE_LINEIN_REAR_LR_NAME; 2172 + case SDCA_TERM_TYPE_LINEOUT_STEREO: 2173 + return SDCA_TERM_TYPE_LINEOUT_STEREO_NAME; 2174 + case SDCA_TERM_TYPE_LINEOUT_FRONT_LR: 2175 + return SDCA_TERM_TYPE_LINEOUT_FRONT_LR_NAME; 2176 + case SDCA_TERM_TYPE_LINEOUT_CENTER_LFE: 2177 + return SDCA_TERM_TYPE_LINEOUT_CENTER_LFE_NAME; 2178 + case SDCA_TERM_TYPE_LINEOUT_SURROUND_LR: 2179 + return SDCA_TERM_TYPE_LINEOUT_SURROUND_LR_NAME; 2180 + case SDCA_TERM_TYPE_LINEOUT_REAR_LR: 2181 + return SDCA_TERM_TYPE_LINEOUT_REAR_LR_NAME; 2182 + case SDCA_TERM_TYPE_MIC_JACK: 2183 + return SDCA_TERM_TYPE_MIC_JACK_NAME; 2184 + case SDCA_TERM_TYPE_STEREO_JACK: 2185 + return SDCA_TERM_TYPE_STEREO_JACK_NAME; 2186 + case SDCA_TERM_TYPE_FRONT_LR_JACK: 2187 + return SDCA_TERM_TYPE_FRONT_LR_JACK_NAME; 2188 + case SDCA_TERM_TYPE_CENTER_LFE_JACK: 2189 + return SDCA_TERM_TYPE_CENTER_LFE_JACK_NAME; 2190 + case SDCA_TERM_TYPE_SURROUND_LR_JACK: 2191 + return SDCA_TERM_TYPE_SURROUND_LR_JACK_NAME; 2192 + case SDCA_TERM_TYPE_REAR_LR_JACK: 2193 + return SDCA_TERM_TYPE_REAR_LR_JACK_NAME; 2194 + case SDCA_TERM_TYPE_HEADPHONE_JACK: 2195 + return SDCA_TERM_TYPE_HEADPHONE_JACK_NAME; 2196 + case SDCA_TERM_TYPE_HEADSET_JACK: 2197 + return SDCA_TERM_TYPE_HEADSET_JACK_NAME; 2198 + default: 2199 + return NULL; 2200 + } 2201 + } 2202 + EXPORT_SYMBOL_NS(sdca_find_terminal_name, "SND_SOC_SDCA"); 2167 2203 2168 2204 struct sdca_control *sdca_selector_find_control(struct device *dev, 2169 2205 struct sdca_entity *entity,