|
@@ -21,7 +21,7 @@
|
|
#include <sound/pcm_params.h>
|
|
#include <sound/pcm_params.h>
|
|
#include <linux/regmap.h>
|
|
#include <linux/regmap.h>
|
|
#include <sound/soc.h>
|
|
#include <sound/soc.h>
|
|
-#include "lpass-lpaif-ipq806x.h"
|
|
|
|
|
|
+#include "lpass-lpaif-reg.h"
|
|
#include "lpass.h"
|
|
#include "lpass.h"
|
|
|
|
|
|
#define LPASS_PLATFORM_BUFFER_SIZE (16 * 1024)
|
|
#define LPASS_PLATFORM_BUFFER_SIZE (16 * 1024)
|
|
@@ -80,6 +80,7 @@ static int lpass_platform_pcmops_hw_params(struct snd_pcm_substream *substream,
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
struct lpass_data *drvdata =
|
|
struct lpass_data *drvdata =
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
|
|
+ struct lpass_variant *v = drvdata->variant;
|
|
snd_pcm_format_t format = params_format(params);
|
|
snd_pcm_format_t format = params_format(params);
|
|
unsigned int channels = params_channels(params);
|
|
unsigned int channels = params_channels(params);
|
|
unsigned int regval;
|
|
unsigned int regval;
|
|
@@ -150,7 +151,7 @@ static int lpass_platform_pcmops_hw_params(struct snd_pcm_substream *substream,
|
|
}
|
|
}
|
|
|
|
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
- LPAIF_RDMACTL_REG(LPAIF_RDMA_CHAN_MI2S), regval);
|
|
|
|
|
|
+ LPAIF_RDMACTL_REG(v, LPAIF_RDMA_CHAN_MI2S), regval);
|
|
if (ret) {
|
|
if (ret) {
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmactl reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmactl reg: %d\n",
|
|
__func__, ret);
|
|
__func__, ret);
|
|
@@ -165,10 +166,11 @@ static int lpass_platform_pcmops_hw_free(struct snd_pcm_substream *substream)
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
struct lpass_data *drvdata =
|
|
struct lpass_data *drvdata =
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
|
|
+ struct lpass_variant *v = drvdata->variant;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
- LPAIF_RDMACTL_REG(LPAIF_RDMA_CHAN_MI2S), 0);
|
|
|
|
|
|
+ LPAIF_RDMACTL_REG(v, LPAIF_RDMA_CHAN_MI2S), 0);
|
|
if (ret)
|
|
if (ret)
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmactl reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmactl reg: %d\n",
|
|
__func__, ret);
|
|
__func__, ret);
|
|
@@ -182,10 +184,11 @@ static int lpass_platform_pcmops_prepare(struct snd_pcm_substream *substream)
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
struct lpass_data *drvdata =
|
|
struct lpass_data *drvdata =
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
|
|
+ struct lpass_variant *v = drvdata->variant;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
- LPAIF_RDMABASE_REG(LPAIF_RDMA_CHAN_MI2S),
|
|
|
|
|
|
+ LPAIF_RDMABASE_REG(v, LPAIF_RDMA_CHAN_MI2S),
|
|
runtime->dma_addr);
|
|
runtime->dma_addr);
|
|
if (ret) {
|
|
if (ret) {
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmabase reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmabase reg: %d\n",
|
|
@@ -194,7 +197,7 @@ static int lpass_platform_pcmops_prepare(struct snd_pcm_substream *substream)
|
|
}
|
|
}
|
|
|
|
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
- LPAIF_RDMABUFF_REG(LPAIF_RDMA_CHAN_MI2S),
|
|
|
|
|
|
+ LPAIF_RDMABUFF_REG(v, LPAIF_RDMA_CHAN_MI2S),
|
|
(snd_pcm_lib_buffer_bytes(substream) >> 2) - 1);
|
|
(snd_pcm_lib_buffer_bytes(substream) >> 2) - 1);
|
|
if (ret) {
|
|
if (ret) {
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmabuff reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmabuff reg: %d\n",
|
|
@@ -203,7 +206,7 @@ static int lpass_platform_pcmops_prepare(struct snd_pcm_substream *substream)
|
|
}
|
|
}
|
|
|
|
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
- LPAIF_RDMAPER_REG(LPAIF_RDMA_CHAN_MI2S),
|
|
|
|
|
|
+ LPAIF_RDMAPER_REG(v, LPAIF_RDMA_CHAN_MI2S),
|
|
(snd_pcm_lib_period_bytes(substream) >> 2) - 1);
|
|
(snd_pcm_lib_period_bytes(substream) >> 2) - 1);
|
|
if (ret) {
|
|
if (ret) {
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmaper reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmaper reg: %d\n",
|
|
@@ -212,7 +215,7 @@ static int lpass_platform_pcmops_prepare(struct snd_pcm_substream *substream)
|
|
}
|
|
}
|
|
|
|
|
|
ret = regmap_update_bits(drvdata->lpaif_map,
|
|
ret = regmap_update_bits(drvdata->lpaif_map,
|
|
- LPAIF_RDMACTL_REG(LPAIF_RDMA_CHAN_MI2S),
|
|
|
|
|
|
+ LPAIF_RDMACTL_REG(v, LPAIF_RDMA_CHAN_MI2S),
|
|
LPAIF_RDMACTL_ENABLE_MASK, LPAIF_RDMACTL_ENABLE_ON);
|
|
LPAIF_RDMACTL_ENABLE_MASK, LPAIF_RDMACTL_ENABLE_ON);
|
|
if (ret) {
|
|
if (ret) {
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmactl reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmactl reg: %d\n",
|
|
@@ -229,6 +232,7 @@ static int lpass_platform_pcmops_trigger(struct snd_pcm_substream *substream,
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
struct lpass_data *drvdata =
|
|
struct lpass_data *drvdata =
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
|
|
+ struct lpass_variant *v = drvdata->variant;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
switch (cmd) {
|
|
switch (cmd) {
|
|
@@ -237,7 +241,7 @@ static int lpass_platform_pcmops_trigger(struct snd_pcm_substream *substream,
|
|
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
|
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
|
/* clear status before enabling interrupts */
|
|
/* clear status before enabling interrupts */
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
- LPAIF_IRQCLEAR_REG(LPAIF_IRQ_PORT_HOST),
|
|
|
|
|
|
+ LPAIF_IRQCLEAR_REG(v, LPAIF_IRQ_PORT_HOST),
|
|
LPAIF_IRQ_ALL(LPAIF_RDMA_CHAN_MI2S));
|
|
LPAIF_IRQ_ALL(LPAIF_RDMA_CHAN_MI2S));
|
|
if (ret) {
|
|
if (ret) {
|
|
dev_err(soc_runtime->dev, "%s() error writing to irqclear reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error writing to irqclear reg: %d\n",
|
|
@@ -246,7 +250,7 @@ static int lpass_platform_pcmops_trigger(struct snd_pcm_substream *substream,
|
|
}
|
|
}
|
|
|
|
|
|
ret = regmap_update_bits(drvdata->lpaif_map,
|
|
ret = regmap_update_bits(drvdata->lpaif_map,
|
|
- LPAIF_IRQEN_REG(LPAIF_IRQ_PORT_HOST),
|
|
|
|
|
|
+ LPAIF_IRQEN_REG(v, LPAIF_IRQ_PORT_HOST),
|
|
LPAIF_IRQ_ALL(LPAIF_RDMA_CHAN_MI2S),
|
|
LPAIF_IRQ_ALL(LPAIF_RDMA_CHAN_MI2S),
|
|
LPAIF_IRQ_ALL(LPAIF_RDMA_CHAN_MI2S));
|
|
LPAIF_IRQ_ALL(LPAIF_RDMA_CHAN_MI2S));
|
|
if (ret) {
|
|
if (ret) {
|
|
@@ -256,7 +260,7 @@ static int lpass_platform_pcmops_trigger(struct snd_pcm_substream *substream,
|
|
}
|
|
}
|
|
|
|
|
|
ret = regmap_update_bits(drvdata->lpaif_map,
|
|
ret = regmap_update_bits(drvdata->lpaif_map,
|
|
- LPAIF_RDMACTL_REG(LPAIF_RDMA_CHAN_MI2S),
|
|
|
|
|
|
+ LPAIF_RDMACTL_REG(v, LPAIF_RDMA_CHAN_MI2S),
|
|
LPAIF_RDMACTL_ENABLE_MASK,
|
|
LPAIF_RDMACTL_ENABLE_MASK,
|
|
LPAIF_RDMACTL_ENABLE_ON);
|
|
LPAIF_RDMACTL_ENABLE_ON);
|
|
if (ret) {
|
|
if (ret) {
|
|
@@ -269,7 +273,7 @@ static int lpass_platform_pcmops_trigger(struct snd_pcm_substream *substream,
|
|
case SNDRV_PCM_TRIGGER_SUSPEND:
|
|
case SNDRV_PCM_TRIGGER_SUSPEND:
|
|
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
|
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
|
ret = regmap_update_bits(drvdata->lpaif_map,
|
|
ret = regmap_update_bits(drvdata->lpaif_map,
|
|
- LPAIF_RDMACTL_REG(LPAIF_RDMA_CHAN_MI2S),
|
|
|
|
|
|
+ LPAIF_RDMACTL_REG(v, LPAIF_RDMA_CHAN_MI2S),
|
|
LPAIF_RDMACTL_ENABLE_MASK,
|
|
LPAIF_RDMACTL_ENABLE_MASK,
|
|
LPAIF_RDMACTL_ENABLE_OFF);
|
|
LPAIF_RDMACTL_ENABLE_OFF);
|
|
if (ret) {
|
|
if (ret) {
|
|
@@ -279,7 +283,7 @@ static int lpass_platform_pcmops_trigger(struct snd_pcm_substream *substream,
|
|
}
|
|
}
|
|
|
|
|
|
ret = regmap_update_bits(drvdata->lpaif_map,
|
|
ret = regmap_update_bits(drvdata->lpaif_map,
|
|
- LPAIF_IRQEN_REG(LPAIF_IRQ_PORT_HOST),
|
|
|
|
|
|
+ LPAIF_IRQEN_REG(v, LPAIF_IRQ_PORT_HOST),
|
|
LPAIF_IRQ_ALL(LPAIF_RDMA_CHAN_MI2S), 0);
|
|
LPAIF_IRQ_ALL(LPAIF_RDMA_CHAN_MI2S), 0);
|
|
if (ret) {
|
|
if (ret) {
|
|
dev_err(soc_runtime->dev, "%s() error writing to irqen reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error writing to irqen reg: %d\n",
|
|
@@ -298,11 +302,13 @@ static snd_pcm_uframes_t lpass_platform_pcmops_pointer(
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
struct lpass_data *drvdata =
|
|
struct lpass_data *drvdata =
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
|
|
+ struct lpass_variant *v = drvdata->variant;
|
|
unsigned int base_addr, curr_addr;
|
|
unsigned int base_addr, curr_addr;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
ret = regmap_read(drvdata->lpaif_map,
|
|
ret = regmap_read(drvdata->lpaif_map,
|
|
- LPAIF_RDMABASE_REG(LPAIF_RDMA_CHAN_MI2S), &base_addr);
|
|
|
|
|
|
+ LPAIF_RDMABASE_REG(v, LPAIF_RDMA_CHAN_MI2S),
|
|
|
|
+ &base_addr);
|
|
if (ret) {
|
|
if (ret) {
|
|
dev_err(soc_runtime->dev, "%s() error reading from rdmabase reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error reading from rdmabase reg: %d\n",
|
|
__func__, ret);
|
|
__func__, ret);
|
|
@@ -310,7 +316,8 @@ static snd_pcm_uframes_t lpass_platform_pcmops_pointer(
|
|
}
|
|
}
|
|
|
|
|
|
ret = regmap_read(drvdata->lpaif_map,
|
|
ret = regmap_read(drvdata->lpaif_map,
|
|
- LPAIF_RDMACURR_REG(LPAIF_RDMA_CHAN_MI2S), &curr_addr);
|
|
|
|
|
|
+ LPAIF_RDMACURR_REG(v, LPAIF_RDMA_CHAN_MI2S),
|
|
|
|
+ &curr_addr);
|
|
if (ret) {
|
|
if (ret) {
|
|
dev_err(soc_runtime->dev, "%s() error reading from rdmacurr reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error reading from rdmacurr reg: %d\n",
|
|
__func__, ret);
|
|
__func__, ret);
|
|
@@ -347,12 +354,13 @@ static irqreturn_t lpass_platform_lpaif_irq(int irq, void *data)
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
struct lpass_data *drvdata =
|
|
struct lpass_data *drvdata =
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
|
|
+ struct lpass_variant *v = drvdata->variant;
|
|
unsigned int interrupts;
|
|
unsigned int interrupts;
|
|
irqreturn_t ret = IRQ_NONE;
|
|
irqreturn_t ret = IRQ_NONE;
|
|
int rv;
|
|
int rv;
|
|
|
|
|
|
rv = regmap_read(drvdata->lpaif_map,
|
|
rv = regmap_read(drvdata->lpaif_map,
|
|
- LPAIF_IRQSTAT_REG(LPAIF_IRQ_PORT_HOST), &interrupts);
|
|
|
|
|
|
+ LPAIF_IRQSTAT_REG(v, LPAIF_IRQ_PORT_HOST), &interrupts);
|
|
if (rv) {
|
|
if (rv) {
|
|
dev_err(soc_runtime->dev, "%s() error reading from irqstat reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error reading from irqstat reg: %d\n",
|
|
__func__, rv);
|
|
__func__, rv);
|
|
@@ -362,7 +370,7 @@ static irqreturn_t lpass_platform_lpaif_irq(int irq, void *data)
|
|
|
|
|
|
if (interrupts & LPAIF_IRQ_PER(LPAIF_RDMA_CHAN_MI2S)) {
|
|
if (interrupts & LPAIF_IRQ_PER(LPAIF_RDMA_CHAN_MI2S)) {
|
|
rv = regmap_write(drvdata->lpaif_map,
|
|
rv = regmap_write(drvdata->lpaif_map,
|
|
- LPAIF_IRQCLEAR_REG(LPAIF_IRQ_PORT_HOST),
|
|
|
|
|
|
+ LPAIF_IRQCLEAR_REG(v, LPAIF_IRQ_PORT_HOST),
|
|
LPAIF_IRQ_PER(LPAIF_RDMA_CHAN_MI2S));
|
|
LPAIF_IRQ_PER(LPAIF_RDMA_CHAN_MI2S));
|
|
if (rv) {
|
|
if (rv) {
|
|
dev_err(soc_runtime->dev, "%s() error writing to irqclear reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error writing to irqclear reg: %d\n",
|
|
@@ -375,7 +383,7 @@ static irqreturn_t lpass_platform_lpaif_irq(int irq, void *data)
|
|
|
|
|
|
if (interrupts & LPAIF_IRQ_XRUN(LPAIF_RDMA_CHAN_MI2S)) {
|
|
if (interrupts & LPAIF_IRQ_XRUN(LPAIF_RDMA_CHAN_MI2S)) {
|
|
rv = regmap_write(drvdata->lpaif_map,
|
|
rv = regmap_write(drvdata->lpaif_map,
|
|
- LPAIF_IRQCLEAR_REG(LPAIF_IRQ_PORT_HOST),
|
|
|
|
|
|
+ LPAIF_IRQCLEAR_REG(v, LPAIF_IRQ_PORT_HOST),
|
|
LPAIF_IRQ_XRUN(LPAIF_RDMA_CHAN_MI2S));
|
|
LPAIF_IRQ_XRUN(LPAIF_RDMA_CHAN_MI2S));
|
|
if (rv) {
|
|
if (rv) {
|
|
dev_err(soc_runtime->dev, "%s() error writing to irqclear reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error writing to irqclear reg: %d\n",
|
|
@@ -389,7 +397,7 @@ static irqreturn_t lpass_platform_lpaif_irq(int irq, void *data)
|
|
|
|
|
|
if (interrupts & LPAIF_IRQ_ERR(LPAIF_RDMA_CHAN_MI2S)) {
|
|
if (interrupts & LPAIF_IRQ_ERR(LPAIF_RDMA_CHAN_MI2S)) {
|
|
rv = regmap_write(drvdata->lpaif_map,
|
|
rv = regmap_write(drvdata->lpaif_map,
|
|
- LPAIF_IRQCLEAR_REG(LPAIF_IRQ_PORT_HOST),
|
|
|
|
|
|
+ LPAIF_IRQCLEAR_REG(v, LPAIF_IRQ_PORT_HOST),
|
|
LPAIF_IRQ_ERR(LPAIF_RDMA_CHAN_MI2S));
|
|
LPAIF_IRQ_ERR(LPAIF_RDMA_CHAN_MI2S));
|
|
if (rv) {
|
|
if (rv) {
|
|
dev_err(soc_runtime->dev, "%s() error writing to irqclear reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error writing to irqclear reg: %d\n",
|
|
@@ -444,6 +452,7 @@ static int lpass_platform_pcm_new(struct snd_soc_pcm_runtime *soc_runtime)
|
|
pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream;
|
|
pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream;
|
|
struct lpass_data *drvdata =
|
|
struct lpass_data *drvdata =
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
snd_soc_platform_get_drvdata(soc_runtime->platform);
|
|
|
|
+ struct lpass_variant *v = drvdata->variant;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
soc_runtime->dev->coherent_dma_mask = DMA_BIT_MASK(32);
|
|
soc_runtime->dev->coherent_dma_mask = DMA_BIT_MASK(32);
|
|
@@ -464,14 +473,14 @@ static int lpass_platform_pcm_new(struct snd_soc_pcm_runtime *soc_runtime)
|
|
|
|
|
|
/* ensure audio hardware is disabled */
|
|
/* ensure audio hardware is disabled */
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
- LPAIF_IRQEN_REG(LPAIF_IRQ_PORT_HOST), 0);
|
|
|
|
|
|
+ LPAIF_IRQEN_REG(v, LPAIF_IRQ_PORT_HOST), 0);
|
|
if (ret) {
|
|
if (ret) {
|
|
dev_err(soc_runtime->dev, "%s() error writing to irqen reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error writing to irqen reg: %d\n",
|
|
__func__, ret);
|
|
__func__, ret);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
ret = regmap_write(drvdata->lpaif_map,
|
|
- LPAIF_RDMACTL_REG(LPAIF_RDMA_CHAN_MI2S), 0);
|
|
|
|
|
|
+ LPAIF_RDMACTL_REG(v, LPAIF_RDMA_CHAN_MI2S), 0);
|
|
if (ret) {
|
|
if (ret) {
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmactl reg: %d\n",
|
|
dev_err(soc_runtime->dev, "%s() error writing to rdmactl reg: %d\n",
|
|
__func__, ret);
|
|
__func__, ret);
|