| ==================== | 
 | Low Level Serial API | 
 | ==================== | 
 |  | 
 |  | 
 | This document is meant as a brief overview of some aspects of the new serial | 
 | driver.  It is not complete, any questions you have should be directed to | 
 | <rmk@arm.linux.org.uk> | 
 |  | 
 | The reference implementation is contained within amba-pl011.c. | 
 |  | 
 |  | 
 |  | 
 | Low Level Serial Hardware Driver | 
 | -------------------------------- | 
 |  | 
 | The low level serial hardware driver is responsible for supplying port | 
 | information (defined by uart_port) and a set of control methods (defined | 
 | by uart_ops) to the core serial driver.  The low level driver is also | 
 | responsible for handling interrupts for the port, and providing any | 
 | console support. | 
 |  | 
 |  | 
 | Console Support | 
 | --------------- | 
 |  | 
 | The serial core provides a few helper functions.  This includes | 
 | decoding command line arguments (uart_parse_options()). | 
 |  | 
 | There is also a helper function (uart_console_write()) which performs a | 
 | character by character write, translating newlines to CRLF sequences. | 
 | Driver writers are recommended to use this function rather than implementing | 
 | their own version. | 
 |  | 
 |  | 
 | Locking | 
 | ------- | 
 |  | 
 | It is the responsibility of the low level hardware driver to perform the | 
 | necessary locking using port->lock.  There are some exceptions (which | 
 | are described in the struct uart_ops listing below.) | 
 |  | 
 | There are two locks.  A per-port spinlock, and an overall semaphore. | 
 |  | 
 | From the core driver perspective, the port->lock locks the following | 
 | data:: | 
 |  | 
 | 	port->mctrl | 
 | 	port->icount | 
 | 	port->state->xmit.head (circ_buf->head) | 
 | 	port->state->xmit.tail (circ_buf->tail) | 
 |  | 
 | The low level driver is free to use this lock to provide any additional | 
 | locking. | 
 |  | 
 | The port_sem semaphore is used to protect against ports being added/ | 
 | removed or reconfigured at inappropriate times. Since v2.6.27, this | 
 | semaphore has been the 'mutex' member of the tty_port struct, and | 
 | commonly referred to as the port mutex. | 
 |  | 
 |  | 
 | uart_ops | 
 | -------- | 
 |  | 
 | .. kernel-doc:: include/linux/serial_core.h | 
 |    :identifiers: uart_ops | 
 |  | 
 | Other functions | 
 | --------------- | 
 |  | 
 | .. kernel-doc:: drivers/tty/serial/serial_core.c | 
 |    :identifiers: uart_update_timeout uart_get_baud_rate uart_get_divisor | 
 |            uart_match_port uart_write_wakeup uart_register_driver | 
 |            uart_unregister_driver uart_suspend_port uart_resume_port | 
 |            uart_add_one_port uart_remove_one_port uart_console_write | 
 |            uart_parse_earlycon uart_parse_options uart_set_options | 
 |            uart_get_lsr_info uart_handle_dcd_change uart_handle_cts_change | 
 |            uart_try_toggle_sysrq | 
 |  | 
 | .. kernel-doc:: include/linux/serial_core.h | 
 |    :identifiers: uart_port_tx_limited uart_port_tx | 
 |  | 
 | Other notes | 
 | ----------- | 
 |  | 
 | It is intended some day to drop the 'unused' entries from uart_port, and | 
 | allow low level drivers to register their own individual uart_port's with | 
 | the core.  This will allow drivers to use uart_port as a pointer to a | 
 | structure containing both the uart_port entry with their own extensions, | 
 | thus:: | 
 |  | 
 | 	struct my_port { | 
 | 		struct uart_port	port; | 
 | 		int			my_stuff; | 
 | 	}; | 
 |  | 
 | Modem control lines via GPIO | 
 | ---------------------------- | 
 |  | 
 | Some helpers are provided in order to set/get modem control lines via GPIO. | 
 |  | 
 | .. kernel-doc:: drivers/tty/serial/serial_mctrl_gpio.c | 
 |    :identifiers: mctrl_gpio_init mctrl_gpio_to_gpiod | 
 |            mctrl_gpio_set mctrl_gpio_get mctrl_gpio_enable_ms | 
 |            mctrl_gpio_disable_ms_sync mctrl_gpio_disable_ms_no_sync |