[Sound-open-firmware] [PATCH_V2 1/2] cnl: dma: refine dma probe

Probe each dma individually
--- V2: rebase on master Tested with: SOF master kernel:pierre V4.14 branch
Signed-off-by: Rander Wang rander.wang@linux.intel.com --- src/drivers/dw-dma.c | 38 +++++++++++--------------------------- src/platform/cannonlake/platform.c | 5 +++++ 2 files changed, 16 insertions(+), 27 deletions(-)
diff --git a/src/drivers/dw-dma.c b/src/drivers/dw-dma.c index c2d6917..ccefc50 100644 --- a/src/drivers/dw-dma.c +++ b/src/drivers/dw-dma.c @@ -1048,14 +1048,7 @@ static void dw_dma_irq_handler(void *data)
status_intr = dw_read(dma, DW_INTR_STATUS); if (!status_intr) { -#ifdef CONFIG_CANNONLAKE - dma++; - status_intr = dw_read(dma, DW_INTR_STATUS); - if (!status_intr) - trace_dma_error("eI0"); -#else trace_dma_error("eI0"); -#endif }
tracev_dma("DIr"); @@ -1148,31 +1141,22 @@ static void dw_dma_irq_handler(void *data) static int dw_dma_probe(struct dma *dma) { struct dma_pdata *dw_pdata; - struct dma *dmac = dma; int i; -#ifdef CONFIG_CANNONLAKE - int j; - - for (j = 0; j < MAX_GPDMA_COUNT; j++) -#endif - { - /* allocate private data */ - dw_pdata = rzalloc(RZONE_SYS, SOF_MEM_CAPS_RAM, - sizeof(*dw_pdata)); - dma_set_drvdata(dmac, dw_pdata);
- spinlock_init(&dmac->lock); + /* allocate private data */ + dw_pdata = rzalloc(RZONE_SYS, SOF_MEM_CAPS_RAM, + sizeof(*dw_pdata)); + dma_set_drvdata(dma, dw_pdata);
- dw_dma_setup(dmac); + spinlock_init(&dma->lock);
- /* init work */ - for (i = 0; i < DW_MAX_CHAN; i++) { - dw_pdata->chan[i].dma = dmac; - dw_pdata->chan[i].channel = i; - dw_pdata->chan[i].status = COMP_STATE_INIT; - } + dw_dma_setup(dma);
- dmac++; + /* init work */ + for (i = 0; i < DW_MAX_CHAN; i++) { + dw_pdata->chan[i].dma = dma; + dw_pdata->chan[i].channel = i; + dw_pdata->chan[i].status = COMP_STATE_INIT; }
/* register our IRQ handler */ diff --git a/src/platform/cannonlake/platform.c b/src/platform/cannonlake/platform.c index 32a4454..ad26a06 100644 --- a/src/platform/cannonlake/platform.c +++ b/src/platform/cannonlake/platform.c @@ -259,6 +259,11 @@ int platform_init(struct reef *reef) return -ENODEV; dma_probe(dmac);
+ dmac = dma_get(DMA_GP_LP_DMAC1); + if (!dmac) + return -ENODEV; + dma_probe(dmac); + dmac = dma_get(DMA_HOST_OUT_DMAC); if (!dmac) return -ENODEV;

On Wed, 2018-03-07 at 10:42 +0800, Rander Wang wrote:
Probe each dma individually
V2: rebase on master Tested with: SOF master kernel:pierre V4.14 branch
Signed-off-by: Rander Wang rander.wang@linux.intel.com
src/drivers/dw-dma.c | 38 +++++++++++-----------------
Applied 1/2, please redo 2/2 using IRQ core as 1st level IRQ handler.
Thanks
Liam --------------------------------------------------------------------- Intel Corporation (UK) Limited Registered No. 1134945 (England) Registered Office: Pipers Way, Swindon SN3 1RJ VAT No: 860 2173 47
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
participants (2)
-
Liam Girdwood
-
Rander Wang