diff options
| -rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 72 | ||||
| -rw-r--r-- | sound/soc/davinci/davinci-mcasp.h | 5 |
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 | ||
| 1570 | enum { | ||
| 1571 | PCM_EDMA, | ||
| 1572 | PCM_SDMA, | ||
| 1573 | }; | ||
| 1574 | static const char *sdma_prefix = "ti,omap"; | ||
| 1575 | |||
| 1576 | static 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 | |||
| 1568 | static int davinci_mcasp_probe(struct platform_device *pdev) | 1613 | static 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 |
