aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2014-05-13 13:23:56 -0400
committerMark Brown <broonie@linaro.org>2014-05-13 13:23:56 -0400
commit8bee1fd482622718fcc1a537db1d7ca48d7f52f8 (patch)
tree8b40cf912a942771b0b22f2aa0ac20d5af256010
parentdfe1951b0c1c6a80b8ad8702eb93f8a4dffa31f1 (diff)
parentcffd6665f57ed18f4be9185c4330c8c98c22e201 (diff)
Merge branch 'fix/intel' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into asoc-intel
Conflicts: sound/soc/intel/sst-baytrail-dsp.c
-rw-r--r--sound/soc/intel/sst-acpi.c1
-rw-r--r--sound/soc/intel/sst-baytrail-dsp.c2
-rw-r--r--sound/soc/intel/sst-baytrail-ipc.c8
-rw-r--r--sound/soc/intel/sst-dsp-priv.h3
-rw-r--r--sound/soc/intel/sst-dsp.c1
-rw-r--r--sound/soc/intel/sst-dsp.h1
-rw-r--r--sound/soc/intel/sst-firmware.c25
-rw-r--r--sound/soc/intel/sst-haswell-dsp.c4
-rw-r--r--sound/soc/intel/sst-haswell-ipc.c35
-rw-r--r--sound/soc/intel/sst-haswell-ipc.h4
-rw-r--r--sound/soc/intel/sst-haswell-pcm.c107
11 files changed, 129 insertions, 62 deletions
diff --git a/sound/soc/intel/sst-acpi.c b/sound/soc/intel/sst-acpi.c
index 5d06eecb6198..18aee77f8d4a 100644
--- a/sound/soc/intel/sst-acpi.c
+++ b/sound/soc/intel/sst-acpi.c
@@ -138,6 +138,7 @@ static int sst_acpi_probe(struct platform_device *pdev)
138 138
139 sst_pdata = &sst_acpi->sst_pdata; 139 sst_pdata = &sst_acpi->sst_pdata;
140 sst_pdata->id = desc->sst_id; 140 sst_pdata->id = desc->sst_id;
141 sst_pdata->dma_dev = dev;
141 sst_acpi->desc = desc; 142 sst_acpi->desc = desc;
142 sst_acpi->mach = mach; 143 sst_acpi->mach = mach;
143 144
diff --git a/sound/soc/intel/sst-baytrail-dsp.c b/sound/soc/intel/sst-baytrail-dsp.c
index 4a5d489e520b..fc588764ffa3 100644
--- a/sound/soc/intel/sst-baytrail-dsp.c
+++ b/sound/soc/intel/sst-baytrail-dsp.c
@@ -324,7 +324,7 @@ static int sst_byt_init(struct sst_dsp *sst, struct sst_pdata *pdata)
324 return ret; 324 return ret;
325 } 325 }
326 326
327 ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32)); 327 ret = dma_coerce_mask_and_coherent(sst->dma_dev, DMA_BIT_MASK(32));
328 if (ret) 328 if (ret)
329 return ret; 329 return ret;
330 330
diff --git a/sound/soc/intel/sst-baytrail-ipc.c b/sound/soc/intel/sst-baytrail-ipc.c
index 3e1dad3449bd..7c1ec003d55d 100644
--- a/sound/soc/intel/sst-baytrail-ipc.c
+++ b/sound/soc/intel/sst-baytrail-ipc.c
@@ -561,16 +561,20 @@ struct sst_byt_stream *sst_byt_stream_new(struct sst_byt *byt, int id,
561 void *data) 561 void *data)
562{ 562{
563 struct sst_byt_stream *stream; 563 struct sst_byt_stream *stream;
564 struct sst_dsp *sst = byt->dsp;
565 unsigned long flags;
564 566
565 stream = kzalloc(sizeof(*stream), GFP_KERNEL); 567 stream = kzalloc(sizeof(*stream), GFP_KERNEL);
566 if (stream == NULL) 568 if (stream == NULL)
567 return NULL; 569 return NULL;
568 570
571 spin_lock_irqsave(&sst->spinlock, flags);
569 list_add(&stream->node, &byt->stream_list); 572 list_add(&stream->node, &byt->stream_list);
570 stream->notify_position = notify_position; 573 stream->notify_position = notify_position;
571 stream->pdata = data; 574 stream->pdata = data;
572 stream->byt = byt; 575 stream->byt = byt;
573 stream->str_id = id; 576 stream->str_id = id;
577 spin_unlock_irqrestore(&sst->spinlock, flags);
574 578
575 return stream; 579 return stream;
576} 580}
@@ -649,6 +653,8 @@ int sst_byt_stream_free(struct sst_byt *byt, struct sst_byt_stream *stream)
649{ 653{
650 u64 header; 654 u64 header;
651 int ret = 0; 655 int ret = 0;
656 struct sst_dsp *sst = byt->dsp;
657 unsigned long flags;
652 658
653 if (!stream->commited) 659 if (!stream->commited)
654 goto out; 660 goto out;
@@ -663,8 +669,10 @@ int sst_byt_stream_free(struct sst_byt *byt, struct sst_byt_stream *stream)
663 669
664 stream->commited = false; 670 stream->commited = false;
665out: 671out:
672 spin_lock_irqsave(&sst->spinlock, flags);
666 list_del(&stream->node); 673 list_del(&stream->node);
667 kfree(stream); 674 kfree(stream);
675 spin_unlock_irqrestore(&sst->spinlock, flags);
668 676
669 return ret; 677 return ret;
670} 678}
diff --git a/sound/soc/intel/sst-dsp-priv.h b/sound/soc/intel/sst-dsp-priv.h
index cd4a3ca25ce4..ffb308bd81ce 100644
--- a/sound/soc/intel/sst-dsp-priv.h
+++ b/sound/soc/intel/sst-dsp-priv.h
@@ -136,7 +136,7 @@ struct sst_module_data {
136 enum sst_data_type data_type; /* type of module data */ 136 enum sst_data_type data_type; /* type of module data */
137 137
138 u32 size; /* size in bytes */ 138 u32 size; /* size in bytes */
139 u32 offset; /* offset in FW file */ 139 int32_t offset; /* offset in FW file */
140 u32 data_offset; /* offset in ADSP memory space */ 140 u32 data_offset; /* offset in ADSP memory space */
141 void *data; /* module data */ 141 void *data; /* module data */
142}; 142};
@@ -228,6 +228,7 @@ struct sst_dsp {
228 spinlock_t spinlock; /* IPC locking */ 228 spinlock_t spinlock; /* IPC locking */
229 struct mutex mutex; /* DSP FW lock */ 229 struct mutex mutex; /* DSP FW lock */
230 struct device *dev; 230 struct device *dev;
231 struct device *dma_dev;
231 void *thread_context; 232 void *thread_context;
232 int irq; 233 int irq;
233 u32 id; 234 u32 id;
diff --git a/sound/soc/intel/sst-dsp.c b/sound/soc/intel/sst-dsp.c
index 0c129fd85ecf..0b715b20a2d7 100644
--- a/sound/soc/intel/sst-dsp.c
+++ b/sound/soc/intel/sst-dsp.c
@@ -337,6 +337,7 @@ struct sst_dsp *sst_dsp_new(struct device *dev,
337 spin_lock_init(&sst->spinlock); 337 spin_lock_init(&sst->spinlock);
338 mutex_init(&sst->mutex); 338 mutex_init(&sst->mutex);
339 sst->dev = dev; 339 sst->dev = dev;
340 sst->dma_dev = pdata->dma_dev;
340 sst->thread_context = sst_dev->thread_context; 341 sst->thread_context = sst_dev->thread_context;
341 sst->sst_dev = sst_dev; 342 sst->sst_dev = sst_dev;
342 sst->id = pdata->id; 343 sst->id = pdata->id;
diff --git a/sound/soc/intel/sst-dsp.h b/sound/soc/intel/sst-dsp.h
index 74052b59485c..e44423be66c4 100644
--- a/sound/soc/intel/sst-dsp.h
+++ b/sound/soc/intel/sst-dsp.h
@@ -169,6 +169,7 @@ struct sst_pdata {
169 u32 dma_base; 169 u32 dma_base;
170 u32 dma_size; 170 u32 dma_size;
171 int dma_engine; 171 int dma_engine;
172 struct device *dma_dev;
172 173
173 /* DSP */ 174 /* DSP */
174 u32 id; 175 u32 id;
diff --git a/sound/soc/intel/sst-firmware.c b/sound/soc/intel/sst-firmware.c
index 0c74bf1d2021..3bb43dac892d 100644
--- a/sound/soc/intel/sst-firmware.c
+++ b/sound/soc/intel/sst-firmware.c
@@ -59,14 +59,8 @@ struct sst_fw *sst_fw_new(struct sst_dsp *dsp,
59 sst_fw->private = private; 59 sst_fw->private = private;
60 sst_fw->size = fw->size; 60 sst_fw->size = fw->size;
61 61
62 err = dma_coerce_mask_and_coherent(dsp->dev, DMA_BIT_MASK(32));
63 if (err < 0) {
64 kfree(sst_fw);
65 return NULL;
66 }
67
68 /* allocate DMA buffer to store FW data */ 62 /* allocate DMA buffer to store FW data */
69 sst_fw->dma_buf = dma_alloc_coherent(dsp->dev, sst_fw->size, 63 sst_fw->dma_buf = dma_alloc_coherent(dsp->dma_dev, sst_fw->size,
70 &sst_fw->dmable_fw_paddr, GFP_DMA | GFP_KERNEL); 64 &sst_fw->dmable_fw_paddr, GFP_DMA | GFP_KERNEL);
71 if (!sst_fw->dma_buf) { 65 if (!sst_fw->dma_buf) {
72 dev_err(dsp->dev, "error: DMA alloc failed\n"); 66 dev_err(dsp->dev, "error: DMA alloc failed\n");
@@ -144,7 +138,7 @@ void sst_fw_free(struct sst_fw *sst_fw)
144 list_del(&sst_fw->list); 138 list_del(&sst_fw->list);
145 mutex_unlock(&dsp->mutex); 139 mutex_unlock(&dsp->mutex);
146 140
147 dma_free_coherent(dsp->dev, sst_fw->size, sst_fw->dma_buf, 141 dma_free_coherent(dsp->dma_dev, sst_fw->size, sst_fw->dma_buf,
148 sst_fw->dmable_fw_paddr); 142 sst_fw->dmable_fw_paddr);
149 kfree(sst_fw); 143 kfree(sst_fw);
150} 144}
@@ -240,6 +234,9 @@ static int block_alloc_contiguous(struct sst_module *module,
240 size -= block->size; 234 size -= block->size;
241 } 235 }
242 236
237 list_for_each_entry(block, &tmp, list)
238 list_add(&block->module_list, &module->block_list);
239
243 list_splice(&tmp, &dsp->used_block_list); 240 list_splice(&tmp, &dsp->used_block_list);
244 return 0;