+
+/**
+ * register_serial - configure a 16x50 serial port at runtime
+ * @req: request structure
+ *
+ * Configure the serial port specified by the request. If the
+ * port exists and is in use an error is returned. If the port
+ * is not currently in the table it is added.
+ *
+ * The port is then probed and if necessary the IRQ is autodetected
+ * If this fails an error is returned.
+ *
+ * On success the port is ready to use and the line number is returned.
+ */
+int register_serial(struct serial_struct *req)
+{
+ struct uart_port port;
+
+ port.iobase = req->port;
+ port.membase = req->iomem_base;
+ port.irq = req->irq;
+ port.uartclk = req->baud_base * 16;
+ port.fifosize = req->xmit_fifo_size;
+ port.regshift = req->iomem_reg_shift;
+ port.iotype = req->io_type;
+ port.flags = req->flags | UPF_BOOT_AUTOCONF;
+ port.mapbase = req->iomap_base;
+ port.dev = NULL;
+
+ if (share_irqs)
+ port.flags |= UPF_SHARE_IRQ;
+
+ if (HIGH_BITS_OFFSET)
+ port.iobase |= (long) req->port_high << HIGH_BITS_OFFSET;
+
+ /*
+ * If a clock rate wasn't specified by the low level driver, then
+ * default to the standard clock rate. This should be 115200 (*16)
+ * and should not depend on the architecture's BASE_BAUD definition.
+ * However, since this API will be deprecated, it's probably a
+ * better idea to convert the drivers to use the new API
+ * (serial8250_register_port and serial8250_unregister_port).
+ */
+ if (port.uartclk == 0) {
+ printk(KERN_WARNING
+ "Serial: registering port at [%08x,%08lx,%p] irq %d with zero baud_base\n",
+ port.iobase, port.mapbase, port.membase, port.irq);
+ printk(KERN_WARNING "Serial: see %s:%d for more information\n",
+ __FILE__, __LINE__);
+ dump_stack();
+
+ /*
+ * Fix it up for now, but this is only a temporary measure.
+ */
+ port.uartclk = BASE_BAUD * 16;
+ }
+
+ return serial8250_register_port(&port);
+}
+EXPORT_SYMBOL(register_serial);
+
+/**
+ * unregister_serial - remove a 16x50 serial port at runtime
+ * @line: serial line number
+ *
+ * Remove one serial port. This may not be called from interrupt
+ * context. We hand the port back to our local PM control.
+ */
+void unregister_serial(int line)
+{
+ serial8250_unregister_port(line);
+}
+EXPORT_SYMBOL(unregister_serial);