Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions drivers/soundwire/slave.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ const struct device_type sdw_slave_type = {
.release = sdw_slave_release,
.uevent = sdw_slave_uevent,
};
EXPORT_SYMBOL_GPL(sdw_slave_type);

int sdw_slave_add(struct sdw_bus *bus,
struct sdw_slave_id *id, struct fwnode_handle *fwnode)
Expand Down
3 changes: 0 additions & 3 deletions include/sound/soc_sdw_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,6 @@ 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);

struct snd_soc_dai_link *asoc_sdw_mc_find_codec_dai_used(struct snd_soc_card *card,
const char *dai_name);

Expand Down
48 changes: 36 additions & 12 deletions sound/soc/sdw_utils/soc_sdw_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -802,6 +802,19 @@ struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_part(const u64 adr)
}
EXPORT_SYMBOL_NS(asoc_sdw_find_codec_info_part, "SND_SOC_SDW_UTILS");

static struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_sdw_id(const struct sdw_slave_id *id)
{
int i;

for (i = 0; i < ARRAY_SIZE(codec_info_list); i++)
if (id->part_id == codec_info_list[i].part_id &&
(!codec_info_list[i].version_id ||
id->sdw_version == codec_info_list[i].version_id))
return &codec_info_list[i];

return NULL;
}

struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_acpi(const u8 *acpi_id)
{
int i;
Expand All @@ -817,38 +830,45 @@ struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_acpi(const u8 *acpi_id)
}
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)
static int asoc_sdw_find_codec_info_dai_index(const struct asoc_sdw_codec_info *codec_info,
const char *dai_name)
{
int i, j;
int i;

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];
}
}
for (i = 0; i < codec_info->dai_num; i++) {
if (!strcmp(codec_info->dais[i].dai_name, dai_name))
return i;
}

return NULL;
return -ENOENT;
}
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;
struct sdw_slave *sdw_peripheral;
const char *spk_components="";
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 (is_sdw_slave(dai->component->dev))
sdw_peripheral = dev_to_sdw_dev(dai->component->dev);
else if (dai->component->dev->parent && is_sdw_slave(dai->component->dev->parent))
sdw_peripheral = dev_to_sdw_dev(dai->component->dev->parent);
else
continue;

codec_info = asoc_sdw_find_codec_info_sdw_id(&sdw_peripheral->id);
if (!codec_info)
return -EINVAL;

dai_index = asoc_sdw_find_codec_info_dai_index(codec_info, dai->name);
WARN_ON(dai_index < 0);

/*
* 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.
Expand All @@ -858,6 +878,10 @@ int asoc_sdw_rtd_init(struct snd_soc_pcm_runtime *rtd)
if (codec_info->dais[dai_index].rtd_init_done)
continue;

dev_dbg(card->dev, "%#x/%s initializing for %s/%s\n",
codec_info->part_id, codec_info->dais[dai_index].dai_name,
dai->component->name, dai->name);

/*
* Add card controls and dapm widgets for the first codec dai.
* The controls and widgets will be used for all codec dais.
Expand Down
Loading