@@ -265,6 +265,8 @@ struct uart_amba_port {
265
265
unsigned int old_cr ; /* state during shutdown */
266
266
unsigned int fixed_baud ; /* vendor-set fixed baud rate */
267
267
char type [12 ];
268
+ bool rs485_tx_started ;
269
+ unsigned int rs485_tx_drain_interval ; /* usecs */
268
270
#ifdef CONFIG_DMA_ENGINE
269
271
/* DMA stuff */
270
272
bool using_tx_dma ;
@@ -275,6 +277,8 @@ struct uart_amba_port {
275
277
#endif
276
278
};
277
279
280
+ static unsigned int pl011_tx_empty (struct uart_port * port );
281
+
278
282
static unsigned int pl011_reg_to_offset (const struct uart_amba_port * uap ,
279
283
unsigned int reg )
280
284
{
@@ -1282,6 +1286,42 @@ static inline bool pl011_dma_rx_running(struct uart_amba_port *uap)
1282
1286
#define pl011_dma_flush_buffer NULL
1283
1287
#endif
1284
1288
1289
+ static void pl011_rs485_tx_stop (struct uart_amba_port * uap )
1290
+ {
1291
+ struct uart_port * port = & uap -> port ;
1292
+ int i = 0 ;
1293
+ u32 cr ;
1294
+
1295
+ /* Wait until hardware tx queue is empty */
1296
+ while (!pl011_tx_empty (port )) {
1297
+ if (i == port -> fifosize ) {
1298
+ dev_warn (port -> dev ,
1299
+ "timeout while draining hardware tx queue\n" );
1300
+ break ;
1301
+ }
1302
+
1303
+ udelay (uap -> rs485_tx_drain_interval );
1304
+ i ++ ;
1305
+ }
1306
+
1307
+ if (port -> rs485 .delay_rts_after_send )
1308
+ mdelay (port -> rs485 .delay_rts_after_send );
1309
+
1310
+ cr = pl011_read (uap , REG_CR );
1311
+
1312
+ if (port -> rs485 .flags & SER_RS485_RTS_AFTER_SEND )
1313
+ cr &= ~UART011_CR_RTS ;
1314
+ else
1315
+ cr |= UART011_CR_RTS ;
1316
+
1317
+ /* Disable the transmitter and reenable the transceiver */
1318
+ cr &= ~UART011_CR_TXE ;
1319
+ cr |= UART011_CR_RXE ;
1320
+ pl011_write (cr , uap , REG_CR );
1321
+
1322
+ uap -> rs485_tx_started = false;
1323
+ }
1324
+
1285
1325
static void pl011_stop_tx (struct uart_port * port )
1286
1326
{
1287
1327
struct uart_amba_port * uap =
@@ -1290,6 +1330,9 @@ static void pl011_stop_tx(struct uart_port *port)
1290
1330
uap -> im &= ~UART011_TXIM ;
1291
1331
pl011_write (uap -> im , uap , REG_IMSC );
1292
1332
pl011_dma_tx_stop (uap );
1333
+
1334
+ if ((port -> rs485 .flags & SER_RS485_ENABLED ) && uap -> rs485_tx_started )
1335
+ pl011_rs485_tx_stop (uap );
1293
1336
}
1294
1337
1295
1338
static bool pl011_tx_chars (struct uart_amba_port * uap , bool from_irq );
@@ -1380,6 +1423,32 @@ static bool pl011_tx_char(struct uart_amba_port *uap, unsigned char c,
1380
1423
return true;
1381
1424
}
1382
1425
1426
+ static void pl011_rs485_tx_start (struct uart_amba_port * uap )
1427
+ {
1428
+ struct uart_port * port = & uap -> port ;
1429
+ u32 cr ;
1430
+
1431
+ /* Enable transmitter */
1432
+ cr = pl011_read (uap , REG_CR );
1433
+ cr |= UART011_CR_TXE ;
1434
+
1435
+ /* Disable receiver if half-duplex */
1436
+ if (!(port -> rs485 .flags & SER_RS485_RX_DURING_TX ))
1437
+ cr &= ~UART011_CR_RXE ;
1438
+
1439
+ if (port -> rs485 .flags & SER_RS485_RTS_ON_SEND )
1440
+ cr &= ~UART011_CR_RTS ;
1441
+ else
1442
+ cr |= UART011_CR_RTS ;
1443
+
1444
+ pl011_write (cr , uap , REG_CR );
1445
+
1446
+ if (port -> rs485 .delay_rts_before_send )
1447
+ mdelay (port -> rs485 .delay_rts_before_send );
1448
+
1449
+ uap -> rs485_tx_started = true;
1450
+ }
1451
+
1383
1452
/* Returns true if tx interrupts have to be (kept) enabled */
1384
1453
static bool pl011_tx_chars (struct uart_amba_port * uap , bool from_irq )
1385
1454
{
@@ -1397,6 +1466,10 @@ static bool pl011_tx_chars(struct uart_amba_port *uap, bool from_irq)
1397
1466
return false;
1398
1467
}
1399
1468
1469
+ if ((uap -> port .rs485 .flags & SER_RS485_ENABLED ) &&
1470
+ !uap -> rs485_tx_started )
1471
+ pl011_rs485_tx_start (uap );
1472
+
1400
1473
/* If we are using DMA mode, try to send some characters. */
1401
1474
if (pl011_dma_tx_irq (uap ))
1402
1475
return true;
@@ -1542,6 +1615,9 @@ static void pl011_set_mctrl(struct uart_port *port, unsigned int mctrl)
1542
1615
container_of (port , struct uart_amba_port , port );
1543
1616
unsigned int cr ;
1544
1617
1618
+ if (port -> rs485 .flags & SER_RS485_ENABLED )
1619
+ mctrl &= ~TIOCM_RTS ;
1620
+
1545
1621
cr = pl011_read (uap , REG_CR );
1546
1622
1547
1623
#define TIOCMBIT (tiocmbit , uartbit ) \
@@ -1763,7 +1839,17 @@ static int pl011_startup(struct uart_port *port)
1763
1839
1764
1840
/* restore RTS and DTR */
1765
1841
cr = uap -> old_cr & (UART011_CR_RTS | UART011_CR_DTR );
1766
- cr |= UART01x_CR_UARTEN | UART011_CR_RXE | UART011_CR_TXE ;
1842
+ cr |= UART01x_CR_UARTEN | UART011_CR_RXE ;
1843
+
1844
+ if (port -> rs485 .flags & SER_RS485_ENABLED ) {
1845
+ if (port -> rs485 .flags & SER_RS485_RTS_AFTER_SEND )
1846
+ cr &= ~UART011_CR_RTS ;
1847
+ else
1848
+ cr |= UART011_CR_RTS ;
1849
+ } else {
1850
+ cr |= UART011_CR_TXE ;
1851
+ }
1852
+
1767
1853
pl011_write (cr , uap , REG_CR );
1768
1854
1769
1855
spin_unlock_irq (& uap -> port .lock );
@@ -1864,6 +1950,9 @@ static void pl011_shutdown(struct uart_port *port)
1864
1950
1865
1951
pl011_dma_shutdown (uap );
1866
1952
1953
+ if ((port -> rs485 .flags & SER_RS485_ENABLED ) && uap -> rs485_tx_started )
1954
+ pl011_rs485_tx_stop (uap );
1955
+
1867
1956
free_irq (uap -> port .irq , uap );
1868
1957
1869
1958
pl011_disable_uart (uap );
@@ -1941,6 +2030,7 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios,
1941
2030
unsigned int lcr_h , old_cr ;
1942
2031
unsigned long flags ;
1943
2032
unsigned int baud , quot , clkdiv ;
2033
+ unsigned int bits ;
1944
2034
1945
2035
if (uap -> vendor -> oversampling )
1946
2036
clkdiv = 8 ;
@@ -1991,18 +2081,30 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios,
1991
2081
if (uap -> fifosize > 1 )
1992
2082
lcr_h |= UART01x_LCRH_FEN ;
1993
2083
2084
+ bits = tty_get_frame_size (termios -> c_cflag );
2085
+
1994
2086
spin_lock_irqsave (& port -> lock , flags );
1995
2087
1996
2088
/*
1997
2089
* Update the per-port timeout.
1998
2090
*/
1999
2091
uart_update_timeout (port , termios -> c_cflag , baud );
2000
2092
2093
+ /*
2094
+ * Calculate the approximated time it takes to transmit one character
2095
+ * with the given baud rate. We use this as the poll interval when we
2096
+ * wait for the tx queue to empty.
2097
+ */
2098
+ uap -> rs485_tx_drain_interval = (bits * 1000 * 1000 ) / baud ;
2099
+
2001
2100
pl011_setup_status_masks (port , termios );
2002
2101
2003
2102
if (UART_ENABLE_MS (port , termios -> c_cflag ))
2004
2103
pl011_enable_ms (port );
2005
2104
2105
+ if (port -> rs485 .flags & SER_RS485_ENABLED )
2106
+ termios -> c_cflag &= ~CRTSCTS ;
2107
+
2006
2108
/* first, disable everything */
2007
2109
old_cr = pl011_read (uap , REG_CR );
2008
2110
pl011_write (0 , uap , REG_CR );
@@ -2124,6 +2226,41 @@ static int pl011_verify_port(struct uart_port *port, struct serial_struct *ser)
2124
2226
return ret ;
2125
2227
}
2126
2228
2229
+ static int pl011_rs485_config (struct uart_port * port ,
2230
+ struct serial_rs485 * rs485 )
2231
+ {
2232
+ struct uart_amba_port * uap =
2233
+ container_of (port , struct uart_amba_port , port );
2234
+
2235
+ /* pick sane settings if the user hasn't */
2236
+ if (!(rs485 -> flags & SER_RS485_RTS_ON_SEND ) ==
2237
+ !(rs485 -> flags & SER_RS485_RTS_AFTER_SEND )) {
2238
+ rs485 -> flags |= SER_RS485_RTS_ON_SEND ;
2239
+ rs485 -> flags &= ~SER_RS485_RTS_AFTER_SEND ;
2240
+ }
2241
+ /* clamp the delays to [0, 100ms] */
2242
+ rs485 -> delay_rts_before_send = min (rs485 -> delay_rts_before_send , 100U );
2243
+ rs485 -> delay_rts_after_send = min (rs485 -> delay_rts_after_send , 100U );
2244
+ memset (rs485 -> padding , 0 , sizeof (rs485 -> padding ));
2245
+
2246
+ if (port -> rs485 .flags & SER_RS485_ENABLED )
2247
+ pl011_rs485_tx_stop (uap );
2248
+
2249
+ /* Set new configuration */
2250
+ port -> rs485 = * rs485 ;
2251
+
2252
+ /* Make sure auto RTS is disabled */
2253
+ if (port -> rs485 .flags & SER_RS485_ENABLED ) {
2254
+ u32 cr = pl011_read (uap , REG_CR );
2255
+
2256
+ cr &= ~UART011_CR_RTSEN ;
2257
+ pl011_write (cr , uap , REG_CR );
2258
+ port -> status &= ~UPSTAT_AUTORTS ;
2259
+ }
2260
+
2261
+ return 0 ;
2262
+ }
2263
+
2127
2264
static const struct uart_ops amba_pl011_pops = {
2128
2265
.tx_empty = pl011_tx_empty ,
2129
2266
.set_mctrl = pl011_set_mctrl ,
@@ -2588,10 +2725,28 @@ static int pl011_find_free_port(void)
2588
2725
return - EBUSY ;
2589
2726
}
2590
2727
2728
+ static int pl011_get_rs485_mode (struct uart_amba_port * uap )
2729
+ {
2730
+ struct uart_port * port = & uap -> port ;
2731
+ struct serial_rs485 * rs485 = & port -> rs485 ;
2732
+ int ret ;
2733
+
2734
+ ret = uart_get_rs485_mode (port );
2735
+ if (ret )
2736
+ return ret ;
2737
+
2738
+ /* clamp the delays to [0, 100ms] */
2739
+ rs485 -> delay_rts_before_send = min (rs485 -> delay_rts_before_send , 100U );
2740
+ rs485 -> delay_rts_after_send = min (rs485 -> delay_rts_after_send , 100U );
2741
+
2742
+ return 0 ;
2743
+ }
2744
+
2591
2745
static int pl011_setup_port (struct device * dev , struct uart_amba_port * uap ,
2592
2746
struct resource * mmiobase , int index )
2593
2747
{
2594
2748
void __iomem * base ;
2749
+ int ret ;
2595
2750
2596
2751
base = devm_ioremap_resource (dev , mmiobase );
2597
2752
if (IS_ERR (base ))
@@ -2608,6 +2763,10 @@ static int pl011_setup_port(struct device *dev, struct uart_amba_port *uap,
2608
2763
uap -> port .flags = UPF_BOOT_AUTOCONF ;
2609
2764
uap -> port .line = index ;
2610
2765
2766
+ ret = pl011_get_rs485_mode (uap );
2767
+ if (ret )
2768
+ return ret ;
2769
+
2611
2770
amba_ports [index ] = uap ;
2612
2771
2613
2772
return 0 ;
@@ -2665,7 +2824,7 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
2665
2824
uap -> port .iotype = vendor -> access_32b ? UPIO_MEM32 : UPIO_MEM ;
2666
2825
uap -> port .irq = dev -> irq [0 ];
2667
2826
uap -> port .ops = & amba_pl011_pops ;
2668
-
2827
+ uap -> port . rs485_config = pl011_rs485_config ;
2669
2828
snprintf (uap -> type , sizeof (uap -> type ), "PL011 rev%u" , amba_rev (dev ));
2670
2829
2671
2830
ret = pl011_setup_port (& dev -> dev , uap , & dev -> res , portnr );
0 commit comments