#define SC16IS7XX_FIFO_SIZE            (64)
 #define SC16IS7XX_GPIOS_PER_BANK       4
 
+#define SC16IS7XX_POLL_PERIOD_MS       10
 #define SC16IS7XX_RECONF_MD            BIT(0)
 #define SC16IS7XX_RECONF_IER           BIT(1)
 #define SC16IS7XX_RECONF_RS485         BIT(2)
        u8                              mctrl_mask;
        struct kthread_worker           kworker;
        struct task_struct              *kworker_task;
+       struct kthread_delayed_work     poll_work;
+       bool                            polling;
        struct sc16is7xx_one            p[];
 };
 
        return IRQ_HANDLED;
 }
 
+static void sc16is7xx_poll_proc(struct kthread_work *ws)
+{
+       struct sc16is7xx_port *s = container_of(ws, struct sc16is7xx_port, poll_work.work);
+
+       /* Reuse standard IRQ handler. Interrupt ID is unused in this context. */
+       sc16is7xx_irq(0, s);
+
+       /* Setup delay based on SC16IS7XX_POLL_PERIOD_MS */
+       kthread_queue_delayed_work(&s->kworker, &s->poll_work,
+                                  msecs_to_jiffies(SC16IS7XX_POLL_PERIOD_MS));
+}
+
 static void sc16is7xx_tx_proc(struct kthread_work *ws)
 {
        struct uart_port *port = &(to_sc16is7xx_one(ws, tx_work)->port);
 static int sc16is7xx_startup(struct uart_port *port)
 {
        struct sc16is7xx_one *one = to_sc16is7xx_one(port, port);
+       struct sc16is7xx_port *s = dev_get_drvdata(port->dev);
        unsigned int val;
        unsigned long flags;
 
        sc16is7xx_enable_ms(port);
        uart_port_unlock_irqrestore(port, flags);
 
+       if (s->polling)
+               kthread_queue_delayed_work(&s->kworker, &s->poll_work,
+                                          msecs_to_jiffies(SC16IS7XX_POLL_PERIOD_MS));
+
        return 0;
 }
 
 
        sc16is7xx_power(port, 0);
 
+       if (s->polling)
+               kthread_cancel_delayed_work_sync(&s->poll_work);
+
        kthread_flush_worker(&s->kworker);
 }
 
        /* Always ask for fixed clock rate from a property. */
        device_property_read_u32(dev, "clock-frequency", &uartclk);
 
+       s->polling = !!irq;
+       if (s->polling)
+               dev_dbg(dev,
+                       "No interrupt pin definition, falling back to polling mode\n");
+
        s->clk = devm_clk_get_optional(dev, NULL);
        if (IS_ERR(s->clk))
                return PTR_ERR(s->clk);
                goto out_ports;
 #endif
 
+       if (s->polling) {
+               /* Initialize kernel thread for polling */
+               kthread_init_delayed_work(&s->poll_work, sc16is7xx_poll_proc);
+               return 0;
+       }
+
        /*
         * Setup interrupt. We first try to acquire the IRQ line as level IRQ.
         * If that succeeds, we can allow sharing the interrupt as well.
                sc16is7xx_power(&s->p[i].port, 0);
        }
 
+       if (s->polling)
+               kthread_cancel_delayed_work_sync(&s->poll_work);
+
        kthread_flush_worker(&s->kworker);
        kthread_stop(s->kworker_task);