Re: [PATCH 3/7] serial: sh-sci: implement FIFO threshold register setting
Hi Uli, On Fri, Dec 9, 2016 at 1:36 PM, Ulrich Hechtwrote: > Sets the closest match for a desired RX trigger level. > > Signed-off-by: Ulrich Hecht Reviewed-by: Geert Uytterhoeven > index de25db8..844288f 100644 > --- a/drivers/tty/serial/sh-sci.c > +++ b/drivers/tty/serial/sh-sci.c > @@ -1103,6 +1103,61 @@ static int sci_handle_breaks(struct uart_port *port) > return copied; > } > > +static int scif_set_rtrg(struct uart_port *port, int rx_trig) > +{ > + if (port->type == PORT_SCIF) { > + } else if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) { > + } else { > + WARN(1, "unknown FIFO configuration"); This cannot happen, right? > + return 1; > + } Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
[PATCH 3/7] serial: sh-sci: implement FIFO threshold register setting
Sets the closest match for a desired RX trigger level. Signed-off-by: Ulrich Hecht--- drivers/tty/serial/sh-sci.c | 55 + 1 file changed, 55 insertions(+) diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index de25db8..844288f 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -1103,6 +1103,61 @@ static int sci_handle_breaks(struct uart_port *port) return copied; } +static int scif_set_rtrg(struct uart_port *port, int rx_trig) +{ + unsigned int bits; + + if (rx_trig < 1) + rx_trig = 1; + if (rx_trig >= port->fifosize) + rx_trig = port->fifosize; + + /* HSCIF can be set to an arbitrary level. */ + if (sci_getreg(port, HSRTRGR)->size) { + serial_port_out(port, HSRTRGR, rx_trig); + return rx_trig; + } + + if (port->type == PORT_SCIF) { + if (rx_trig < 4) { + bits = 0; + rx_trig = 1; + } else if (rx_trig < 8) { + bits = SCFCR_RTRG0; + rx_trig = 4; + } else if (rx_trig < 14) { + bits = SCFCR_RTRG1; + rx_trig = 8; + } else { + bits = SCFCR_RTRG0 | SCFCR_RTRG1; + rx_trig = 14; + } + } else if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) { + if (rx_trig < 16) { + bits = 0; + rx_trig = 1; + } else if (rx_trig < 32) { + bits = SCFCR_RTRG0; + rx_trig = 16; + } else if (rx_trig < 48) { + bits = SCFCR_RTRG1; + rx_trig = 32; + } else { + bits = SCFCR_RTRG0 | SCFCR_RTRG1; + rx_trig = 48; + } + } else { + WARN(1, "unknown FIFO configuration"); + return 1; + } + + serial_port_out(port, SCFCR, + (serial_port_in(port, SCFCR) & + ~(SCFCR_RTRG1 | SCFCR_RTRG0)) | bits); + + return rx_trig; +} + #ifdef CONFIG_SERIAL_SH_SCI_DMA static void sci_dma_tx_complete(void *arg) { -- 2.7.4