diff options
Diffstat (limited to 'sound/soc/davinci/davinci-mcasp.c')
| -rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 56 |
1 files changed, 52 insertions, 4 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index 0f66fda2c772..237dc67002ef 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c | |||
| @@ -1513,8 +1513,9 @@ static struct davinci_mcasp_pdata am33xx_mcasp_pdata = { | |||
| 1513 | }; | 1513 | }; |
| 1514 | 1514 | ||
| 1515 | static struct davinci_mcasp_pdata dra7_mcasp_pdata = { | 1515 | static struct davinci_mcasp_pdata dra7_mcasp_pdata = { |
| 1516 | .tx_dma_offset = 0x200, | 1516 | /* The CFG port offset will be calculated if it is needed */ |
| 1517 | .rx_dma_offset = 0x284, | 1517 | .tx_dma_offset = 0, |
| 1518 | .rx_dma_offset = 0, | ||
| 1518 | .version = MCASP_VERSION_4, | 1519 | .version = MCASP_VERSION_4, |
| 1519 | }; | 1520 | }; |
| 1520 | 1521 | ||
| @@ -1734,6 +1735,52 @@ static int davinci_mcasp_get_dma_type(struct davinci_mcasp *mcasp) | |||
| 1734 | return PCM_EDMA; | 1735 | return PCM_EDMA; |
| 1735 | } | 1736 | } |
| 1736 | 1737 | ||
| 1738 | static u32 davinci_mcasp_txdma_offset(struct davinci_mcasp_pdata *pdata) | ||
| 1739 | { | ||
| 1740 | int i; | ||
| 1741 | u32 offset = 0; | ||
| 1742 | |||
| 1743 | if (pdata->version != MCASP_VERSION_4) | ||
| 1744 | return pdata->tx_dma_offset; | ||
| 1745 | |||
| 1746 | for (i = 0; i < pdata->num_serializer; i++) { | ||
| 1747 | if (pdata->serial_dir[i] == TX_MODE) { | ||
| 1748 | if (!offset) { | ||
| 1749 | offset = DAVINCI_MCASP_TXBUF_REG(i); | ||
| 1750 | } else { | ||
| 1751 | pr_err("%s: Only one serializer allowed!\n", | ||
| 1752 | __func__); | ||
| 1753 | break; | ||
| 1754 | } | ||
| 1755 | } | ||
| 1756 | } | ||
| 1757 | |||
| 1758 | return offset; | ||
| 1759 | } | ||
| 1760 | |||
| 1761 | static u32 davinci_mcasp_rxdma_offset(struct davinci_mcasp_pdata *pdata) | ||
| 1762 | { | ||
| 1763 | int i; | ||
| 1764 | u32 offset = 0; | ||
| 1765 | |||
| 1766 | if (pdata->version != MCASP_VERSION_4) | ||
| 1767 | return pdata->rx_dma_offset; | ||
| 1768 | |||
| 1769 | for (i = 0; i < pdata->num_serializer; i++) { | ||
| 1770 | if (pdata->serial_dir[i] == RX_MODE) { | ||
| 1771 | if (!offset) { | ||
| 1772 | offset = DAVINCI_MCASP_RXBUF_REG(i); | ||
| 1773 | } else { | ||
| 1774 | pr_err("%s: Only one serializer allowed!\n", | ||
| 1775 | __func__); | ||
| 1776 | break; | ||
| 1777 | } | ||
| 1778 | } | ||
| 1779 | } | ||
| 1780 | |||
| 1781 | return offset; | ||
| 1782 | } | ||
| 1783 | |||
| 1737 | static int davinci_mcasp_probe(struct platform_device *pdev) | 1784 | static int davinci_mcasp_probe(struct platform_device *pdev) |
| 1738 | { | 1785 | { |
| 1739 | struct snd_dmaengine_dai_dma_data *dma_data; | 1786 | struct snd_dmaengine_dai_dma_data *dma_data; |
| @@ -1862,7 +1909,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev) | |||
| 1862 | if (dat) | 1909 | if (dat) |
| 1863 | dma_data->addr = dat->start; | 1910 | dma_data->addr = dat->start; |
| 1864 | else | 1911 | else |
| 1865 | dma_data->addr = mem->start + pdata->tx_dma_offset; | 1912 | dma_data->addr = mem->start + davinci_mcasp_txdma_offset(pdata); |
| 1866 | 1913 | ||
| 1867 | dma = &mcasp->dma_request[SNDRV_PCM_STREAM_PLAYBACK]; | 1914 | dma = &mcasp->dma_request[SNDRV_PCM_STREAM_PLAYBACK]; |
| 1868 | res = platform_get_resource(pdev, IORESOURCE_DMA, 0); | 1915 | res = platform_get_resource(pdev, IORESOURCE_DMA, 0); |
| @@ -1883,7 +1930,8 @@ static int davinci_mcasp_probe(struct platform_device *pdev) | |||
| 1883 | if (dat) | 1930 | if (dat) |
| 1884 | dma_data->addr = dat->start; | 1931 | dma_data->addr = dat->start; |
| 1885 | else | 1932 | else |
| 1886 | dma_data->addr = mem->start + pdata->rx_dma_offset; | 1933 | dma_data->addr = |
| 1934 | mem->start + davinci_mcasp_rxdma_offset(pdata); | ||
| 1887 | 1935 | ||
| 1888 | dma = &mcasp->dma_request[SNDRV_PCM_STREAM_CAPTURE]; | 1936 | dma = &mcasp->dma_request[SNDRV_PCM_STREAM_CAPTURE]; |
| 1889 | res = platform_get_resource(pdev, IORESOURCE_DMA, 1); | 1937 | res = platform_get_resource(pdev, IORESOURCE_DMA, 1); |
