#define TEGRA_GPCDMA_BURST_COMPLETION_TIMEOUT  5000 /* 5 msec */
 
 /* Channel base address offset from GPCDMA base address */
-#define TEGRA_GPCDMA_CHANNEL_BASE_ADD_OFFSET   0x20000
+#define TEGRA_GPCDMA_CHANNEL_BASE_ADDR_OFFSET  0x10000
+
+/* Default channel mask reserving channel0 */
+#define TEGRA_GPCDMA_DEFAULT_CHANNEL_MASK      0xfffffffe
 
 struct tegra_dma;
 struct tegra_dma_channel;
        const struct tegra_dma_chip_data *chip_data;
        unsigned long sid_m2d_reserved;
        unsigned long sid_d2m_reserved;
+       u32 chan_mask;
        void __iomem *base_addr;
        struct device *dev;
        struct dma_device dma_dev;
 }
 
 static const struct tegra_dma_chip_data tegra186_dma_chip_data = {
-       .nr_channels = 31,
+       .nr_channels = 32,
        .channel_reg_size = SZ_64K,
        .max_dma_count = SZ_1G,
        .hw_support_pause = false,
 };
 
 static const struct tegra_dma_chip_data tegra194_dma_chip_data = {
-       .nr_channels = 31,
+       .nr_channels = 32,
        .channel_reg_size = SZ_64K,
        .max_dma_count = SZ_1G,
        .hw_support_pause = true,
 };
 
 static const struct tegra_dma_chip_data tegra234_dma_chip_data = {
-       .nr_channels = 31,
+       .nr_channels = 32,
        .channel_reg_size = SZ_64K,
        .max_dma_count = SZ_1G,
        .hw_support_pause = true,
        }
        stream_id = iommu_spec->ids[0] & 0xffff;
 
+       ret = device_property_read_u32(&pdev->dev, "dma-channel-mask",
+                                      &tdma->chan_mask);
+       if (ret) {
+               dev_warn(&pdev->dev,
+                        "Missing dma-channel-mask property, using default channel mask %#x\n",
+                        TEGRA_GPCDMA_DEFAULT_CHANNEL_MASK);
+               tdma->chan_mask = TEGRA_GPCDMA_DEFAULT_CHANNEL_MASK;
+       }
+
        INIT_LIST_HEAD(&tdma->dma_dev.channels);
        for (i = 0; i < cdata->nr_channels; i++) {
                struct tegra_dma_channel *tdc = &tdma->channels[i];
 
+               /* Check for channel mask */
+               if (!(tdma->chan_mask & BIT(i)))
+                       continue;
+
                tdc->irq = platform_get_irq(pdev, i);
                if (tdc->irq < 0)
                        return tdc->irq;
 
-               tdc->chan_base_offset = TEGRA_GPCDMA_CHANNEL_BASE_ADD_OFFSET +
+               tdc->chan_base_offset = TEGRA_GPCDMA_CHANNEL_BASE_ADDR_OFFSET +
                                        i * cdata->channel_reg_size;
                snprintf(tdc->name, sizeof(tdc->name), "gpcdma.%d", i);
                tdc->tdma = tdma;
                return ret;
        }
 
-       dev_info(&pdev->dev, "GPC DMA driver register %d channels\n",
-                cdata->nr_channels);
+       dev_info(&pdev->dev, "GPC DMA driver register %lu channels\n",
+                hweight_long(tdma->chan_mask));
 
        return 0;
 }
        for (i = 0; i < tdma->chip_data->nr_channels; i++) {
                struct tegra_dma_channel *tdc = &tdma->channels[i];
 
+               if (!(tdma->chan_mask & BIT(i)))
+                       continue;
+
                if (tdc->dma_desc) {
                        dev_err(tdma->dev, "channel %u busy\n", i);
                        return -EBUSY;
        for (i = 0; i < tdma->chip_data->nr_channels; i++) {
                struct tegra_dma_channel *tdc = &tdma->channels[i];
 
+               if (!(tdma->chan_mask & BIT(i)))
+                       continue;
+
                tegra_dma_program_sid(tdc, tdc->stream_id);
        }