Unverified Commit 7c7e6c89 authored by Niklas Schnelle's avatar Niklas Schnelle Committed by Arnd Bergmann
Browse files

tty: serial: handle HAS_IOPORT dependencies



In a future patch HAS_IOPORT=n will disable inb()/outb() and friends at
compile time. We thus need to add HAS_IOPORT as dependency for those
drivers using them unconditionally. Some 8250 serial drivers support
MMIO only use, so fence only the parts requiring I/O ports and print an
error message if a device can't be supported with the current
configuration.

Co-developed-by: default avatarArnd Bergmann <arnd@kernel.org>
Signed-off-by: default avatarArnd Bergmann <arnd@kernel.org>
Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: default avatarMaciej W. Rozycki <macro@orcam.me.uk>
Signed-off-by: default avatarNiklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent f663c6ae
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -220,7 +220,7 @@ config MOXA_INTELLIO

config MOXA_SMARTIO
	tristate "Moxa SmartIO support v. 2.0"
	depends on SERIAL_NONSTANDARD && PCI
	depends on SERIAL_NONSTANDARD && PCI && HAS_IOPORT
	help
	  Say Y here if you have a Moxa SmartIO multiport serial card and/or
	  want to help develop a new version of this driver.
@@ -302,7 +302,7 @@ config GOLDFISH_TTY_EARLY_CONSOLE

config IPWIRELESS
	tristate "IPWireless 3G UMTS PCMCIA card support"
	depends on PCMCIA && NETDEVICES
	depends on PCMCIA && NETDEVICES && HAS_IOPORT
	select PPP
	help
	  This is a driver for 3G UMTS PCMCIA card from IPWireless company. In
+4 −0
Original line number Diff line number Diff line
@@ -46,8 +46,10 @@ static unsigned int serial8250_early_in(struct uart_port *port, int offset)
		return readl(port->membase + offset);
	case UPIO_MEM32BE:
		return ioread32be(port->membase + offset);
#ifdef CONFIG_HAS_IOPORT
	case UPIO_PORT:
		return inb(port->iobase + offset);
#endif
	default:
		return 0;
	}
@@ -70,9 +72,11 @@ static void serial8250_early_out(struct uart_port *port, int offset, int value)
	case UPIO_MEM32BE:
		iowrite32be(value, port->membase + offset);
		break;
#ifdef CONFIG_HAS_IOPORT
	case UPIO_PORT:
		outb(value, port->iobase + offset);
		break;
#endif
	}
}

