Commit 59611370 authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Mark Brown

ASoC: SOF: Add flag and state which will be used for DSP-less mode

The DSPless mode of the ASoC/SOF driver can be used for hardware
verification and debug on platforms with HDaudio codecs. The DSP mode is
still needed on existing platforms for SSP, DMIC, SoundWire interfaces
managed by the GP-DMA.

This mode is also helpful to compare the legacy HDaudio driver with the
ASoC/SOF driver wrt. codec management and handling. In theory we use the
same code but differences are sometimes seen on jack detection and event
handling.
Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarRander Wang <rander.wang@intel.com>
Link: https://lore.kernel.org/r/20230404092115.27949-3-peter.ujfalusi@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 09255c7e
...@@ -21,6 +21,7 @@ struct snd_sof_dev; ...@@ -21,6 +21,7 @@ struct snd_sof_dev;
/** /**
* enum sof_fw_state - DSP firmware state definitions * enum sof_fw_state - DSP firmware state definitions
* @SOF_FW_BOOT_NOT_STARTED: firmware boot is not yet started * @SOF_FW_BOOT_NOT_STARTED: firmware boot is not yet started
* @SOF_DSPLESS_MODE: DSP is not used
* @SOF_FW_BOOT_PREPARE: preparing for boot (firmware loading for exaqmple) * @SOF_FW_BOOT_PREPARE: preparing for boot (firmware loading for exaqmple)
* @SOF_FW_BOOT_IN_PROGRESS: firmware boot is in progress * @SOF_FW_BOOT_IN_PROGRESS: firmware boot is in progress
* @SOF_FW_BOOT_FAILED: firmware boot failed * @SOF_FW_BOOT_FAILED: firmware boot failed
...@@ -31,6 +32,7 @@ struct snd_sof_dev; ...@@ -31,6 +32,7 @@ struct snd_sof_dev;
*/ */
enum sof_fw_state { enum sof_fw_state {
SOF_FW_BOOT_NOT_STARTED = 0, SOF_FW_BOOT_NOT_STARTED = 0,
SOF_DSPLESS_MODE,
SOF_FW_BOOT_PREPARE, SOF_FW_BOOT_PREPARE,
SOF_FW_BOOT_IN_PROGRESS, SOF_FW_BOOT_IN_PROGRESS,
SOF_FW_BOOT_FAILED, SOF_FW_BOOT_FAILED,
...@@ -130,6 +132,9 @@ struct sof_dev_desc { ...@@ -130,6 +132,9 @@ struct sof_dev_desc {
unsigned int ipc_supported_mask; unsigned int ipc_supported_mask;
enum sof_ipc_type ipc_default; enum sof_ipc_type ipc_default;
/* The platform supports DSPless mode */
bool dspless_mode_supported;
/* defaults paths for firmware, library and topology files */ /* defaults paths for firmware, library and topology files */
const char *default_fw_path[SOF_IPC_TYPE_COUNT]; const char *default_fw_path[SOF_IPC_TYPE_COUNT];
const char *default_lib_path[SOF_IPC_TYPE_COUNT]; const char *default_lib_path[SOF_IPC_TYPE_COUNT];
......
...@@ -365,6 +365,15 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data) ...@@ -365,6 +365,15 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data)
if (sof_core_debug) if (sof_core_debug)
dev_info(dev, "sof_debug value: %#x\n", sof_core_debug); dev_info(dev, "sof_debug value: %#x\n", sof_core_debug);
if (sof_debug_check_flag(SOF_DBG_DSPLESS_MODE)) {
if (plat_data->desc->dspless_mode_supported) {
dev_info(dev, "Switching to DSPless mode\n");
sdev->dspless_mode_selected = true;
} else {
dev_info(dev, "DSPless mode is not supported by the platform\n");
}
}
/* check IPC support */ /* check IPC support */
if (!(BIT(plat_data->ipc_type) & plat_data->desc->ipc_supported_mask)) { if (!(BIT(plat_data->ipc_type) & plat_data->desc->ipc_supported_mask)) {
dev_err(dev, "ipc_type %d is not supported on this platform, mask is %#x\n", dev_err(dev, "ipc_type %d is not supported on this platform, mask is %#x\n",
......
...@@ -48,6 +48,7 @@ struct snd_sof_pcm_stream; ...@@ -48,6 +48,7 @@ struct snd_sof_pcm_stream;
#define SOF_DBG_FORCE_NOCODEC BIT(10) /* ignore all codec-related #define SOF_DBG_FORCE_NOCODEC BIT(10) /* ignore all codec-related
* configurations * configurations
*/ */
#define SOF_DBG_DSPLESS_MODE BIT(15) /* Do not initialize and use the DSP */
/* Flag definitions used for controlling the DSP dump behavior */ /* Flag definitions used for controlling the DSP dump behavior */
#define SOF_DBG_DUMP_REGS BIT(0) #define SOF_DBG_DUMP_REGS BIT(0)
...@@ -528,6 +529,16 @@ struct snd_sof_dev { ...@@ -528,6 +529,16 @@ struct snd_sof_dev {
spinlock_t ipc_lock; /* lock for IPC users */ spinlock_t ipc_lock; /* lock for IPC users */
spinlock_t hw_lock; /* lock for HW IO access */ spinlock_t hw_lock; /* lock for HW IO access */
/*
* When true the DSP is not used.
* It is set under the following condition:
* User sets the SOF_DBG_DSPLESS_MODE flag in sof_debug module parameter
* and
* the platform advertises that it can support such mode
* pdata->desc->dspless_mode_supported is true.
*/
bool dspless_mode_selected;
/* Main, Base firmware image */ /* Main, Base firmware image */
struct sof_firmware basefw; struct sof_firmware basefw;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment