sound/soc/mediatek/mt8365/mt8365-afe-pcm.c

Source file repositories/reference/linux-study-clean/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c

File Facts

System
Linux kernel
Corpus path
sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
Extension
.c
Size
68109 bytes
Lines
2281
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct mt8365_afe_rate {
	unsigned int rate;
	unsigned int reg_val;
};

static const struct mt8365_afe_rate mt8365_afe_fs_rates[] = {
	{ .rate = 8000, .reg_val = MT8365_FS_8K },
	{ .rate = 11025, .reg_val = MT8365_FS_11D025K },
	{ .rate = 12000, .reg_val = MT8365_FS_12K },
	{ .rate = 16000, .reg_val = MT8365_FS_16K },
	{ .rate = 22050, .reg_val = MT8365_FS_22D05K },
	{ .rate = 24000, .reg_val = MT8365_FS_24K },
	{ .rate = 32000, .reg_val = MT8365_FS_32K },
	{ .rate = 44100, .reg_val = MT8365_FS_44D1K },
	{ .rate = 48000, .reg_val = MT8365_FS_48K },
	{ .rate = 88200, .reg_val = MT8365_FS_88D2K },
	{ .rate = 96000, .reg_val = MT8365_FS_96K },
	{ .rate = 176400, .reg_val = MT8365_FS_176D4K },
	{ .rate = 192000, .reg_val = MT8365_FS_192K },
};

int mt8365_afe_fs_timing(unsigned int rate)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(mt8365_afe_fs_rates); i++)
		if (mt8365_afe_fs_rates[i].rate == rate)
			return mt8365_afe_fs_rates[i].reg_val;

	return -EINVAL;
}

bool mt8365_afe_rate_supported(unsigned int rate, unsigned int id)
{
	switch (id) {
	case MT8365_AFE_IO_TDM_IN:
		if (rate >= 8000 && rate <= 192000)
			return true;
		break;
	case MT8365_AFE_IO_DMIC:
		if (rate >= 8000 && rate <= 48000)
			return true;
		break;
	default:
		break;
	}

	return false;
}

bool mt8365_afe_channel_supported(unsigned int channel, unsigned int id)
{
	switch (id) {
	case MT8365_AFE_IO_TDM_IN:
		if (channel >= 1 && channel <= 8)
			return true;
		break;
	case MT8365_AFE_IO_DMIC:
		if (channel >= 1 && channel <= 8)
			return true;
		break;
	default:
		break;
	}

	return false;
}

static bool mt8365_afe_clk_group_44k(int sample_rate)
{
	if (sample_rate == 11025 ||
	    sample_rate == 22050 ||
	    sample_rate == 44100 ||
	    sample_rate == 88200 ||
	    sample_rate == 176400)
		return true;
	else
		return false;
}

static bool mt8365_afe_clk_group_48k(int sample_rate)
{
	return (!mt8365_afe_clk_group_44k(sample_rate));
}

int mt8365_dai_set_priv(struct mtk_base_afe *afe, int id,
			int priv_size, const void *priv_data)
{
	struct mt8365_afe_private *afe_priv = afe->platform_priv;
	void *temp_data;

Annotation

Implementation Notes