The new serial design After much toying with the various ideas and Russell King's code I have formed the start of what to do. The basic idea is simple. To create a serial core where we can register a device interface to a specific port. This gives use the power to do things like have a serial console without a tty on port 1, input interface on port 2, and a tty interface on port 3. Here are the ideas I have come up with to deal with this. 1) We need to break up what we setup. The primary this we want to do are: I. Register and setup hardware ports in a device independent way. The function to do this is int uart_register_port(struct uart_port *port); II. The next step is to register the various device interfaces i.e tty, input etc. This function sets up devfs, minor numbers etc. It has nothing to do with the hardware. int uart_register_driver(struct uart_driver *uart); III. The final step is when a device is detected that we map it to a specific port. For example if the bus detects a modem then it would only make sense to map the struct uart_driver that represents the tty interface to the port that the modem wants to use. int uart_register_device(struct uart_driver *reg,struct uart_port *port); 2) The structures to represent the hardware and device interfaces. Now with the data we want to have data structs that define the hardware state and be able to change that state. We also want to make those structs visible to the higher level device interface layers. The second set of data is the device layer structs. We don't want them visible to the lower layers. Only the specific device interface would have access to it. At present we have the following data structs: I. struct uart_port. This struct represents a serial port. All the data in it defines the current hardware state. Both low level and device level use this data. II. struct uart_ops. This structure describes all the operations that can be done on the physical hardware. It is apart of struct uart_port. III. struct uart_driver. The data here presents the device interface used to represent the hardware. This struct should be interface independent. A void field would be added to this struct which could be cast in the higher device level. That data field would depend on the device interface.