|
@@ -36,6 +36,7 @@
|
|
|
#include <linux/seq_file.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/io.h>
|
|
|
+#include <linux/of.h>
|
|
|
#include <mach/iomap.h>
|
|
|
#include <sound/core.h>
|
|
|
#include <sound/pcm.h>
|
|
@@ -331,6 +332,8 @@ static __devinit int tegra_i2s_platform_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
struct tegra_i2s * i2s;
|
|
|
struct resource *mem, *memregion, *dmareq;
|
|
|
+ u32 of_dma[2];
|
|
|
+ u32 dma_ch;
|
|
|
int ret;
|
|
|
|
|
|
i2s = devm_kzalloc(&pdev->dev, sizeof(struct tegra_i2s), GFP_KERNEL);
|
|
@@ -360,9 +363,16 @@ static __devinit int tegra_i2s_platform_probe(struct platform_device *pdev)
|
|
|
|
|
|
dmareq = platform_get_resource(pdev, IORESOURCE_DMA, 0);
|
|
|
if (!dmareq) {
|
|
|
- dev_err(&pdev->dev, "No DMA resource\n");
|
|
|
- ret = -ENODEV;
|
|
|
- goto err_clk_put;
|
|
|
+ if (of_property_read_u32_array(pdev->dev.of_node,
|
|
|
+ "nvidia,dma-request-selector",
|
|
|
+ of_dma, 2) < 0) {
|
|
|
+ dev_err(&pdev->dev, "No DMA resource\n");
|
|
|
+ ret = -ENODEV;
|
|
|
+ goto err_clk_put;
|
|
|
+ }
|
|
|
+ dma_ch = of_dma[1];
|
|
|
+ } else {
|
|
|
+ dma_ch = dmareq->start;
|
|
|
}
|
|
|
|
|
|
memregion = devm_request_mem_region(&pdev->dev, mem->start,
|
|
@@ -383,12 +393,12 @@ static __devinit int tegra_i2s_platform_probe(struct platform_device *pdev)
|
|
|
i2s->capture_dma_data.addr = mem->start + TEGRA_I2S_FIFO2;
|
|
|
i2s->capture_dma_data.wrap = 4;
|
|
|
i2s->capture_dma_data.width = 32;
|
|
|
- i2s->capture_dma_data.req_sel = dmareq->start;
|
|
|
+ i2s->capture_dma_data.req_sel = dma_ch;
|
|
|
|
|
|
i2s->playback_dma_data.addr = mem->start + TEGRA_I2S_FIFO1;
|
|
|
i2s->playback_dma_data.wrap = 4;
|
|
|
i2s->playback_dma_data.width = 32;
|
|
|
- i2s->playback_dma_data.req_sel = dmareq->start;
|
|
|
+ i2s->playback_dma_data.req_sel = dma_ch;
|
|
|
|
|
|
i2s->reg_ctrl = TEGRA_I2S_CTRL_FIFO_FORMAT_PACKED;
|
|
|
|
|
@@ -422,10 +432,16 @@ static int __devexit tegra_i2s_platform_remove(struct platform_device *pdev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static const struct of_device_id tegra_i2s_of_match[] __devinitconst = {
|
|
|
+ { .compatible = "nvidia,tegra20-i2s", },
|
|
|
+ {},
|
|
|
+};
|
|
|
+
|
|
|
static struct platform_driver tegra_i2s_driver = {
|
|
|
.driver = {
|
|
|
.name = DRV_NAME,
|
|
|
.owner = THIS_MODULE,
|
|
|
+ .of_match_table = tegra_i2s_of_match,
|
|
|
},
|
|
|
.probe = tegra_i2s_platform_probe,
|
|
|
.remove = __devexit_p(tegra_i2s_platform_remove),
|
|
@@ -436,3 +452,4 @@ MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>");
|
|
|
MODULE_DESCRIPTION("Tegra I2S ASoC driver");
|
|
|
MODULE_LICENSE("GPL");
|
|
|
MODULE_ALIAS("platform:" DRV_NAME);
|
|
|
+MODULE_DEVICE_TABLE(of, tegra_i2s_of_match);
|