up->capabilities |= UART_CAP_AFE;
 }
 
-static int dw8250_probe_of(struct uart_port *p,
-                          struct dw8250_data *data)
-{
-       struct device_node      *np = p->dev->of_node;
-       int id;
-
-#ifdef CONFIG_64BIT
-       if (of_device_is_compatible(np, "cavium,octeon-3860-uart")) {
-               p->serial_in = dw8250_serial_inq;
-               p->serial_out = dw8250_serial_outq;
-               p->flags = UPF_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE;
-               p->type = PORT_OCTEON;
-               data->usr_reg = 0x27;
-               data->skip_autocfg = true;
-       }
-#endif
-       /* get index of serial line, if found in DT aliases */
-       id = of_alias_get_id(np, "serial");
-       if (id >= 0)
-               p->line = id;
-
-       return 0;
-}
-
 static bool dw8250_idma_filter(struct dma_chan *chan, void *param)
 {
        struct device *dev = param;
        return true;
 }
 
-static int dw8250_probe_acpi(struct uart_8250_port *up,
-                            struct dw8250_data *data)
+static void dw8250_quirks(struct uart_port *p, struct dw8250_data *data)
 {
-       struct uart_port *p = &up->port;
-
-       p->iotype = UPIO_MEM32;
-       p->serial_in = dw8250_serial_in32;
-       p->serial_out = dw8250_serial_out32;
-       p->regshift = 2;
+       if (p->dev->of_node) {
+               struct device_node *np = p->dev->of_node;
+               int id;
+
+               /* get index of serial line, if found in DT aliases */
+               id = of_alias_get_id(np, "serial");
+               if (id >= 0)
+                       p->line = id;
+#ifdef CONFIG_64BIT
+               if (of_device_is_compatible(np, "cavium,octeon-3860-uart")) {
+                       p->serial_in = dw8250_serial_inq;
+                       p->serial_out = dw8250_serial_outq;
+                       p->flags = UPF_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE;
+                       p->type = PORT_OCTEON;
+                       data->usr_reg = 0x27;
+                       data->skip_autocfg = true;
+               }
+#endif
+       } else if (has_acpi_companion(p->dev)) {
+               p->iotype = UPIO_MEM32;
+               p->regshift = 2;
+               p->serial_in = dw8250_serial_in32;
+               p->serial_out = dw8250_serial_out32;
+               p->set_termios = dw8250_set_termios;
+       }
 
        /* Platforms with iDMA */
-       if (platform_get_resource_byname(to_platform_device(up->port.dev),
+       if (platform_get_resource_byname(to_platform_device(p->dev),
                                         IORESOURCE_MEM, "lpss_priv")) {
-               data->dma.rx_param = up->port.dev->parent;
-               data->dma.tx_param = up->port.dev->parent;
+               p->set_termios = dw8250_set_termios;
+               data->dma.rx_param = p->dev->parent;
+               data->dma.tx_param = p->dev->parent;
                data->dma.fn = dw8250_idma_filter;
        }
-
-       up->port.set_termios = dw8250_set_termios;
-
-       return 0;
 }
 
 static int dw8250_probe(struct platform_device *pdev)
        data->dma.tx_param = data;
        data->dma.fn = dw8250_dma_filter;
 
-       if (pdev->dev.of_node) {
-               err = dw8250_probe_of(p, data);
-               if (err)
-                       goto err_reset;
-       } else if (ACPI_HANDLE(&pdev->dev)) {
-               err = dw8250_probe_acpi(&uart, data);
-               if (err)
-                       goto err_reset;
-       } else {
-               err = -ENODEV;
-               goto err_reset;
-       }
+       dw8250_quirks(p, data);
 
        if (!data->skip_autocfg)
                dw8250_setup_port(&uart);