summaryrefslogtreecommitdiff
path: root/sound/soc
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc')
-rw-r--r--sound/soc/fsl/fsl_sai.c23
-rw-r--r--sound/soc/fsl/fsl_sai.h2
2 files changed, 25 insertions, 0 deletions
diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c
index 79e26db37547..21aa7cfc42a2 100644
--- a/sound/soc/fsl/fsl_sai.c
+++ b/sound/soc/fsl/fsl_sai.c
@@ -35,6 +35,7 @@ static struct fsl_sai_soc_data fsl_sai_vf610 = {
.fifos = 1,
.fifo_depth = 32,
.flags = 0,
+ .constrain_period_size = false,
};
static struct fsl_sai_soc_data fsl_sai_imx6sx = {
@@ -44,6 +45,7 @@ static struct fsl_sai_soc_data fsl_sai_imx6sx = {
.fifo_depth = 32,
.flags = 0,
.reg_offset = 0,
+ .constrain_period_size = false,
};
static struct fsl_sai_soc_data fsl_sai_imx6ul = {
@@ -53,6 +55,7 @@ static struct fsl_sai_soc_data fsl_sai_imx6ul = {
.fifo_depth = 32,
.flags = 0,
.reg_offset = 0,
+ .constrain_period_size = false,
};
static struct fsl_sai_soc_data fsl_sai_imx7ulp = {
@@ -62,6 +65,7 @@ static struct fsl_sai_soc_data fsl_sai_imx7ulp = {
.fifo_depth = 16,
.flags = SAI_FLAG_PMQOS,
.reg_offset = 0,
+ .constrain_period_size = false,
};
static struct fsl_sai_soc_data fsl_sai_imx8mq = {
@@ -71,6 +75,17 @@ static struct fsl_sai_soc_data fsl_sai_imx8mq = {
.fifo_depth = 32,
.flags = 0,
.reg_offset = 8,
+ .constrain_period_size = false,
+};
+
+static struct fsl_sai_soc_data fsl_sai_imx8qm = {
+ .imx = true,
+ .dataline = 0x3,
+ .fifos = 1,
+ .fifo_depth = 32,
+ .flags = 0,
+ .reg_offset = 0,
+ .constrain_period_size = true,
};
static const unsigned int fsl_sai_rates[] = {
@@ -692,6 +707,13 @@ static int fsl_sai_startup(struct snd_pcm_substream *substream,
FSL_SAI_CR3_TRCE_MASK,
FSL_SAI_CR3_TRCE(sai->dataline[tx]));
+ /* EDMA engine needs periods of size multiple of tx/rx maxburst */
+ if (sai->soc->constrain_period_size)
+ snd_pcm_hw_constraint_step(substream->runtime, 0,
+ SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
+ tx ? sai->dma_params_tx.maxburst :
+ sai->dma_params_rx.maxburst);
+
ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
SNDRV_PCM_HW_PARAM_RATE, &fsl_sai_rate_constraints);
@@ -914,6 +936,7 @@ static const struct of_device_id fsl_sai_ids[] = {
{ .compatible = "fsl,imx6ul-sai", .data = &fsl_sai_imx6ul },
{ .compatible = "fsl,imx7ulp-sai", .data = &fsl_sai_imx7ulp },
{ .compatible = "fsl,imx8mq-sai", .data = &fsl_sai_imx8mq },
+ { .compatible = "fsl,imx8qm-sai", .data = &fsl_sai_imx8qm },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, fsl_sai_ids);
diff --git a/sound/soc/fsl/fsl_sai.h b/sound/soc/fsl/fsl_sai.h
index 99bde12d9b3a..dbc60a18f0a2 100644
--- a/sound/soc/fsl/fsl_sai.h
+++ b/sound/soc/fsl/fsl_sai.h
@@ -147,6 +147,8 @@ struct fsl_sai_soc_data {
unsigned int flags;
unsigned char reg_offset;
bool imx;
+ /* True for EDMA because it needs period size multiple of maxburst */
+ bool constrain_period_size;
};
struct fsl_sai {