sound/soc/mediatek/common/mtk-afe-platform-driver.c

Source file repositories/reference/linux-study-clean/sound/soc/mediatek/common/mtk-afe-platform-driver.c

File Facts

System
Linux kernel
Corpus path
sound/soc/mediatek/common/mtk-afe-platform-driver.c
Extension
.c
Size
5115 bytes
Lines
181
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.

Dependency Surface

Detected Declarations

Annotated Snippet

if (ret) {
			dev_err(dev, "%s hw_ptr_upper32 err\n", __func__);
			return 0;
		}
	}

	ret = regmap_read(regmap, memif_data->reg_ofs_base, &hw_base_lower32);
	if (ret) {
		dev_err(dev, "%s hw_base_lower32 err\n", __func__);
		return 0;
	}
	if (memif_data->reg_ofs_base_msb) {
		ret = regmap_read(regmap, memif_data->reg_ofs_base_msb, &hw_base_upper32);
		if (ret) {
			dev_err(dev, "%s hw_base_upper32 err\n", __func__);
			return 0;
		}
	}

	hw_ptr = ((unsigned long long)hw_ptr_upper32 << 32) | hw_ptr_lower32;
	hw_base = ((unsigned long long)hw_base_upper32 << 32) | hw_base_lower32;

	if (!hw_ptr || !hw_base) {
		dev_err(dev, "hw_ptr or hw_base = 0 err\n");
		return 0;
	}

	pcm_ptr_bytes = MTK_ALIGN_16BYTES(hw_ptr - hw_base);
	return bytes_to_frames(substream->runtime, (ssize_t)pcm_ptr_bytes);
}
EXPORT_SYMBOL_GPL(mtk_afe_pcm_pointer);

int mtk_afe_pcm_new(struct snd_soc_component *component,
		    struct snd_soc_pcm_runtime *rtd)
{
	size_t size;
	struct snd_pcm *pcm = rtd->pcm;
	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);

	size = afe->mtk_afe_hardware->buffer_bytes_max;
	snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV, afe->dev,
				       afe->preallocate_buffers ? size : 0,
				       size);

	return 0;
}
EXPORT_SYMBOL_GPL(mtk_afe_pcm_new);

static int mtk_afe_component_probe(struct snd_soc_component *component)
{
	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
	int ret;

	snd_soc_component_init_regmap(component, afe->regmap);

	/* If the list was never initialized there are no sub-DAIs */
	if (afe->sub_dais.next && afe->sub_dais.prev) {
		ret = mtk_afe_add_sub_dai_control(component);
		if (ret)
			return ret;
	}

	return 0;
}

const struct snd_soc_component_driver mtk_afe_pcm_platform = {
	.name		= AFE_PCM_NAME,
	.pointer	= mtk_afe_pcm_pointer,
	.pcm_new	= mtk_afe_pcm_new,
	.probe		= mtk_afe_component_probe,
};
EXPORT_SYMBOL_GPL(mtk_afe_pcm_platform);

MODULE_DESCRIPTION("Mediatek simple platform driver");
MODULE_AUTHOR("Garlic Tseng <garlic.tseng@mediatek.com>");
MODULE_LICENSE("GPL v2");

Annotation

Implementation Notes