|
@@ -58,13 +58,15 @@ static void s6000_pcm_enqueue_dma(struct snd_pcm_substream *substream)
|
|
|
struct snd_pcm_runtime *runtime = substream->runtime;
|
|
|
struct s6000_runtime_data *prtd = runtime->private_data;
|
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
|
- struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data;
|
|
|
+ struct s6000_pcm_dma_params *par;
|
|
|
int channel;
|
|
|
unsigned int period_size;
|
|
|
unsigned int dma_offset;
|
|
|
dma_addr_t dma_pos;
|
|
|
dma_addr_t src, dst;
|
|
|
|
|
|
+ par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
|
|
|
+
|
|
|
period_size = snd_pcm_lib_period_bytes(substream);
|
|
|
dma_offset = prtd->period * period_size;
|
|
|
dma_pos = runtime->dma_addr + dma_offset;
|
|
@@ -101,7 +103,8 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data)
|
|
|
{
|
|
|
struct snd_pcm *pcm = data;
|
|
|
struct snd_soc_pcm_runtime *runtime = pcm->private_data;
|
|
|
- struct s6000_pcm_dma_params *params = runtime->dai->cpu_dai->dma_data;
|
|
|
+ struct s6000_pcm_dma_params *params =
|
|
|
+ snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
|
|
|
struct s6000_runtime_data *prtd;
|
|
|
unsigned int has_xrun;
|
|
|
int i, ret = IRQ_NONE;
|
|
@@ -172,11 +175,13 @@ static int s6000_pcm_start(struct snd_pcm_substream *substream)
|
|
|
{
|
|
|
struct s6000_runtime_data *prtd = substream->runtime->private_data;
|
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
|
- struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data;
|
|
|
+ struct s6000_pcm_dma_params *par;
|
|
|
unsigned long flags;
|
|
|
int srcinc;
|
|
|
u32 dma;
|
|
|
|
|
|
+ par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
|
|
|
+
|
|
|
spin_lock_irqsave(&prtd->lock, flags);
|
|
|
|
|
|
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
|
@@ -212,10 +217,12 @@ static int s6000_pcm_stop(struct snd_pcm_substream *substream)
|
|
|
{
|
|
|
struct s6000_runtime_data *prtd = substream->runtime->private_data;
|
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
|
- struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data;
|
|
|
+ struct s6000_pcm_dma_params *par;
|
|
|
unsigned long flags;
|
|
|
u32 channel;
|
|
|
|
|
|
+ par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
|
|
|
+
|
|
|
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
|
|
channel = par->dma_out;
|
|
|
else
|
|
@@ -236,9 +243,11 @@ static int s6000_pcm_stop(struct snd_pcm_substream *substream)
|
|
|
static int s6000_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
|
|
{
|
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
|
- struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data;
|
|
|
+ struct s6000_pcm_dma_params *par;
|
|
|
int ret;
|
|
|
|
|
|
+ par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
|
|
|
+
|
|
|
ret = par->trigger(substream, cmd, 0);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
@@ -275,13 +284,15 @@ static int s6000_pcm_prepare(struct snd_pcm_substream *substream)
|
|
|
static snd_pcm_uframes_t s6000_pcm_pointer(struct snd_pcm_substream *substream)
|
|
|
{
|
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
|
- struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data;
|
|
|
+ struct s6000_pcm_dma_params *par;
|
|
|
struct snd_pcm_runtime *runtime = substream->runtime;
|
|
|
struct s6000_runtime_data *prtd = runtime->private_data;
|
|
|
unsigned long flags;
|
|
|
unsigned int offset;
|
|
|
dma_addr_t count;
|
|
|
|
|
|
+ par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
|
|
|
+
|
|
|
spin_lock_irqsave(&prtd->lock, flags);
|
|
|
|
|
|
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
|
@@ -305,11 +316,12 @@ static snd_pcm_uframes_t s6000_pcm_pointer(struct snd_pcm_substream *substream)
|
|
|
static int s6000_pcm_open(struct snd_pcm_substream *substream)
|
|
|
{
|
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
|
- struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data;
|
|
|
+ struct s6000_pcm_dma_params *par;
|
|
|
struct snd_pcm_runtime *runtime = substream->runtime;
|
|
|
struct s6000_runtime_data *prtd;
|
|
|
int ret;
|
|
|
|
|
|
+ par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
|
|
|
snd_soc_set_runtime_hwparams(substream, &s6000_pcm_hardware);
|
|
|
|
|
|
ret = snd_pcm_hw_constraint_step(runtime, 0,
|
|
@@ -364,7 +376,7 @@ static int s6000_pcm_hw_params(struct snd_pcm_substream *substream,
|
|
|
struct snd_pcm_hw_params *hw_params)
|
|
|
{
|
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
|
- struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data;
|
|
|
+ struct s6000_pcm_dma_params *par;
|
|
|
int ret;
|
|
|
ret = snd_pcm_lib_malloc_pages(substream,
|
|
|
params_buffer_bytes(hw_params));
|
|
@@ -373,6 +385,8 @@ static int s6000_pcm_hw_params(struct snd_pcm_substream *substream,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
|
|
|
+
|
|
|
if (par->same_rate) {
|
|
|
spin_lock(&par->lock);
|
|
|
if (par->rate == -1 ||
|
|
@@ -392,7 +406,8 @@ static int s6000_pcm_hw_params(struct snd_pcm_substream *substream,
|
|
|
static int s6000_pcm_hw_free(struct snd_pcm_substream *substream)
|
|
|
{
|
|
|
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
|
|
|
- struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data;
|
|
|
+ struct s6000_pcm_dma_params *par =
|
|
|
+ snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
|
|
|
|
|
|
spin_lock(&par->lock);
|
|
|
par->in_use &= ~(1 << substream->stream);
|
|
@@ -417,7 +432,8 @@ static struct snd_pcm_ops s6000_pcm_ops = {
|
|
|
static void s6000_pcm_free(struct snd_pcm *pcm)
|
|
|
{
|
|
|
struct snd_soc_pcm_runtime *runtime = pcm->private_data;
|
|
|
- struct s6000_pcm_dma_params *params = runtime->dai->cpu_dai->dma_data;
|
|
|
+ struct s6000_pcm_dma_params *params =
|
|
|
+ snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
|
|
|
|
|
|
free_irq(params->irq, pcm);
|
|
|
snd_pcm_lib_preallocate_free_for_all(pcm);
|
|
@@ -429,9 +445,11 @@ static int s6000_pcm_new(struct snd_card *card,
|
|
|
struct snd_soc_dai *dai, struct snd_pcm *pcm)
|
|
|
{
|
|
|
struct snd_soc_pcm_runtime *runtime = pcm->private_data;
|
|
|
- struct s6000_pcm_dma_params *params = runtime->dai->cpu_dai->dma_data;
|
|
|
+ struct s6000_pcm_dma_params *params;
|
|
|
int res;
|
|
|
|
|
|
+ params = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
|
|
|
+
|
|
|
if (!card->dev->dma_mask)
|
|
|
card->dev->dma_mask = &s6000_pcm_dmamask;
|
|
|
if (!card->dev->coherent_dma_mask)
|