Message ID | 1481286971-16667-4-git-send-email-ulrich.hecht+renesas@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Geert Uytterhoeven |
Headers | show |
Hello! On 12/9/2016 3:36 PM, Ulrich Hecht wrote: > Sets the closest match for a desired RX trigger level. > > Signed-off-by: Ulrich Hecht <ulrich.hecht+renesas@gmail.com> > --- > 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) { This is asking to be a *switch* statement instead. > + 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; > + } [...] MBR, Sergei
Hi Uli, On Fri, Dec 9, 2016 at 1:36 PM, Ulrich Hecht <ulrich.hecht+renesas@gmail.com> wrote: > Sets the closest match for a desired RX trigger level. > > Signed-off-by: Ulrich Hecht <ulrich.hecht+renesas@gmail.com> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> > 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 -- geert@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
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) {
Sets the closest match for a desired RX trigger level. Signed-off-by: Ulrich Hecht <ulrich.hecht+renesas@gmail.com> --- drivers/tty/serial/sh-sci.c | 55 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+)