|
83 | 83 |
|
84 | 84 | #define PCI_DEVICE_ID_MOXA_CP102E 0x1024 |
85 | 85 | #define PCI_DEVICE_ID_MOXA_CP102EL 0x1025 |
| 86 | +#define PCI_DEVICE_ID_MOXA_CP102N 0x1027 |
86 | 87 | #define PCI_DEVICE_ID_MOXA_CP104EL_A 0x1045 |
| 88 | +#define PCI_DEVICE_ID_MOXA_CP104N 0x1046 |
| 89 | +#define PCI_DEVICE_ID_MOXA_CP112N 0x1121 |
87 | 90 | #define PCI_DEVICE_ID_MOXA_CP114EL 0x1144 |
| 91 | +#define PCI_DEVICE_ID_MOXA_CP114N 0x1145 |
88 | 92 | #define PCI_DEVICE_ID_MOXA_CP116E_A_A 0x1160 |
89 | 93 | #define PCI_DEVICE_ID_MOXA_CP116E_A_B 0x1161 |
90 | 94 | #define PCI_DEVICE_ID_MOXA_CP118EL_A 0x1182 |
91 | 95 | #define PCI_DEVICE_ID_MOXA_CP118E_A_I 0x1183 |
92 | 96 | #define PCI_DEVICE_ID_MOXA_CP132EL 0x1322 |
| 97 | +#define PCI_DEVICE_ID_MOXA_CP132N 0x1323 |
93 | 98 | #define PCI_DEVICE_ID_MOXA_CP134EL_A 0x1342 |
| 99 | +#define PCI_DEVICE_ID_MOXA_CP134N 0x1343 |
94 | 100 | #define PCI_DEVICE_ID_MOXA_CP138E_A 0x1381 |
95 | 101 | #define PCI_DEVICE_ID_MOXA_CP168EL_A 0x1683 |
96 | 102 |
|
@@ -1959,6 +1965,49 @@ pci_sunix_setup(struct serial_private *priv, |
1959 | 1965 | return setup_port(priv, port, bar, offset, 0); |
1960 | 1966 | } |
1961 | 1967 |
|
| 1968 | +#define MOXA_PUART_GPIO_EN 0x09 |
| 1969 | +#define MOXA_PUART_GPIO_OUT 0x0A |
| 1970 | + |
| 1971 | +#define MOXA_GPIO_PIN2 BIT(2) |
| 1972 | + |
| 1973 | +static bool pci_moxa_is_mini_pcie(unsigned short device) |
| 1974 | +{ |
| 1975 | + if (device == PCI_DEVICE_ID_MOXA_CP102N || |
| 1976 | + device == PCI_DEVICE_ID_MOXA_CP104N || |
| 1977 | + device == PCI_DEVICE_ID_MOXA_CP112N || |
| 1978 | + device == PCI_DEVICE_ID_MOXA_CP114N || |
| 1979 | + device == PCI_DEVICE_ID_MOXA_CP132N || |
| 1980 | + device == PCI_DEVICE_ID_MOXA_CP134N) |
| 1981 | + return true; |
| 1982 | + |
| 1983 | + return false; |
| 1984 | +} |
| 1985 | + |
| 1986 | +static int pci_moxa_init(struct pci_dev *dev) |
| 1987 | +{ |
| 1988 | + unsigned short device = dev->device; |
| 1989 | + resource_size_t iobar_addr = pci_resource_start(dev, 2); |
| 1990 | + unsigned int num_ports = (device & 0x00F0) >> 4; |
| 1991 | + u8 val; |
| 1992 | + |
| 1993 | + /* |
| 1994 | + * Enable hardware buffer to prevent break signal output when system boots up. |
| 1995 | + * This hardware buffer is only supported on Mini PCIe series. |
| 1996 | + */ |
| 1997 | + if (pci_moxa_is_mini_pcie(device)) { |
| 1998 | + /* Set GPIO direction */ |
| 1999 | + val = inb(iobar_addr + MOXA_PUART_GPIO_EN); |
| 2000 | + val |= MOXA_GPIO_PIN2; |
| 2001 | + outb(val, iobar_addr + MOXA_PUART_GPIO_EN); |
| 2002 | + /* Enable low GPIO */ |
| 2003 | + val = inb(iobar_addr + MOXA_PUART_GPIO_OUT); |
| 2004 | + val &= ~MOXA_GPIO_PIN2; |
| 2005 | + outb(val, iobar_addr + MOXA_PUART_GPIO_OUT); |
| 2006 | + } |
| 2007 | + |
| 2008 | + return num_ports; |
| 2009 | +} |
| 2010 | + |
1962 | 2011 | static int |
1963 | 2012 | pci_moxa_setup(struct serial_private *priv, |
1964 | 2013 | const struct pciserial_board *board, |
@@ -2635,6 +2684,7 @@ static struct pci_serial_quirk pci_serial_quirks[] = { |
2635 | 2684 | .device = PCI_ANY_ID, |
2636 | 2685 | .subvendor = PCI_ANY_ID, |
2637 | 2686 | .subdevice = PCI_ANY_ID, |
| 2687 | + .init = pci_moxa_init, |
2638 | 2688 | .setup = pci_moxa_setup, |
2639 | 2689 | }, |
2640 | 2690 | { |
@@ -5351,14 +5401,20 @@ static const struct pci_device_id serial_pci_tbl[] = { |
5351 | 5401 | */ |
5352 | 5402 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102E), pbn_moxa_2 }, |
5353 | 5403 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102EL), pbn_moxa_2 }, |
| 5404 | + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102N), pbn_moxa_2 }, |
5354 | 5405 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104EL_A), pbn_moxa_4 }, |
| 5406 | + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104N), pbn_moxa_4 }, |
| 5407 | + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP112N), pbn_moxa_2 }, |
5355 | 5408 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP114EL), pbn_moxa_4 }, |
| 5409 | + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP114N), pbn_moxa_4 }, |
5356 | 5410 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP116E_A_A), pbn_moxa_8 }, |
5357 | 5411 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP116E_A_B), pbn_moxa_8 }, |
5358 | 5412 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP118EL_A), pbn_moxa_8 }, |
5359 | 5413 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP118E_A_I), pbn_moxa_8 }, |
5360 | 5414 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132EL), pbn_moxa_2 }, |
| 5415 | + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132N), pbn_moxa_2 }, |
5361 | 5416 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP134EL_A), pbn_moxa_4 }, |
| 5417 | + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP134N), pbn_moxa_4 }, |
5362 | 5418 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP138E_A), pbn_moxa_8 }, |
5363 | 5419 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP168EL_A), pbn_moxa_8 }, |
5364 | 5420 |
|
|
0 commit comments