sound/soc/mediatek/mt8189/mt8189-afe-pcm.c
Source file repositories/reference/linux-study-clean/sound/soc/mediatek/mt8189/mt8189-afe-pcm.c
File Facts
- System
- Linux kernel
- Corpus path
sound/soc/mediatek/mt8189/mt8189-afe-pcm.c- Extension
.c- Size
- 87156 bytes
- Lines
- 2634
- Domain
- Driver Families
- Bucket
- sound/soc
- Inferred role
- Driver Families: implementation source
- Status
- source 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- 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
linux/delay.hlinux/dma-mapping.hlinux/module.hlinux/of.hlinux/of_address.hlinux/of_device.hlinux/of_reserved_mem.hlinux/pm_runtime.hlinux/regmap.hsound/pcm.hsound/soc.hmt8189-afe-clk.hmt8189-afe-common.hmt8189-interconnection.h../common/mtk-afe-fe-dai.h../common/mtk-afe-platform-driver.h
Detected Declarations
function mt8189_rate_transformfunction calculate_cm_updatefunction mt8189_set_cmfunction mt8189_enable_cm_bypassfunction mt8189_fe_startupfunction mt8189_fe_shutdownfunction mt8189_fe_hw_paramsfunction mt8189_fe_triggerfunction mt8189_memif_fsfunction mt8189_get_dai_fsfunction mt8189_irq_fsfunction mt8189_get_memif_pbuf_sizefunction ul_cm0_eventfunction ul_cm1_eventfunction mt8189_is_volatile_regfunction mt8189_afe_irq_handlerfunction mt8189_afe_runtime_suspendfunction mt8189_afe_runtime_resumefunction mt8189_afe_component_probefunction mt8189_afe_pcm_openfunction mt8189_afe_pcm_freefunction mt8189_dai_memif_registerfunction mt8189_afe_release_reserved_memfunction mt8189_afe_pcm_dev_probefunction mt8189_afe_pcm_dev_remove
Annotated Snippet
if (irq_id != afe->irqs_size) {
/* link */
memif->irq_usage = irq_id;
} else {
dev_err(afe->dev, "%s() error: no more asys irq\n",
__func__);
ret = -EBUSY;
}
}
return ret;
}
static void mt8189_fe_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
int memif_num = cpu_dai->id;
struct mtk_base_afe_memif *memif = &afe->memif[memif_num];
int irq_id = memif->irq_usage;
dev_dbg(afe->dev, "%s(), memif_num: %d.\n", __func__, memif_num);
memif->substream = NULL;
if (!memif->const_irq) {
mtk_dynamic_irq_release(afe, irq_id);
memif->irq_usage = -1;
memif->substream = NULL;
}
}
static int mt8189_fe_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
struct mt8189_afe_private *afe_priv = afe->platform_priv;
int id = dai->id;
int cm;
switch (id) {
case MT8189_MEMIF_VUL8:
case MT8189_MEMIF_VUL_CM0:
cm = CM0;
break;
case MT8189_MEMIF_VUL9:
case MT8189_MEMIF_VUL_CM1:
cm = CM1;
break;
default:
cm = CM0;
break;
}
afe_priv->cm_rate[cm] = params_rate(params);
afe_priv->cm_channels = params_channels(params);
return mtk_afe_fe_hw_params(substream, params, dai);
}
static int mt8189_fe_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
struct snd_pcm_runtime *const runtime = substream->runtime;
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
int id = cpu_dai->id;
struct mtk_base_afe_memif *memif = &afe->memif[id];
int irq_id = memif->irq_usage;
struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];
const struct mtk_base_irq_data *irq_data = irqs->irq_data;
unsigned int counter = runtime->period_size;
unsigned int rate = runtime->rate;
unsigned int tmp_reg;
int fs;
int ret;
dev_dbg(afe->dev, "%s(), %s cmd %d, irq_id %d, dai_id %d\n", __func__,
memif->data->name, cmd, irq_id, id);
switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
ret = mtk_memif_set_enable(afe, id);
if (ret) {
dev_err(afe->dev, "id %d, memif enable fail.\n", id);
Annotation
- Immediate include surface: `linux/delay.h`, `linux/dma-mapping.h`, `linux/module.h`, `linux/of.h`, `linux/of_address.h`, `linux/of_device.h`, `linux/of_reserved_mem.h`, `linux/pm_runtime.h`.
- Detected declarations: `function mt8189_rate_transform`, `function calculate_cm_update`, `function mt8189_set_cm`, `function mt8189_enable_cm_bypass`, `function mt8189_fe_startup`, `function mt8189_fe_shutdown`, `function mt8189_fe_hw_params`, `function mt8189_fe_trigger`, `function mt8189_memif_fs`, `function mt8189_get_dai_fs`.
- Atlas domain: Driver Families / sound/soc.
- Implementation status: source implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.