mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 11:33:28 +02:00
ASoC: intel/sdw_utils: move soundwire codec_info_list structure
SoundWire 'codec_info_list' structure is not a platform specific one. Move codec_info_list structure to common file soc_sdw_utils.c. Move codec helper functions which uses codec_info_list structure to common place holder and rename the function by adding _sdw tag. This will allow to use 'codec_info_list' structure and it's helper functions in other platform machine driver. Link: https://github.com/thesofproject/linux/pull/5068 Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com> Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://patch.msgid.link/20240801111821.18076-3-Vijendar.Mukunda@amd.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
6e7af1fdf7
commit
e377c94773
|
|
@ -90,8 +90,12 @@ struct asoc_sdw_mc_private {
|
||||||
bool ignore_internal_dmic;
|
bool ignore_internal_dmic;
|
||||||
void *private;
|
void *private;
|
||||||
unsigned long mc_quirk;
|
unsigned long mc_quirk;
|
||||||
|
int codec_info_list_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern struct asoc_sdw_codec_info codec_info_list[];
|
||||||
|
int asoc_sdw_get_codec_info_list_count(void);
|
||||||
|
|
||||||
int asoc_sdw_startup(struct snd_pcm_substream *substream);
|
int asoc_sdw_startup(struct snd_pcm_substream *substream);
|
||||||
int asoc_sdw_prepare(struct snd_pcm_substream *substream);
|
int asoc_sdw_prepare(struct snd_pcm_substream *substream);
|
||||||
int asoc_sdw_prepare(struct snd_pcm_substream *substream);
|
int asoc_sdw_prepare(struct snd_pcm_substream *substream);
|
||||||
|
|
@ -106,6 +110,15 @@ const char *asoc_sdw_get_codec_name(struct device *dev,
|
||||||
const struct snd_soc_acpi_link_adr *adr_link,
|
const struct snd_soc_acpi_link_adr *adr_link,
|
||||||
int adr_index);
|
int adr_index);
|
||||||
|
|
||||||
|
struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_part(const u64 adr);
|
||||||
|
|
||||||
|
struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_acpi(const u8 *acpi_id);
|
||||||
|
|
||||||
|
struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_dai(const char *dai_name,
|
||||||
|
int *dai_index);
|
||||||
|
|
||||||
|
int asoc_sdw_rtd_init(struct snd_soc_pcm_runtime *rtd);
|
||||||
|
|
||||||
/* DMIC support */
|
/* DMIC support */
|
||||||
int asoc_sdw_dmic_init(struct snd_soc_pcm_runtime *rtd);
|
int asoc_sdw_dmic_init(struct snd_soc_pcm_runtime *rtd);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -548,50 +548,6 @@ static struct snd_soc_dai_link_component platform_component[] = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct snd_soc_dapm_widget generic_dmic_widgets[] = {
|
|
||||||
SND_SOC_DAPM_MIC("DMIC", NULL),
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct snd_soc_dapm_widget generic_jack_widgets[] = {
|
|
||||||
SND_SOC_DAPM_HP("Headphone", NULL),
|
|
||||||
SND_SOC_DAPM_MIC("Headset Mic", NULL),
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct snd_kcontrol_new generic_jack_controls[] = {
|
|
||||||
SOC_DAPM_PIN_SWITCH("Headphone"),
|
|
||||||
SOC_DAPM_PIN_SWITCH("Headset Mic"),
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct snd_soc_dapm_widget generic_spk_widgets[] = {
|
|
||||||
SND_SOC_DAPM_SPK("Speaker", NULL),
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct snd_kcontrol_new generic_spk_controls[] = {
|
|
||||||
SOC_DAPM_PIN_SWITCH("Speaker"),
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct snd_soc_dapm_widget maxim_widgets[] = {
|
|
||||||
SND_SOC_DAPM_SPK("Left Spk", NULL),
|
|
||||||
SND_SOC_DAPM_SPK("Right Spk", NULL),
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct snd_kcontrol_new maxim_controls[] = {
|
|
||||||
SOC_DAPM_PIN_SWITCH("Left Spk"),
|
|
||||||
SOC_DAPM_PIN_SWITCH("Right Spk"),
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct snd_soc_dapm_widget rt700_widgets[] = {
|
|
||||||
SND_SOC_DAPM_HP("Headphones", NULL),
|
|
||||||
SND_SOC_DAPM_MIC("AMIC", NULL),
|
|
||||||
SND_SOC_DAPM_SPK("Speaker", NULL),
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct snd_kcontrol_new rt700_controls[] = {
|
|
||||||
SOC_DAPM_PIN_SWITCH("Headphones"),
|
|
||||||
SOC_DAPM_PIN_SWITCH("AMIC"),
|
|
||||||
SOC_DAPM_PIN_SWITCH("Speaker"),
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct snd_soc_ops sdw_ops = {
|
static const struct snd_soc_ops sdw_ops = {
|
||||||
.startup = asoc_sdw_startup,
|
.startup = asoc_sdw_startup,
|
||||||
.prepare = asoc_sdw_prepare,
|
.prepare = asoc_sdw_prepare,
|
||||||
|
|
@ -601,547 +557,6 @@ static const struct snd_soc_ops sdw_ops = {
|
||||||
.shutdown = asoc_sdw_shutdown,
|
.shutdown = asoc_sdw_shutdown,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct asoc_sdw_codec_info codec_info_list[] = {
|
|
||||||
{
|
|
||||||
.part_id = 0x700,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "rt700-aif1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
|
||||||
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
|
||||||
.rtd_init = asoc_sdw_rt700_rtd_init,
|
|
||||||
.controls = rt700_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(rt700_controls),
|
|
||||||
.widgets = rt700_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(rt700_widgets),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x711,
|
|
||||||
.version_id = 3,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "rt711-sdca-aif1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
|
||||||
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
|
||||||
.init = asoc_sdw_rt_sdca_jack_init,
|
|
||||||
.exit = asoc_sdw_rt_sdca_jack_exit,
|
|
||||||
.rtd_init = asoc_sdw_rt_sdca_jack_rtd_init,
|
|
||||||
.controls = generic_jack_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
|
||||||
.widgets = generic_jack_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x711,
|
|
||||||
.version_id = 2,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "rt711-aif1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
|
||||||
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
|
||||||
.init = asoc_sdw_rt711_init,
|
|
||||||
.exit = asoc_sdw_rt711_exit,
|
|
||||||
.rtd_init = asoc_sdw_rt711_rtd_init,
|
|
||||||
.controls = generic_jack_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
|
||||||
.widgets = generic_jack_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x712,
|
|
||||||
.version_id = 3,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "rt712-sdca-aif1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
|
||||||
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
|
||||||
.init = asoc_sdw_rt_sdca_jack_init,
|
|
||||||
.exit = asoc_sdw_rt_sdca_jack_exit,
|
|
||||||
.rtd_init = asoc_sdw_rt_sdca_jack_rtd_init,
|
|
||||||
.controls = generic_jack_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
|
||||||
.widgets = generic_jack_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.direction = {true, false},
|
|
||||||
.dai_name = "rt712-sdca-aif2",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
|
||||||
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
|
|
||||||
.init = asoc_sdw_rt_amp_init,
|
|
||||||
.exit = asoc_sdw_rt_amp_exit,
|
|
||||||
.rtd_init = asoc_sdw_rt712_spk_rtd_init,
|
|
||||||
.controls = generic_spk_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
|
||||||
.widgets = generic_spk_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x1712,
|
|
||||||
.version_id = 3,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {false, true},
|
|
||||||
.dai_name = "rt712-sdca-dmic-aif1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
|
||||||
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
|
||||||
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x713,
|
|
||||||
.version_id = 3,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "rt712-sdca-aif1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
|
||||||
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
|
||||||
.init = asoc_sdw_rt_sdca_jack_init,
|
|
||||||
.exit = asoc_sdw_rt_sdca_jack_exit,
|
|
||||||
.rtd_init = asoc_sdw_rt_sdca_jack_rtd_init,
|
|
||||||
.controls = generic_jack_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
|
||||||
.widgets = generic_jack_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x1713,
|
|
||||||
.version_id = 3,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {false, true},
|
|
||||||
.dai_name = "rt712-sdca-dmic-aif1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
|
||||||
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
|
||||||
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x1308,
|
|
||||||
.acpi_id = "10EC1308",
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, false},
|
|
||||||
.dai_name = "rt1308-aif",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
|
||||||
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
|
|
||||||
.init = asoc_sdw_rt_amp_init,
|
|
||||||
.exit = asoc_sdw_rt_amp_exit,
|
|
||||||
.rtd_init = asoc_sdw_rt_amp_spk_rtd_init,
|
|
||||||
.controls = generic_spk_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
|
||||||
.widgets = generic_spk_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
.ops = &soc_sdw_rt1308_i2s_ops,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x1316,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "rt1316-aif",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
|
||||||
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_AMP_IN_DAI_ID},
|
|
||||||
.init = asoc_sdw_rt_amp_init,
|
|
||||||
.exit = asoc_sdw_rt_amp_exit,
|
|
||||||
.rtd_init = asoc_sdw_rt_amp_spk_rtd_init,
|
|
||||||
.controls = generic_spk_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
|
||||||
.widgets = generic_spk_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x1318,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "rt1318-aif",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
|
||||||
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_AMP_IN_DAI_ID},
|
|
||||||
.init = asoc_sdw_rt_amp_init,
|
|
||||||
.exit = asoc_sdw_rt_amp_exit,
|
|
||||||
.rtd_init = asoc_sdw_rt_amp_spk_rtd_init,
|
|
||||||
.controls = generic_spk_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
|
||||||
.widgets = generic_spk_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x714,
|
|
||||||
.version_id = 3,
|
|
||||||
.ignore_internal_dmic = true,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {false, true},
|
|
||||||
.dai_name = "rt715-sdca-aif2",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
|
||||||
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
|
||||||
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x715,
|
|
||||||
.version_id = 3,
|
|
||||||
.ignore_internal_dmic = true,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {false, true},
|
|
||||||
.dai_name = "rt715-sdca-aif2",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
|
||||||
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
|
||||||
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x714,
|
|
||||||
.version_id = 2,
|
|
||||||
.ignore_internal_dmic = true,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {false, true},
|
|
||||||
.dai_name = "rt715-aif2",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
|
||||||
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
|
||||||
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x715,
|
|
||||||
.version_id = 2,
|
|
||||||
.ignore_internal_dmic = true,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {false, true},
|
|
||||||
.dai_name = "rt715-aif2",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
|
||||||
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
|
||||||
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x722,
|
|
||||||
.version_id = 3,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "rt722-sdca-aif1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
|
||||||
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
|
||||||
.init = asoc_sdw_rt_sdca_jack_init,
|
|
||||||
.exit = asoc_sdw_rt_sdca_jack_exit,
|
|
||||||
.rtd_init = asoc_sdw_rt_sdca_jack_rtd_init,
|
|
||||||
.controls = generic_jack_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
|
||||||
.widgets = generic_jack_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.direction = {true, false},
|
|
||||||
.dai_name = "rt722-sdca-aif2",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
|
||||||
/* No feedback capability is provided by rt722-sdca codec driver*/
|
|
||||||
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
|
|
||||||
.init = asoc_sdw_rt_amp_init,
|
|
||||||
.exit = asoc_sdw_rt_amp_exit,
|
|
||||||
.rtd_init = asoc_sdw_rt722_spk_rtd_init,
|
|
||||||
.controls = generic_spk_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
|
||||||
.widgets = generic_spk_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.direction = {false, true},
|
|
||||||
.dai_name = "rt722-sdca-aif3",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
|
||||||
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
|
||||||
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 3,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x8373,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "max98373-aif1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
|
||||||
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_AMP_IN_DAI_ID},
|
|
||||||
.init = asoc_sdw_maxim_init,
|
|
||||||
.rtd_init = asoc_sdw_maxim_spk_rtd_init,
|
|
||||||
.controls = maxim_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(maxim_controls),
|
|
||||||
.widgets = maxim_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(maxim_widgets),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x8363,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, false},
|
|
||||||
.dai_name = "max98363-aif1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
|
||||||
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
|
|
||||||
.init = asoc_sdw_maxim_init,
|
|
||||||
.rtd_init = asoc_sdw_maxim_spk_rtd_init,
|
|
||||||
.controls = maxim_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(maxim_controls),
|
|
||||||
.widgets = maxim_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(maxim_widgets),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x5682,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "rt5682-sdw",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
|
||||||
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
|
||||||
.rtd_init = asoc_sdw_rt5682_rtd_init,
|
|
||||||
.controls = generic_jack_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
|
||||||
.widgets = generic_jack_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x3556,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "cs35l56-sdw1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
|
||||||
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_AMP_IN_DAI_ID},
|
|
||||||
.init = asoc_sdw_cs_amp_init,
|
|
||||||
.rtd_init = asoc_sdw_cs_spk_rtd_init,
|
|
||||||
.controls = generic_spk_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
|
||||||
.widgets = generic_spk_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x4242,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "cs42l42-sdw",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
|
||||||
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
|
||||||
.rtd_init = asoc_sdw_cs42l42_rtd_init,
|
|
||||||
.controls = generic_jack_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
|
||||||
.widgets = generic_jack_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x4243,
|
|
||||||
.codec_name = "cs42l43-codec",
|
|
||||||
.count_sidecar = asoc_sdw_bridge_cs35l56_count_sidecar,
|
|
||||||
.add_sidecar = asoc_sdw_bridge_cs35l56_add_sidecar,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, false},
|
|
||||||
.dai_name = "cs42l43-dp5",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
|
||||||
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
|
|
||||||
.rtd_init = asoc_sdw_cs42l43_hs_rtd_init,
|
|
||||||
.controls = generic_jack_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
|
||||||
.widgets = generic_jack_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.direction = {false, true},
|
|
||||||
.dai_name = "cs42l43-dp1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
|
||||||
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
|
||||||
.rtd_init = asoc_sdw_cs42l43_dmic_rtd_init,
|
|
||||||
.widgets = generic_dmic_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_dmic_widgets),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.direction = {false, true},
|
|
||||||
.dai_name = "cs42l43-dp2",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
|
||||||
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.direction = {true, false},
|
|
||||||
.dai_name = "cs42l43-dp6",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
|
||||||
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
|
|
||||||
.init = asoc_sdw_cs42l43_spk_init,
|
|
||||||
.rtd_init = asoc_sdw_cs42l43_spk_rtd_init,
|
|
||||||
.controls = generic_spk_controls,
|
|
||||||
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
|
||||||
.widgets = generic_spk_widgets,
|
|
||||||
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
|
||||||
.quirk = SOC_SDW_CODEC_SPKR | SOC_SDW_SIDECAR_AMPS,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 4,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0xaaaa, /* generic codec mockup */
|
|
||||||
.version_id = 0,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "sdw-mockup-aif1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
|
||||||
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0xaa55, /* headset codec mockup */
|
|
||||||
.version_id = 0,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "sdw-mockup-aif1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
|
||||||
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x55aa, /* amplifier mockup */
|
|
||||||
.version_id = 0,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.direction = {true, true},
|
|
||||||
.dai_name = "sdw-mockup-aif1",
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
|
||||||
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_AMP_IN_DAI_ID},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.part_id = 0x5555,
|
|
||||||
.version_id = 0,
|
|
||||||
.dais = {
|
|
||||||
{
|
|
||||||
.dai_name = "sdw-mockup-aif1",
|
|
||||||
.direction = {false, true},
|
|
||||||
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
|
||||||
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.dai_num = 1,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_part(const u64 adr)
|
|
||||||
{
|
|
||||||
unsigned int part_id, sdw_version;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
part_id = SDW_PART_ID(adr);
|
|
||||||
sdw_version = SDW_VERSION(adr);
|
|
||||||
for (i = 0; i < ARRAY_SIZE(codec_info_list); i++)
|
|
||||||
/*
|
|
||||||
* A codec info is for all sdw version with the part id if
|
|
||||||
* version_id is not specified in the codec info.
|
|
||||||
*/
|
|
||||||
if (part_id == codec_info_list[i].part_id &&
|
|
||||||
(!codec_info_list[i].version_id ||
|
|
||||||
sdw_version == codec_info_list[i].version_id))
|
|
||||||
return &codec_info_list[i];
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_acpi(const u8 *acpi_id)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!acpi_id[0])
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(codec_info_list); i++)
|
|
||||||
if (!memcmp(codec_info_list[i].acpi_id, acpi_id, ACPI_ID_LEN))
|
|
||||||
return &codec_info_list[i];
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_dai(const char *dai_name,
|
|
||||||
int *dai_index)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(codec_info_list); i++) {
|
|
||||||
for (j = 0; j < codec_info_list[i].dai_num; j++) {
|
|
||||||
if (!strcmp(codec_info_list[i].dais[j].dai_name, dai_name)) {
|
|
||||||
*dai_index = j;
|
|
||||||
return &codec_info_list[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void init_dai_link(struct device *dev, struct snd_soc_dai_link *dai_links,
|
static void init_dai_link(struct device *dev, struct snd_soc_dai_link *dai_links,
|
||||||
int *be_id, char *name, int playback, int capture,
|
int *be_id, char *name, int playback, int capture,
|
||||||
struct snd_soc_dai_link_component *cpus, int cpus_num,
|
struct snd_soc_dai_link_component *cpus, int cpus_num,
|
||||||
|
|
@ -1190,69 +605,6 @@ static int init_simple_dai_link(struct device *dev, struct snd_soc_dai_link *dai
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int asoc_sdw_rtd_init(struct snd_soc_pcm_runtime *rtd)
|
|
||||||
{
|
|
||||||
struct snd_soc_card *card = rtd->card;
|
|
||||||
struct asoc_sdw_codec_info *codec_info;
|
|
||||||
struct snd_soc_dai *dai;
|
|
||||||
int dai_index;
|
|
||||||
int ret;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for_each_rtd_codec_dais(rtd, i, dai) {
|
|
||||||
codec_info = asoc_sdw_find_codec_info_dai(dai->name, &dai_index);
|
|
||||||
if (!codec_info)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A codec dai can be connected to different dai links for capture and playback,
|
|
||||||
* but we only need to call the rtd_init function once.
|
|
||||||
* The rtd_init for each codec dai is independent. So, the order of rtd_init
|
|
||||||
* doesn't matter.
|
|
||||||
*/
|
|
||||||
if (codec_info->dais[dai_index].rtd_init_done)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Add card controls and dapm widgets for the first codec dai.
|
|
||||||
* The controls and widgets will be used for all codec dais.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (i > 0)
|
|
||||||
goto skip_add_controls_widgets;
|
|
||||||
|
|
||||||
if (codec_info->dais[dai_index].controls) {
|
|
||||||
ret = snd_soc_add_card_controls(card, codec_info->dais[dai_index].controls,
|
|
||||||
codec_info->dais[dai_index].num_controls);
|
|
||||||
if (ret) {
|
|
||||||
dev_err(card->dev, "%#x controls addition failed: %d\n",
|
|
||||||
codec_info->part_id, ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (codec_info->dais[dai_index].widgets) {
|
|
||||||
ret = snd_soc_dapm_new_controls(&card->dapm,
|
|
||||||
codec_info->dais[dai_index].widgets,
|
|
||||||
codec_info->dais[dai_index].num_widgets);
|
|
||||||
if (ret) {
|
|
||||||
dev_err(card->dev, "%#x widgets addition failed: %d\n",
|
|
||||||
codec_info->part_id, ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
skip_add_controls_widgets:
|
|
||||||
if (codec_info->dais[dai_index].rtd_init) {
|
|
||||||
ret = codec_info->dais[dai_index].rtd_init(rtd, dai);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
codec_info->dais[dai_index].rtd_init_done = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sof_sdw_endpoint {
|
struct sof_sdw_endpoint {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
|
|
||||||
|
|
@ -1871,7 +1223,7 @@ static int sof_sdw_card_late_probe(struct snd_soc_card *card)
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(codec_info_list); i++) {
|
for (i = 0; i < ctx->codec_info_list_count; i++) {
|
||||||
if (codec_info_list[i].codec_card_late_probe) {
|
if (codec_info_list[i].codec_card_late_probe) {
|
||||||
ret = codec_info_list[i].codec_card_late_probe(card);
|
ret = codec_info_list[i].codec_card_late_probe(card);
|
||||||
|
|
||||||
|
|
@ -1907,10 +1259,11 @@ static struct snd_soc_dai_link *mc_find_codec_dai_used(struct snd_soc_card *card
|
||||||
static void mc_dailink_exit_loop(struct snd_soc_card *card)
|
static void mc_dailink_exit_loop(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai_link *dai_link;
|
struct snd_soc_dai_link *dai_link;
|
||||||
|
struct asoc_sdw_mc_private *ctx = snd_soc_card_get_drvdata(card);
|
||||||
int ret;
|
int ret;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(codec_info_list); i++) {
|
for (i = 0; i < ctx->codec_info_list_count; i++) {
|
||||||
for (j = 0; j < codec_info_list[i].dai_num; j++) {
|
for (j = 0; j < codec_info_list[i].dai_num; j++) {
|
||||||
codec_info_list[i].dais[j].rtd_init_done = false;
|
codec_info_list[i].dais[j].rtd_init_done = false;
|
||||||
/* Check each dai in codec_info_lis to see if it is used in the link */
|
/* Check each dai in codec_info_lis to see if it is used in the link */
|
||||||
|
|
@ -1955,6 +1308,7 @@ static int mc_probe(struct platform_device *pdev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
ctx->private = intel_ctx;
|
ctx->private = intel_ctx;
|
||||||
|
ctx->codec_info_list_count = asoc_sdw_get_codec_info_list_count();
|
||||||
card = &ctx->card;
|
card = &ctx->card;
|
||||||
card->dev = &pdev->dev;
|
card->dev = &pdev->dev;
|
||||||
card->name = "soundwire";
|
card->name = "soundwire";
|
||||||
|
|
@ -1975,7 +1329,7 @@ static int mc_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
ctx->mc_quirk = sof_sdw_quirk;
|
ctx->mc_quirk = sof_sdw_quirk;
|
||||||
/* reset amp_num to ensure amp_num++ starts from 0 in each probe */
|
/* reset amp_num to ensure amp_num++ starts from 0 in each probe */
|
||||||
for (i = 0; i < ARRAY_SIZE(codec_info_list); i++)
|
for (i = 0; i < ctx->codec_info_list_count; i++)
|
||||||
codec_info_list[i].amp_num = 0;
|
codec_info_list[i].amp_num = 0;
|
||||||
|
|
||||||
if (mach->mach_params.subsystem_id_set) {
|
if (mach->mach_params.subsystem_id_set) {
|
||||||
|
|
@ -1993,7 +1347,7 @@ static int mc_probe(struct platform_device *pdev)
|
||||||
* amp_num will only be increased for active amp
|
* amp_num will only be increased for active amp
|
||||||
* codecs on used platform
|
* codecs on used platform
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < ARRAY_SIZE(codec_info_list); i++)
|
for (i = 0; i < ctx->codec_info_list_count; i++)
|
||||||
amp_num += codec_info_list[i].amp_num;
|
amp_num += codec_info_list[i].amp_num;
|
||||||
|
|
||||||
card->components = devm_kasprintf(card->dev, GFP_KERNEL,
|
card->components = devm_kasprintf(card->dev, GFP_KERNEL,
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,663 @@
|
||||||
#include <linux/soundwire/sdw_type.h>
|
#include <linux/soundwire/sdw_type.h>
|
||||||
#include <sound/soc_sdw_utils.h>
|
#include <sound/soc_sdw_utils.h>
|
||||||
|
|
||||||
|
static const struct snd_soc_dapm_widget generic_dmic_widgets[] = {
|
||||||
|
SND_SOC_DAPM_MIC("DMIC", NULL),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct snd_soc_dapm_widget generic_jack_widgets[] = {
|
||||||
|
SND_SOC_DAPM_HP("Headphone", NULL),
|
||||||
|
SND_SOC_DAPM_MIC("Headset Mic", NULL),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct snd_kcontrol_new generic_jack_controls[] = {
|
||||||
|
SOC_DAPM_PIN_SWITCH("Headphone"),
|
||||||
|
SOC_DAPM_PIN_SWITCH("Headset Mic"),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct snd_soc_dapm_widget generic_spk_widgets[] = {
|
||||||
|
SND_SOC_DAPM_SPK("Speaker", NULL),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct snd_kcontrol_new generic_spk_controls[] = {
|
||||||
|
SOC_DAPM_PIN_SWITCH("Speaker"),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct snd_soc_dapm_widget maxim_widgets[] = {
|
||||||
|
SND_SOC_DAPM_SPK("Left Spk", NULL),
|
||||||
|
SND_SOC_DAPM_SPK("Right Spk", NULL),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct snd_kcontrol_new maxim_controls[] = {
|
||||||
|
SOC_DAPM_PIN_SWITCH("Left Spk"),
|
||||||
|
SOC_DAPM_PIN_SWITCH("Right Spk"),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct snd_soc_dapm_widget rt700_widgets[] = {
|
||||||
|
SND_SOC_DAPM_HP("Headphones", NULL),
|
||||||
|
SND_SOC_DAPM_MIC("AMIC", NULL),
|
||||||
|
SND_SOC_DAPM_SPK("Speaker", NULL),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct snd_kcontrol_new rt700_controls[] = {
|
||||||
|
SOC_DAPM_PIN_SWITCH("Headphones"),
|
||||||
|
SOC_DAPM_PIN_SWITCH("AMIC"),
|
||||||
|
SOC_DAPM_PIN_SWITCH("Speaker"),
|
||||||
|
};
|
||||||
|
|
||||||
|
struct asoc_sdw_codec_info codec_info_list[] = {
|
||||||
|
{
|
||||||
|
.part_id = 0x700,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "rt700-aif1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
||||||
|
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
||||||
|
.rtd_init = asoc_sdw_rt700_rtd_init,
|
||||||
|
.controls = rt700_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(rt700_controls),
|
||||||
|
.widgets = rt700_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(rt700_widgets),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x711,
|
||||||
|
.version_id = 3,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "rt711-sdca-aif1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
||||||
|
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
||||||
|
.init = asoc_sdw_rt_sdca_jack_init,
|
||||||
|
.exit = asoc_sdw_rt_sdca_jack_exit,
|
||||||
|
.rtd_init = asoc_sdw_rt_sdca_jack_rtd_init,
|
||||||
|
.controls = generic_jack_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
||||||
|
.widgets = generic_jack_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x711,
|
||||||
|
.version_id = 2,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "rt711-aif1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
||||||
|
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
||||||
|
.init = asoc_sdw_rt711_init,
|
||||||
|
.exit = asoc_sdw_rt711_exit,
|
||||||
|
.rtd_init = asoc_sdw_rt711_rtd_init,
|
||||||
|
.controls = generic_jack_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
||||||
|
.widgets = generic_jack_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x712,
|
||||||
|
.version_id = 3,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "rt712-sdca-aif1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
||||||
|
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
||||||
|
.init = asoc_sdw_rt_sdca_jack_init,
|
||||||
|
.exit = asoc_sdw_rt_sdca_jack_exit,
|
||||||
|
.rtd_init = asoc_sdw_rt_sdca_jack_rtd_init,
|
||||||
|
.controls = generic_jack_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
||||||
|
.widgets = generic_jack_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.direction = {true, false},
|
||||||
|
.dai_name = "rt712-sdca-aif2",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
||||||
|
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
|
||||||
|
.init = asoc_sdw_rt_amp_init,
|
||||||
|
.exit = asoc_sdw_rt_amp_exit,
|
||||||
|
.rtd_init = asoc_sdw_rt712_spk_rtd_init,
|
||||||
|
.controls = generic_spk_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
||||||
|
.widgets = generic_spk_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x1712,
|
||||||
|
.version_id = 3,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {false, true},
|
||||||
|
.dai_name = "rt712-sdca-dmic-aif1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
||||||
|
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
||||||
|
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x713,
|
||||||
|
.version_id = 3,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "rt712-sdca-aif1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
||||||
|
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
||||||
|
.init = asoc_sdw_rt_sdca_jack_init,
|
||||||
|
.exit = asoc_sdw_rt_sdca_jack_exit,
|
||||||
|
.rtd_init = asoc_sdw_rt_sdca_jack_rtd_init,
|
||||||
|
.controls = generic_jack_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
||||||
|
.widgets = generic_jack_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x1713,
|
||||||
|
.version_id = 3,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {false, true},
|
||||||
|
.dai_name = "rt712-sdca-dmic-aif1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
||||||
|
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
||||||
|
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x1308,
|
||||||
|
.acpi_id = "10EC1308",
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, false},
|
||||||
|
.dai_name = "rt1308-aif",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
||||||
|
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
|
||||||
|
.init = asoc_sdw_rt_amp_init,
|
||||||
|
.exit = asoc_sdw_rt_amp_exit,
|
||||||
|
.rtd_init = asoc_sdw_rt_amp_spk_rtd_init,
|
||||||
|
.controls = generic_spk_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
||||||
|
.widgets = generic_spk_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
.ops = &soc_sdw_rt1308_i2s_ops,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x1316,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "rt1316-aif",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
||||||
|
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_AMP_IN_DAI_ID},
|
||||||
|
.init = asoc_sdw_rt_amp_init,
|
||||||
|
.exit = asoc_sdw_rt_amp_exit,
|
||||||
|
.rtd_init = asoc_sdw_rt_amp_spk_rtd_init,
|
||||||
|
.controls = generic_spk_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
||||||
|
.widgets = generic_spk_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x1318,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "rt1318-aif",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
||||||
|
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_AMP_IN_DAI_ID},
|
||||||
|
.init = asoc_sdw_rt_amp_init,
|
||||||
|
.exit = asoc_sdw_rt_amp_exit,
|
||||||
|
.rtd_init = asoc_sdw_rt_amp_spk_rtd_init,
|
||||||
|
.controls = generic_spk_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
||||||
|
.widgets = generic_spk_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x714,
|
||||||
|
.version_id = 3,
|
||||||
|
.ignore_internal_dmic = true,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {false, true},
|
||||||
|
.dai_name = "rt715-sdca-aif2",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
||||||
|
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
||||||
|
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x715,
|
||||||
|
.version_id = 3,
|
||||||
|
.ignore_internal_dmic = true,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {false, true},
|
||||||
|
.dai_name = "rt715-sdca-aif2",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
||||||
|
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
||||||
|
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x714,
|
||||||
|
.version_id = 2,
|
||||||
|
.ignore_internal_dmic = true,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {false, true},
|
||||||
|
.dai_name = "rt715-aif2",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
||||||
|
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
||||||
|
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x715,
|
||||||
|
.version_id = 2,
|
||||||
|
.ignore_internal_dmic = true,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {false, true},
|
||||||
|
.dai_name = "rt715-aif2",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
||||||
|
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
||||||
|
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x722,
|
||||||
|
.version_id = 3,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "rt722-sdca-aif1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
||||||
|
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
||||||
|
.init = asoc_sdw_rt_sdca_jack_init,
|
||||||
|
.exit = asoc_sdw_rt_sdca_jack_exit,
|
||||||
|
.rtd_init = asoc_sdw_rt_sdca_jack_rtd_init,
|
||||||
|
.controls = generic_jack_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
||||||
|
.widgets = generic_jack_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.direction = {true, false},
|
||||||
|
.dai_name = "rt722-sdca-aif2",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
||||||
|
/* No feedback capability is provided by rt722-sdca codec driver*/
|
||||||
|
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
|
||||||
|
.init = asoc_sdw_rt_amp_init,
|
||||||
|
.exit = asoc_sdw_rt_amp_exit,
|
||||||
|
.rtd_init = asoc_sdw_rt722_spk_rtd_init,
|
||||||
|
.controls = generic_spk_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
||||||
|
.widgets = generic_spk_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.direction = {false, true},
|
||||||
|
.dai_name = "rt722-sdca-aif3",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
||||||
|
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
||||||
|
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x8373,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "max98373-aif1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
||||||
|
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_AMP_IN_DAI_ID},
|
||||||
|
.init = asoc_sdw_maxim_init,
|
||||||
|
.rtd_init = asoc_sdw_maxim_spk_rtd_init,
|
||||||
|
.controls = maxim_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(maxim_controls),
|
||||||
|
.widgets = maxim_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(maxim_widgets),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x8363,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, false},
|
||||||
|
.dai_name = "max98363-aif1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
||||||
|
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
|
||||||
|
.init = asoc_sdw_maxim_init,
|
||||||
|
.rtd_init = asoc_sdw_maxim_spk_rtd_init,
|
||||||
|
.controls = maxim_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(maxim_controls),
|
||||||
|
.widgets = maxim_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(maxim_widgets),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x5682,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "rt5682-sdw",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
||||||
|
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
||||||
|
.rtd_init = asoc_sdw_rt5682_rtd_init,
|
||||||
|
.controls = generic_jack_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
||||||
|
.widgets = generic_jack_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x3556,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "cs35l56-sdw1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
||||||
|
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_AMP_IN_DAI_ID},
|
||||||
|
.init = asoc_sdw_cs_amp_init,
|
||||||
|
.rtd_init = asoc_sdw_cs_spk_rtd_init,
|
||||||
|
.controls = generic_spk_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
||||||
|
.widgets = generic_spk_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x4242,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "cs42l42-sdw",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
||||||
|
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
||||||
|
.rtd_init = asoc_sdw_cs42l42_rtd_init,
|
||||||
|
.controls = generic_jack_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
||||||
|
.widgets = generic_jack_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x4243,
|
||||||
|
.codec_name = "cs42l43-codec",
|
||||||
|
.count_sidecar = asoc_sdw_bridge_cs35l56_count_sidecar,
|
||||||
|
.add_sidecar = asoc_sdw_bridge_cs35l56_add_sidecar,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, false},
|
||||||
|
.dai_name = "cs42l43-dp5",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
||||||
|
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
|
||||||
|
.rtd_init = asoc_sdw_cs42l43_hs_rtd_init,
|
||||||
|
.controls = generic_jack_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_jack_controls),
|
||||||
|
.widgets = generic_jack_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.direction = {false, true},
|
||||||
|
.dai_name = "cs42l43-dp1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
||||||
|
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
||||||
|
.rtd_init = asoc_sdw_cs42l43_dmic_rtd_init,
|
||||||
|
.widgets = generic_dmic_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_dmic_widgets),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.direction = {false, true},
|
||||||
|
.dai_name = "cs42l43-dp2",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
||||||
|
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.direction = {true, false},
|
||||||
|
.dai_name = "cs42l43-dp6",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
||||||
|
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
|
||||||
|
.init = asoc_sdw_cs42l43_spk_init,
|
||||||
|
.rtd_init = asoc_sdw_cs42l43_spk_rtd_init,
|
||||||
|
.controls = generic_spk_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(generic_spk_controls),
|
||||||
|
.widgets = generic_spk_widgets,
|
||||||
|
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
|
||||||
|
.quirk = SOC_SDW_CODEC_SPKR | SOC_SDW_SIDECAR_AMPS,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 4,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0xaaaa, /* generic codec mockup */
|
||||||
|
.version_id = 0,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "sdw-mockup-aif1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
||||||
|
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0xaa55, /* headset codec mockup */
|
||||||
|
.version_id = 0,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "sdw-mockup-aif1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_JACK,
|
||||||
|
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x55aa, /* amplifier mockup */
|
||||||
|
.version_id = 0,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.direction = {true, true},
|
||||||
|
.dai_name = "sdw-mockup-aif1",
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_AMP,
|
||||||
|
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_AMP_IN_DAI_ID},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.part_id = 0x5555,
|
||||||
|
.version_id = 0,
|
||||||
|
.dais = {
|
||||||
|
{
|
||||||
|
.dai_name = "sdw-mockup-aif1",
|
||||||
|
.direction = {false, true},
|
||||||
|
.dai_type = SOC_SDW_DAI_TYPE_MIC,
|
||||||
|
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.dai_num = 1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
EXPORT_SYMBOL_NS(codec_info_list, SND_SOC_SDW_UTILS);
|
||||||
|
|
||||||
|
int asoc_sdw_get_codec_info_list_count(void)
|
||||||
|
{
|
||||||
|
return ARRAY_SIZE(codec_info_list);
|
||||||
|
};
|
||||||
|
EXPORT_SYMBOL_NS(asoc_sdw_get_codec_info_list_count, SND_SOC_SDW_UTILS);
|
||||||
|
|
||||||
|
struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_part(const u64 adr)
|
||||||
|
{
|
||||||
|
unsigned int part_id, sdw_version;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
part_id = SDW_PART_ID(adr);
|
||||||
|
sdw_version = SDW_VERSION(adr);
|
||||||
|
for (i = 0; i < ARRAY_SIZE(codec_info_list); i++)
|
||||||
|
/*
|
||||||
|
* A codec info is for all sdw version with the part id if
|
||||||
|
* version_id is not specified in the codec info.
|
||||||
|
*/
|
||||||
|
if (part_id == codec_info_list[i].part_id &&
|
||||||
|
(!codec_info_list[i].version_id ||
|
||||||
|
sdw_version == codec_info_list[i].version_id))
|
||||||
|
return &codec_info_list[i];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_NS(asoc_sdw_find_codec_info_part, SND_SOC_SDW_UTILS);
|
||||||
|
|
||||||
|
struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_acpi(const u8 *acpi_id)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!acpi_id[0])
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(codec_info_list); i++)
|
||||||
|
if (!memcmp(codec_info_list[i].acpi_id, acpi_id, ACPI_ID_LEN))
|
||||||
|
return &codec_info_list[i];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_NS(asoc_sdw_find_codec_info_acpi, SND_SOC_SDW_UTILS);
|
||||||
|
|
||||||
|
struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_dai(const char *dai_name, int *dai_index)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(codec_info_list); i++) {
|
||||||
|
for (j = 0; j < codec_info_list[i].dai_num; j++) {
|
||||||
|
if (!strcmp(codec_info_list[i].dais[j].dai_name, dai_name)) {
|
||||||
|
*dai_index = j;
|
||||||
|
return &codec_info_list[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_NS(asoc_sdw_find_codec_info_dai, SND_SOC_SDW_UTILS);
|
||||||
|
|
||||||
|
int asoc_sdw_rtd_init(struct snd_soc_pcm_runtime *rtd)
|
||||||
|
{
|
||||||
|
struct snd_soc_card *card = rtd->card;
|
||||||
|
struct asoc_sdw_codec_info *codec_info;
|
||||||
|
struct snd_soc_dai *dai;
|
||||||
|
int dai_index;
|
||||||
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for_each_rtd_codec_dais(rtd, i, dai) {
|
||||||
|
codec_info = asoc_sdw_find_codec_info_dai(dai->name, &dai_index);
|
||||||
|
if (!codec_info)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A codec dai can be connected to different dai links for capture and playback,
|
||||||
|
* but we only need to call the rtd_init function once.
|
||||||
|
* The rtd_init for each codec dai is independent. So, the order of rtd_init
|
||||||
|
* doesn't matter.
|
||||||
|
*/
|
||||||
|
if (codec_info->dais[dai_index].rtd_init_done)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add card controls and dapm widgets for the first codec dai.
|
||||||
|
* The controls and widgets will be used for all codec dais.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (i > 0)
|
||||||
|
goto skip_add_controls_widgets;
|
||||||
|
|
||||||
|
if (codec_info->dais[dai_index].controls) {
|
||||||
|
ret = snd_soc_add_card_controls(card, codec_info->dais[dai_index].controls,
|
||||||
|
codec_info->dais[dai_index].num_controls);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(card->dev, "%#x controls addition failed: %d\n",
|
||||||
|
codec_info->part_id, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (codec_info->dais[dai_index].widgets) {
|
||||||
|
ret = snd_soc_dapm_new_controls(&card->dapm,
|
||||||
|
codec_info->dais[dai_index].widgets,
|
||||||
|
codec_info->dais[dai_index].num_widgets);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(card->dev, "%#x widgets addition failed: %d\n",
|
||||||
|
codec_info->part_id, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
skip_add_controls_widgets:
|
||||||
|
if (codec_info->dais[dai_index].rtd_init) {
|
||||||
|
ret = codec_info->dais[dai_index].rtd_init(rtd, dai);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
codec_info->dais[dai_index].rtd_init_done = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_NS(asoc_sdw_rtd_init, SND_SOC_SDW_UTILS);
|
||||||
|
|
||||||
/* these wrappers are only needed to avoid typecast compilation errors */
|
/* these wrappers are only needed to avoid typecast compilation errors */
|
||||||
int asoc_sdw_startup(struct snd_pcm_substream *substream)
|
int asoc_sdw_startup(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user