| From 4c4fc90964b1cf205a67df566cc82ea1731bcb00 Mon Sep 17 00:00:00 2001 |
| From: Ard Biesheuvel <ard.biesheuvel@linaro.org> |
| Date: Thu, 18 May 2017 12:29:55 +0100 |
| Subject: drivers/tty: 8250: only call fintek_8250_probe when doing port I/O |
| |
| From: Ard Biesheuvel <ard.biesheuvel@linaro.org> |
| |
| commit 4c4fc90964b1cf205a67df566cc82ea1731bcb00 upstream. |
| |
| Commit fa01e2ca9f53 ("serial: 8250: Integrate Fintek into 8250_base") |
| modified the probing logic for PNP0501 devices, to remove a collision |
| between the generic 16550A driver and the Fintek driver, which reused |
| the same ACPI _HID. |
| |
| The Fintek device probe is now incorporated into the common 8250 probe |
| path, and gets called for all discovered 16550A compatible devices, |
| including ones that are MMIO mapped rather than IO mapped. However, |
| the Fintek driver assumes the port base is a I/O address, and proceeds |
| to probe some arbitrary offsets above it. |
| |
| This is generally a wrong thing to do, but on ARM systems (having no |
| native port I/O), this may result in faulting accesses of completely |
| unrelated MMIO regions in the PCI I/O space. Given that this is at |
| serial probe time, this results in hard to diagnose crashes at boot. |
| |
| So let's restrict the Fintek probe to devices that we know are using |
| port I/O in the first place. |
| |
| Fixes: fa01e2ca9f53 ("serial: 8250: Integrate Fintek into 8250_base") |
| Suggested-by: Arnd Bergmann <arnd@arndb.de> |
| Reviewed-by: Ricardo Ribalda <ricardo.ribalda@gmail.com> |
| Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/tty/serial/8250/8250_port.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/tty/serial/8250/8250_port.c |
| +++ b/drivers/tty/serial/8250/8250_port.c |
| @@ -1320,7 +1320,7 @@ out_lock: |
| /* |
| * Check if the device is a Fintek F81216A |
| */ |
| - if (port->type == PORT_16550A) |
| + if (port->type == PORT_16550A && port->iotype == UPIO_PORT) |
| fintek_8250_probe(up); |
| |
| if (up->capabilities != old_capabilities) { |