sound/soc/mediatek/mt8186/mt8186-afe-pcm.c
Source file repositories/reference/linux-study-clean/sound/soc/mediatek/mt8186/mt8186-afe-pcm.c
File Facts
- System
- Linux kernel
- Corpus path
sound/soc/mediatek/mt8186/mt8186-afe-pcm.c- Extension
.c- Size
- 94346 bytes
- Lines
- 3006
- 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_reserved_mem.hlinux/pm_runtime.hlinux/reset.hsound/soc.h../common/mtk-afe-platform-driver.h../common/mtk-afe-fe-dai.hmt8186-afe-common.hmt8186-afe-clk.hmt8186-afe-gpio.hmt8186-interconnection.h
Detected Declarations
function mt8186_fe_startupfunction mt8186_fe_shutdownfunction mt8186_fe_hw_paramsfunction mt8186_fe_hw_freefunction mt8186_fe_triggerfunction mt8186_memif_fsfunction mt8186_get_dai_fsfunction mt8186_irq_fsfunction mt8186_get_memif_pbuf_sizefunction mt8186_fe_preparefunction mt8186_irq_cnt1_getfunction mt8186_irq_cnt1_setfunction mt8186_irq_cnt2_getfunction mt8186_irq_cnt2_setfunction mt8186_record_xrun_assert_getfunction mt8186_record_xrun_assert_setfunction mt8186_is_volatile_regfunction mt8186_afe_irq_handlerfunction mt8186_afe_runtime_suspendfunction mt8186_afe_runtime_resumefunction mt8186_afe_component_probefunction mt8186_dai_memif_registerfunction mt8186_afe_pcm_dev_probe
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__);
return -EBUSY;
}
}
return 0;
}
static void mt8186_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 mt8186_afe_private *afe_priv = afe->platform_priv;
int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
struct mtk_base_afe_memif *memif = &afe->memif[id];
int irq_id = memif->irq_usage;
memif->substream = NULL;
afe_priv->irq_cnt[id] = 0;
afe_priv->xrun_assert[id] = 0;
if (!memif->const_irq) {
mtk_dynamic_irq_release(afe, irq_id);
memif->irq_usage = -1;
memif->substream = NULL;
}
}
static int mt8186_fe_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
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);
int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
unsigned int channels = params_channels(params);
unsigned int rate = params_rate(params);
int ret;
ret = mtk_afe_fe_hw_params(substream, params, dai);
if (ret)
return ret;
/* channel merge configuration, enable control is in UL5_IN_MUX */
if (id == MT8186_MEMIF_VUL3) {
int update_cnt = 8;
unsigned int val = 0;
unsigned int mask = 0;
int fs_mode = mt8186_rate_transform(afe->dev, rate, id);
/* set rate, channel, update cnt, disable sgen */
val = fs_mode << CM1_FS_SELECT_SFT |
(channels - 1) << CHANNEL_MERGE0_CHNUM_SFT |
update_cnt << CHANNEL_MERGE0_UPDATE_CNT_SFT;
mask = CM1_FS_SELECT_MASK_SFT |
CHANNEL_MERGE0_CHNUM_MASK_SFT |
CHANNEL_MERGE0_UPDATE_CNT_MASK_SFT;
regmap_update_bits(afe->regmap, AFE_CM1_CON, mask, val);
}
return 0;
}
static int mt8186_fe_hw_free(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
int ret;
ret = mtk_afe_fe_hw_free(substream, dai);
if (ret) {
dev_err(afe->dev, "%s failed\n", __func__);
return ret;
}
return 0;
}
static int mt8186_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);
Annotation
- Immediate include surface: `linux/delay.h`, `linux/dma-mapping.h`, `linux/module.h`, `linux/of.h`, `linux/of_address.h`, `linux/of_reserved_mem.h`, `linux/pm_runtime.h`, `linux/reset.h`.
- Detected declarations: `function mt8186_fe_startup`, `function mt8186_fe_shutdown`, `function mt8186_fe_hw_params`, `function mt8186_fe_hw_free`, `function mt8186_fe_trigger`, `function mt8186_memif_fs`, `function mt8186_get_dai_fs`, `function mt8186_irq_fs`, `function mt8186_get_memif_pbuf_size`, `function mt8186_fe_prepare`.
- 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.