Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
5f6eb87
ASoC: SOF: topology: remove redundant code
ranj063 Nov 30, 2021
4773a21
ASoC: SOF: topology: remove redundant code in sof_link_afe_load()
ranj063 Nov 30, 2021
d4ac515
ASoC: SOF: topology: Drop the size parameter from struct sof_topology…
ranj063 Dec 6, 2021
702497c
ASoC: SOF: topology: Modify the get_token op for string tokens
ranj063 Dec 7, 2021
dc99302
ASoC: SOF: topology: expose some get_token ops
ranj063 Dec 7, 2021
715b9a9
ASoC: SOF: change comp_dai to a pointer in struct snd_sof_dai
ranj063 Nov 30, 2021
d0a1031
ASoC: SOF: make struct snd_sof_widget IPC agnostic
ranj063 Nov 30, 2021
cfe8a3c
ASoC: SOF: topology: make sof_route_load() IPC agnostic
ranj063 Nov 30, 2021
1e7211f
ASoC: SOF: Add a tuples array to struct snd_sof_widget
ranj063 Nov 30, 2021
de30f8b
ASoC: SOF: Introduce struct snd_sof_dai_link
ranj063 Nov 30, 2021
ccb5a70
ASoC: SOF: topology: Modify signature for token parsing functions
ranj063 Dec 7, 2021
1cd6ee9
ASoC: SOF: topology: Rename arguments in sof_parse_token_sets()
ranj063 Dec 7, 2021
1dcaea1
ASoC: SOF: topology: Rename arguments in sof_parse_tokens()
ranj063 Dec 7, 2021
565dfa6
ASoC: SOF: make struct snd_sof_dai IPC agnostic
ranj063 Dec 3, 2021
f354555
ASoC: SOF: IPC: Introduce IPC ops
ranj063 Nov 30, 2021
d233d9f
ASoC: SOF: topology: Add helper function for processing tuple arrays
ranj063 Dec 2, 2021
b87ff63
ASoC: SOF: Introduce IPC3 ops
ranj063 Dec 5, 2021
7111d0a
ASoC: SOF: topology: Make scheduler widget parsing IPC agnostic
ranj063 Dec 5, 2021
4faaba9
ASoC: SOF: topology: Make buffer widget parsing IPC agnostic
ranj063 Dec 5, 2021
ed7cabc
ASoC: SOF: topology: Make pga widget parsing IPC agnostic
ranj063 Dec 5, 2021
75ac1d1
ASoC: SOF: topology: Make mixer widget parsing IPC agnostic
ranj063 Dec 5, 2021
f1bbf83
ASoC: SOF: topology: Make mux/demux widget parsing IPC agnostic
ranj063 Dec 5, 2021
54fbed8
ASoC: SOF: topology: Make src widget parsing IPC agnostic
ranj063 Dec 5, 2021
41e1791
ASoC: SOF: topology: Make asrc widget parsing IPC agnostic
ranj063 Dec 5, 2021
c750d53
ASoC: SOF: topology: Make siggen widget parsing IPC agnostic
ranj063 Dec 5, 2021
0d80fac
ASoC: SOF: topology: Make effect widget parsing IPC agnostic
ranj063 Dec 5, 2021
395657e
ASoC: SOF: topology: Make route setup IPC agnostic
ranj063 Dec 5, 2021
729f373
ASoC: SOF: topology: Make DAI widget parsing IPC agnostic
ranj063 Dec 5, 2021
9f5f75a
ASoC: SOF: topology: Make control parsing IPC agnostic
ranj063 Dec 1, 2021
875ae26
ASoC: SOF: topology: Make widget binding IPC agnostic
ranj063 Dec 1, 2021
eda118e
ASoC: SOF: topology: remove snd_sof_complete_pipeline()
ranj063 Dec 1, 2021
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
5 changes: 5 additions & 0 deletions include/sound/sof/dai.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,4 +116,9 @@ struct sof_ipc_dai_config {
};
} __packed;

struct sof_dai_private_data {
struct sof_ipc_comp_dai *comp_dai;
struct sof_ipc_dai_config *dai_config;
};

#endif
5 changes: 0 additions & 5 deletions include/sound/sof/topology.h
Original file line number Diff line number Diff line change
Expand Up @@ -303,9 +303,4 @@ enum sof_event_types {
SOF_KEYWORD_DETECT_DAPM_EVENT,
};

/* extended data struct for UUID components */
struct sof_ipc_comp_ext {
uint8_t uuid[SOF_UUID_SIZE];
} __packed;

#endif
3 changes: 2 additions & 1 deletion sound/soc/sof/Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)

