Commit 3fd8b6af authored by Soeren Grunewald's avatar Soeren Grunewald Committed by Luis Henriques

serial: 8250_pci: Add support for 16 port Exar boards

commit 96a5d18b upstream.

The Exar XR17V358 chip usually provides only 8 ports. But two chips can be
combined to act as a single 16 port chip. Therefor one chip is configured
as master the second as slave by connecting the mode pin to VCC (master)
or GND (slave).

Then the master chip is reporting a different device-id depending on
whether a slave is detected or not. The UARTs 8-15 are addressed from
0x2000-0x3fff. So the offset of 0x400 from UART to UART can be used to
address all 16 ports as before.

See: https://www.exar.com/common/content/document.ashx?id=1587 page 11
Signed-off-by: default avatarSoeren Grunewald <soeren.grunewald@desy.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
parent c9ca6165
...@@ -1802,6 +1802,8 @@ pci_wch_ch353_setup(struct serial_private *priv, ...@@ -1802,6 +1802,8 @@ pci_wch_ch353_setup(struct serial_private *priv,
#define PCI_DEVICE_ID_PERICOM_PI7C9X7954 0x7954 #define PCI_DEVICE_ID_PERICOM_PI7C9X7954 0x7954
#define PCI_DEVICE_ID_PERICOM_PI7C9X7958 0x7958 #define PCI_DEVICE_ID_PERICOM_PI7C9X7958 0x7958
#define PCI_DEVICE_ID_EXAR_XR17V8358 0x8358
/* Unknown vendors/cards - this should not be in linux/pci_ids.h */ /* Unknown vendors/cards - this should not be in linux/pci_ids.h */
#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
#define PCI_SUBDEVICE_ID_UNKNOWN_0x1588 0x1588 #define PCI_SUBDEVICE_ID_UNKNOWN_0x1588 0x1588
...@@ -2281,6 +2283,13 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { ...@@ -2281,6 +2283,13 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
.subdevice = PCI_ANY_ID, .subdevice = PCI_ANY_ID,
.setup = pci_xr17v35x_setup, .setup = pci_xr17v35x_setup,
}, },
{
.vendor = PCI_VENDOR_ID_EXAR,
.device = PCI_DEVICE_ID_EXAR_XR17V8358,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
.setup = pci_xr17v35x_setup,
},
/* /*
* Xircom cards * Xircom cards
*/ */
...@@ -2729,6 +2738,7 @@ enum pci_board_num_t { ...@@ -2729,6 +2738,7 @@ enum pci_board_num_t {
pbn_exar_XR17V352, pbn_exar_XR17V352,
pbn_exar_XR17V354, pbn_exar_XR17V354,
pbn_exar_XR17V358, pbn_exar_XR17V358,
pbn_exar_XR17V8358,
pbn_exar_ibm_saturn, pbn_exar_ibm_saturn,
pbn_pasemi_1682M, pbn_pasemi_1682M,
pbn_ni8430_2, pbn_ni8430_2,
...@@ -3402,6 +3412,14 @@ static struct pciserial_board pci_boards[] = { ...@@ -3402,6 +3412,14 @@ static struct pciserial_board pci_boards[] = {
.reg_shift = 0, .reg_shift = 0,
.first_offset = 0, .first_offset = 0,
}, },
[pbn_exar_XR17V8358] = {
.flags = FL_BASE0,
.num_ports = 16,
.base_baud = 7812500,
.uart_offset = 0x400,
.reg_shift = 0,
.first_offset = 0,
},
[pbn_exar_ibm_saturn] = { [pbn_exar_ibm_saturn] = {
.flags = FL_BASE0, .flags = FL_BASE0,
.num_ports = 1, .num_ports = 1,
...@@ -4797,7 +4815,7 @@ static struct pci_device_id serial_pci_tbl[] = { ...@@ -4797,7 +4815,7 @@ static struct pci_device_id serial_pci_tbl[] = {
0, 0,
0, pbn_exar_XR17C158 }, 0, pbn_exar_XR17C158 },
/* /*
* Exar Corp. XR17V35[248] Dual/Quad/Octal PCIe UARTs * Exar Corp. XR17V[48]35[248] Dual/Quad/Octal/Hexa PCIe UARTs
*/ */
{ PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17V352, { PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17V352,
PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
...@@ -4811,7 +4829,10 @@ static struct pci_device_id serial_pci_tbl[] = { ...@@ -4811,7 +4829,10 @@ static struct pci_device_id serial_pci_tbl[] = {
PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
0, 0,
0, pbn_exar_XR17V358 }, 0, pbn_exar_XR17V358 },
{ PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17V8358,
PCI_ANY_ID, PCI_ANY_ID,
0,
0, pbn_exar_XR17V8358 },
/* /*
* Pericom PI7C9X795[1248] Uno/Dual/Quad/Octal UART * Pericom PI7C9X795[1248] Uno/Dual/Quad/Octal UART
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment