aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
authorMark Brown <broonie@kernel.org>2026-05-22 00:16:33 +0100
committerMark Brown <broonie@kernel.org>2026-05-22 00:16:33 +0100
commit7d28d5ce83a7d67e13607a8d0212e4dd0095ce9a (patch)
treef8081efed766c268a2288950abfbb03163dd7f58 /sound
parent75b992accc6ae53e6dcb40572a5e0593e4b3749d (diff)
parentfdfbd9ff86a145f09978ab49305ed7acfad66a1d (diff)
downloadlinux-next-history-7d28d5ce83a7d67e13607a8d0212e4dd0095ce9a.tar.gz
ASoC: SOF: Intel: Enable offload for UAOL for LNL+
Peter Ujfalusi <peter.ujfalusi@linux.intel.com> says: The USB Audio Offload (UAOL) can only be used from the DSP side and on Lunar Lake (ACE2) and newer platforms the access to it's register space must be granted by the host, just like for SSP or DMIC. This series enable the offload for UAOL for LNL or newer devices. Link: https://patch.msgid.link/20260520150639.25301-1-peter.ujfalusi@linux.intel.com
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/sof/intel/hda-mlink.c11
-rw-r--r--sound/soc/sof/intel/lnl.c40
2 files changed, 18 insertions, 33 deletions
diff --git a/sound/soc/sof/intel/hda-mlink.c b/sound/soc/sof/intel/hda-mlink.c
index ce603a2343de1..92314e3b568aa 100644
--- a/sound/soc/sof/intel/hda-mlink.c
+++ b/sound/soc/sof/intel/hda-mlink.c
@@ -988,24 +988,19 @@ struct hdac_ext_link *hdac_bus_eml_sdw_get_hlink(struct hdac_bus *bus)
}
EXPORT_SYMBOL_NS(hdac_bus_eml_sdw_get_hlink, "SND_SOC_SOF_HDA_MLINK");
-int hdac_bus_eml_enable_offload(struct hdac_bus *bus, bool alt, int elid, bool enable)
+void hdac_bus_eml_enable_offload(struct hdac_bus *bus, bool alt, int elid, bool enable)
{
struct hdac_ext2_link *h2link;
struct hdac_ext_link *hlink;
h2link = find_ext2_link(bus, alt, elid);
- if (!h2link)
- return -ENODEV;
-
- if (!h2link->ofls)
- return 0;
+ if (!h2link || !h2link->ofls)
+ return;
hlink = &h2link->hext_link;
scoped_guard(mutex, &h2link->eml_lock)
hdaml_lctl_offload_enable(hlink->ml_addr + AZX_REG_ML_LCTL, enable);
-
- return 0;
}
EXPORT_SYMBOL_NS(hdac_bus_eml_enable_offload, "SND_SOC_SOF_HDA_MLINK");
diff --git a/sound/soc/sof/intel/lnl.c b/sound/soc/sof/intel/lnl.c
index c01ea7e731aab..83703ebc6385b 100644
--- a/sound/soc/sof/intel/lnl.c
+++ b/sound/soc/sof/intel/lnl.c
@@ -20,22 +20,12 @@
#include "lnl.h"
#include <sound/hda-mlink.h>
-/* this helps allows the DSP to setup DMIC/SSP */
-static int hdac_bus_offload_dmic_ssp(struct hdac_bus *bus, bool enable)
+/* Configure DSP offload for DMIC/SSP/UAOL */
+static void hdac_bus_set_dsp_offload(struct hdac_bus *bus, bool enable)
{
- int ret;
-
- ret = hdac_bus_eml_enable_offload(bus, true,
- AZX_REG_ML_LEPTR_ID_INTEL_SSP, enable);
- if (ret < 0)
- return ret;
-
- ret = hdac_bus_eml_enable_offload(bus, true,
- AZX_REG_ML_LEPTR_ID_INTEL_DMIC, enable);
- if (ret < 0)
- return ret;
-
- return 0;
+ hdac_bus_eml_enable_offload(bus, true, AZX_REG_ML_LEPTR_ID_INTEL_SSP, enable);
+ hdac_bus_eml_enable_offload(bus, true, AZX_REG_ML_LEPTR_ID_INTEL_DMIC, enable);
+ hdac_bus_eml_enable_offload(bus, true, AZX_REG_ML_LEPTR_ID_INTEL_UAOL, enable);
}
static int lnl_hda_dsp_probe(struct snd_sof_dev *sdev)
@@ -46,18 +36,14 @@ static int lnl_hda_dsp_probe(struct snd_sof_dev *sdev)
if (ret < 0)
return ret;
- return hdac_bus_offload_dmic_ssp(sof_to_bus(sdev), true);
+ hdac_bus_set_dsp_offload(sof_to_bus(sdev), true);
+
+ return 0;
}
static void lnl_hda_dsp_remove(struct snd_sof_dev *sdev)
{
- int ret;
-
- ret = hdac_bus_offload_dmic_ssp(sof_to_bus(sdev), false);
- if (ret < 0)
- dev_warn(sdev->dev,
- "Failed to disable offload for DMIC/SSP: %d\n", ret);
-
+ hdac_bus_set_dsp_offload(sof_to_bus(sdev), false);
hda_dsp_remove(sdev);
}
@@ -69,7 +55,9 @@ static int lnl_hda_dsp_resume(struct snd_sof_dev *sdev)
if (ret < 0)
return ret;
- return hdac_bus_offload_dmic_ssp(sof_to_bus(sdev), true);
+ hdac_bus_set_dsp_offload(sof_to_bus(sdev), true);
+
+ return 0;
}
static int lnl_hda_dsp_runtime_resume(struct snd_sof_dev *sdev)
@@ -80,7 +68,9 @@ static int lnl_hda_dsp_runtime_resume(struct snd_sof_dev *sdev)
if (ret < 0)
return ret;
- return hdac_bus_offload_dmic_ssp(sof_to_bus(sdev), true);
+ hdac_bus_set_dsp_offload(sof_to_bus(sdev), true);
+
+ return 0;
}
static int lnl_dsp_post_fw_run(struct snd_sof_dev *sdev)