sound/soc/generic/simple-card-utils.c
Source file repositories/reference/linux-study-clean/sound/soc/generic/simple-card-utils.c
File Facts
- System
- Linux kernel
- Corpus path
sound/soc/generic/simple-card-utils.c- Extension
.c- Size
- 32549 bytes
- Lines
- 1280
- Domain
- Driver Families
- Bucket
- sound/soc
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
dt-bindings/sound/audio-graph.hlinux/cleanup.hlinux/clk.hlinux/gpio/consumer.hlinux/module.hlinux/of.hlinux/of_graph.hsound/jack.hsound/pcm_params.hsound/simple_card_utils.h
Detected Declarations
function _simple_retfunction simple_util_get_sample_fmtfunction simple_fixup_sample_fmtfunction simple_util_parse_convertfunction simple_util_is_convert_requiredfunction simple_util_parse_daifmtfunction simple_util_parse_tdm_width_mapfunction simple_util_set_dailink_namefunction simple_util_parse_card_namefunction simple_clk_enablefunction simple_clk_disablefunction simple_util_parse_clkfunction simple_check_fixed_sysclkfunction simple_util_startupfunction for_each_prop_dai_cpufunction for_each_prop_dai_codecfunction simple_util_shutdownfunction for_each_prop_dai_cpufunction simple_set_clk_ratefunction simple_set_tdmfunction simple_util_hw_paramsfunction for_each_prop_dai_codecfunction for_each_prop_dai_cpufunction for_each_rtd_componentsfunction for_each_rtd_codec_daisfunction for_each_rtd_codec_daisfunction for_each_rtd_cpu_daisfunction for_each_prop_dai_codecfunction for_each_prop_dai_cpufunction simple_util_be_hw_params_fixupfunction simple_init_daifunction simple_component_is_codecfunction simple_init_for_codec2codecfunction simple_util_dai_initfunction for_each_prop_dai_codecfunction simple_util_canonicalize_platformfunction simple_util_canonicalize_cpufunction simple_util_clean_referencefunction for_each_card_prelinksfunction simple_util_parse_routingfunction simple_util_parse_widgetsfunction simple_util_parse_pin_switchesfunction simple_util_init_jackfunction simple_util_init_aux_jacksfunction for_each_card_auxsfunction for_each_card_auxsfunction simple_util_init_privfunction simple_util_remove
Annotated Snippet
if (*fixed_sysclk && *fixed_sysclk != dai->sysclk) {
dev_err(dev, "inconsistent fixed sysclk rates (%u vs %u)\n",
*fixed_sysclk, dai->sysclk);
return -EINVAL;
}
*fixed_sysclk = dai->sysclk;
}
return 0;
}
int simple_util_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
struct simple_util_priv *priv = snd_soc_card_get_drvdata(rtd->card);
struct simple_dai_props *props = runtime_simple_priv_to_props(priv, rtd);
struct simple_util_dai *dai;
unsigned int fixed_sysclk = 0;
int i1, i2, i;
int ret;
for_each_prop_dai_cpu(props, i1, dai) {
ret = simple_clk_enable(dai);
if (ret)
goto cpu_err;
ret = simple_check_fixed_sysclk(rtd->dev, dai, &fixed_sysclk);
if (ret)
goto cpu_err;
}
for_each_prop_dai_codec(props, i2, dai) {
ret = simple_clk_enable(dai);
if (ret)
goto codec_err;
ret = simple_check_fixed_sysclk(rtd->dev, dai, &fixed_sysclk);
if (ret)
goto codec_err;
}
if (fixed_sysclk && props->mclk_fs) {
unsigned int fixed_rate = fixed_sysclk / props->mclk_fs;
if (fixed_sysclk % props->mclk_fs) {
dev_err(rtd->dev, "fixed sysclk %u not divisible by mclk_fs %u\n",
fixed_sysclk, props->mclk_fs);
ret = -EINVAL;
goto codec_err;
}
ret = snd_pcm_hw_constraint_minmax(substream->runtime, SNDRV_PCM_HW_PARAM_RATE,
fixed_rate, fixed_rate);
if (ret < 0)
goto codec_err;
}
return 0;
codec_err:
for_each_prop_dai_codec(props, i, dai) {
if (i >= i2)
break;
simple_clk_disable(dai);
}
cpu_err:
for_each_prop_dai_cpu(props, i, dai) {
if (i >= i1)
break;
simple_clk_disable(dai);
}
return simple_ret(priv, ret);
}
EXPORT_SYMBOL_GPL(simple_util_startup);
void simple_util_shutdown(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
struct simple_util_priv *priv = snd_soc_card_get_drvdata(rtd->card);
struct simple_dai_props *props = runtime_simple_priv_to_props(priv, rtd);
struct simple_util_dai *dai;
int i;
for_each_prop_dai_cpu(props, i, dai) {
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, i);
if (props->mclk_fs && !dai->clk_fixed && !snd_soc_dai_active(cpu_dai))
snd_soc_dai_set_sysclk(cpu_dai, 0, 0, dai->clk_direction);
simple_clk_disable(dai);
}
for_each_prop_dai_codec(props, i, dai) {
Annotation
- Immediate include surface: `dt-bindings/sound/audio-graph.h`, `linux/cleanup.h`, `linux/clk.h`, `linux/gpio/consumer.h`, `linux/module.h`, `linux/of.h`, `linux/of_graph.h`, `sound/jack.h`.
- Detected declarations: `function _simple_ret`, `function simple_util_get_sample_fmt`, `function simple_fixup_sample_fmt`, `function simple_util_parse_convert`, `function simple_util_is_convert_required`, `function simple_util_parse_daifmt`, `function simple_util_parse_tdm_width_map`, `function simple_util_set_dailink_name`, `function simple_util_parse_card_name`, `function simple_clk_enable`.
- Atlas domain: Driver Families / sound/soc.
- Implementation status: integration implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.