• Jiri Slaby (SUSE)'s avatar
    tty: serial: introduce transmit helpers · 8275b48b
    Jiri Slaby (SUSE) authored
    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.)
    Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
    Signed-off-by: default avatarJiri Slaby (SUSE) <jirislaby@kernel.org>
    Link: https://lore.kernel.org/r/20221004104927.14361-2-jirislaby@kernel.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    8275b48b
driver.rst 3.33 KB