snd-sof-objs := core.o ops.o loader.o ipc.o pcm.o pm.o debug.o topology.o\
control.o trace.o iomem-utils.o sof-audio.o stream-ipc.o ipc4.o
control.o trace.o iomem-utils.o sof-audio.o stream-ipc.o ipc4.o\
ipc3-topology.o
snd-sof-$(CONFIG_SND_SOC_SOF_CLIENT) += sof-client.o

snd-sof-$(CONFIG_SND_SOC_SOF_COMPRESS) += compress.o
Expand Down
26 changes: 13 additions & 13 deletions sound/soc/sof/control.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ static inline u32 ipc_to_mixer(u32 value, u32 *volume_map, int size)

static void snd_sof_refresh_control(struct snd_sof_control *scontrol)
{
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
Comment thread
ranj063 marked this conversation as resolved.
Resolved
struct snd_soc_component *scomp = scontrol->scomp;
int ret;

Expand Down Expand Up @@ -97,7 +97,7 @@ int snd_sof_volume_get(struct snd_kcontrol *kcontrol,
struct soc_mixer_control *sm =
(struct soc_mixer_control *)kcontrol->private_value;
struct snd_sof_control *scontrol = sm->dobj.private;
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
unsigned int i, channels = scontrol->num_channels;

snd_sof_refresh_control(scontrol);
Expand All @@ -118,7 +118,7 @@ int snd_sof_volume_put(struct snd_kcontrol *kcontrol,
(struct soc_mixer_control *)kcontrol->private_value;
struct snd_sof_control *scontrol = sm->dobj.private;
struct snd_soc_component *scomp = scontrol->scomp;
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
unsigned int i, channels = scontrol->num_channels;
bool change = false;
u32 value;
Expand Down Expand Up @@ -166,7 +166,7 @@ int snd_sof_switch_get(struct snd_kcontrol *kcontrol,
struct soc_mixer_control *sm =
(struct soc_mixer_control *)kcontrol->private_value;
struct snd_sof_control *scontrol = sm->dobj.private;
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
unsigned int i, channels = scontrol->num_channels;

snd_sof_refresh_control(scontrol);
Expand All @@ -185,7 +185,7 @@ int snd_sof_switch_put(struct snd_kcontrol *kcontrol,
(struct soc_mixer_control *)kcontrol->private_value;
struct snd_sof_control *scontrol = sm->dobj.private;
struct snd_soc_component *scomp = scontrol->scomp;
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
unsigned int i, channels = scontrol->num_channels;
bool change = false;
u32 value;
Expand Down Expand Up @@ -214,7 +214,7 @@ int snd_sof_enum_get(struct snd_kcontrol *kcontrol,
struct soc_enum *se =
(struct soc_enum *)kcontrol->private_value;
struct snd_sof_control *scontrol = se->dobj.private;
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
unsigned int i, channels = scontrol->num_channels;

snd_sof_refresh_control(scontrol);
Expand All @@ -233,7 +233,7 @@ int snd_sof_enum_put(struct snd_kcontrol *kcontrol,
(struct soc_enum *)kcontrol->private_value;
struct snd_sof_control *scontrol = se->dobj.private;
struct snd_soc_component *scomp = scontrol->scomp;
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
unsigned int i, channels = scontrol->num_channels;
bool change = false;
u32 value;
Expand All @@ -260,7 +260,7 @@ int snd_sof_bytes_get(struct snd_kcontrol *kcontrol,
(struct soc_bytes_ext *)kcontrol->private_value;
struct snd_sof_control *scontrol = be->dobj.private;
struct snd_soc_component *scomp = scontrol->scomp;
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
struct sof_abi_hdr *data = cdata->data;
size_t size;

Expand Down Expand Up @@ -296,7 +296,7 @@ int snd_sof_bytes_put(struct snd_kcontrol *kcontrol,
(struct soc_bytes_ext *)kcontrol->private_value;
struct snd_sof_control *scontrol = be->dobj.private;
struct snd_soc_component *scomp = scontrol->scomp;
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
struct sof_abi_hdr *data = cdata->data;
size_t size;

Expand Down Expand Up @@ -335,7 +335,7 @@ int snd_sof_bytes_ext_put(struct snd_kcontrol *kcontrol,
(struct soc_bytes_ext *)kcontrol->private_value;
struct snd_sof_control *scontrol = be->dobj.private;
struct snd_soc_component *scomp = scontrol->scomp;
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
struct snd_ctl_tlv header;
const struct snd_ctl_tlv __user *tlvd =
(const struct snd_ctl_tlv __user *)binary_data;
Expand Down Expand Up @@ -409,7 +409,7 @@ int snd_sof_bytes_ext_volatile_get(struct snd_kcontrol *kcontrol, unsigned int _
struct soc_bytes_ext *be = (struct soc_bytes_ext *)kcontrol->private_value;
struct snd_sof_control *scontrol = be->dobj.private;
struct snd_soc_component *scomp = scontrol->scomp;
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
struct snd_ctl_tlv header;
struct snd_ctl_tlv __user *tlvd = (struct snd_ctl_tlv __user *)binary_data;
size_t data_size;
Expand Down Expand Up @@ -482,7 +482,7 @@ int snd_sof_bytes_ext_get(struct snd_kcontrol *kcontrol,
(struct soc_bytes_ext *)kcontrol->private_value;
struct snd_sof_control *scontrol = be->dobj.private;
struct snd_soc_component *scomp = scontrol->scomp;
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
struct snd_ctl_tlv header;
struct snd_ctl_tlv __user *tlvd =
(struct snd_ctl_tlv __user *)binary_data;
Expand Down Expand Up @@ -534,7 +534,7 @@ static void snd_sof_update_control(struct snd_sof_control *scontrol,
struct sof_ipc_ctrl_data *local_cdata;
int i;

local_cdata = scontrol->control_data;
local_cdata = scontrol->ipc_control_data;

if (cdata->cmd == SOF_CTRL_CMD_BINARY) {
if (cdata->num_elems != local_cdata->data->size) {
Expand Down
1 change: 1 addition & 0 deletions sound/soc/sof/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,7 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data)
INIT_LIST_HEAD(&sdev->kcontrol_list);
INIT_LIST_HEAD(&sdev->widget_list);
INIT_LIST_HEAD(&sdev->dai_list);
INIT_LIST_HEAD(&sdev->dai_link_list);
INIT_LIST_HEAD(&sdev->route_list);
INIT_LIST_HEAD(&sdev->ipc_client_list);
INIT_LIST_HEAD(&sdev->ipc_rx_handler_list);
Expand Down
27 changes: 21 additions & 6 deletions sound/soc/sof/intel/hda-dai.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ static struct sof_ipc_dai_config *hda_dai_update_config(struct snd_soc_dapm_widg
int channel)
{
struct snd_sof_widget *swidget = w->dobj.private;
struct sof_dai_private_data *private;
struct sof_ipc_dai_config *config;
struct snd_sof_dai *sof_dai;

Expand All @@ -175,12 +176,19 @@ static struct sof_ipc_dai_config *hda_dai_update_config(struct snd_soc_dapm_widg

sof_dai = swidget->private;

if (!sof_dai || !sof_dai->dai_config) {
dev_err(swidget->scomp->dev, "error: No config for DAI %s\n", w->name);
if (!sof_dai || !sof_dai->private) {
dev_err(swidget->scomp->dev, "%s: No private data for DAI %s\n", __func__,
w->name);
return NULL;
}

config = &sof_dai->dai_config[sof_dai->current_config];
private = sof_dai->private;
if (!private->dai_config) {
dev_err(swidget->scomp->dev, "%s: No config for DAI %s\n", __func__, w->name);
return NULL;
}

config = &private->dai_config[sof_dai->current_config];

/* update config with stream tag */
config->hda.link_dma_ch = channel;
Expand Down Expand Up @@ -294,19 +302,26 @@ static int hda_link_dai_config_pause_push_ipc(struct snd_soc_dapm_widget *w)
struct snd_sof_widget *swidget = w->dobj.private;
struct snd_soc_component *component = swidget->scomp;
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
struct sof_dai_private_data *private;
struct sof_ipc_dai_config *config;
struct snd_sof_dai *sof_dai;
struct sof_ipc_reply reply;
int ret;

sof_dai = swidget->private;

if (!sof_dai || !sof_dai->dai_config) {
dev_err(sdev->dev, "No config for DAI %s\n", w->name);
if (!sof_dai || !sof_dai->private) {
dev_err(sdev->dev, "%s: No private data for DAI %s\n", __func__, w->name);
return -EINVAL;
}

private = sof_dai->private;
if (!private->dai_config) {
dev_err(sdev->dev, "%s: No config for DAI %s\n", __func__, w->name);
return -EINVAL;
}

config = &sof_dai->dai_config[sof_dai->current_config];
config = &private->dai_config[sof_dai->current_config];

/* set PAUSE command flag */
config->flags = FIELD_PREP(SOF_DAI_CONFIG_FLAGS_CMD_MASK, SOF_DAI_CONFIG_FLAGS_PAUSE);
Expand Down
39 changes: 30 additions & 9 deletions sound/soc/sof/intel/hda.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,21 @@ int hda_ctrl_dai_widget_setup(struct snd_soc_dapm_widget *w, unsigned int quirk_
struct snd_soc_component *component = swidget->scomp;
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
struct sof_ipc_dai_config *config;
struct sof_dai_private_data *private;
struct snd_sof_dai *sof_dai;
struct sof_ipc_reply reply;
int ret;

sof_dai = swidget->private;

if (!sof_dai || !sof_dai->dai_config) {
dev_err(sdev->dev, "No config for DAI %s\n", w->name);
if (!sof_dai || !sof_dai->private) {
dev_err(sdev->dev, "%s: No private data for DAI %s\n", __func__, w->name);
return -EINVAL;
}

private = sof_dai->private;
if (!private->dai_config) {
dev_err(sdev->dev, "%s: No config for DAI %s\n", __func__, w->name);
return -EINVAL;
}

Expand All @@ -65,7 +72,7 @@ int hda_ctrl_dai_widget_setup(struct snd_soc_dapm_widget *w, unsigned int quirk_
return ret;
}

config = &sof_dai->dai_config[sof_dai->current_config];
config = &private->dai_config[sof_dai->current_config];

/*
* For static pipelines, the DAI widget would already be set up and calling
Expand Down Expand Up @@ -101,23 +108,30 @@ int hda_ctrl_dai_widget_free(struct snd_soc_dapm_widget *w, unsigned int quirk_f
struct snd_sof_widget *swidget = w->dobj.private;
struct snd_soc_component *component = swidget->scomp;
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
struct sof_dai_private_data *private;
struct sof_ipc_dai_config *config;
struct snd_sof_dai *sof_dai;
struct sof_ipc_reply reply;
int ret;

sof_dai = swidget->private;

if (!sof_dai || !sof_dai->dai_config) {
dev_err(sdev->dev, "error: No config to free DAI %s\n", w->name);
if (!sof_dai || !sof_dai->private) {
dev_err(sdev->dev, "%s: No private data for DAI %s\n", __func__, w->name);
return -EINVAL;
}

private = sof_dai->private;
if (!private->dai_config) {
dev_err(sdev->dev, "%s: No config for DAI %s\n", __func__, w->name);
return -EINVAL;
}

/* nothing to do if hw_free() is called without restarting the stream after resume. */
if (!sof_dai->configured)
return 0;

config = &sof_dai->dai_config[sof_dai->current_config];
config = &private->dai_config[sof_dai->current_config];

/* set HW_FREE flag along with any quirks */
config->flags = SOF_DAI_CONFIG_FLAGS_HW_FREE |
Expand Down Expand Up @@ -154,6 +168,7 @@ static int sdw_dai_config_ipc(struct snd_sof_dev *sdev,
int link_id, int alh_stream_id, int dai_id, bool setup)
{
struct snd_sof_widget *swidget = w->dobj.private;
struct sof_dai_private_data *private;
struct sof_ipc_dai_config *config;
struct snd_sof_dai *sof_dai;

Expand All @@ -164,12 +179,18 @@ static int sdw_dai_config_ipc(struct snd_sof_dev *sdev,

sof_dai = swidget->private;

if (!sof_dai || !sof_dai->dai_config) {
dev_err(sdev->dev, "error: No config for DAI %s\n", w->name);
if (!sof_dai || !sof_dai->private) {
dev_err(sdev->dev, "%s: No private data for DAI %s\n", __func__, w->name);
return -EINVAL;
}

private = sof_dai->private;
if (!private->dai_config) {
dev_err(sdev->dev, "%s: No config for DAI %s\n", __func__, w->name);
return -EINVAL;
}

config = &sof_dai->dai_config[sof_dai->current_config];
config = &private->dai_config[sof_dai->current_config];

/* update config with link and stream ID */
config->dai_index = (link_id << 8) | dai_id;
Expand Down
14 changes: 13 additions & 1 deletion sound/soc/sof/ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -812,7 +812,7 @@ static int sof_set_get_large_ctrl_data(struct snd_sof_dev *sdev,
int snd_sof_ipc_set_get_comp_data(struct snd_sof_control *scontrol, bool set)
{
struct snd_soc_component *scomp = scontrol->scomp;
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
struct sof_ipc_fw_ready *ready = &sdev->fw_ready;
struct sof_ipc_fw_version *v = &ready->version;
Expand Down Expand Up @@ -1025,6 +1025,18 @@ struct snd_sof_ipc *snd_sof_ipc_init(struct snd_sof_dev *sdev)

init_waitqueue_head(&msg->waitq);

/*
* Use IPC3 ops as it is the only available version now. With the addition of new IPC
* versions, this will need to be modified to use the selected version at runtime.
*/
ipc->ops = &ipc3_ops;
Comment thread
plbossart marked this conversation as resolved.
Resolved

/* check for mandatory ops */
if (!ipc->ops->tplg || !ipc->ops->tplg->widget) {
dev_err(sdev->dev, "Invalid topology IPC ops\n");
return NULL;
}

return ipc;
}
EXPORT_SYMBOL(snd_sof_ipc_init);
Expand Down
Loading