mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 00:53:34 +02:00
ASoC: Intel: sof_sdw: Add rt722 support
RT722 is a multi-function codec which supports headset, amp, and dmic functions. Each function provides a DAI which can be used in different dailinks. The RT711 supports up to 3 SoundWire lanes, but that should not have any impact in the machine driver: the lanes are allocated and controlled by the manager and bandwidth allocation algorithm. Signed-off-by: Chao Song <chao.song@linux.intel.com> Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com> Link: https://lore.kernel.org/r/20231127133448.18449-4-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
fd8ff49d35
commit
def127feaa
|
|
@ -686,6 +686,7 @@ config SND_SOC_INTEL_SOUNDWIRE_SOF_MACH
|
|||
select SND_SOC_RT712_SDCA_DMIC_SDW
|
||||
select SND_SOC_RT715_SDW
|
||||
select SND_SOC_RT715_SDCA_SDW
|
||||
select SND_SOC_RT722_SDCA_SDW
|
||||
select SND_SOC_RT1308_SDW
|
||||
select SND_SOC_RT1308
|
||||
select SND_SOC_RT1316_SDW
|
||||
|
|
|
|||
|
|
@ -41,9 +41,10 @@ snd-soc-sof-sdw-objs += sof_sdw.o \
|
|||
sof_sdw_rt5682.o sof_sdw_rt700.o \
|
||||
sof_sdw_rt711.o sof_sdw_rt_sdca_jack_common.o \
|
||||
sof_sdw_rt712_sdca.o sof_sdw_rt715.o \
|
||||
sof_sdw_rt715_sdca.o sof_sdw_dmic.o \
|
||||
sof_sdw_rt715_sdca.o sof_sdw_rt722_sdca.o \
|
||||
sof_sdw_cs42l42.o sof_sdw_cs42l43.o \
|
||||
sof_sdw_cs_amp.o \
|
||||
sof_sdw_dmic.o \
|
||||
sof_sdw_hdmi.o
|
||||
obj-$(CONFIG_SND_SOC_INTEL_SOF_RT5682_MACH) += snd-soc-sof_rt5682.o
|
||||
obj-$(CONFIG_SND_SOC_INTEL_SOF_CS42L42_MACH) += snd-soc-sof_cs42l42.o
|
||||
|
|
|
|||
|
|
@ -860,6 +860,36 @@ static struct sof_sdw_codec_info codec_info_list[] = {
|
|||
},
|
||||
.dai_num = 1,
|
||||
},
|
||||
{
|
||||
.part_id = 0x722,
|
||||
.version_id = 3,
|
||||
.dais = {
|
||||
{
|
||||
.direction = {true, true},
|
||||
.dai_name = "rt722-sdca-aif1",
|
||||
.dai_type = SOF_SDW_DAI_TYPE_JACK,
|
||||
.dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID},
|
||||
.init = sof_sdw_rt_sdca_jack_init,
|
||||
.exit = sof_sdw_rt_sdca_jack_exit,
|
||||
},
|
||||
{
|
||||
.direction = {true, false},
|
||||
.dai_name = "rt722-sdca-aif2",
|
||||
.dai_type = SOF_SDW_DAI_TYPE_AMP,
|
||||
/* No feedback capability is provided by rt722-sdca codec driver*/
|
||||
.dailink = {SDW_AMP_OUT_DAI_ID, SDW_UNUSED_DAI_ID},
|
||||
.init = sof_sdw_rt722_spk_init,
|
||||
},
|
||||
{
|
||||
.direction = {false, true},
|
||||
.dai_name = "rt722-sdca-aif3",
|
||||
.dai_type = SOF_SDW_DAI_TYPE_MIC,
|
||||
.dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID},
|
||||
.init = sof_sdw_rt722_sdca_dmic_init,
|
||||
},
|
||||
},
|
||||
.dai_num = 3,
|
||||
},
|
||||
{
|
||||
.part_id = 0x8373,
|
||||
.dais = {
|
||||
|
|
|
|||
|
|
@ -183,6 +183,18 @@ int sof_sdw_rt715_sdca_init(struct snd_soc_card *card,
|
|||
struct sof_sdw_codec_info *info,
|
||||
bool playback);
|
||||
|
||||
/* RT722-SDCA support */
|
||||
int sof_sdw_rt722_spk_init(struct snd_soc_card *card,
|
||||
const struct snd_soc_acpi_link_adr *link,
|
||||
struct snd_soc_dai_link *dai_links,
|
||||
struct sof_sdw_codec_info *info,
|
||||
bool playback);
|
||||
int sof_sdw_rt722_sdca_dmic_init(struct snd_soc_card *card,
|
||||
const struct snd_soc_acpi_link_adr *link,
|
||||
struct snd_soc_dai_link *dai_links,
|
||||
struct sof_sdw_codec_info *info,
|
||||
bool playback);
|
||||
|
||||
/* MAXIM codec support */
|
||||
int sof_sdw_maxim_init(struct snd_soc_card *card,
|
||||
const struct snd_soc_acpi_link_adr *link,
|
||||
|
|
|
|||
97
sound/soc/intel/boards/sof_sdw_rt722_sdca.c
Normal file
97
sound/soc/intel/boards/sof_sdw_rt722_sdca.c
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
// Copyright (c) 2023 Intel Corporation
|
||||
|
||||
/*
|
||||
* sof_sdw_rt722_sdca - Helpers to handle RT722-SDCA from generic machine driver
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/soundwire/sdw.h>
|
||||
#include <linux/soundwire/sdw_type.h>
|
||||
#include <sound/control.h>
|
||||
#include <sound/soc.h>
|
||||
#include <sound/soc-acpi.h>
|
||||
#include <sound/soc-dapm.h>
|
||||
#include "sof_sdw_common.h"
|
||||
|
||||
static const struct snd_soc_dapm_widget rt722_spk_widgets[] = {
|
||||
SND_SOC_DAPM_SPK("Speaker", NULL),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route rt722_spk_map[] = {
|
||||
{ "Speaker", NULL, "rt722 SPK" },
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new rt722_spk_controls[] = {
|
||||
SOC_DAPM_PIN_SWITCH("Speaker"),
|
||||
};
|
||||
|
||||
static int rt722_spk_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
int ret;
|
||||
|
||||
card->components = devm_kasprintf(card->dev, GFP_KERNEL,
|
||||
"%s spk:rt722",
|
||||
card->components);
|
||||
if (!card->components)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_add_card_controls(card, rt722_spk_controls,
|
||||
ARRAY_SIZE(rt722_spk_controls));
|
||||
if (ret) {
|
||||
dev_err(card->dev, "failed to add rt722 spk controls: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = snd_soc_dapm_new_controls(&card->dapm, rt722_spk_widgets,
|
||||
ARRAY_SIZE(rt722_spk_widgets));
|
||||
if (ret) {
|
||||
dev_err(card->dev, "failed to add rt722 spk widgets: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = snd_soc_dapm_add_routes(&card->dapm, rt722_spk_map, ARRAY_SIZE(rt722_spk_map));
|
||||
if (ret)
|
||||
dev_err(rtd->dev, "failed to add rt722 spk map: %d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int sof_sdw_rt722_spk_init(struct snd_soc_card *card,
|
||||
const struct snd_soc_acpi_link_adr *link,
|
||||
struct snd_soc_dai_link *dai_links,
|
||||
struct sof_sdw_codec_info *info,
|
||||
bool playback)
|
||||
{
|
||||
dai_links->init = rt722_spk_init;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rt722_sdca_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_card *card = rtd->card;
|
||||
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
|
||||
card->components = devm_kasprintf(card->dev, GFP_KERNEL,
|
||||
"%s mic:%s",
|
||||
card->components, component->name_prefix);
|
||||
if (!card->components)
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sof_sdw_rt722_sdca_dmic_init(struct snd_soc_card *card,
|
||||
const struct snd_soc_acpi_link_adr *link,
|
||||
struct snd_soc_dai_link *dai_links,
|
||||
struct sof_sdw_codec_info *info,
|
||||
bool playback)
|
||||
{
|
||||
dai_links->init = rt722_sdca_dmic_rtd_init;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -63,6 +63,11 @@ static const struct snd_soc_dapm_route rt713_sdca_map[] = {
|
|||
{ "rt713 MIC2", NULL, "Headset Mic" },
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route rt722_sdca_map[] = {
|
||||
{ "Headphone", NULL, "rt722 HP" },
|
||||
{ "rt722 MIC2", NULL, "Headset Mic" },
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new rt_sdca_jack_controls[] = {
|
||||
SOC_DAPM_PIN_SWITCH("Headphone"),
|
||||
SOC_DAPM_PIN_SWITCH("Headset Mic"),
|
||||
|
|
@ -117,6 +122,9 @@ static int rt_sdca_jack_rtd_init(struct snd_soc_pcm_runtime *rtd)
|
|||
} else if (strstr(component->name_prefix, "rt713")) {
|
||||
ret = snd_soc_dapm_add_routes(&card->dapm, rt713_sdca_map,
|
||||
ARRAY_SIZE(rt713_sdca_map));
|
||||
} else if (strstr(component->name_prefix, "rt722")) {
|
||||
ret = snd_soc_dapm_add_routes(&card->dapm, rt722_sdca_map,
|
||||
ARRAY_SIZE(rt722_sdca_map));
|
||||
} else {
|
||||
dev_err(card->dev, "%s is not supported\n", component->name_prefix);
|
||||
return -EINVAL;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user