On Tue, 20 Sep 2022, Jiri Slaby wrote: > Many serial drivers do the same thing: > * send x_char if set > * keep sending from the xmit circular buffer until either > - the loop reaches the end of the xmit buffer > - TX is stopped > - HW fifo is full > * check for pending characters and: > - wake up tty writers to fill for more data into xmit buffer > - stop TX if there is nothing in the xmit buffer > > The only differences are: > * how to write the character to the HW fifo > * the check of the end condition: > - is the HW fifo full? > - is limit of the written characters reached? > > So unify the above into two helpers: > * uart_port_tx_limited() -- it performs the above taking the written > characters limit into account, and > * uart_port_tx() -- the same as above, except it only checks the HW > readiness, not the characters limit. > > The HW specific operations (as stated as "differences" above) are passed > as arguments to the macros. They are: > * tx_ready -- returns true if HW can accept more data. > * put_char -- write a character to the device. > * tx_done -- when the write loop is done, perform arbitrary action > before potential invocation of ops->stop_tx() happens. > > Note that the above are macros. This means the code is generated in > place and the above 3 arguments are "inlined". I.e. no added penalty by > generating call instructions for every single character. Nor any > indirect calls. (As in some previous versions of this patchset.) > > Signed-off-by: Jiri Slaby <jslaby@xxxxxxx> Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx> -- i.