static int sf_pdma_probe(struct platform_device *pdev)
 {
        struct sf_pdma *pdma;
-       struct sf_pdma_chan *chan;
        struct resource *res;
-       int len, chans;
-       int ret;
+       int ret, n_chans;
        const enum dma_slave_buswidth widths =
                DMA_SLAVE_BUSWIDTH_1_BYTE | DMA_SLAVE_BUSWIDTH_2_BYTES |
                DMA_SLAVE_BUSWIDTH_4_BYTES | DMA_SLAVE_BUSWIDTH_8_BYTES |
                DMA_SLAVE_BUSWIDTH_16_BYTES | DMA_SLAVE_BUSWIDTH_32_BYTES |
                DMA_SLAVE_BUSWIDTH_64_BYTES;
 
-       chans = PDMA_NR_CH;
-       len = sizeof(*pdma) + sizeof(*chan) * chans;
-       pdma = devm_kzalloc(&pdev->dev, len, GFP_KERNEL);
+       ret = of_property_read_u32(pdev->dev.of_node, "dma-channels", &n_chans);
+       if (ret) {
+               /* backwards-compatibility for no dma-channels property */
+               dev_dbg(&pdev->dev, "set number of channels to default value: 4\n");
+               n_chans = PDMA_MAX_NR_CH;
+       } else if (n_chans > PDMA_MAX_NR_CH) {
+               dev_err(&pdev->dev, "the number of channels exceeds the maximum\n");
+               return -EINVAL;
+       }
+
+       pdma = devm_kzalloc(&pdev->dev, struct_size(pdma, chans, n_chans),
+                           GFP_KERNEL);
        if (!pdma)
                return -ENOMEM;
 
-       pdma->n_chans = chans;
+       pdma->n_chans = n_chans;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        pdma->membase = devm_ioremap_resource(&pdev->dev, res);
        struct sf_pdma_chan *ch;
        int i;
 
-       for (i = 0; i < PDMA_NR_CH; i++) {
+       for (i = 0; i < pdma->n_chans; i++) {
                ch = &pdma->chans[i];
 
                devm_free_irq(&pdev->dev, ch->txirq, ch);
 
 static const struct of_device_id sf_pdma_dt_ids[] = {
        { .compatible = "sifive,fu540-c000-pdma" },
+       { .compatible = "sifive,pdma0" },
        {},
 };
 MODULE_DEVICE_TABLE(of, sf_pdma_dt_ids);
 
 #include "../dmaengine.h"
 #include "../virt-dma.h"
 
-#define PDMA_NR_CH                                     4
-
-#if (PDMA_NR_CH != 4)
-#error "Please define PDMA_NR_CH to 4"
-#endif
+#define PDMA_MAX_NR_CH                                 4
 
 #define PDMA_BASE_ADDR                                 0x3000000
 #define PDMA_CHAN_OFFSET                               0x1000
        void __iomem            *membase;
        void __iomem            *mappedbase;
        u32                     n_chans;
-       struct sf_pdma_chan     chans[PDMA_NR_CH];
+       struct sf_pdma_chan     chans[];
 };
 
 #endif /* _SF_PDMA_H */