|
@@ -0,0 +1,62 @@
|
|
|
+diff --git a/Documentation/serial/serial-rs485.txt b/Documentation/serial/serial-rs485.txt
|
|
|
+index 2253b8b45a74..6225a3b759de 100644
|
|
|
+--- a/Documentation/serial/serial-rs485.txt
|
|
|
++++ b/Documentation/serial/serial-rs485.txt
|
|
|
+@@ -73,6 +73,9 @@
|
|
|
+ /* Set rts delay before send, if needed: */
|
|
|
+ rs485conf.delay_rts_before_send = ...;
|
|
|
+
|
|
|
++ /* Set udelay_before_enable_tx, if needed: */
|
|
|
++ rs485conf.udelay_before_enable_tx = ...;
|
|
|
++
|
|
|
+ /* Set rts delay after send, if needed: */
|
|
|
+ rs485conf.delay_rts_after_send = ...;
|
|
|
+
|
|
|
+diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
|
|
|
+index 2c6c06f3d61c..19f51585641b 100644
|
|
|
+--- a/drivers/tty/serial/omap-serial.c
|
|
|
++++ b/drivers/tty/serial/omap-serial.c
|
|
|
+@@ -423,6 +423,8 @@ static void serial_omap_start_tx(struct uart_port *port)
|
|
|
+ /* if rts not already enabled */
|
|
|
+ res = (port->rs485.flags & SER_RS485_RTS_ON_SEND) ? 1 : 0;
|
|
|
+ if (gpio_get_value(up->rts_gpio) != res) {
|
|
|
++ if(port->rs485.udelay_before_enable_tx)
|
|
|
++ udelay(port->rs485.udelay_before_enable_tx);
|
|
|
+ gpio_set_value(up->rts_gpio, res);
|
|
|
+ if (port->rs485.delay_rts_before_send > 0)
|
|
|
+ mdelay(port->rs485.delay_rts_before_send);
|
|
|
+@@ -1545,7 +1547,7 @@ static int serial_omap_probe_rs485(struct uart_omap_port *up,
|
|
|
+ struct device_node *np)
|
|
|
+ {
|
|
|
+ struct serial_rs485 *rs485conf = &up->port.rs485;
|
|
|
+- u32 rs485_delay[2];
|
|
|
++ u32 rs485_delay[3];
|
|
|
+ enum of_gpio_flags flags;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+@@ -1577,9 +1579,10 @@ static int serial_omap_probe_rs485(struct uart_omap_port *up,
|
|
|
+ }
|
|
|
+
|
|
|
+ if (of_property_read_u32_array(np, "rs485-rts-delay",
|
|
|
+- rs485_delay, 2) == 0) {
|
|
|
++ rs485_delay, 3) == 0) {
|
|
|
+ rs485conf->delay_rts_before_send = rs485_delay[0];
|
|
|
+ rs485conf->delay_rts_after_send = rs485_delay[1];
|
|
|
++ rs485conf->udelay_before_enable_tx = rs485_delay[2];
|
|
|
+ }
|
|
|
+
|
|
|
+ if (of_property_read_bool(np, "rs485-rx-during-tx"))
|
|
|
+diff --git a/include/uapi/linux/serial.h b/include/uapi/linux/serial.h
|
|
|
+index 5d59c3ebf459..d100bdac93c2 100644
|
|
|
+--- a/include/uapi/linux/serial.h
|
|
|
++++ b/include/uapi/linux/serial.h
|
|
|
+@@ -124,7 +124,8 @@ struct serial_rs485 {
|
|
|
+ #define SER_RS485_RX_DURING_TX (1 << 4)
|
|
|
+ __u32 delay_rts_before_send; /* Delay before send (milliseconds) */
|
|
|
+ __u32 delay_rts_after_send; /* Delay after send (milliseconds) */
|
|
|
+- __u32 padding[5]; /* Memory is cheap, new structs
|
|
|
++ __u32 udelay_before_enable_tx;/* Delay before switching to tx direction */
|
|
|
++ __u32 padding[4]; /* Memory is cheap, new structs
|
|
|
+ are a royal PITA .. */
|
|
|
+ };
|
|
|
+
|