Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.19 1747 lines 53 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Probe module for 8250/16550-type Exar chips PCI serial ports. 4 * 5 * Based on drivers/tty/serial/8250/8250_pci.c, 6 * 7 * Copyright (C) 2017 Sudip Mukherjee, All Rights Reserved. 8 */ 9#include <linux/bitfield.h> 10#include <linux/bits.h> 11#include <linux/delay.h> 12#include <linux/device.h> 13#include <linux/dmi.h> 14#include <linux/eeprom_93cx6.h> 15#include <linux/interrupt.h> 16#include <linux/io.h> 17#include <linux/math.h> 18#include <linux/module.h> 19#include <linux/pci.h> 20#include <linux/platform_device.h> 21#include <linux/pm.h> 22#include <linux/property.h> 23#include <linux/string.h> 24#include <linux/types.h> 25 26#include <linux/serial_8250.h> 27#include <linux/serial_core.h> 28#include <linux/serial_reg.h> 29 30#include <asm/byteorder.h> 31 32#include "8250.h" 33#include "8250_pcilib.h" 34 35#define PCI_DEVICE_ID_ACCESSIO_COM_2S 0x1052 36#define PCI_DEVICE_ID_ACCESSIO_COM_4S 0x105d 37#define PCI_DEVICE_ID_ACCESSIO_COM_8S 0x106c 38#define PCI_DEVICE_ID_ACCESSIO_COM232_8 0x10a8 39#define PCI_DEVICE_ID_ACCESSIO_COM_2SM 0x10d2 40#define PCI_DEVICE_ID_ACCESSIO_COM_4SM 0x10db 41#define PCI_DEVICE_ID_ACCESSIO_COM_8SM 0x10ea 42 43#define PCI_DEVICE_ID_ADVANTECH_XR17V352 0x0018 44 45#define PCI_DEVICE_ID_COMMTECH_4224PCI335 0x0002 46#define PCI_DEVICE_ID_COMMTECH_4222PCI335 0x0004 47#define PCI_DEVICE_ID_COMMTECH_2324PCI335 0x000a 48#define PCI_DEVICE_ID_COMMTECH_2328PCI335 0x000b 49#define PCI_DEVICE_ID_COMMTECH_4224PCIE 0x0020 50#define PCI_DEVICE_ID_COMMTECH_4228PCIE 0x0021 51#define PCI_DEVICE_ID_COMMTECH_4222PCIE 0x0022 52 53#define PCI_VENDOR_ID_CONNECT_TECH 0x12c4 54#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_SP_OPTO 0x0340 55#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_SP_OPTO_A 0x0341 56#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_SP_OPTO_B 0x0342 57#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XPRS 0x0350 58#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_A 0x0351 59#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_B 0x0352 60#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS 0x0353 61#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_16_XPRS_A 0x0354 62#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_16_XPRS_B 0x0355 63#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XPRS_OPTO 0x0360 64#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_OPTO_A 0x0361 65#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_OPTO_B 0x0362 66#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_SP 0x0370 67#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_SP_232 0x0371 68#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_SP_485 0x0372 69#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_4_SP 0x0373 70#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_6_2_SP 0x0374 71#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_6_SP 0x0375 72#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_SP_232_NS 0x0376 73#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XP_OPTO_LEFT 0x0380 74#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XP_OPTO_RIGHT 0x0381 75#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XP_OPTO 0x0382 76#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_4_XPRS_OPTO 0x0392 77#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS_LP 0x03A0 78#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS_LP_232 0x03A1 79#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS_LP_485 0x03A2 80#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS_LP_232_NS 0x03A3 81#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCIE_XEG001 0x0602 82#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCIE_XR35X_BASE 0x1000 83#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCIE_XR35X_2 0x1002 84#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCIE_XR35X_4 0x1004 85#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCIE_XR35X_8 0x1008 86#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCIE_XR35X_12 0x100C 87#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCIE_XR35X_16 0x1010 88#define PCI_DEVICE_ID_CONNECT_TECH_PCI_XR79X_12_XIG00X 0x110c 89#define PCI_DEVICE_ID_CONNECT_TECH_PCI_XR79X_12_XIG01X 0x110d 90#define PCI_DEVICE_ID_CONNECT_TECH_PCI_XR79X_16 0x1110 91 92#define PCI_DEVICE_ID_EXAR_XR17V4358 0x4358 93#define PCI_DEVICE_ID_EXAR_XR17V8358 0x8358 94#define PCI_DEVICE_ID_EXAR_XR17V252 0x0252 95#define PCI_DEVICE_ID_EXAR_XR17V254 0x0254 96#define PCI_DEVICE_ID_EXAR_XR17V258 0x0258 97 98#define PCI_SUBDEVICE_ID_USR_2980 0x0128 99#define PCI_SUBDEVICE_ID_USR_2981 0x0129 100 101#define UART_EXAR_INT0 0x80 102#define UART_EXAR_8XMODE 0x88 /* 8X sampling rate select */ 103#define UART_EXAR_SLEEP 0x8b /* Sleep mode */ 104#define UART_EXAR_DVID 0x8d /* Device identification */ 105 106#define UART_EXAR_FCTR 0x08 /* Feature Control Register */ 107#define UART_FCTR_EXAR_IRDA 0x10 /* IrDa data encode select */ 108#define UART_FCTR_EXAR_485 0x20 /* Auto 485 half duplex dir ctl */ 109#define UART_FCTR_EXAR_TRGA 0x00 /* FIFO trigger table A */ 110#define UART_FCTR_EXAR_TRGB 0x60 /* FIFO trigger table B */ 111#define UART_FCTR_EXAR_TRGC 0x80 /* FIFO trigger table C */ 112#define UART_FCTR_EXAR_TRGD 0xc0 /* FIFO trigger table D programmable */ 113 114#define UART_EXAR_TXTRG 0x0a /* Tx FIFO trigger level write-only */ 115#define UART_EXAR_RXTRG 0x0b /* Rx FIFO trigger level write-only */ 116 117#define UART_EXAR_MPIOINT_7_0 0x8f /* MPIOINT[7:0] */ 118#define UART_EXAR_MPIOLVL_7_0 0x90 /* MPIOLVL[7:0] */ 119#define UART_EXAR_MPIO3T_7_0 0x91 /* MPIO3T[7:0] */ 120#define UART_EXAR_MPIOINV_7_0 0x92 /* MPIOINV[7:0] */ 121#define UART_EXAR_MPIOSEL_7_0 0x93 /* MPIOSEL[7:0] */ 122#define UART_EXAR_MPIOOD_7_0 0x94 /* MPIOOD[7:0] */ 123#define UART_EXAR_MPIOINT_15_8 0x95 /* MPIOINT[15:8] */ 124#define UART_EXAR_MPIOLVL_15_8 0x96 /* MPIOLVL[15:8] */ 125#define UART_EXAR_MPIO3T_15_8 0x97 /* MPIO3T[15:8] */ 126#define UART_EXAR_MPIOINV_15_8 0x98 /* MPIOINV[15:8] */ 127#define UART_EXAR_MPIOSEL_15_8 0x99 /* MPIOSEL[15:8] */ 128#define UART_EXAR_MPIOOD_15_8 0x9a /* MPIOOD[15:8] */ 129 130#define UART_EXAR_RS485_DLY(x) ((x) << 4) 131 132#define UART_EXAR_DLD 0x02 /* Divisor Fractional */ 133#define UART_EXAR_DLD_485_POLARITY 0x80 /* RS-485 Enable Signal Polarity */ 134 135/* EEPROM registers */ 136#define UART_EXAR_REGB 0x8e 137#define UART_EXAR_REGB_EECK BIT(4) 138#define UART_EXAR_REGB_EECS BIT(5) 139#define UART_EXAR_REGB_EEDI BIT(6) 140#define UART_EXAR_REGB_EEDO BIT(7) 141 142#define UART_EXAR_XR17C15X_PORT_OFFSET 0x200 143#define UART_EXAR_XR17V25X_PORT_OFFSET 0x200 144#define UART_EXAR_XR17V35X_PORT_OFFSET 0x400 145 146/* 147 * IOT2040 MPIO wiring semantics: 148 * 149 * MPIO Port Function 150 * ---- ---- -------- 151 * 0 2 Mode bit 0 152 * 1 2 Mode bit 1 153 * 2 2 Terminate bus 154 * 3 - <reserved> 155 * 4 3 Mode bit 0 156 * 5 3 Mode bit 1 157 * 6 3 Terminate bus 158 * 7 - <reserved> 159 * 8 2 Enable 160 * 9 3 Enable 161 * 10 - Red LED 162 * 11..15 - <unused> 163 */ 164 165/* IOT2040 MPIOs 0..7 */ 166#define IOT2040_UART_MODE_RS232 0x01 167#define IOT2040_UART_MODE_RS485 0x02 168#define IOT2040_UART_MODE_RS422 0x03 169#define IOT2040_UART_TERMINATE_BUS 0x04 170 171#define IOT2040_UART1_MASK 0x0f 172#define IOT2040_UART2_SHIFT 4 173 174#define IOT2040_UARTS_DEFAULT_MODE 0x11 /* both RS232 */ 175#define IOT2040_UARTS_GPIO_LO_MODE 0x88 /* reserved pins as input */ 176 177/* IOT2040 MPIOs 8..15 */ 178#define IOT2040_UARTS_ENABLE 0x03 179#define IOT2040_UARTS_GPIO_HI_MODE 0xF8 /* enable & LED as outputs */ 180 181/* CTI EEPROM offsets */ 182#define CTI_EE_OFF_XR17C15X_OSC_FREQ 0x04 /* 2 words */ 183#define CTI_EE_OFF_XR17C15X_PART_NUM 0x0A /* 4 words */ 184#define CTI_EE_OFF_XR17C15X_SERIAL_NUM 0x0E /* 1 word */ 185 186#define CTI_EE_OFF_XR17V25X_OSC_FREQ 0x08 /* 2 words */ 187#define CTI_EE_OFF_XR17V25X_PART_NUM 0x0E /* 4 words */ 188#define CTI_EE_OFF_XR17V25X_SERIAL_NUM 0x12 /* 1 word */ 189 190#define CTI_EE_OFF_XR17V35X_SERIAL_NUM 0x11 /* 2 word */ 191#define CTI_EE_OFF_XR17V35X_BRD_FLAGS 0x13 /* 1 word */ 192#define CTI_EE_OFF_XR17V35X_PORT_FLAGS 0x14 /* 1 word */ 193 194#define CTI_EE_MASK_PORT_FLAGS_TYPE GENMASK(7, 0) 195#define CTI_EE_MASK_OSC_FREQ GENMASK(31, 0) 196 197#define CTI_FPGA_RS485_IO_REG 0x2008 198#define CTI_FPGA_CFG_INT_EN_REG 0x48 199#define CTI_FPGA_CFG_INT_EN_EXT_BIT BIT(15) /* External int enable bit */ 200 201#define CTI_DEFAULT_PCI_OSC_FREQ 29491200 202#define CTI_DEFAULT_PCIE_OSC_FREQ 125000000 203#define CTI_DEFAULT_FPGA_OSC_FREQ 33333333 204 205/* 206 * CTI Serial port line types. These match the values stored in the first 207 * nibble of the CTI EEPROM port_flags word. 208 */ 209enum cti_port_type { 210 CTI_PORT_TYPE_NONE = 0, 211 CTI_PORT_TYPE_RS232, // RS232 ONLY 212 CTI_PORT_TYPE_RS422_485, // RS422/RS485 ONLY 213 CTI_PORT_TYPE_RS232_422_485_HW, // RS232/422/485 HW ONLY Switchable 214 CTI_PORT_TYPE_RS232_422_485_SW, // RS232/422/485 SW ONLY Switchable 215 CTI_PORT_TYPE_RS232_422_485_4B, // RS232/422/485 HW/SW (4bit ex. BCG004) 216 CTI_PORT_TYPE_RS232_422_485_2B, // RS232/422/485 HW/SW (2bit ex. BBG008) 217 CTI_PORT_TYPE_MAX, 218}; 219 220#define CTI_PORT_TYPE_VALID(_port_type) \ 221 (((_port_type) > CTI_PORT_TYPE_NONE) && \ 222 ((_port_type) < CTI_PORT_TYPE_MAX)) 223 224#define CTI_PORT_TYPE_RS485(_port_type) \ 225 (((_port_type) > CTI_PORT_TYPE_RS232) && \ 226 ((_port_type) < CTI_PORT_TYPE_MAX)) 227 228struct exar8250; 229 230struct exar8250_platform { 231 int (*rs485_config)(struct uart_port *port, struct ktermios *termios, 232 struct serial_rs485 *rs485); 233 const struct serial_rs485 *rs485_supported; 234 int (*register_gpio)(struct pci_dev *pcidev, struct uart_8250_port *port); 235 void (*unregister_gpio)(struct uart_8250_port *port); 236}; 237 238/** 239 * struct exar8250_board - board information 240 * @num_ports: number of serial ports 241 * @reg_shift: describes UART register mapping in PCI memory 242 * @setup: quirk run at ->probe() stage for each port 243 * @exit: quirk run at ->remove() stage 244 */ 245struct exar8250_board { 246 unsigned int num_ports; 247 unsigned int reg_shift; 248 int (*setup)(struct exar8250 *priv, struct pci_dev *pcidev, 249 struct uart_8250_port *port, int idx); 250 void (*exit)(struct pci_dev *pcidev); 251}; 252 253struct exar8250 { 254 unsigned int nr; 255 unsigned int osc_freq; 256 struct exar8250_board *board; 257 struct eeprom_93cx6 eeprom; 258 void __iomem *virt; 259 int line[]; 260}; 261 262static inline void exar_write_reg(struct exar8250 *priv, 263 unsigned int reg, u8 value) 264{ 265 writeb(value, priv->virt + reg); 266} 267 268static inline u8 exar_read_reg(struct exar8250 *priv, unsigned int reg) 269{ 270 return readb(priv->virt + reg); 271} 272 273static void exar_eeprom_93cx6_reg_read(struct eeprom_93cx6 *eeprom) 274{ 275 struct exar8250 *priv = eeprom->data; 276 u8 regb = exar_read_reg(priv, UART_EXAR_REGB); 277 278 /* EECK and EECS always read 0 from REGB so only set EEDO */ 279 eeprom->reg_data_out = regb & UART_EXAR_REGB_EEDO; 280} 281 282static void exar_eeprom_93cx6_reg_write(struct eeprom_93cx6 *eeprom) 283{ 284 struct exar8250 *priv = eeprom->data; 285 u8 regb = 0; 286 287 if (eeprom->reg_data_in) 288 regb |= UART_EXAR_REGB_EEDI; 289 if (eeprom->reg_data_clock) 290 regb |= UART_EXAR_REGB_EECK; 291 if (eeprom->reg_chip_select) 292 regb |= UART_EXAR_REGB_EECS; 293 294 exar_write_reg(priv, UART_EXAR_REGB, regb); 295} 296 297static void exar_eeprom_init(struct exar8250 *priv) 298{ 299 priv->eeprom.data = priv; 300 priv->eeprom.register_read = exar_eeprom_93cx6_reg_read; 301 priv->eeprom.register_write = exar_eeprom_93cx6_reg_write; 302 priv->eeprom.width = PCI_EEPROM_WIDTH_93C46; 303 priv->eeprom.quirks |= PCI_EEPROM_QUIRK_EXTRA_READ_CYCLE; 304} 305 306/** 307 * exar_mpio_config_output() - Configure an Exar MPIO as an output 308 * @priv: Device's private structure 309 * @mpio_num: MPIO number/offset to configure 310 * 311 * Configure a single MPIO as an output and disable tristate. It is recommended 312 * to set the level with exar_mpio_set_high()/exar_mpio_set_low() prior to 313 * calling this function to ensure default MPIO pin state. 314 * 315 * Return: 0 on success, negative error code on failure 316 */ 317static int exar_mpio_config_output(struct exar8250 *priv, 318 unsigned int mpio_num) 319{ 320 unsigned int mpio_offset; 321 u8 sel_reg; // MPIO Select register (input/output) 322 u8 tri_reg; // MPIO Tristate register 323 u8 value; 324 325 if (mpio_num < 8) { 326 sel_reg = UART_EXAR_MPIOSEL_7_0; 327 tri_reg = UART_EXAR_MPIO3T_7_0; 328 mpio_offset = mpio_num; 329 } else if (mpio_num >= 8 && mpio_num < 16) { 330 sel_reg = UART_EXAR_MPIOSEL_15_8; 331 tri_reg = UART_EXAR_MPIO3T_15_8; 332 mpio_offset = mpio_num - 8; 333 } else { 334 return -EINVAL; 335 } 336 337 // Disable MPIO pin tri-state 338 value = exar_read_reg(priv, tri_reg); 339 value &= ~BIT(mpio_offset); 340 exar_write_reg(priv, tri_reg, value); 341 342 value = exar_read_reg(priv, sel_reg); 343 value &= ~BIT(mpio_offset); 344 exar_write_reg(priv, sel_reg, value); 345 346 return 0; 347} 348 349/** 350 * _exar_mpio_set() - Set an Exar MPIO output high or low 351 * @priv: Device's private structure 352 * @mpio_num: MPIO number/offset to set 353 * @high: Set MPIO high if true, low if false 354 * 355 * Set a single MPIO high or low. exar_mpio_config_output() must also be called 356 * to configure the pin as an output. 357 * 358 * Return: 0 on success, negative error code on failure 359 */ 360static int _exar_mpio_set(struct exar8250 *priv, 361 unsigned int mpio_num, bool high) 362{ 363 unsigned int mpio_offset; 364 u8 lvl_reg; 365 u8 value; 366 367 if (mpio_num < 8) { 368 lvl_reg = UART_EXAR_MPIOLVL_7_0; 369 mpio_offset = mpio_num; 370 } else if (mpio_num >= 8 && mpio_num < 16) { 371 lvl_reg = UART_EXAR_MPIOLVL_15_8; 372 mpio_offset = mpio_num - 8; 373 } else { 374 return -EINVAL; 375 } 376 377 value = exar_read_reg(priv, lvl_reg); 378 if (high) 379 value |= BIT(mpio_offset); 380 else 381 value &= ~BIT(mpio_offset); 382 exar_write_reg(priv, lvl_reg, value); 383 384 return 0; 385} 386 387static int exar_mpio_set_low(struct exar8250 *priv, unsigned int mpio_num) 388{ 389 return _exar_mpio_set(priv, mpio_num, false); 390} 391 392static int exar_mpio_set_high(struct exar8250 *priv, unsigned int mpio_num) 393{ 394 return _exar_mpio_set(priv, mpio_num, true); 395} 396 397static int generic_rs485_config(struct uart_port *port, struct ktermios *termios, 398 struct serial_rs485 *rs485) 399{ 400 bool is_rs485 = !!(rs485->flags & SER_RS485_ENABLED); 401 u8 __iomem *p = port->membase; 402 u8 value; 403 404 value = readb(p + UART_EXAR_FCTR); 405 if (is_rs485) 406 value |= UART_FCTR_EXAR_485; 407 else 408 value &= ~UART_FCTR_EXAR_485; 409 410 writeb(value, p + UART_EXAR_FCTR); 411 412 if (is_rs485) 413 writeb(UART_EXAR_RS485_DLY(4), p + UART_MSR); 414 415 return 0; 416} 417 418static const struct serial_rs485 generic_rs485_supported = { 419 .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND, 420}; 421 422static void exar_pm(struct uart_port *port, unsigned int state, unsigned int old) 423{ 424 /* 425 * Exar UARTs have a SLEEP register that enables or disables each UART 426 * to enter sleep mode separately. On the XR17V35x the register 427 * is accessible to each UART at the UART_EXAR_SLEEP offset, but 428 * the UART channel may only write to the corresponding bit. 429 */ 430 serial_port_out(port, UART_EXAR_SLEEP, state ? 0xff : 0); 431} 432 433/* 434 * XR17V35x UARTs have an extra fractional divisor register (DLD) 435 * Calculate divisor with extra 4-bit fractional portion 436 */ 437static unsigned int xr17v35x_get_divisor(struct uart_port *p, unsigned int baud, 438 unsigned int *frac) 439{ 440 unsigned int quot_16; 441 442 quot_16 = DIV_ROUND_CLOSEST(p->uartclk, baud); 443 *frac = quot_16 & 0x0f; 444 445 return quot_16 >> 4; 446} 447 448static void xr17v35x_set_divisor(struct uart_port *p, unsigned int baud, 449 unsigned int quot, unsigned int quot_frac) 450{ 451 serial8250_do_set_divisor(p, baud, quot); 452 453 /* Preserve bits not related to baudrate; DLD[7:4]. */ 454 quot_frac |= serial_port_in(p, 0x2) & 0xf0; 455 serial_port_out(p, 0x2, quot_frac); 456} 457 458static int xr17v35x_startup(struct uart_port *port) 459{ 460 /* 461 * First enable access to IER [7:5], ISR [5:4], FCR [5:4], 462 * MCR [7:5] and MSR [7:0] 463 */ 464 serial_port_out(port, UART_XR_EFR, UART_EFR_ECB); 465 466 /* 467 * Make sure all interrupts are masked until initialization is 468 * complete and the FIFOs are cleared 469 * 470 * Synchronize UART_IER access against the console. 471 */ 472 uart_port_lock_irq(port); 473 serial_port_out(port, UART_IER, 0); 474 uart_port_unlock_irq(port); 475 476 return serial8250_do_startup(port); 477} 478 479static void exar_shutdown(struct uart_port *port) 480{ 481 bool tx_complete = false; 482 struct uart_8250_port *up = up_to_u8250p(port); 483 struct tty_port *tport = &port->state->port; 484 int i = 0; 485 u16 lsr; 486 487 do { 488 lsr = serial_in(up, UART_LSR); 489 if (lsr & (UART_LSR_TEMT | UART_LSR_THRE)) 490 tx_complete = true; 491 else 492 tx_complete = false; 493 usleep_range(1000, 1100); 494 } while (!kfifo_is_empty(&tport->xmit_fifo) && 495 !tx_complete && i++ < 1000); 496 497 serial8250_do_shutdown(port); 498} 499 500static int default_setup(struct exar8250 *priv, struct pci_dev *pcidev, 501 int idx, unsigned int offset, 502 struct uart_8250_port *port) 503{ 504 const struct exar8250_board *board = priv->board; 505 unsigned char status; 506 int err; 507 508 err = serial8250_pci_setup_port(pcidev, port, 0, offset, board->reg_shift, priv->virt); 509 if (err) 510 return err; 511 512 /* 513 * XR17V35x UARTs have an extra divisor register, DLD that gets enabled 514 * with when DLAB is set which will cause the device to incorrectly match 515 * and assign port type to PORT_16650. The EFR for this UART is found 516 * at offset 0x09. Instead check the Deice ID (DVID) register 517 * for a 2, 4 or 8 port UART. 518 */ 519 status = readb(port->port.membase + UART_EXAR_DVID); 520 if (status == 0x82 || status == 0x84 || status == 0x88) { 521 port->port.type = PORT_XR17V35X; 522 523 port->port.get_divisor = xr17v35x_get_divisor; 524 port->port.set_divisor = xr17v35x_set_divisor; 525 526 port->port.startup = xr17v35x_startup; 527 } else { 528 port->port.type = PORT_XR17D15X; 529 } 530 531 port->port.pm = exar_pm; 532 port->port.shutdown = exar_shutdown; 533 534 return 0; 535} 536 537static int 538pci_fastcom335_setup(struct exar8250 *priv, struct pci_dev *pcidev, 539 struct uart_8250_port *port, int idx) 540{ 541 unsigned int offset = idx * 0x200; 542 unsigned int baud = 1843200; 543 u8 __iomem *p; 544 int err; 545 546 port->port.uartclk = baud * 16; 547 548 err = default_setup(priv, pcidev, idx, offset, port); 549 if (err) 550 return err; 551 552 p = port->port.membase; 553 554 writeb(0x00, p + UART_EXAR_8XMODE); 555 writeb(UART_FCTR_EXAR_TRGD, p + UART_EXAR_FCTR); 556 writeb(32, p + UART_EXAR_TXTRG); 557 writeb(32, p + UART_EXAR_RXTRG); 558 559 /* Skip the initial (per device) setup */ 560 if (idx) 561 return 0; 562 563 /* 564 * Setup Multipurpose Input/Output pins. 565 */ 566 switch (pcidev->device) { 567 case PCI_DEVICE_ID_COMMTECH_4222PCI335: 568 case PCI_DEVICE_ID_COMMTECH_4224PCI335: 569 writeb(0x78, p + UART_EXAR_MPIOLVL_7_0); 570 writeb(0x00, p + UART_EXAR_MPIOINV_7_0); 571 writeb(0x00, p + UART_EXAR_MPIOSEL_7_0); 572 break; 573 case PCI_DEVICE_ID_COMMTECH_2324PCI335: 574 case PCI_DEVICE_ID_COMMTECH_2328PCI335: 575 writeb(0x00, p + UART_EXAR_MPIOLVL_7_0); 576 writeb(0xc0, p + UART_EXAR_MPIOINV_7_0); 577 writeb(0xc0, p + UART_EXAR_MPIOSEL_7_0); 578 break; 579 default: 580 break; 581 } 582 writeb(0x00, p + UART_EXAR_MPIOINT_7_0); 583 writeb(0x00, p + UART_EXAR_MPIO3T_7_0); 584 writeb(0x00, p + UART_EXAR_MPIOOD_7_0); 585 586 return 0; 587} 588 589/** 590 * cti_tristate_disable() - Disable RS485 transciever tristate 591 * @priv: Device's private structure 592 * @port_num: Port number to set tristate off 593 * 594 * Most RS485 capable cards have a power on tristate jumper/switch that ensures 595 * the RS422/RS485 transceiver does not drive a multi-drop RS485 bus when it is 596 * not the master. When this jumper is installed the user must set the RS485 597 * mode to Full or Half duplex to disable tristate prior to using the port. 598 * 599 * Some Exar UARTs have an auto-tristate feature while others require setting 600 * an MPIO to disable the tristate. 601 * 602 * Return: 0 on success, negative error code on failure 603 */ 604static int cti_tristate_disable(struct exar8250 *priv, unsigned int port_num) 605{ 606 int ret; 607 608 ret = exar_mpio_set_high(priv, port_num); 609 if (ret) 610 return ret; 611 612 return exar_mpio_config_output(priv, port_num); 613} 614 615/** 616 * cti_plx_int_enable() - Enable UART interrupts to PLX bridge 617 * @priv: Device's private structure 618 * 619 * Some older CTI cards require MPIO_0 to be set low to enable the 620 * interrupts from the UART to the PLX PCI->PCIe bridge. 621 * 622 * Return: 0 on success, negative error code on failure 623 */ 624static int cti_plx_int_enable(struct exar8250 *priv) 625{ 626 int ret; 627 628 ret = exar_mpio_set_low(priv, 0); 629 if (ret) 630 return ret; 631 632 return exar_mpio_config_output(priv, 0); 633} 634 635/** 636 * cti_read_osc_freq() - Read the UART oscillator frequency from EEPROM 637 * @priv: Device's private structure 638 * @eeprom_offset: Offset where the oscillator frequency is stored 639 * 640 * CTI XR17x15X and XR17V25X cards have the serial boards oscillator frequency 641 * stored in the EEPROM. FPGA and XR17V35X based cards use the PCI/PCIe clock. 642 * 643 * Return: frequency on success, negative error code on failure 644 */ 645static int cti_read_osc_freq(struct exar8250 *priv, u8 eeprom_offset) 646{ 647 __le16 ee_words[2]; 648 u32 osc_freq; 649 650 eeprom_93cx6_multiread(&priv->eeprom, eeprom_offset, ee_words, ARRAY_SIZE(ee_words)); 651 652 osc_freq = le16_to_cpu(ee_words[0]) | (le16_to_cpu(ee_words[1]) << 16); 653 if (osc_freq == CTI_EE_MASK_OSC_FREQ) 654 return -EIO; 655 656 return osc_freq; 657} 658 659/** 660 * cti_get_port_type_xr17c15x_xr17v25x() - Get port type of xr17c15x/xr17v25x 661 * @priv: Device's private structure 662 * @pcidev: Pointer to the PCI device for this port 663 * @port_num: Port to get type of 664 * 665 * CTI xr17c15x and xr17v25x based cards port types are based on PCI IDs. 666 * 667 * Return: port type on success, CTI_PORT_TYPE_NONE on failure 668 */ 669static enum cti_port_type cti_get_port_type_xr17c15x_xr17v25x(struct exar8250 *priv, 670 struct pci_dev *pcidev, 671 unsigned int port_num) 672{ 673 switch (pcidev->subsystem_device) { 674 // RS232 only cards 675 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_232: 676 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_232: 677 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_232: 678 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_SP_232: 679 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_SP_232_NS: 680 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS_LP_232: 681 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS_LP_232_NS: 682 return CTI_PORT_TYPE_RS232; 683 // 1x RS232, 1x RS422/RS485 684 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_1_1: 685 return (port_num == 0) ? CTI_PORT_TYPE_RS232 : CTI_PORT_TYPE_RS422_485; 686 // 2x RS232, 2x RS422/RS485 687 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_2: 688 return (port_num < 2) ? CTI_PORT_TYPE_RS232 : CTI_PORT_TYPE_RS422_485; 689 // 4x RS232, 4x RS422/RS485 690 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_4: 691 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_4_SP: 692 return (port_num < 4) ? CTI_PORT_TYPE_RS232 : CTI_PORT_TYPE_RS422_485; 693 // RS232/RS422/RS485 HW (jumper) selectable 694 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2: 695 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4: 696 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8: 697 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_SP_OPTO: 698 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_SP_OPTO_A: 699 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_SP_OPTO_B: 700 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XPRS: 701 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_A: 702 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_B: 703 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS: 704 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_16_XPRS_A: 705 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_16_XPRS_B: 706 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XPRS_OPTO: 707 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_OPTO_A: 708 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_OPTO_B: 709 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_SP: 710 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XP_OPTO_LEFT: 711 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XP_OPTO_RIGHT: 712 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XP_OPTO: 713 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_4_XPRS_OPTO: 714 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS_LP: 715 return CTI_PORT_TYPE_RS232_422_485_HW; 716 // RS422/RS485 HW (jumper) selectable 717 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_485: 718 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_485: 719 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_485: 720 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_SP_485: 721 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS_LP_485: 722 return CTI_PORT_TYPE_RS422_485; 723 // 6x RS232, 2x RS422/RS485 724 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_6_2_SP: 725 return (port_num < 6) ? CTI_PORT_TYPE_RS232 : CTI_PORT_TYPE_RS422_485; 726 // 2x RS232, 6x RS422/RS485 727 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_6_SP: 728 return (port_num < 2) ? CTI_PORT_TYPE_RS232 : CTI_PORT_TYPE_RS422_485; 729 default: 730 dev_err(&pcidev->dev, "unknown/unsupported device\n"); 731 return CTI_PORT_TYPE_NONE; 732 } 733} 734 735/** 736 * cti_get_port_type_fpga() - Get the port type of a CTI FPGA card 737 * @priv: Device's private structure 738 * @pcidev: Pointer to the PCI device for this port 739 * @port_num: Port to get type of 740 * 741 * FPGA based cards port types are based on PCI IDs. 742 * 743 * Return: port type on success, CTI_PORT_TYPE_NONE on failure 744 */ 745static enum cti_port_type cti_get_port_type_fpga(struct exar8250 *priv, 746 struct pci_dev *pcidev, 747 unsigned int port_num) 748{ 749 switch (pcidev->device) { 750 case PCI_DEVICE_ID_CONNECT_TECH_PCI_XR79X_12_XIG00X: 751 case PCI_DEVICE_ID_CONNECT_TECH_PCI_XR79X_12_XIG01X: 752 case PCI_DEVICE_ID_CONNECT_TECH_PCI_XR79X_16: 753 return CTI_PORT_TYPE_RS232_422_485_HW; 754 default: 755 dev_err(&pcidev->dev, "unknown/unsupported device\n"); 756 return CTI_PORT_TYPE_NONE; 757 } 758} 759 760/** 761 * cti_get_port_type_xr17v35x() - Read port type from the EEPROM 762 * @priv: Device's private structure 763 * @pcidev: Pointer to the PCI device for this port 764 * @port_num: port offset 765 * 766 * CTI XR17V35X based cards have the port types stored in the EEPROM. 767 * This function reads the port type for a single port. 768 * 769 * Return: port type on success, CTI_PORT_TYPE_NONE on failure 770 */ 771static enum cti_port_type cti_get_port_type_xr17v35x(struct exar8250 *priv, 772 struct pci_dev *pcidev, 773 unsigned int port_num) 774{ 775 enum cti_port_type port_type; 776 u16 port_flags; 777 u8 offset; 778 779 offset = CTI_EE_OFF_XR17V35X_PORT_FLAGS + port_num; 780 eeprom_93cx6_read(&priv->eeprom, offset, &port_flags); 781 782 port_type = FIELD_GET(CTI_EE_MASK_PORT_FLAGS_TYPE, port_flags); 783 if (CTI_PORT_TYPE_VALID(port_type)) 784 return port_type; 785 786 /* 787 * If the port type is missing the card assume it is a 788 * RS232/RS422/RS485 card to be safe. 789 * 790 * There is one known board (BEG013) that only has 3 of 4 port types 791 * written to the EEPROM so this acts as a work around. 792 */ 793 dev_warn(&pcidev->dev, "failed to get port %d type from EEPROM\n", port_num); 794 795 return CTI_PORT_TYPE_RS232_422_485_HW; 796} 797 798static int cti_rs485_config_mpio_tristate(struct uart_port *port, 799 struct ktermios *termios, 800 struct serial_rs485 *rs485) 801{ 802 struct exar8250 *priv = (struct exar8250 *)port->private_data; 803 int ret; 804 805 ret = generic_rs485_config(port, termios, rs485); 806 if (ret) 807 return ret; 808 809 // Disable power-on RS485 tri-state via MPIO 810 return cti_tristate_disable(priv, port->port_id); 811} 812 813static void cti_board_init_osc_freq(struct exar8250 *priv, struct pci_dev *pcidev, u8 eeprom_offset) 814{ 815 int osc_freq; 816 817 osc_freq = cti_read_osc_freq(priv, eeprom_offset); 818 if (osc_freq <= 0) { 819 dev_warn(&pcidev->dev, "failed to read OSC freq from EEPROM, using default\n"); 820 osc_freq = CTI_DEFAULT_PCI_OSC_FREQ; 821 } 822 823 priv->osc_freq = osc_freq; 824} 825 826static int cti_port_setup_common(struct exar8250 *priv, 827 struct pci_dev *pcidev, 828 int idx, unsigned int offset, 829 struct uart_8250_port *port) 830{ 831 int ret; 832 833 port->port.port_id = idx; 834 port->port.uartclk = priv->osc_freq; 835 836 ret = serial8250_pci_setup_port(pcidev, port, 0, offset, 0, priv->virt); 837 if (ret) 838 return ret; 839 840 port->port.private_data = (void *)priv; 841 port->port.pm = exar_pm; 842 port->port.shutdown = exar_shutdown; 843 844 return 0; 845} 846 847static int cti_board_init_fpga(struct exar8250 *priv, struct pci_dev *pcidev) 848{ 849 int ret; 850 u16 cfg_val; 851 852 // FPGA OSC is fixed to the 33MHz PCI clock 853 priv->osc_freq = CTI_DEFAULT_FPGA_OSC_FREQ; 854 855 // Enable external interrupts in special cfg space register 856 ret = pci_read_config_word(pcidev, CTI_FPGA_CFG_INT_EN_REG, &cfg_val); 857 if (ret) 858 return pcibios_err_to_errno(ret); 859 860 cfg_val |= CTI_FPGA_CFG_INT_EN_EXT_BIT; 861 ret = pci_write_config_word(pcidev, CTI_FPGA_CFG_INT_EN_REG, cfg_val); 862 if (ret) 863 return pcibios_err_to_errno(ret); 864 865 // RS485 gate needs to be enabled; otherwise RTS/CTS will not work 866 exar_write_reg(priv, CTI_FPGA_RS485_IO_REG, 0x01); 867 868 return 0; 869} 870 871static int cti_port_setup_fpga(struct exar8250 *priv, 872 struct pci_dev *pcidev, 873 struct uart_8250_port *port, 874 int idx) 875{ 876 enum cti_port_type port_type; 877 unsigned int offset; 878 int ret; 879 880 if (idx == 0) { 881 ret = cti_board_init_fpga(priv, pcidev); 882 if (ret) 883 return ret; 884 } 885 886 port_type = cti_get_port_type_fpga(priv, pcidev, idx); 887 888 // FPGA shares port offsets with XR17C15X 889 offset = idx * UART_EXAR_XR17C15X_PORT_OFFSET; 890 port->port.type = PORT_XR17D15X; 891 892 port->port.get_divisor = xr17v35x_get_divisor; 893 port->port.set_divisor = xr17v35x_set_divisor; 894 port->port.startup = xr17v35x_startup; 895 896 if (CTI_PORT_TYPE_RS485(port_type)) { 897 port->port.rs485_config = generic_rs485_config; 898 port->port.rs485_supported = generic_rs485_supported; 899 } 900 901 return cti_port_setup_common(priv, pcidev, idx, offset, port); 902} 903 904static void cti_board_init_xr17v35x(struct exar8250 *priv, struct pci_dev *pcidev) 905{ 906 // XR17V35X uses the PCIe clock rather than an oscillator 907 priv->osc_freq = CTI_DEFAULT_PCIE_OSC_FREQ; 908} 909 910static int cti_port_setup_xr17v35x(struct exar8250 *priv, 911 struct pci_dev *pcidev, 912 struct uart_8250_port *port, 913 int idx) 914{ 915 enum cti_port_type port_type; 916 unsigned int offset; 917 int ret; 918 919 if (idx == 0) 920 cti_board_init_xr17v35x(priv, pcidev); 921 922 port_type = cti_get_port_type_xr17v35x(priv, pcidev, idx); 923 924 offset = idx * UART_EXAR_XR17V35X_PORT_OFFSET; 925 port->port.type = PORT_XR17V35X; 926 927 port->port.get_divisor = xr17v35x_get_divisor; 928 port->port.set_divisor = xr17v35x_set_divisor; 929 port->port.startup = xr17v35x_startup; 930 931 switch (port_type) { 932 case CTI_PORT_TYPE_RS422_485: 933 case CTI_PORT_TYPE_RS232_422_485_HW: 934 port->port.rs485_config = cti_rs485_config_mpio_tristate; 935 port->port.rs485_supported = generic_rs485_supported; 936 break; 937 case CTI_PORT_TYPE_RS232_422_485_SW: 938 case CTI_PORT_TYPE_RS232_422_485_4B: 939 case CTI_PORT_TYPE_RS232_422_485_2B: 940 port->port.rs485_config = generic_rs485_config; 941 port->port.rs485_supported = generic_rs485_supported; 942 break; 943 default: 944 break; 945 } 946 947 ret = cti_port_setup_common(priv, pcidev, idx, offset, port); 948 if (ret) 949 return ret; 950 951 exar_write_reg(priv, (offset + UART_EXAR_8XMODE), 0x00); 952 exar_write_reg(priv, (offset + UART_EXAR_FCTR), UART_FCTR_EXAR_TRGD); 953 exar_write_reg(priv, (offset + UART_EXAR_TXTRG), 128); 954 exar_write_reg(priv, (offset + UART_EXAR_RXTRG), 128); 955 956 return 0; 957} 958 959static void cti_board_init_xr17v25x(struct exar8250 *priv, struct pci_dev *pcidev) 960{ 961 cti_board_init_osc_freq(priv, pcidev, CTI_EE_OFF_XR17V25X_OSC_FREQ); 962 963 /* enable interrupts on cards that need the "PLX fix" */ 964 switch (pcidev->subsystem_device) { 965 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS: 966 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_16_XPRS_A: 967 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_16_XPRS_B: 968 cti_plx_int_enable(priv); 969 break; 970 default: 971 break; 972 } 973} 974 975static int cti_port_setup_xr17v25x(struct exar8250 *priv, 976 struct pci_dev *pcidev, 977 struct uart_8250_port *port, 978 int idx) 979{ 980 enum cti_port_type port_type; 981 unsigned int offset; 982 int ret; 983 984 if (idx == 0) 985 cti_board_init_xr17v25x(priv, pcidev); 986 987 port_type = cti_get_port_type_xr17c15x_xr17v25x(priv, pcidev, idx); 988 989 offset = idx * UART_EXAR_XR17V25X_PORT_OFFSET; 990 port->port.type = PORT_XR17D15X; 991 992 // XR17V25X supports fractional baudrates 993 port->port.get_divisor = xr17v35x_get_divisor; 994 port->port.set_divisor = xr17v35x_set_divisor; 995 port->port.startup = xr17v35x_startup; 996 997 if (CTI_PORT_TYPE_RS485(port_type)) { 998 switch (pcidev->subsystem_device) { 999 // These cards support power on 485 tri-state via MPIO 1000 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_SP: 1001 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_SP_485: 1002 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_4_SP: 1003 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_6_2_SP: 1004 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_6_SP: 1005 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XP_OPTO_LEFT: 1006 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XP_OPTO_RIGHT: 1007 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XP_OPTO: 1008 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_4_XPRS_OPTO: 1009 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS_LP: 1010 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS_LP_485: 1011 port->port.rs485_config = cti_rs485_config_mpio_tristate; 1012 break; 1013 // Otherwise auto or no power on 485 tri-state support 1014 default: 1015 port->port.rs485_config = generic_rs485_config; 1016 break; 1017 } 1018 1019 port->port.rs485_supported = generic_rs485_supported; 1020 } 1021 1022 ret = cti_port_setup_common(priv, pcidev, idx, offset, port); 1023 if (ret) 1024 return ret; 1025 1026 exar_write_reg(priv, (offset + UART_EXAR_8XMODE), 0x00); 1027 exar_write_reg(priv, (offset + UART_EXAR_FCTR), UART_FCTR_EXAR_TRGD); 1028 exar_write_reg(priv, (offset + UART_EXAR_TXTRG), 32); 1029 exar_write_reg(priv, (offset + UART_EXAR_RXTRG), 32); 1030 1031 return 0; 1032} 1033 1034static void cti_board_init_xr17c15x(struct exar8250 *priv, struct pci_dev *pcidev) 1035{ 1036 cti_board_init_osc_freq(priv, pcidev, CTI_EE_OFF_XR17C15X_OSC_FREQ); 1037 1038 /* enable interrupts on cards that need the "PLX fix" */ 1039 switch (pcidev->subsystem_device) { 1040 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XPRS: 1041 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_A: 1042 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_B: 1043 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XPRS_OPTO: 1044 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_OPTO_A: 1045 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_OPTO_B: 1046 cti_plx_int_enable(priv); 1047 break; 1048 default: 1049 break; 1050 } 1051} 1052 1053static int cti_port_setup_xr17c15x(struct exar8250 *priv, 1054 struct pci_dev *pcidev, 1055 struct uart_8250_port *port, 1056 int idx) 1057{ 1058 enum cti_port_type port_type; 1059 unsigned int offset; 1060 1061 if (idx == 0) 1062 cti_board_init_xr17c15x(priv, pcidev); 1063 1064 port_type = cti_get_port_type_xr17c15x_xr17v25x(priv, pcidev, idx); 1065 1066 offset = idx * UART_EXAR_XR17C15X_PORT_OFFSET; 1067 port->port.type = PORT_XR17D15X; 1068 1069 if (CTI_PORT_TYPE_RS485(port_type)) { 1070 switch (pcidev->subsystem_device) { 1071 // These cards support power on 485 tri-state via MPIO 1072 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_SP: 1073 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_SP_485: 1074 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_4_SP: 1075 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_6_2_SP: 1076 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_6_SP: 1077 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XP_OPTO_LEFT: 1078 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XP_OPTO_RIGHT: 1079 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XP_OPTO: 1080 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_4_XPRS_OPTO: 1081 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS_LP: 1082 case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS_LP_485: 1083 port->port.rs485_config = cti_rs485_config_mpio_tristate; 1084 break; 1085 // Otherwise auto or no power on 485 tri-state support 1086 default: 1087 port->port.rs485_config = generic_rs485_config; 1088 break; 1089 } 1090 1091 port->port.rs485_supported = generic_rs485_supported; 1092 } 1093 1094 return cti_port_setup_common(priv, pcidev, idx, offset, port); 1095} 1096 1097static int 1098pci_xr17c154_setup(struct exar8250 *priv, struct pci_dev *pcidev, 1099 struct uart_8250_port *port, int idx) 1100{ 1101 unsigned int offset = idx * 0x200; 1102 unsigned int baud = 921600; 1103 1104 port->port.uartclk = baud * 16; 1105 return default_setup(priv, pcidev, idx, offset, port); 1106} 1107 1108static void setup_gpio(struct pci_dev *pcidev, u8 __iomem *p) 1109{ 1110 /* 1111 * The Commtech adapters required the MPIOs to be driven low. The Exar 1112 * devices will export them as GPIOs, so we pre-configure them safely 1113 * as inputs. 1114 */ 1115 u8 dir = 0x00; 1116 1117 if ((pcidev->vendor == PCI_VENDOR_ID_EXAR) && 1118 (pcidev->subsystem_vendor != PCI_VENDOR_ID_SEALEVEL)) { 1119 // Configure GPIO as inputs for Commtech adapters 1120 dir = 0xff; 1121 } else { 1122 // Configure GPIO as outputs for SeaLevel adapters 1123 dir = 0x00; 1124 } 1125 1126 writeb(0x00, p + UART_EXAR_MPIOINT_7_0); 1127 writeb(0x00, p + UART_EXAR_MPIOLVL_7_0); 1128 writeb(0x00, p + UART_EXAR_MPIO3T_7_0); 1129 writeb(0x00, p + UART_EXAR_MPIOINV_7_0); 1130 writeb(dir, p + UART_EXAR_MPIOSEL_7_0); 1131 writeb(0x00, p + UART_EXAR_MPIOOD_7_0); 1132 writeb(0x00, p + UART_EXAR_MPIOINT_15_8); 1133 writeb(0x00, p + UART_EXAR_MPIOLVL_15_8); 1134 writeb(0x00, p + UART_EXAR_MPIO3T_15_8); 1135 writeb(0x00, p + UART_EXAR_MPIOINV_15_8); 1136 writeb(dir, p + UART_EXAR_MPIOSEL_15_8); 1137 writeb(0x00, p + UART_EXAR_MPIOOD_15_8); 1138} 1139 1140static struct platform_device *__xr17v35x_register_gpio(struct pci_dev *pcidev, 1141 const struct software_node *node) 1142{ 1143 struct platform_device *pdev; 1144 1145 pdev = platform_device_alloc("gpio_exar", PLATFORM_DEVID_AUTO); 1146 if (!pdev) 1147 return NULL; 1148 1149 pdev->dev.parent = &pcidev->dev; 1150 device_set_node(&pdev->dev, dev_fwnode(&pcidev->dev)); 1151 1152 if (device_add_software_node(&pdev->dev, node) < 0 || 1153 platform_device_add(pdev) < 0) { 1154 platform_device_put(pdev); 1155 return NULL; 1156 } 1157 1158 return pdev; 1159} 1160 1161static void __xr17v35x_unregister_gpio(struct platform_device *pdev) 1162{ 1163 device_remove_software_node(&pdev->dev); 1164 platform_device_unregister(pdev); 1165} 1166 1167static const struct property_entry exar_gpio_properties[] = { 1168 PROPERTY_ENTRY_U32("exar,first-pin", 0), 1169 PROPERTY_ENTRY_U32("ngpios", 16), 1170 { } 1171}; 1172 1173static const struct software_node exar_gpio_node = { 1174 .properties = exar_gpio_properties, 1175}; 1176 1177static int xr17v35x_register_gpio(struct pci_dev *pcidev, struct uart_8250_port *port) 1178{ 1179 if (pcidev->vendor == PCI_VENDOR_ID_EXAR) 1180 port->port.private_data = 1181 __xr17v35x_register_gpio(pcidev, &exar_gpio_node); 1182 1183 return 0; 1184} 1185 1186static void xr17v35x_unregister_gpio(struct uart_8250_port *port) 1187{ 1188 if (!port->port.private_data) 1189 return; 1190 1191 __xr17v35x_unregister_gpio(port->port.private_data); 1192 port->port.private_data = NULL; 1193} 1194 1195static int sealevel_rs485_config(struct uart_port *port, struct ktermios *termios, 1196 struct serial_rs485 *rs485) 1197{ 1198 u8 __iomem *p = port->membase; 1199 u8 old_lcr; 1200 u8 efr; 1201 u8 dld; 1202 int ret; 1203 1204 ret = generic_rs485_config(port, termios, rs485); 1205 if (ret) 1206 return ret; 1207 1208 if (!(rs485->flags & SER_RS485_ENABLED)) 1209 return 0; 1210 1211 old_lcr = readb(p + UART_LCR); 1212 1213 /* Set EFR[4]=1 to enable enhanced feature registers */ 1214 efr = readb(p + UART_XR_EFR); 1215 efr |= UART_EFR_ECB; 1216 writeb(efr, p + UART_XR_EFR); 1217 1218 /* Set MCR to use DTR as Auto-RS485 Enable signal */ 1219 writeb(UART_MCR_OUT1, p + UART_MCR); 1220 1221 /* Set LCR[7]=1 to enable access to DLD register */ 1222 writeb(old_lcr | UART_LCR_DLAB, p + UART_LCR); 1223 1224 /* Set DLD[7]=1 for inverted RS485 Enable logic */ 1225 dld = readb(p + UART_EXAR_DLD); 1226 dld |= UART_EXAR_DLD_485_POLARITY; 1227 writeb(dld, p + UART_EXAR_DLD); 1228 1229 writeb(old_lcr, p + UART_LCR); 1230 1231 return 0; 1232} 1233 1234static const struct exar8250_platform exar8250_default_platform = { 1235 .register_gpio = xr17v35x_register_gpio, 1236 .unregister_gpio = xr17v35x_unregister_gpio, 1237 .rs485_config = generic_rs485_config, 1238 .rs485_supported = &generic_rs485_supported, 1239}; 1240 1241static int iot2040_rs485_config(struct uart_port *port, struct ktermios *termios, 1242 struct serial_rs485 *rs485) 1243{ 1244 bool is_rs485 = !!(rs485->flags & SER_RS485_ENABLED); 1245 u8 __iomem *p = port->membase; 1246 u8 mask = IOT2040_UART1_MASK; 1247 u8 mode, value; 1248 1249 if (is_rs485) { 1250 if (rs485->flags & SER_RS485_RX_DURING_TX) 1251 mode = IOT2040_UART_MODE_RS422; 1252 else 1253 mode = IOT2040_UART_MODE_RS485; 1254 1255 if (rs485->flags & SER_RS485_TERMINATE_BUS) 1256 mode |= IOT2040_UART_TERMINATE_BUS; 1257 } else { 1258 mode = IOT2040_UART_MODE_RS232; 1259 } 1260 1261 if (port->line == 3) { 1262 mask <<= IOT2040_UART2_SHIFT; 1263 mode <<= IOT2040_UART2_SHIFT; 1264 } 1265 1266 value = readb(p + UART_EXAR_MPIOLVL_7_0); 1267 value &= ~mask; 1268 value |= mode; 1269 writeb(value, p + UART_EXAR_MPIOLVL_7_0); 1270 1271 return generic_rs485_config(port, termios, rs485); 1272} 1273 1274static const struct serial_rs485 iot2040_rs485_supported = { 1275 .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND | 1276 SER_RS485_RX_DURING_TX | SER_RS485_TERMINATE_BUS, 1277}; 1278 1279static const struct property_entry iot2040_gpio_properties[] = { 1280 PROPERTY_ENTRY_U32("exar,first-pin", 10), 1281 PROPERTY_ENTRY_U32("ngpios", 1), 1282 { } 1283}; 1284 1285static const struct software_node iot2040_gpio_node = { 1286 .properties = iot2040_gpio_properties, 1287}; 1288 1289static int iot2040_register_gpio(struct pci_dev *pcidev, 1290 struct uart_8250_port *port) 1291{ 1292 u8 __iomem *p = port->port.membase; 1293 1294 writeb(IOT2040_UARTS_DEFAULT_MODE, p + UART_EXAR_MPIOLVL_7_0); 1295 writeb(IOT2040_UARTS_GPIO_LO_MODE, p + UART_EXAR_MPIOSEL_7_0); 1296 writeb(IOT2040_UARTS_ENABLE, p + UART_EXAR_MPIOLVL_15_8); 1297 writeb(IOT2040_UARTS_GPIO_HI_MODE, p + UART_EXAR_MPIOSEL_15_8); 1298 1299 port->port.private_data = 1300 __xr17v35x_register_gpio(pcidev, &iot2040_gpio_node); 1301 1302 return 0; 1303} 1304 1305static const struct exar8250_platform iot2040_platform = { 1306 .rs485_config = iot2040_rs485_config, 1307 .rs485_supported = &iot2040_rs485_supported, 1308 .register_gpio = iot2040_register_gpio, 1309 .unregister_gpio = xr17v35x_unregister_gpio, 1310}; 1311 1312/* 1313 * For SIMATIC IOT2000, only IOT2040 and its variants have the Exar device, 1314 * IOT2020 doesn't have. Therefore it is sufficient to match on the common 1315 * board name after the device was found. 1316 */ 1317static const struct dmi_system_id exar_platforms[] = { 1318 { 1319 .matches = { 1320 DMI_EXACT_MATCH(DMI_BOARD_NAME, "SIMATIC IOT2000"), 1321 }, 1322 .driver_data = (void *)&iot2040_platform, 1323 }, 1324 {} 1325}; 1326 1327static const struct exar8250_platform *exar_get_platform(void) 1328{ 1329 const struct dmi_system_id *dmi_match; 1330 1331 dmi_match = dmi_first_match(exar_platforms); 1332 if (dmi_match) 1333 return dmi_match->driver_data; 1334 1335 return &exar8250_default_platform; 1336} 1337 1338static int 1339pci_xr17v35x_setup(struct exar8250 *priv, struct pci_dev *pcidev, 1340 struct uart_8250_port *port, int idx) 1341{ 1342 const struct exar8250_platform *platform = exar_get_platform(); 1343 unsigned int offset = idx * 0x400; 1344 unsigned int baud = 7812500; 1345 u8 __iomem *p; 1346 int ret; 1347 1348 port->port.uartclk = baud * 16; 1349 port->port.rs485_config = platform->rs485_config; 1350 port->port.rs485_supported = *(platform->rs485_supported); 1351 1352 if (pcidev->subsystem_vendor == PCI_VENDOR_ID_SEALEVEL) 1353 port->port.rs485_config = sealevel_rs485_config; 1354 1355 /* 1356 * Setup the UART clock for the devices on expansion slot to 1357 * half the clock speed of the main chip (which is 125MHz) 1358 */ 1359 if (idx >= 8) 1360 port->port.uartclk /= 2; 1361 1362 ret = default_setup(priv, pcidev, idx, offset, port); 1363 if (ret) 1364 return ret; 1365 1366 p = port->port.membase; 1367 1368 writeb(0x00, p + UART_EXAR_8XMODE); 1369 writeb(UART_FCTR_EXAR_TRGD, p + UART_EXAR_FCTR); 1370 writeb(128, p + UART_EXAR_TXTRG); 1371 writeb(128, p + UART_EXAR_RXTRG); 1372 1373 if (idx == 0) { 1374 /* Setup Multipurpose Input/Output pins. */ 1375 setup_gpio(pcidev, p); 1376 1377 ret = platform->register_gpio(pcidev, port); 1378 } 1379 1380 return ret; 1381} 1382 1383static void pci_xr17v35x_exit(struct pci_dev *pcidev) 1384{ 1385 const struct exar8250_platform *platform = exar_get_platform(); 1386 struct exar8250 *priv = pci_get_drvdata(pcidev); 1387 struct uart_8250_port *port = serial8250_get_port(priv->line[0]); 1388 1389 platform->unregister_gpio(port); 1390} 1391 1392static inline void exar_misc_clear(struct exar8250 *priv) 1393{ 1394 /* Clear all PCI interrupts by reading INT0. No effect on IIR */ 1395 readb(priv->virt + UART_EXAR_INT0); 1396 1397 /* Clear INT0 for Expansion Interface slave ports, too */ 1398 if (priv->board->num_ports > 8) 1399 readb(priv->virt + 0x2000 + UART_EXAR_INT0); 1400} 1401 1402/* 1403 * These Exar UARTs have an extra interrupt indicator that could fire for a 1404 * few interrupts that are not presented/cleared through IIR. One of which is 1405 * a wakeup interrupt when coming out of sleep. These interrupts are only 1406 * cleared by reading global INT0 or INT1 registers as interrupts are 1407 * associated with channel 0. The INT[3:0] registers _are_ accessible from each 1408 * channel's address space, but for the sake of bus efficiency we register a 1409 * dedicated handler at the PCI device level to handle them. 1410 */ 1411static irqreturn_t exar_misc_handler(int irq, void *data) 1412{ 1413 exar_misc_clear(data); 1414 1415 return IRQ_HANDLED; 1416} 1417 1418static unsigned int exar_get_nr_ports(struct exar8250_board *board, struct pci_dev *pcidev) 1419{ 1420 if (pcidev->vendor == PCI_VENDOR_ID_ACCESSIO) 1421 return BIT(((pcidev->device & 0x38) >> 3) - 1); 1422 1423 // Check if board struct overrides number of ports 1424 if (board->num_ports > 0) 1425 return board->num_ports; 1426 1427 // Exar encodes # ports in last nibble of PCI Device ID ex. 0358 1428 if (pcidev->vendor == PCI_VENDOR_ID_EXAR) 1429 return pcidev->device & 0x0f; 1430 1431 // Handle CTI FPGA cards 1432 if (pcidev->vendor == PCI_VENDOR_ID_CONNECT_TECH) { 1433 switch (pcidev->device) { 1434 case PCI_DEVICE_ID_CONNECT_TECH_PCI_XR79X_12_XIG00X: 1435 case PCI_DEVICE_ID_CONNECT_TECH_PCI_XR79X_12_XIG01X: 1436 return 12; 1437 case PCI_DEVICE_ID_CONNECT_TECH_PCI_XR79X_16: 1438 return 16; 1439 default: 1440 return 0; 1441 } 1442 } 1443 1444 return 0; 1445} 1446 1447static int 1448exar_pci_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) 1449{ 1450 unsigned int nr_ports, i, bar = 0, maxnr; 1451 struct exar8250_board *board; 1452 struct uart_8250_port uart; 1453 struct exar8250 *priv; 1454 int rc; 1455 1456 board = (struct exar8250_board *)ent->driver_data; 1457 if (!board) 1458 return -EINVAL; 1459 1460 rc = pcim_enable_device(pcidev); 1461 if (rc) 1462 return rc; 1463 1464 maxnr = pci_resource_len(pcidev, bar) >> (board->reg_shift + 3); 1465 1466 nr_ports = exar_get_nr_ports(board, pcidev); 1467 if (nr_ports == 0) 1468 return dev_err_probe(&pcidev->dev, -ENODEV, "failed to get number of ports\n"); 1469 1470 priv = devm_kzalloc(&pcidev->dev, struct_size(priv, line, nr_ports), GFP_KERNEL); 1471 if (!priv) 1472 return -ENOMEM; 1473 1474 priv->board = board; 1475 priv->virt = pcim_iomap(pcidev, bar, 0); 1476 if (!priv->virt) 1477 return -ENOMEM; 1478 1479 pci_set_master(pcidev); 1480 1481 rc = pci_alloc_irq_vectors(pcidev, 1, 1, PCI_IRQ_ALL_TYPES); 1482 if (rc < 0) 1483 return rc; 1484 1485 memset(&uart, 0, sizeof(uart)); 1486 uart.port.flags = UPF_SHARE_IRQ | UPF_EXAR_EFR | UPF_FIXED_TYPE | UPF_FIXED_PORT; 1487 uart.port.irq = pci_irq_vector(pcidev, 0); 1488 uart.port.dev = &pcidev->dev; 1489 1490 /* Clear interrupts */ 1491 exar_misc_clear(priv); 1492 1493 rc = devm_request_irq(&pcidev->dev, uart.port.irq, exar_misc_handler, 1494 IRQF_SHARED, "exar_uart", priv); 1495 if (rc) 1496 return rc; 1497 1498 exar_eeprom_init(priv); 1499 1500 for (i = 0; i < nr_ports && i < maxnr; i++) { 1501 rc = board->setup(priv, pcidev, &uart, i); 1502 if (rc) { 1503 dev_err_probe(&pcidev->dev, rc, "Failed to setup port %u\n", i); 1504 break; 1505 } 1506 1507 dev_dbg(&pcidev->dev, "Setup PCI port: port %lx, irq %d, type %d\n", 1508 uart.port.iobase, uart.port.irq, uart.port.iotype); 1509 1510 priv->line[i] = serial8250_register_8250_port(&uart); 1511 if (priv->line[i] < 0) { 1512 dev_err_probe(&pcidev->dev, priv->line[i], 1513 "Couldn't register serial port %lx, type %d, irq %d\n", 1514 uart.port.iobase, uart.port.iotype, uart.port.irq); 1515 break; 1516 } 1517 } 1518 priv->nr = i; 1519 pci_set_drvdata(pcidev, priv); 1520 return 0; 1521} 1522 1523static void exar_pci_remove(struct pci_dev *pcidev) 1524{ 1525 struct exar8250 *priv = pci_get_drvdata(pcidev); 1526 unsigned int i; 1527 1528 for (i = 0; i < priv->nr; i++) 1529 serial8250_unregister_port(priv->line[i]); 1530 1531 /* Ensure that every init quirk is properly torn down */ 1532 if (priv->board->exit) 1533 priv->board->exit(pcidev); 1534} 1535 1536static int exar_suspend(struct device *dev) 1537{ 1538 struct exar8250 *priv = dev_get_drvdata(dev); 1539 unsigned int i; 1540 1541 for (i = 0; i < priv->nr; i++) 1542 if (priv->line[i] >= 0) 1543 serial8250_suspend_port(priv->line[i]); 1544 1545 return 0; 1546} 1547 1548static int exar_resume(struct device *dev) 1549{ 1550 struct exar8250 *priv = dev_get_drvdata(dev); 1551 unsigned int i; 1552 1553 exar_misc_clear(priv); 1554 1555 for (i = 0; i < priv->nr; i++) 1556 if (priv->line[i] >= 0) 1557 serial8250_resume_port(priv->line[i]); 1558 1559 return 0; 1560} 1561 1562static DEFINE_SIMPLE_DEV_PM_OPS(exar_pci_pm, exar_suspend, exar_resume); 1563 1564static const struct exar8250_board pbn_fastcom335_2 = { 1565 .num_ports = 2, 1566 .setup = pci_fastcom335_setup, 1567}; 1568 1569static const struct exar8250_board pbn_fastcom335_4 = { 1570 .num_ports = 4, 1571 .setup = pci_fastcom335_setup, 1572}; 1573 1574static const struct exar8250_board pbn_fastcom335_8 = { 1575 .num_ports = 8, 1576 .setup = pci_fastcom335_setup, 1577}; 1578 1579static const struct exar8250_board pbn_cti_xr17c15x = { 1580 .setup = cti_port_setup_xr17c15x, 1581}; 1582 1583static const struct exar8250_board pbn_cti_xr17v25x = { 1584 .setup = cti_port_setup_xr17v25x, 1585}; 1586 1587static const struct exar8250_board pbn_cti_xr17v35x = { 1588 .setup = cti_port_setup_xr17v35x, 1589}; 1590 1591static const struct exar8250_board pbn_cti_fpga = { 1592 .setup = cti_port_setup_fpga, 1593}; 1594 1595static const struct exar8250_board pbn_exar_ibm_saturn = { 1596 .num_ports = 1, 1597 .setup = pci_xr17c154_setup, 1598}; 1599 1600static const struct exar8250_board pbn_exar_XR17C15x = { 1601 .setup = pci_xr17c154_setup, 1602}; 1603 1604static const struct exar8250_board pbn_exar_XR17V35x = { 1605 .setup = pci_xr17v35x_setup, 1606 .exit = pci_xr17v35x_exit, 1607}; 1608 1609static const struct exar8250_board pbn_fastcom35x_2 = { 1610 .num_ports = 2, 1611 .setup = pci_xr17v35x_setup, 1612 .exit = pci_xr17v35x_exit, 1613}; 1614 1615static const struct exar8250_board pbn_fastcom35x_4 = { 1616 .num_ports = 4, 1617 .setup = pci_xr17v35x_setup, 1618 .exit = pci_xr17v35x_exit, 1619}; 1620 1621static const struct exar8250_board pbn_fastcom35x_8 = { 1622 .num_ports = 8, 1623 .setup = pci_xr17v35x_setup, 1624 .exit = pci_xr17v35x_exit, 1625}; 1626 1627static const struct exar8250_board pbn_adv_XR17V352 = { 1628 .num_ports = 2, 1629 .setup = pci_xr17v35x_setup, 1630 .exit = pci_xr17v35x_exit, 1631}; 1632 1633static const struct exar8250_board pbn_exar_XR17V4358 = { 1634 .num_ports = 12, 1635 .setup = pci_xr17v35x_setup, 1636 .exit = pci_xr17v35x_exit, 1637}; 1638 1639static const struct exar8250_board pbn_exar_XR17V8358 = { 1640 .num_ports = 16, 1641 .setup = pci_xr17v35x_setup, 1642 .exit = pci_xr17v35x_exit, 1643}; 1644 1645#define CTI_EXAR_DEVICE(devid, bd) { \ 1646 PCI_DEVICE_SUB( \ 1647 PCI_VENDOR_ID_EXAR, \ 1648 PCI_DEVICE_ID_EXAR_##devid, \ 1649 PCI_SUBVENDOR_ID_CONNECT_TECH, \ 1650 PCI_ANY_ID), 0, 0, \ 1651 (kernel_ulong_t)&bd \ 1652 } 1653 1654#define EXAR_DEVICE(vend, devid, bd) { PCI_DEVICE_DATA(vend, devid, &bd) } 1655 1656#define IBM_DEVICE(devid, sdevid, bd) { \ 1657 PCI_DEVICE_SUB( \ 1658 PCI_VENDOR_ID_EXAR, \ 1659 PCI_DEVICE_ID_EXAR_##devid, \ 1660 PCI_SUBVENDOR_ID_IBM, \ 1661 PCI_SUBDEVICE_ID_IBM_##sdevid), 0, 0, \ 1662 (kernel_ulong_t)&bd \ 1663 } 1664 1665#define USR_DEVICE(devid, sdevid, bd) { \ 1666 PCI_DEVICE_SUB( \ 1667 PCI_VENDOR_ID_USR, \ 1668 PCI_DEVICE_ID_EXAR_##devid, \ 1669 PCI_VENDOR_ID_EXAR, \ 1670 PCI_SUBDEVICE_ID_USR_##sdevid), 0, 0, \ 1671 (kernel_ulong_t)&bd \ 1672 } 1673 1674static const struct pci_device_id exar_pci_tbl[] = { 1675 EXAR_DEVICE(ACCESSIO, COM_2S, pbn_exar_XR17C15x), 1676 EXAR_DEVICE(ACCESSIO, COM_4S, pbn_exar_XR17C15x), 1677 EXAR_DEVICE(ACCESSIO, COM_8S, pbn_exar_XR17C15x), 1678 EXAR_DEVICE(ACCESSIO, COM232_8, pbn_exar_XR17C15x), 1679 EXAR_DEVICE(ACCESSIO, COM_2SM, pbn_exar_XR17C15x), 1680 EXAR_DEVICE(ACCESSIO, COM_4SM, pbn_exar_XR17C15x), 1681 EXAR_DEVICE(ACCESSIO, COM_8SM, pbn_exar_XR17C15x), 1682 1683 /* Connect Tech cards with Exar vendor/device PCI IDs */ 1684 CTI_EXAR_DEVICE(XR17C152, pbn_cti_xr17c15x), 1685 CTI_EXAR_DEVICE(XR17C154, pbn_cti_xr17c15x), 1686 CTI_EXAR_DEVICE(XR17C158, pbn_cti_xr17c15x), 1687 1688 CTI_EXAR_DEVICE(XR17V252, pbn_cti_xr17v25x), 1689 CTI_EXAR_DEVICE(XR17V254, pbn_cti_xr17v25x), 1690 CTI_EXAR_DEVICE(XR17V258, pbn_cti_xr17v25x), 1691 1692 CTI_EXAR_DEVICE(XR17V352, pbn_cti_xr17v35x), 1693 CTI_EXAR_DEVICE(XR17V354, pbn_cti_xr17v35x), 1694 CTI_EXAR_DEVICE(XR17V358, pbn_cti_xr17v35x), 1695 1696 /* Connect Tech cards with Connect Tech vendor/device PCI IDs (FPGA based) */ 1697 EXAR_DEVICE(CONNECT_TECH, PCI_XR79X_12_XIG00X, pbn_cti_fpga), 1698 EXAR_DEVICE(CONNECT_TECH, PCI_XR79X_12_XIG01X, pbn_cti_fpga), 1699 EXAR_DEVICE(CONNECT_TECH, PCI_XR79X_16, pbn_cti_fpga), 1700 1701 IBM_DEVICE(XR17C152, SATURN_SERIAL_ONE_PORT, pbn_exar_ibm_saturn), 1702 1703 /* USRobotics USR298x-OEM PCI Modems */ 1704 USR_DEVICE(XR17C152, 2980, pbn_exar_XR17C15x), 1705 USR_DEVICE(XR17C152, 2981, pbn_exar_XR17C15x), 1706 1707 /* ADVANTECH devices */ 1708 EXAR_DEVICE(ADVANTECH, XR17V352, pbn_adv_XR17V352), 1709 1710 /* Exar Corp. XR17C15[248] Dual/Quad/Octal UART */ 1711 EXAR_DEVICE(EXAR, XR17C152, pbn_exar_XR17C15x), 1712 EXAR_DEVICE(EXAR, XR17C154, pbn_exar_XR17C15x), 1713 EXAR_DEVICE(EXAR, XR17C158, pbn_exar_XR17C15x), 1714 1715 /* Exar Corp. XR17V[48]35[248] Dual/Quad/Octal/Hexa PCIe UARTs */ 1716 EXAR_DEVICE(EXAR, XR17V352, pbn_exar_XR17V35x), 1717 EXAR_DEVICE(EXAR, XR17V354, pbn_exar_XR17V35x), 1718 EXAR_DEVICE(EXAR, XR17V358, pbn_exar_XR17V35x), 1719 EXAR_DEVICE(EXAR, XR17V4358, pbn_exar_XR17V4358), 1720 EXAR_DEVICE(EXAR, XR17V8358, pbn_exar_XR17V8358), 1721 EXAR_DEVICE(COMMTECH, 4222PCIE, pbn_fastcom35x_2), 1722 EXAR_DEVICE(COMMTECH, 4224PCIE, pbn_fastcom35x_4), 1723 EXAR_DEVICE(COMMTECH, 4228PCIE, pbn_fastcom35x_8), 1724 1725 EXAR_DEVICE(COMMTECH, 4222PCI335, pbn_fastcom335_2), 1726 EXAR_DEVICE(COMMTECH, 4224PCI335, pbn_fastcom335_4), 1727 EXAR_DEVICE(COMMTECH, 2324PCI335, pbn_fastcom335_4), 1728 EXAR_DEVICE(COMMTECH, 2328PCI335, pbn_fastcom335_8), 1729 { 0, } 1730}; 1731MODULE_DEVICE_TABLE(pci, exar_pci_tbl); 1732 1733static struct pci_driver exar_pci_driver = { 1734 .name = "exar_serial", 1735 .probe = exar_pci_probe, 1736 .remove = exar_pci_remove, 1737 .driver = { 1738 .pm = pm_sleep_ptr(&exar_pci_pm), 1739 }, 1740 .id_table = exar_pci_tbl, 1741}; 1742module_pci_driver(exar_pci_driver); 1743 1744MODULE_IMPORT_NS("SERIAL_8250_PCI"); 1745MODULE_LICENSE("GPL"); 1746MODULE_DESCRIPTION("Exar Serial Driver"); 1747MODULE_AUTHOR("Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>");