diff options
| author | Mark Brown <broonie@linaro.org> | 2014-05-13 13:23:56 -0400 |
|---|---|---|
| committer | Mark Brown <broonie@linaro.org> | 2014-05-13 13:23:56 -0400 |
| commit | 8bee1fd482622718fcc1a537db1d7ca48d7f52f8 (patch) | |
| tree | 8b40cf912a942771b0b22f2aa0ac20d5af256010 | |
| parent | dfe1951b0c1c6a80b8ad8702eb93f8a4dffa31f1 (diff) | |
| parent | cffd6665f57ed18f4be9185c4330c8c98c22e201 (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.c | 1 | ||||
| -rw-r--r-- | sound/soc/intel/sst-baytrail-dsp.c | 2 | ||||
| -rw-r--r-- | sound/soc/intel/sst-baytrail-ipc.c | 8 | ||||
| -rw-r--r-- | sound/soc/intel/sst-dsp-priv.h | 3 | ||||
| -rw-r--r-- | sound/soc/intel/sst-dsp.c | 1 | ||||
| -rw-r--r-- | sound/soc/intel/sst-dsp.h | 1 | ||||
| -rw-r--r-- | sound/soc/intel/sst-firmware.c | 25 | ||||
| -rw-r--r-- | sound/soc/intel/sst-haswell-dsp.c | 4 | ||||
| -rw-r--r-- | sound/soc/intel/sst-haswell-ipc.c | 35 | ||||
| -rw-r--r-- | sound/soc/intel/sst-haswell-ipc.h | 4 | ||||
| -rw-r--r-- | sound/soc/intel/sst-haswell-pcm.c | 107 |
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; |
| 665 | out: | 671 | out: |
| 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; | ||
