Commit 8e23fcc89c8091790903927449f8efb9b4e23960

Authored by David Daney
Committed by Linus Torvalds
1 parent 7d6a07d123

Serial: Allow port type to be specified when calling serial8250_register_port.

Add flag value UPF_FIXED_TYPE which specifies that the UART type is
known and should not be probed.  For this case the UARTs properties
are just copied out of the uart_config entry.

This allows us to keep SOC specific 8250 probe code out of 8250.c.  In
this case we know the serial hardware will not be changing as it is on
the same silicon as the CPU, and we can specify it with certainty in
the board/cpu setup code.

The alternative is to load up 8250.c with a bunch of OCTEON specific
special cases in the probing code.

Signed-off-by: David Daney <ddaney@caviumnetworks.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 4 changed files with 17 additions and 2 deletions Side-by-side Diff

drivers/serial/8250.c
... ... @@ -2903,6 +2903,7 @@
2903 2903 port.mapbase = p->mapbase;
2904 2904 port.hub6 = p->hub6;
2905 2905 port.private_data = p->private_data;
  2906 + port.type = p->type;
2906 2907 port.serial_in = p->serial_in;
2907 2908 port.serial_out = p->serial_out;
2908 2909 port.dev = &dev->dev;
... ... @@ -3058,6 +3059,14 @@
3058 3059 uart->port.private_data = port->private_data;
3059 3060 if (port->dev)
3060 3061 uart->port.dev = port->dev;
  3062 +
  3063 + if (port->flags & UPF_FIXED_TYPE) {
  3064 + uart->port.type = port->type;
  3065 + uart->port.fifosize = uart_config[port->type].fifo_size;
  3066 + uart->capabilities = uart_config[port->type].flags;
  3067 + uart->tx_loadsz = uart_config[port->type].tx_loadsz;
  3068 + }
  3069 +
3061 3070 set_io_from_upio(&uart->port);
3062 3071 /* Possibly override default I/O functions. */
3063 3072 if (port->serial_in)
drivers/serial/serial_core.c
... ... @@ -2179,11 +2179,14 @@
2179 2179 * Now do the auto configuration stuff. Note that config_port
2180 2180 * is expected to claim the resources and map the port for us.
2181 2181 */
2182   - flags = UART_CONFIG_TYPE;
  2182 + flags = 0;
2183 2183 if (port->flags & UPF_AUTO_IRQ)
2184 2184 flags |= UART_CONFIG_IRQ;
2185 2185 if (port->flags & UPF_BOOT_AUTOCONF) {
2186   - port->type = PORT_UNKNOWN;
  2186 + if (!(port->flags & UPF_FIXED_TYPE)) {
  2187 + port->type = PORT_UNKNOWN;
  2188 + flags |= UART_CONFIG_TYPE;
  2189 + }
2187 2190 port->ops->config_port(port, flags);
2188 2191 }
2189 2192  
include/linux/serial_8250.h
... ... @@ -28,6 +28,7 @@
28 28 unsigned char iotype; /* UPIO_* */
29 29 unsigned char hub6;
30 30 upf_t flags; /* UPF_* flags */
  31 + unsigned int type; /* If UPF_FIXED_TYPE */
31 32 unsigned int (*serial_in)(struct uart_port *, int);
32 33 void (*serial_out)(struct uart_port *, int, int);
33 34 };
include/linux/serial_core.h
... ... @@ -295,6 +295,8 @@
295 295 #define UPF_MAGIC_MULTIPLIER ((__force upf_t) (1 << 16))
296 296 #define UPF_CONS_FLOW ((__force upf_t) (1 << 23))
297 297 #define UPF_SHARE_IRQ ((__force upf_t) (1 << 24))
  298 +/* The exact UART type is known and should not be probed. */
  299 +#define UPF_FIXED_TYPE ((__force upf_t) (1 << 27))
298 300 #define UPF_BOOT_AUTOCONF ((__force upf_t) (1 << 28))
299 301 #define UPF_FIXED_PORT ((__force upf_t) (1 << 29))
300 302 #define UPF_DEAD ((__force upf_t) (1 << 30))