received, and that the peripheral should invert its input using the
       INVR registers.
 
+  fsl,dma-info:
+    $ref: /schemas/types.yaml#/definitions/uint32-array
+    minItems: 2
+    maxItems: 2
+    description: |
+      First cell contains the size of DMA buffer chunks, second cell contains
+      the amount of chunks used for the device. Multiplying both numbers is
+      the total size of memory used for receiving data.
+      When not being configured the system will use default settings, which
+      are sensible for most use cases. If you need low latency processing on
+      slow connections this needs to be configured appropriately.
+
   uart-has-rtscts: true
 
   rs485-rts-delay: true
 
        struct scatterlist      rx_sgl, tx_sgl[2];
        void                    *rx_buf;
        struct circ_buf         rx_ring;
+       unsigned int            rx_buf_size;
+       unsigned int            rx_period_length;
        unsigned int            rx_periods;
        dma_cookie_t            rx_cookie;
        unsigned int            tx_bytes;
        }
 }
 
-/* RX DMA buffer periods */
-#define RX_DMA_PERIODS 16
-#define RX_BUF_SIZE    (RX_DMA_PERIODS * PAGE_SIZE / 4)
-
 static int imx_uart_start_rx_dma(struct imx_port *sport)
 {
        struct scatterlist *sgl = &sport->rx_sgl;
 
        sport->rx_ring.head = 0;
        sport->rx_ring.tail = 0;
-       sport->rx_periods = RX_DMA_PERIODS;
 
-       sg_init_one(sgl, sport->rx_buf, RX_BUF_SIZE);
+       sg_init_one(sgl, sport->rx_buf, sport->rx_buf_size);
        ret = dma_map_sg(dev, sgl, 1, DMA_FROM_DEVICE);
        if (ret == 0) {
                dev_err(dev, "DMA mapping error for RX.\n");
                goto err;
        }
 
-       sport->rx_buf = kzalloc(RX_BUF_SIZE, GFP_KERNEL);
+       sport->rx_buf_size = sport->rx_period_length * sport->rx_periods;
+       sport->rx_buf = kzalloc(sport->rx_buf_size, GFP_KERNEL);
        if (!sport->rx_buf) {
                ret = -ENOMEM;
                goto err;
        return HRTIMER_NORESTART;
 }
 
+/* Default RX DMA buffer configuration */
+#define RX_DMA_PERIODS         16
+#define RX_DMA_PERIOD_LEN      (PAGE_SIZE / 4)
+
 static int imx_uart_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
        struct imx_port *sport;
        void __iomem *base;
+       u32 dma_buf_conf[2];
        int ret = 0;
        u32 ucr1;
        struct resource *res;
        if (of_get_property(np, "fsl,inverted-rx", NULL))
                sport->inverted_rx = 1;
 
+       if (!of_property_read_u32_array(np, "fsl,dma-info", dma_buf_conf, 2)) {
+               sport->rx_period_length = dma_buf_conf[0];
+               sport->rx_periods = dma_buf_conf[1];
+       } else {
+               sport->rx_period_length = RX_DMA_PERIOD_LEN;
+               sport->rx_periods = RX_DMA_PERIODS;
+       }
+
        if (sport->port.line >= ARRAY_SIZE(imx_uart_ports)) {
                dev_err(&pdev->dev, "serial%d out of range\n",
                        sport->port.line);