+40 −0
Original line number Diff line number Diff line
@@ -964,6 +964,9 @@ static int pci_ite887x_init(struct pci_dev *dev)
	struct resource *iobase = NULL;
	u32 miscr, uartbar, ioport;

	if (!IS_ENABLED(CONFIG_HAS_IOPORT))
		return serial_8250_warn_need_ioport(dev);

	/* search for the base-ioport */
	for (i = 0; i < ARRAY_SIZE(inta_addr); i++) {
		iobase = request_region(inta_addr[i], ITE_887x_IOSIZE,
@@ -1514,6 +1517,9 @@ static int pci_quatech_init(struct pci_dev *dev)
	const struct pci_device_id *match;
	bool amcc = false;

	if (!IS_ENABLED(CONFIG_HAS_IOPORT))
		return serial_8250_warn_need_ioport(dev);

	match = pci_match_id(quatech_cards, dev);
	if (match)
		amcc = match->driver_data;
@@ -1538,6 +1544,9 @@ static int pci_quatech_setup(struct serial_private *priv,
		  const struct pciserial_board *board,
		  struct uart_8250_port *port, int idx)
{
	if (!IS_ENABLED(CONFIG_HAS_IOPORT))
		return serial_8250_warn_need_ioport(priv->dev);

	/* Needed by pci_quatech calls below */
	port->port.iobase = pci_resource_start(priv->dev, FL_GET_BASE(board->flags));
	/* Set up the clocking */
@@ -1655,6 +1664,9 @@ static int pci_fintek_setup(struct serial_private *priv,
	u8 config_base;
	u16 iobase;

	if (!IS_ENABLED(CONFIG_HAS_IOPORT))
		return serial_8250_warn_need_ioport(pdev);

	config_base = 0x40 + 0x08 * idx;

	/* Get the io address from configuration space */
@@ -1686,6 +1698,9 @@ static int pci_fintek_init(struct pci_dev *dev)
	u8 config_base;
	struct serial_private *priv = pci_get_drvdata(dev);

	if (!IS_ENABLED(CONFIG_HAS_IOPORT))
		return serial_8250_warn_need_ioport(dev);

	if (!(pci_resource_flags(dev, 5) & IORESOURCE_IO) ||
			!(pci_resource_flags(dev, 4) & IORESOURCE_IO) ||
			!(pci_resource_flags(dev, 3) & IORESOURCE_IO))
@@ -1864,6 +1879,9 @@ static int kt_serial_setup(struct serial_private *priv,
			   const struct pciserial_board *board,
			   struct uart_8250_port *port, int idx)
{
	if (!IS_ENABLED(CONFIG_HAS_IOPORT))
		return serial_8250_warn_need_ioport(priv->dev);

	port->port.flags |= UPF_BUG_THRE;
	port->port.serial_in = kt_serial_in;
	port->port.handle_break = kt_handle_break;
@@ -1884,6 +1902,9 @@ pci_wch_ch353_setup(struct serial_private *priv,
		    const struct pciserial_board *board,
		    struct uart_8250_port *port, int idx)
{
	if (!IS_ENABLED(CONFIG_HAS_IOPORT))
		return serial_8250_warn_need_ioport(priv->dev);

	port->port.flags |= UPF_FIXED_TYPE;
	port->port.type = PORT_16550A;
	return pci_default_setup(priv, board, port, idx);
@@ -1894,6 +1915,9 @@ pci_wch_ch355_setup(struct serial_private *priv,
		const struct pciserial_board *board,
		struct uart_8250_port *port, int idx)
{
	if (!IS_ENABLED(CONFIG_HAS_IOPORT))
		return serial_8250_warn_need_ioport(priv->dev);

	port->port.flags |= UPF_FIXED_TYPE;
	port->port.type = PORT_16550A;
	return pci_default_setup(priv, board, port, idx);
@@ -1904,6 +1928,9 @@ pci_wch_ch38x_setup(struct serial_private *priv,
		    const struct pciserial_board *board,
		    struct uart_8250_port *port, int idx)
{
	if (!IS_ENABLED(CONFIG_HAS_IOPORT))
		return serial_8250_warn_need_ioport(priv->dev);

	port->port.flags |= UPF_FIXED_TYPE;
	port->port.type = PORT_16850;
	return pci_default_setup(priv, board, port, idx);
@@ -1918,6 +1945,8 @@ static int pci_wch_ch38x_init(struct pci_dev *dev)
	int max_port;
	unsigned long iobase;

	if (!IS_ENABLED(CONFIG_HAS_IOPORT))
		return serial_8250_warn_need_ioport(dev);

	switch (dev->device) {
	case 0x3853: /* 8 ports */
@@ -1937,6 +1966,11 @@ static void pci_wch_ch38x_exit(struct pci_dev *dev)
{
	unsigned long iobase;

	if (!IS_ENABLED(CONFIG_HAS_IOPORT)) {
		serial_8250_warn_need_ioport(dev);
		return;
	}

	iobase = pci_resource_start(dev, 0);
	outb(0x0, iobase + CH384_XINT_ENABLE_REG);
}
@@ -2052,6 +2086,9 @@ static int pci_moxa_init(struct pci_dev *dev)
	unsigned int i, num_ports = moxa_get_nports(device);
	u8 val, init_mode = MOXA_RS232;

	if (!IS_ENABLED(CONFIG_HAS_IOPORT))
		return serial_8250_warn_need_ioport(dev);

	if (!(pci_moxa_supported_rs(dev) & MOXA_SUPP_RS232)) {
		init_mode = MOXA_RS422;
	}
@@ -2084,6 +2121,9 @@ pci_moxa_setup(struct serial_private *priv,
	unsigned int bar = FL_GET_BASE(board->flags);
	int offset;

	if (!IS_ENABLED(CONFIG_HAS_IOPORT))
		return serial_8250_warn_need_ioport(priv->dev);

	if (board->num_ports == 4 && idx == 3)
		offset = 7 * board->uart_offset;
	else
+11 −1
Original line number Diff line number Diff line
@@ -12,6 +12,14 @@
#include "8250.h"
#include "8250_pcilib.h"

int serial_8250_warn_need_ioport(struct pci_dev *dev)
{
	dev_warn(&dev->dev,
		 "Serial port not supported because of missing I/O resource\n");

	return -ENXIO;
}

int serial8250_pci_setup_port(struct pci_dev *dev, struct uart_8250_port *port,
		   u8 bar, unsigned int offset, int regshift)
{
@@ -27,12 +35,14 @@ int serial8250_pci_setup_port(struct pci_dev *dev, struct uart_8250_port *port,
		port->port.mapbase = pci_resource_start(dev, bar) + offset;
		port->port.membase = pcim_iomap_table(dev)[bar] + offset;
		port->port.regshift = regshift;
	} else {
	} else if (IS_ENABLED(CONFIG_HAS_IOPORT)) {
		port->port.iotype = UPIO_PORT;
		port->port.iobase = pci_resource_start(dev, bar) + offset;
		port->port.mapbase = 0;
		port->port.membase = NULL;
		port->port.regshift = 0;
	} else {
		return serial_8250_warn_need_ioport(dev);
	}
	return 0;
}
+2 −0
Original line number Diff line number Diff line
@@ -13,3 +13,5 @@ struct uart_8250_port;

int serial8250_pci_setup_port(struct pci_dev *dev, struct uart_8250_port *port, u8 bar,
		   unsigned int offset, int regshift);

int serial_8250_warn_need_ioport(struct pci_dev *dev);
Loading