ASoC: get sdw dmic number for Intel platforms#5843
Open
bardliao wants to merge 2 commits into
Open
Conversation
We can get how many mic transducers are connected to the codec. The information will be used for selecting the topology with proper dmic channel number. Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
The commit get the sdca sdw dmic number form the mipi-sdca-cluster-channel-id property. The dai link name will be used to select the function topology with a proper dmic channel number. Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
There was a problem hiding this comment.
Pull request overview
This PR adds support for deriving the SoundWire DMIC channel/transducer count from SDCA firmware-described entities and appending that count to Intel SOF SoundWire DAI link names, enabling more precise topology selection based on connected microphone transducers.
Changes:
- Add
sdca_get_mic_count()to parse SDCA Function entity metadata and return a microphone transducer count. - Update Intel SOF SoundWire machine driver to query SDCA SmartMic functions and suffix the DAI link name with
-<N>ch. - Expose the new helper via
include/sound/sdca.hand import the SDCA symbol namespace in the machine driver.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.
| File | Description |
|---|---|
| sound/soc/sdca/sdca_functions.c | Adds sdca_get_mic_count() to parse SDCA entity properties and extract microphone transducer count. |
| sound/soc/intel/boards/sof_sdw.c | Appends SDCA-derived mic channel count to SoundWire capture link name for topology matching; adds SDCA namespace import. |
| include/sound/sdca.h | Exposes sdca_get_mic_count() in the public SDCA header. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
16
to
19
| #include <sound/core.h> | ||
| #include <sound/sdca_function.h> | ||
| #include <sound/soc.h> | ||
| #include <sound/soc-acpi.h> |
Comment on lines
+277
to
+300
| if (entity_type == SDCA_ENTITY_TYPE_IT) { | ||
| ret = fwnode_property_read_u32(entity_node, | ||
| "mipi-sdca-terminal-type", | ||
| &terminal_type); | ||
| if (ret) | ||
| continue; | ||
|
|
||
| if (terminal_type != SDCA_TERM_TYPE_MICROPHONE_TRANSDUCER && | ||
| terminal_type != SDCA_TERM_TYPE_MICROPHONE_ARRAY_TRANSDUCER) | ||
| continue; | ||
|
|
||
| ret = fwnode_property_read_u32(entity_node, | ||
| "mipi-sdca-terminal-transducer-count", | ||
| &transducer_count); | ||
| if (ret) | ||
| continue; | ||
|
|
||
| dev_info(&slave->dev, | ||
| "SDCA function %s entity %s: iot mipi-sdca-terminal-type=%#x mipi-sdca-terminal-transducer-count=%u\n", | ||
| function->name, entity_label, terminal_type, transducer_count); | ||
| break; | ||
| } | ||
|
|
||
| fwnode_handle_put(entity_node); |
Comment on lines
+218
to
+239
| num_entities = fwnode_property_count_u32(function_node, | ||
| "mipi-sdca-entity-id-list"); | ||
| if (num_entities <= 0) { | ||
| dev_err(&slave->dev, | ||
| "%pfwP: no entity list found for function type %u\n", | ||
| function_node, function->type); | ||
| return -EINVAL; | ||
| } | ||
|
|
||
| entity_list = kcalloc(num_entities, sizeof(*entity_list), GFP_KERNEL); | ||
| if (!entity_list) | ||
| return -ENOMEM; | ||
|
|
||
| ret = fwnode_property_read_u32_array(function_node, | ||
| "mipi-sdca-entity-id-list", | ||
| entity_list, num_entities); | ||
| if (ret) { | ||
| dev_err(&slave->dev, | ||
| "%pfwP: failed to read entity id list for function type %u: %d\n", | ||
| function_node, function->type, ret); | ||
| return -EINVAL; | ||
| } |
| #if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SDCA) | ||
|
|
||
| void sdca_lookup_functions(struct sdw_slave *slave); | ||
| int sdca_get_mic_count(struct sdw_slave *slave, struct sdca_function_desc *function); |
Comment on lines
+1039
to
+1060
| peripheral = sof_sdw_get_peripheral_by_codec_name(sof_end->codec_name); | ||
| if (!peripheral) { | ||
| dev_err(dev, "failed to get peripheral for codec %s\n", | ||
| sof_end->codec_name); | ||
| break; | ||
| } | ||
|
|
||
| for (k = 0; k < peripheral->sdca_data.num_functions; k++) { | ||
| if (peripheral->sdca_data.function[k].type != SDCA_FUNCTION_TYPE_SMART_MIC) | ||
| continue; | ||
|
|
||
| sdw_mic_num = sdca_get_mic_count(peripheral, &peripheral->sdca_data.function[k]); | ||
| dev_dbg(dev, "%s mic num %d\n", sof_end->codec_name, sdw_mic_num); | ||
| if (sdw_mic_num > 0) { | ||
| char *tmp = name; | ||
| name = devm_kasprintf(dev, GFP_KERNEL, "%s-%dch", name, sdw_mic_num); | ||
| if (!name) | ||
| return -ENOMEM; | ||
|
|
||
| devm_kfree(dev, tmp); | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The topology needs to set the DMIC channel number according to the number of transducers connected to the codec. This information can be provided via the DAI link name for proper topology selection.