aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/davinci/davinci-mcasp.c72
-rw-r--r--sound/soc/davinci/davinci-mcasp.h5
2 files changed, 66 insertions, 11 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
index d79349434a9a..b960e626dad9 100644
--- a/sound/soc/davinci/davinci-mcasp.c
+++ b/sound/soc/davinci/davinci-mcasp.c
@@ -686,6 +686,8 @@ static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
686 if (mcasp->serial_dir[i] == TX_MODE && 686 if (mcasp->serial_dir[i] == TX_MODE &&
687 tx_ser < max_active_serializers) { 687 tx_ser < max_active_serializers) {
688 mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AXR(i)); 688 mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AXR(i));
689 mcasp_mod_bits(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
690 DISMOD_LOW, DISMOD_MASK);
689 tx_ser++; 691 tx_ser++;
690 } else if (mcasp->serial_dir[i] == RX_MODE && 692 } else if (mcasp->serial_dir[i] == RX_MODE &&
691 rx_ser < max_active_serializers) { 693 rx_ser < max_active_serializers) {
@@ -1565,6 +1567,49 @@ static int davinci_mcasp_init_ch_constraints(struct davinci_mcasp *mcasp)
1565 return ret; 1567 return ret;
1566} 1568}
1567 1569
1570enum {
1571 PCM_EDMA,
1572 PCM_SDMA,
1573};
1574static const char *sdma_prefix = "ti,omap";
1575
1576static int davinci_mcasp_get_dma_type(struct davinci_mcasp *mcasp)
1577{
1578 struct dma_chan *chan;
1579 const char *tmp;
1580 int ret = PCM_EDMA;
1581
1582 if (!mcasp->dev->of_node)
1583 return PCM_EDMA;
1584
1585 tmp = mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK].filter_data;
1586 chan = dma_request_slave_channel_reason(mcasp->dev, tmp);
1587 if (IS_ERR(chan)) {
1588 if (PTR_ERR(chan) != -EPROBE_DEFER)
1589 dev_err(mcasp->dev,
1590 "Can't verify DMA configuration (%ld)\n",
1591 PTR_ERR(chan));
1592 return PTR_ERR(chan);
1593 }
1594 BUG_ON(!chan->device || !chan->device->dev);
1595
1596 if (chan->device->dev->of_node)
1597 ret = of_property_read_string(chan->device->dev->of_node,
1598 "compatible", &tmp);
1599 else
1600 dev_dbg(mcasp->dev, "DMA controller has no of-node\n");
1601
1602 dma_release_channel(chan);
1603 if (ret)
1604 return ret;
1605
1606 dev_dbg(mcasp->dev, "DMA controller compatible = \"%s\"\n", tmp);
1607 if (!strncmp(tmp, sdma_prefix, strlen(sdma_prefix)))
1608 return PCM_SDMA;
1609
1610 return PCM_EDMA;
1611}
1612
1568static int davinci_mcasp_probe(struct platform_device *pdev) 1613static int davinci_mcasp_probe(struct platform_device *pdev)
1569{ 1614{
1570 struct snd_dmaengine_dai_dma_data *dma_data; 1615 struct snd_dmaengine_dai_dma_data *dma_data;
@@ -1763,27 +1808,34 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
1763 if (ret != 0) 1808 if (ret != 0)
1764 goto err; 1809 goto err;
1765 1810
1766 switch (mcasp->version) { 1811 ret = davinci_mcasp_get_dma_type(mcasp);
1812 switch (ret) {
1813 case PCM_EDMA:
1767#if IS_BUILTIN(CONFIG_SND_EDMA_SOC) || \ 1814#if IS_BUILTIN(CONFIG_SND_EDMA_SOC) || \
1768 (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \ 1815 (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \
1769 IS_MODULE(CONFIG_SND_EDMA_SOC)) 1816 IS_MODULE(CONFIG_SND_EDMA_SOC))
1770 case MCASP_VERSION_1:
1771 case MCASP_VERSION_2:
1772 case MCASP_VERSION_3:
1773 ret = edma_pcm_platform_register(&pdev->dev); 1817 ret = edma_pcm_platform_register(&pdev->dev);
1774 break; 1818#else
1819 dev_err(&pdev->dev, "Missing SND_EDMA_SOC\n");
1820 ret = -EINVAL;
1821 goto err;
1775#endif 1822#endif
1823 break;
1824 case PCM_SDMA:
1776#if IS_BUILTIN(CONFIG_SND_OMAP_SOC) || \ 1825#if IS_BUILTIN(CONFIG_SND_OMAP_SOC) || \
1777 (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \ 1826 (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \
1778 IS_MODULE(CONFIG_SND_OMAP_SOC)) 1827 IS_MODULE(CONFIG_SND_OMAP_SOC))
1779 case MCASP_VERSION_4:
1780 ret = omap_pcm_platform_register(&pdev->dev); 1828 ret = omap_pcm_platform_register(&pdev->dev);
1781 break; 1829#else
1830 dev_err(&pdev->dev, "Missing SND_SDMA_SOC\n");
1831 ret = -EINVAL;
1832 goto err;
1782#endif 1833#endif
1834 break;
1783 default: 1835 default:
1784 dev_err(&pdev->dev, "Invalid McASP version: %d\n", 1836 dev_err(&pdev->dev, "No DMA controller found (%d)\n", ret);
1785 mcasp->version); 1837 case -EPROBE_DEFER:
1786 ret = -EINVAL; 1838 goto err;
1787 break; 1839 break;
1788 } 1840 }
1789 1841
diff --git a/sound/soc/davinci/davinci-mcasp.h b/sound/soc/davinci/davinci-mcasp.h
index 79dc511180bf..a3be108a8c17 100644
--- a/sound/soc/davinci/davinci-mcasp.h
+++ b/sound/soc/davinci/davinci-mcasp.h
@@ -215,7 +215,10 @@
215 * DAVINCI_MCASP_XRSRCTL_BASE_REG - Serializer Control Register Bits 215 * DAVINCI_MCASP_XRSRCTL_BASE_REG - Serializer Control Register Bits
216 */ 216 */
217#define MODE(val) (val) 217#define MODE(val) (val)
218#define DISMOD (val)(val<<2) 218#define DISMOD_3STATE (0x0)
219#define DISMOD_LOW (0x2 << 2)
220#define DISMOD_HIGH (0x3 << 2)
221#define DISMOD_MASK DISMOD_HIGH
219#define TXSTATE BIT(4) 222#define TXSTATE BIT(4)
220#define RXSTATE BIT(5) 223#define RXSTATE BIT(5)
221#define SRMOD_MASK 3 224#define SRMOD_MASK 3