Linux Audio

Check our new training course

Loading...
  1// SPDX-License-Identifier: GPL-2.0-only
  2//
  3// Copyright(c) 2023 Intel Corporation. All rights reserved.
  4
  5#include <linux/device.h>
  6#include <sound/soc-acpi.h>
  7#include "sof_ssp_common.h"
  8
  9/*
 10 * Codec probe function
 11 */
 12#define CODEC_MAP_ENTRY(n, h, t)	\
 13	{				\
 14		.name = n,		\
 15		.acpi_hid = h,		\
 16		.codec_type = t,	\
 17	}
 18
 19struct codec_map {
 20	const char *name;
 21	const char *acpi_hid;
 22	enum sof_ssp_codec codec_type;
 23};
 24
 25static const struct codec_map codecs[] = {
 26	/* Cirrus Logic */
 27	CODEC_MAP_ENTRY("CS42L42", CS42L42_ACPI_HID, CODEC_CS42L42),
 28
 29	/* Dialog */
 30	CODEC_MAP_ENTRY("DA7219", DA7219_ACPI_HID, CODEC_DA7219),
 31
 32	/* Everest */
 33	CODEC_MAP_ENTRY("ES8316", ES8316_ACPI_HID, CODEC_ES8316),
 34	CODEC_MAP_ENTRY("ES8326", ES8326_ACPI_HID, CODEC_ES8326),
 35	CODEC_MAP_ENTRY("ES8336", ES8336_ACPI_HID, CODEC_ES8336),
 36
 37	/* Nuvoton */
 38	CODEC_MAP_ENTRY("NAU8825", NAU8825_ACPI_HID, CODEC_NAU8825),
 39
 40	/* Realtek */
 41	CODEC_MAP_ENTRY("RT5650", RT5650_ACPI_HID, CODEC_RT5650),
 42	CODEC_MAP_ENTRY("RT5682", RT5682_ACPI_HID, CODEC_RT5682),
 43	CODEC_MAP_ENTRY("RT5682S", RT5682S_ACPI_HID, CODEC_RT5682S),
 44};
 45
 46static const struct codec_map amps[] = {
 47	/* Cirrus Logic */
 48	CODEC_MAP_ENTRY("CS35L41", CS35L41_ACPI_HID, CODEC_CS35L41),
 49
 50	/* Maxim */
 51	CODEC_MAP_ENTRY("MAX98357A", MAX_98357A_ACPI_HID, CODEC_MAX98357A),
 52	CODEC_MAP_ENTRY("MAX98360A", MAX_98360A_ACPI_HID, CODEC_MAX98360A),
 53	CODEC_MAP_ENTRY("MAX98373", MAX_98373_ACPI_HID, CODEC_MAX98373),
 54	CODEC_MAP_ENTRY("MAX98390", MAX_98390_ACPI_HID, CODEC_MAX98390),
 55
 56	/* Nuvoton */
 57	CODEC_MAP_ENTRY("NAU8318", NAU8318_ACPI_HID, CODEC_NAU8318),
 58
 59	/* Realtek */
 60	CODEC_MAP_ENTRY("RT1011", RT1011_ACPI_HID, CODEC_RT1011),
 61	CODEC_MAP_ENTRY("RT1015", RT1015_ACPI_HID, CODEC_RT1015),
 62	CODEC_MAP_ENTRY("RT1015P", RT1015P_ACPI_HID, CODEC_RT1015P),
 63	CODEC_MAP_ENTRY("RT1019P", RT1019P_ACPI_HID, CODEC_RT1019P),
 64	CODEC_MAP_ENTRY("RT1308", RT1308_ACPI_HID, CODEC_RT1308),
 65};
 66
 67enum sof_ssp_codec sof_ssp_detect_codec_type(struct device *dev)
 68{
 69	int i;
 70
 71	for (i = 0; i < ARRAY_SIZE(codecs); i++) {
 72		if (!acpi_dev_present(codecs[i].acpi_hid, NULL, -1))
 73			continue;
 74
 75		dev_dbg(dev, "codec %s found\n", codecs[i].name);
 76		return codecs[i].codec_type;
 77	}
 78
 79	return CODEC_NONE;
 80}
 81EXPORT_SYMBOL_NS(sof_ssp_detect_codec_type, SND_SOC_INTEL_SOF_SSP_COMMON);
 82
 83enum sof_ssp_codec sof_ssp_detect_amp_type(struct device *dev)
 84{
 85	int i;
 86
 87	for (i = 0; i < ARRAY_SIZE(amps); i++) {
 88		if (!acpi_dev_present(amps[i].acpi_hid, NULL, -1))
 89			continue;
 90
 91		dev_dbg(dev, "amp %s found\n", amps[i].name);
 92		return amps[i].codec_type;
 93	}
 94
 95	return CODEC_NONE;
 96}
 97EXPORT_SYMBOL_NS(sof_ssp_detect_amp_type, SND_SOC_INTEL_SOF_SSP_COMMON);
 98
 99const char *sof_ssp_get_codec_name(enum sof_ssp_codec codec_type)
100{
101	int i;
102
103	for (i = 0; i < ARRAY_SIZE(codecs); i++) {
104		if (codecs[i].codec_type != codec_type)
105			continue;
106
107		return codecs[i].name;
108	}
109	for (i = 0; i < ARRAY_SIZE(amps); i++) {
110		if (amps[i].codec_type != codec_type)
111			continue;
112
113		return amps[i].name;
114	}
115
116	return NULL;
117}
118EXPORT_SYMBOL_NS(sof_ssp_get_codec_name, SND_SOC_INTEL_SOF_SSP_COMMON);
119
120MODULE_DESCRIPTION("ASoC Intel SOF Common Machine Driver Helpers");
121MODULE_AUTHOR("Brent Lu <brent.lu@intel.com>");
122MODULE_LICENSE("GPL");