diff options
Diffstat (limited to 'sound/soc/davinci/davinci-mcasp.c')
-rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 103 |
1 files changed, 70 insertions, 33 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index 30b94d4f9c5d..de3b155a5011 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c | |||
@@ -364,6 +364,20 @@ static irqreturn_t davinci_mcasp_rx_irq_handler(int irq, void *data) | |||
364 | return IRQ_RETVAL(handled_mask); | 364 | return IRQ_RETVAL(handled_mask); |
365 | } | 365 | } |
366 | 366 | ||
367 | static irqreturn_t davinci_mcasp_common_irq_handler(int irq, void *data) | ||
368 | { | ||
369 | struct davinci_mcasp *mcasp = (struct davinci_mcasp *)data; | ||
370 | irqreturn_t ret = IRQ_NONE; | ||
371 | |||
372 | if (mcasp->substreams[SNDRV_PCM_STREAM_PLAYBACK]) | ||
373 | ret = davinci_mcasp_tx_irq_handler(irq, data); | ||
374 | |||
375 | if (mcasp->substreams[SNDRV_PCM_STREAM_CAPTURE]) | ||
376 | ret |= davinci_mcasp_rx_irq_handler(irq, data); | ||
377 | |||
378 | return ret; | ||
379 | } | ||
380 | |||
367 | static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | 381 | static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, |
368 | unsigned int fmt) | 382 | unsigned int fmt) |
369 | { | 383 | { |
@@ -1313,16 +1327,19 @@ static struct davinci_mcasp_pdata *davinci_mcasp_set_pdata_from_of( | |||
1313 | 1327 | ||
1314 | pdata->tx_dma_channel = dma_spec.args[0]; | 1328 | pdata->tx_dma_channel = dma_spec.args[0]; |
1315 | 1329 | ||
1316 | ret = of_property_match_string(np, "dma-names", "rx"); | 1330 | /* RX is not valid in DIT mode */ |
1317 | if (ret < 0) | 1331 | if (pdata->op_mode != DAVINCI_MCASP_DIT_MODE) { |
1318 | goto nodata; | 1332 | ret = of_property_match_string(np, "dma-names", "rx"); |
1333 | if (ret < 0) | ||
1334 | goto nodata; | ||
1319 | 1335 | ||
1320 | ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret, | 1336 | ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret, |
1321 | &dma_spec); | 1337 | &dma_spec); |
1322 | if (ret < 0) | 1338 | if (ret < 0) |
1323 | goto nodata; | 1339 | goto nodata; |
1324 | 1340 | ||
1325 | pdata->rx_dma_channel = dma_spec.args[0]; | 1341 | pdata->rx_dma_channel = dma_spec.args[0]; |
1342 | } | ||
1326 | 1343 | ||
1327 | ret = of_property_read_u32(np, "tx-num-evt", &val); | 1344 | ret = of_property_read_u32(np, "tx-num-evt", &val); |
1328 | if (ret >= 0) | 1345 | if (ret >= 0) |
@@ -1441,6 +1458,23 @@ static int davinci_mcasp_probe(struct platform_device *pdev) | |||
1441 | 1458 | ||
1442 | mcasp->dev = &pdev->dev; | 1459 | mcasp->dev = &pdev->dev; |
1443 | 1460 | ||
1461 | irq = platform_get_irq_byname(pdev, "common"); | ||
1462 | if (irq >= 0) { | ||
1463 | irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_common\n", | ||
1464 | dev_name(&pdev->dev)); | ||
1465 | ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, | ||
1466 | davinci_mcasp_common_irq_handler, | ||
1467 | IRQF_ONESHOT | IRQF_SHARED, | ||
1468 | irq_name, mcasp); | ||
1469 | if (ret) { | ||
1470 | dev_err(&pdev->dev, "common IRQ request failed\n"); | ||
1471 | goto err; | ||
1472 | } | ||
1473 | |||
1474 | mcasp->irq_request[SNDRV_PCM_STREAM_PLAYBACK] = XUNDRN; | ||
1475 | mcasp->irq_request[SNDRV_PCM_STREAM_CAPTURE] = ROVRN; | ||
1476 | } | ||
1477 | |||
1444 | irq = platform_get_irq_byname(pdev, "rx"); | 1478 | irq = platform_get_irq_byname(pdev, "rx"); |
1445 | if (irq >= 0) { | 1479 | if (irq >= 0) { |
1446 | irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_rx\n", | 1480 | irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_rx\n", |
@@ -1501,19 +1535,34 @@ static int davinci_mcasp_probe(struct platform_device *pdev) | |||
1501 | else | 1535 | else |
1502 | dma_data->filter_data = &dma_params->channel; | 1536 | dma_data->filter_data = &dma_params->channel; |
1503 | 1537 | ||
1504 | dma_params = &mcasp->dma_params[SNDRV_PCM_STREAM_CAPTURE]; | 1538 | /* RX is not valid in DIT mode */ |
1505 | dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE]; | 1539 | if (mcasp->op_mode != DAVINCI_MCASP_DIT_MODE) { |
1506 | dma_params->asp_chan_q = pdata->asp_chan_q; | 1540 | dma_params = &mcasp->dma_params[SNDRV_PCM_STREAM_CAPTURE]; |
1507 | dma_params->ram_chan_q = pdata->ram_chan_q; | 1541 | dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE]; |
1508 | dma_params->sram_pool = pdata->sram_pool; | 1542 | dma_params->asp_chan_q = pdata->asp_chan_q; |
1509 | dma_params->sram_size = pdata->sram_size_capture; | 1543 | dma_params->ram_chan_q = pdata->ram_chan_q; |
1510 | if (dat) | 1544 | dma_params->sram_pool = pdata->sram_pool; |
1511 | dma_params->dma_addr = dat->start; | 1545 | dma_params->sram_size = pdata->sram_size_capture; |
1512 | else | 1546 | if (dat) |
1513 | dma_params->dma_addr = mem->start + pdata->rx_dma_offset; | 1547 | dma_params->dma_addr = dat->start; |
1514 | 1548 | else | |
1515 | /* Unconditional dmaengine stuff */ | 1549 | dma_params->dma_addr = mem->start + pdata->rx_dma_offset; |
1516 | dma_data->addr = dma_params->dma_addr; | 1550 | |
1551 | /* Unconditional dmaengine stuff */ | ||
1552 | dma_data->addr = dma_params->dma_addr; | ||
1553 | |||
1554 | res = platform_get_resource(pdev, IORESOURCE_DMA, 1); | ||
1555 | if (res) | ||
1556 | dma_params->channel = res->start; | ||
1557 | else | ||
1558 | dma_params->channel = pdata->rx_dma_channel; | ||
1559 | |||
1560 | /* dmaengine filter data for DT and non-DT boot */ | ||
1561 | if (pdev->dev.of_node) | ||
1562 | dma_data->filter_data = "rx"; | ||
1563 | else | ||
1564 | dma_data->filter_data = &dma_params->channel; | ||
1565 | } | ||
1517 | 1566 | ||
1518 | if (mcasp->version < MCASP_VERSION_3) { | 1567 | if (mcasp->version < MCASP_VERSION_3) { |
1519 | mcasp->fifo_base = DAVINCI_MCASP_V2_AFIFO_BASE; | 1568 | mcasp->fifo_base = DAVINCI_MCASP_V2_AFIFO_BASE; |
@@ -1523,18 +1572,6 @@ static int davinci_mcasp_probe(struct platform_device *pdev) | |||
1523 | mcasp->fifo_base = DAVINCI_MCASP_V3_AFIFO_BASE; | 1572 | mcasp->fifo_base = DAVINCI_MCASP_V3_AFIFO_BASE; |
1524 | } | 1573 | } |
1525 | 1574 | ||
1526 | res = platform_get_resource(pdev, IORESOURCE_DMA, 1); | ||
1527 | if (res) | ||
1528 | dma_params->channel = res->start; | ||
1529 | else | ||
1530 | dma_params->channel = pdata->rx_dma_channel; | ||
1531 | |||
1532 | /* dmaengine filter data for DT and non-DT boot */ | ||
1533 | if (pdev->dev.of_node) | ||
1534 | dma_data->filter_data = "rx"; | ||
1535 | else | ||
1536 | dma_data->filter_data = &dma_params->channel; | ||
1537 | |||
1538 | dev_set_drvdata(&pdev->dev, mcasp); | 1575 | dev_set_drvdata(&pdev->dev, mcasp); |
1539 | 1576 | ||
1540 | mcasp_reparent_fck(pdev); | 1577 | mcasp_reparent_fck(pdev); |