2020-05-01 22:58:50 +08:00
|
|
|
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
|
2019-04-13 00:05:09 +08:00
|
|
|
/*
|
|
|
|
* This file is provided under a dual BSD/GPLv2 license. When using or
|
|
|
|
* redistributing this file, you may do so under either license.
|
|
|
|
*
|
|
|
|
* Copyright(c) 2018 Intel Corporation. All rights reserved.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __INCLUDE_SOUND_SOF_DAI_H__
|
|
|
|
#define __INCLUDE_SOUND_SOF_DAI_H__
|
|
|
|
|
|
|
|
#include <sound/sof/header.h>
|
|
|
|
#include <sound/sof/dai-intel.h>
|
2019-10-09 00:44:39 +08:00
|
|
|
#include <sound/sof/dai-imx.h>
|
2021-11-17 17:37:24 +08:00
|
|
|
#include <sound/sof/dai-amd.h>
|
2021-11-18 18:07:44 +08:00
|
|
|
#include <sound/sof/dai-mediatek.h>
|
2019-04-13 00:05:09 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* DAI Configuration.
|
|
|
|
*
|
|
|
|
* Each different DAI type will have it's own structure and IPC cmd.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define SOF_DAI_FMT_I2S 1 /**< I2S mode */
|
|
|
|
#define SOF_DAI_FMT_RIGHT_J 2 /**< Right Justified mode */
|
|
|
|
#define SOF_DAI_FMT_LEFT_J 3 /**< Left Justified mode */
|
|
|
|
#define SOF_DAI_FMT_DSP_A 4 /**< L data MSB after FRM LRC */
|
|
|
|
#define SOF_DAI_FMT_DSP_B 5 /**< L data MSB during FRM LRC */
|
|
|
|
#define SOF_DAI_FMT_PDM 6 /**< Pulse density modulation */
|
|
|
|
|
|
|
|
#define SOF_DAI_FMT_CONT (1 << 4) /**< continuous clock */
|
|
|
|
#define SOF_DAI_FMT_GATED (0 << 4) /**< clock is gated */
|
|
|
|
|
|
|
|
#define SOF_DAI_FMT_NB_NF (0 << 8) /**< normal bit clock + frame */
|
|
|
|
#define SOF_DAI_FMT_NB_IF (2 << 8) /**< normal BCLK + inv FRM */
|
|
|
|
#define SOF_DAI_FMT_IB_NF (3 << 8) /**< invert BCLK + nor FRM */
|
|
|
|
#define SOF_DAI_FMT_IB_IF (4 << 8) /**< invert BCLK + FRM */
|
|
|
|
|
2020-11-13 00:30:58 +08:00
|
|
|
#define SOF_DAI_FMT_CBP_CFP (0 << 12) /**< codec bclk provider & frame provider */
|
|
|
|
#define SOF_DAI_FMT_CBC_CFP (2 << 12) /**< codec bclk consumer & frame provider */
|
|
|
|
#define SOF_DAI_FMT_CBP_CFC (3 << 12) /**< codec bclk provider & frame consumer */
|
|
|
|
#define SOF_DAI_FMT_CBC_CFC (4 << 12) /**< codec bclk consumer & frame consumer */
|
|
|
|
|
|
|
|
/* keep old definitions for backwards compatibility */
|
|
|
|
#define SOF_DAI_FMT_CBM_CFM SOF_DAI_FMT_CBP_CFP
|
|
|
|
#define SOF_DAI_FMT_CBS_CFM SOF_DAI_FMT_CBC_CFP
|
|
|
|
#define SOF_DAI_FMT_CBM_CFS SOF_DAI_FMT_CBP_CFC
|
|
|
|
#define SOF_DAI_FMT_CBS_CFS SOF_DAI_FMT_CBC_CFC
|
2019-04-13 00:05:09 +08:00
|
|
|
|
|
|
|
#define SOF_DAI_FMT_FORMAT_MASK 0x000f
|
|
|
|
#define SOF_DAI_FMT_CLOCK_MASK 0x00f0
|
|
|
|
#define SOF_DAI_FMT_INV_MASK 0x0f00
|
2020-11-13 00:30:58 +08:00
|
|
|
#define SOF_DAI_FMT_CLOCK_PROVIDER_MASK 0xf000
|
2019-04-13 00:05:09 +08:00
|
|
|
|
2021-11-25 18:15:19 +08:00
|
|
|
/*
|
|
|
|
* DAI_CONFIG flags. The 4 LSB bits are used for the commands, HW_PARAMS, HW_FREE and PAUSE
|
|
|
|
* representing when the IPC is sent. The 4 MSB bits are used to add quirks along with the above
|
|
|
|
* commands.
|
|
|
|
*/
|
|
|
|
#define SOF_DAI_CONFIG_FLAGS_CMD_MASK 0xF
|
|
|
|
#define SOF_DAI_CONFIG_FLAGS_NONE 0 /**< DAI_CONFIG sent without stage information */
|
|
|
|
#define SOF_DAI_CONFIG_FLAGS_HW_PARAMS BIT(0) /**< DAI_CONFIG sent during hw_params stage */
|
|
|
|
#define SOF_DAI_CONFIG_FLAGS_HW_FREE BIT(1) /**< DAI_CONFIG sent during hw_free stage */
|
|
|
|
/**< DAI_CONFIG sent during pause trigger. Only available ABI 3.20 onwards */
|
|
|
|
#define SOF_DAI_CONFIG_FLAGS_PAUSE BIT(2)
|
|
|
|
#define SOF_DAI_CONFIG_FLAGS_QUIRK_SHIFT 4
|
|
|
|
#define SOF_DAI_CONFIG_FLAGS_QUIRK_MASK (0xF << SOF_DAI_CONFIG_FLAGS_QUIRK_SHIFT)
|
|
|
|
/*
|
|
|
|
* This should be used along with the SOF_DAI_CONFIG_FLAGS_HW_PARAMS to indicate that pipeline
|
|
|
|
* stop/pause and DAI DMA stop/pause should happen in two steps. This change is only available
|
|
|
|
* ABI 3.20 onwards.
|
|
|
|
*/
|
|
|
|
#define SOF_DAI_CONFIG_FLAGS_2_STEP_STOP BIT(0)
|
ASoC: SOF: dai: include new flags for DAI_CONFIG
Mirror changes done in SOF tree. The changes do not rely on
BIT/GENMASK on purpose to keep the structure and flags common with the
firmware tree.
The DAI_CONFIG IPC is currently used in multiple ways. It is sent to
the DSP firmware when enabling static or dynamic pipelines, in
hw_params or prepare callbacks for Intel SSP, HDaudio and ALH, on
trigger_stop and hw_free.
This IPC has been abused a bit in the past, i.e. the values used for
some of the DAI-specific fields are used to either allocate or free
resources. Two typical examples are Intel HDaudio and SoundWire/ALH
DAIs, where using a zero DMA channel number or stream tag signals to
the firmware the DMA channels or tags allocated earlier can be freed.
Rather than add a new IPC for 'hw_params' and 'hw_free', this patch
suggests supporting a 2-bit value conveying the 'stage' information in
an existing IPC structure. Only 3 possible values are used.
The mapping between HW_PARAMS and HW_FREE flags and ALSA definitions
is not strictly 1:1, e.g. in some cases the HW_PARAM flag might be set
during the .prepare callback, while the HW_FREE might be sent during the
ALSA .trigger for stop/suspend.
The semantics of the flags is to reserve and start/stop all needed
resources, typically hardware related such as DMAs or clocks, when the
HW_PARAMS is set, while the HW_FREE flag allows the firmware to
release the resources allocated. The data transfers are still
controlled within the firmware through the propagation of the trigger
command.
The driver can then pass information that the DAI_CONFIG was invoked
in e.g. a pipeline/DAI setup, hw_params or hw_free stage without
having to use a special DAI-specific encoding. Unfortunately we can't
remove old encodings due to backwards-compatibility requirements but
for new cases, such as the SSP in follow-up patches, we can make the
IPC less cryptic.
This change is tagged as ABI 3.19 and is completely backwards compatible.
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Bard Liao <bard.liao@intel.com>
Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Reviewed-by: Brent Lu <brent.lu@intel.com>
Link: https://lore.kernel.org/r/20211004171430.103674-3-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
2021-10-05 01:14:27 +08:00
|
|
|
|
2019-04-13 00:05:09 +08:00
|
|
|
/** \brief Types of DAI */
|
|
|
|
enum sof_ipc_dai_type {
|
|
|
|
SOF_DAI_INTEL_NONE = 0, /**< None */
|
|
|
|
SOF_DAI_INTEL_SSP, /**< Intel SSP */
|
|
|
|
SOF_DAI_INTEL_DMIC, /**< Intel DMIC */
|
|
|
|
SOF_DAI_INTEL_HDA, /**< Intel HD/A */
|
2019-08-16 03:20:16 +08:00
|
|
|
SOF_DAI_INTEL_ALH, /**< Intel ALH */
|
2019-08-16 03:20:15 +08:00
|
|
|
SOF_DAI_IMX_SAI, /**< i.MX SAI */
|
|
|
|
SOF_DAI_IMX_ESAI, /**< i.MX ESAI */
|
2021-11-17 17:37:24 +08:00
|
|
|
SOF_DAI_AMD_BT, /**< AMD ACP BT*/
|
|
|
|
SOF_DAI_AMD_SP, /**< AMD ACP SP */
|
|
|
|
SOF_DAI_AMD_DMIC, /**< AMD ACP DMIC */
|
2021-11-18 18:07:44 +08:00
|
|
|
SOF_DAI_MEDIATEK_AFE, /**< Mediatek AFE */
|
2022-11-18 07:21:20 +08:00
|
|
|
SOF_DAI_AMD_HS, /**< Amd HS */
|
2022-11-29 18:00:59 +08:00
|
|
|
SOF_DAI_AMD_SP_VIRTUAL, /**< AMD ACP SP VIRTUAL */
|
|
|
|
SOF_DAI_AMD_HS_VIRTUAL, /**< AMD ACP HS VIRTUAL */
|
2019-04-13 00:05:09 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/* general purpose DAI configuration */
|
|
|
|
struct sof_ipc_dai_config {
|
|
|
|
struct sof_ipc_cmd_hdr hdr;
|
|
|
|
uint32_t type; /**< DAI type - enum sof_ipc_dai_type */
|
|
|
|
uint32_t dai_index; /**< index of this type dai */
|
|
|
|
|
|
|
|
/* physical protocol and clocking */
|
|
|
|
uint16_t format; /**< SOF_DAI_FMT_ */
|
2021-10-05 01:14:26 +08:00
|
|
|
uint8_t group_id; /**< group ID, 0 means no group (ABI 3.17) */
|
ASoC: SOF: dai: include new flags for DAI_CONFIG
Mirror changes done in SOF tree. The changes do not rely on
BIT/GENMASK on purpose to keep the structure and flags common with the
firmware tree.
The DAI_CONFIG IPC is currently used in multiple ways. It is sent to
the DSP firmware when enabling static or dynamic pipelines, in
hw_params or prepare callbacks for Intel SSP, HDaudio and ALH, on
trigger_stop and hw_free.
This IPC has been abused a bit in the past, i.e. the values used for
some of the DAI-specific fields are used to either allocate or free
resources. Two typical examples are Intel HDaudio and SoundWire/ALH
DAIs, where using a zero DMA channel number or stream tag signals to
the firmware the DMA channels or tags allocated earlier can be freed.
Rather than add a new IPC for 'hw_params' and 'hw_free', this patch
suggests supporting a 2-bit value conveying the 'stage' information in
an existing IPC structure. Only 3 possible values are used.
The mapping between HW_PARAMS and HW_FREE flags and ALSA definitions
is not strictly 1:1, e.g. in some cases the HW_PARAM flag might be set
during the .prepare callback, while the HW_FREE might be sent during the
ALSA .trigger for stop/suspend.
The semantics of the flags is to reserve and start/stop all needed
resources, typically hardware related such as DMAs or clocks, when the
HW_PARAMS is set, while the HW_FREE flag allows the firmware to
release the resources allocated. The data transfers are still
controlled within the firmware through the propagation of the trigger
command.
The driver can then pass information that the DAI_CONFIG was invoked
in e.g. a pipeline/DAI setup, hw_params or hw_free stage without
having to use a special DAI-specific encoding. Unfortunately we can't
remove old encodings due to backwards-compatibility requirements but
for new cases, such as the SSP in follow-up patches, we can make the
IPC less cryptic.
This change is tagged as ABI 3.19 and is completely backwards compatible.
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Bard Liao <bard.liao@intel.com>
Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Reviewed-by: Brent Lu <brent.lu@intel.com>
Link: https://lore.kernel.org/r/20211004171430.103674-3-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
2021-10-05 01:14:27 +08:00
|
|
|
uint8_t flags; /**< SOF_DAI_CONFIG_FLAGS_ (ABI 3.19) */
|
2019-04-13 00:05:09 +08:00
|
|
|
|
|
|
|
/* reserved for future use */
|
|
|
|
uint32_t reserved[8];
|
|
|
|
|
|
|
|
/* HW specific data */
|
|
|
|
union {
|
|
|
|
struct sof_ipc_dai_ssp_params ssp;
|
|
|
|
struct sof_ipc_dai_dmic_params dmic;
|
|
|
|
struct sof_ipc_dai_hda_params hda;
|
2019-08-15 23:50:30 +08:00
|
|
|
struct sof_ipc_dai_alh_params alh;
|
2019-10-09 00:44:39 +08:00
|
|
|
struct sof_ipc_dai_esai_params esai;
|
2019-12-18 08:26:15 +08:00
|
|
|
struct sof_ipc_dai_sai_params sai;
|
2021-11-17 17:37:24 +08:00
|
|
|
struct sof_ipc_dai_acp_params acpbt;
|
|
|
|
struct sof_ipc_dai_acp_params acpsp;
|
2022-06-14 15:52:51 +08:00
|
|
|
struct sof_ipc_dai_acpdmic_params acpdmic;
|
2022-09-13 22:43:17 +08:00
|
|
|
struct sof_ipc_dai_acp_params acphs;
|
2021-11-18 18:07:44 +08:00
|
|
|
struct sof_ipc_dai_mtk_afe_params afe;
|
2019-04-13 00:05:09 +08:00
|
|
|
};
|
|
|
|
} __packed;
|
|
|
|
|
2022-03-09 00:43:43 +08:00
|
|
|
struct sof_dai_private_data {
|
|
|
|
struct sof_ipc_comp_dai *comp_dai;
|
|
|
|
struct sof_ipc_dai_config *dai_config;
|
|
|
|
};
|
|
|
|
|
2019-04-13 00:05:09 +08:00
|
|
|
#endif
|