@@ -147,6 +147,7 @@ static struct uart_driver qcom_geni_uart_driver;
147
147
148
148
static void __qcom_geni_serial_cancel_tx_cmd (struct uart_port * uport );
149
149
static void qcom_geni_serial_cancel_tx_cmd (struct uart_port * uport );
150
+ static int qcom_geni_serial_port_setup (struct uart_port * uport );
150
151
151
152
static inline struct qcom_geni_serial_port * to_dev_port (struct uart_port * uport )
152
153
{
@@ -395,6 +396,23 @@ static void qcom_geni_serial_poll_put_char(struct uart_port *uport,
395
396
writel (c , uport -> membase + SE_GENI_TX_FIFOn );
396
397
qcom_geni_serial_poll_tx_done (uport );
397
398
}
399
+
400
+ static int qcom_geni_serial_poll_init (struct uart_port * uport )
401
+ {
402
+ struct qcom_geni_serial_port * port = to_dev_port (uport );
403
+ int ret ;
404
+
405
+ if (!port -> setup ) {
406
+ ret = qcom_geni_serial_port_setup (uport );
407
+ if (ret )
408
+ return ret ;
409
+ }
410
+
411
+ if (!qcom_geni_serial_secondary_active (uport ))
412
+ geni_se_setup_s_cmd (& port -> se , UART_START_READ , 0 );
413
+
414
+ return 0 ;
415
+ }
398
416
#endif
399
417
400
418
#ifdef CONFIG_SERIAL_QCOM_GENI_CONSOLE
@@ -562,17 +580,16 @@ static void handle_rx_console(struct uart_port *uport, u32 bytes, bool drop)
562
580
}
563
581
#endif /* CONFIG_SERIAL_QCOM_GENI_CONSOLE */
564
582
565
- static void handle_rx_uart (struct uart_port * uport , u32 bytes , bool drop )
583
+ static void handle_rx_uart (struct uart_port * uport , u32 bytes )
566
584
{
567
585
struct qcom_geni_serial_port * port = to_dev_port (uport );
568
586
struct tty_port * tport = & uport -> state -> port ;
569
587
int ret ;
570
588
571
589
ret = tty_insert_flip_string (tport , port -> rx_buf , bytes );
572
590
if (ret != bytes ) {
573
- dev_err (uport -> dev , "%s:Unable to push data ret %d_bytes %d\n" ,
574
- __func__ , ret , bytes );
575
- WARN_ON_ONCE (1 );
591
+ dev_err_ratelimited (uport -> dev , "failed to push data (%d < %u)\n" ,
592
+ ret , bytes );
576
593
}
577
594
uport -> icount .rx += ret ;
578
595
tty_flip_buffer_push (tport );
@@ -787,17 +804,27 @@ static void qcom_geni_serial_start_rx_fifo(struct uart_port *uport)
787
804
static void qcom_geni_serial_stop_rx_dma (struct uart_port * uport )
788
805
{
789
806
struct qcom_geni_serial_port * port = to_dev_port (uport );
807
+ bool done ;
790
808
791
809
if (!qcom_geni_serial_secondary_active (uport ))
792
810
return ;
793
811
794
812
geni_se_cancel_s_cmd (& port -> se );
795
- qcom_geni_serial_poll_bit (uport , SE_GENI_S_IRQ_STATUS ,
796
- S_CMD_CANCEL_EN , true);
797
-
798
- if (qcom_geni_serial_secondary_active (uport ))
813
+ done = qcom_geni_serial_poll_bit (uport , SE_DMA_RX_IRQ_STAT ,
814
+ RX_EOT , true);
815
+ if (done ) {
816
+ writel (RX_EOT | RX_DMA_DONE ,
817
+ uport -> membase + SE_DMA_RX_IRQ_CLR );
818
+ } else {
799
819
qcom_geni_serial_abort_rx (uport );
800
820
821
+ writel (1 , uport -> membase + SE_DMA_RX_FSM_RST );
822
+ qcom_geni_serial_poll_bit (uport , SE_DMA_RX_IRQ_STAT ,
823
+ RX_RESET_DONE , true);
824
+ writel (RX_RESET_DONE | RX_DMA_DONE ,
825
+ uport -> membase + SE_DMA_RX_IRQ_CLR );
826
+ }
827
+
801
828
if (port -> rx_dma_addr ) {
802
829
geni_se_rx_dma_unprep (& port -> se , port -> rx_dma_addr ,
803
830
DMA_RX_BUF_SIZE );
@@ -846,7 +873,7 @@ static void qcom_geni_serial_handle_rx_dma(struct uart_port *uport, bool drop)
846
873
}
847
874
848
875
if (!drop )
849
- handle_rx_uart (uport , rx_in , drop );
876
+ handle_rx_uart (uport , rx_in );
850
877
851
878
ret = geni_se_rx_dma_prep (& port -> se , port -> rx_buf ,
852
879
DMA_RX_BUF_SIZE ,
@@ -1096,10 +1123,12 @@ static void qcom_geni_serial_shutdown(struct uart_port *uport)
1096
1123
{
1097
1124
disable_irq (uport -> irq );
1098
1125
1126
+ uart_port_lock_irq (uport );
1099
1127
qcom_geni_serial_stop_tx (uport );
1100
1128
qcom_geni_serial_stop_rx (uport );
1101
1129
1102
1130
qcom_geni_serial_cancel_tx_cmd (uport );
1131
+ uart_port_unlock_irq (uport );
1103
1132
}
1104
1133
1105
1134
static void qcom_geni_serial_flush_buffer (struct uart_port * uport )
@@ -1152,7 +1181,6 @@ static int qcom_geni_serial_port_setup(struct uart_port *uport)
1152
1181
false, true, true);
1153
1182
geni_se_init (& port -> se , UART_RX_WM , port -> rx_fifo_depth - 2 );
1154
1183
geni_se_select_mode (& port -> se , port -> dev_data -> mode );
1155
- qcom_geni_serial_start_rx (uport );
1156
1184
port -> setup = true;
1157
1185
1158
1186
return 0 ;
@@ -1168,6 +1196,11 @@ static int qcom_geni_serial_startup(struct uart_port *uport)
1168
1196
if (ret )
1169
1197
return ret ;
1170
1198
}
1199
+
1200
+ uart_port_lock_irq (uport );
1201
+ qcom_geni_serial_start_rx (uport );
1202
+ uart_port_unlock_irq (uport );
1203
+
1171
1204
enable_irq (uport -> irq );
1172
1205
1173
1206
return 0 ;
@@ -1253,7 +1286,6 @@ static void qcom_geni_serial_set_termios(struct uart_port *uport,
1253
1286
unsigned int avg_bw_core ;
1254
1287
unsigned long timeout ;
1255
1288
1256
- qcom_geni_serial_stop_rx (uport );
1257
1289
/* baud rate */
1258
1290
baud = uart_get_baud_rate (uport , termios , old , 300 , 4000000 );
1259
1291
@@ -1269,7 +1301,7 @@ static void qcom_geni_serial_set_termios(struct uart_port *uport,
1269
1301
dev_err (port -> se .dev ,
1270
1302
"Couldn't find suitable clock rate for %u\n" ,
1271
1303
baud * sampling_rate );
1272
- goto out_restart_rx ;
1304
+ return ;
1273
1305
}
1274
1306
1275
1307
dev_dbg (port -> se .dev , "desired_rate = %u, clk_rate = %lu, clk_div = %u\n" ,
@@ -1360,8 +1392,6 @@ static void qcom_geni_serial_set_termios(struct uart_port *uport,
1360
1392
writel (stop_bit_len , uport -> membase + SE_UART_TX_STOP_BIT_LEN );
1361
1393
writel (ser_clk_cfg , uport -> membase + GENI_SER_M_CLK_CFG );
1362
1394
writel (ser_clk_cfg , uport -> membase + GENI_SER_S_CLK_CFG );
1363
- out_restart_rx :
1364
- qcom_geni_serial_start_rx (uport );
1365
1395
}
1366
1396
1367
1397
#ifdef CONFIG_SERIAL_QCOM_GENI_CONSOLE
@@ -1582,7 +1612,7 @@ static const struct uart_ops qcom_geni_console_pops = {
1582
1612
#ifdef CONFIG_CONSOLE_POLL
1583
1613
.poll_get_char = qcom_geni_serial_get_char ,
1584
1614
.poll_put_char = qcom_geni_serial_poll_put_char ,
1585
- .poll_init = qcom_geni_serial_port_setup ,
1615
+ .poll_init = qcom_geni_serial_poll_init ,
1586
1616
#endif
1587
1617
.pm = qcom_geni_serial_pm ,
1588
1618
};
@@ -1749,7 +1779,7 @@ static void qcom_geni_serial_remove(struct platform_device *pdev)
1749
1779
uart_remove_one_port (drv , & port -> uport );
1750
1780
}
1751
1781
1752
- static int qcom_geni_serial_sys_suspend (struct device * dev )
1782
+ static int qcom_geni_serial_suspend (struct device * dev )
1753
1783
{
1754
1784
struct qcom_geni_serial_port * port = dev_get_drvdata (dev );
1755
1785
struct uart_port * uport = & port -> uport ;
@@ -1766,7 +1796,7 @@ static int qcom_geni_serial_sys_suspend(struct device *dev)
1766
1796
return uart_suspend_port (private_data -> drv , uport );
1767
1797
}
1768
1798
1769
- static int qcom_geni_serial_sys_resume (struct device * dev )
1799
+ static int qcom_geni_serial_resume (struct device * dev )
1770
1800
{
1771
1801
int ret ;
1772
1802
struct qcom_geni_serial_port * port = dev_get_drvdata (dev );
@@ -1781,38 +1811,6 @@ static int qcom_geni_serial_sys_resume(struct device *dev)
1781
1811
return ret ;
1782
1812
}
1783
1813
1784
- static int qcom_geni_serial_sys_hib_resume (struct device * dev )
1785
- {
1786
- int ret = 0 ;
1787
- struct uart_port * uport ;
1788
- struct qcom_geni_private_data * private_data ;
1789
- struct qcom_geni_serial_port * port = dev_get_drvdata (dev );
1790
-
1791
- uport = & port -> uport ;
1792
- private_data = uport -> private_data ;
1793
-
1794
- if (uart_console (uport )) {
1795
- geni_icc_set_tag (& port -> se , QCOM_ICC_TAG_ALWAYS );
1796
- geni_icc_set_bw (& port -> se );
1797
- ret = uart_resume_port (private_data -> drv , uport );
1798
- /*
1799
- * For hibernation usecase clients for
1800
- * console UART won't call port setup during restore,
1801
- * hence call port setup for console uart.
1802
- */
1803
- qcom_geni_serial_port_setup (uport );
1804
- } else {
1805
- /*
1806
- * Peripheral register settings are lost during hibernation.
1807
- * Update setup flag such that port setup happens again
1808
- * during next session. Clients of HS-UART will close and
1809
- * open the port during hibernation.
1810
- */
1811
- port -> setup = false;
1812
- }
1813
- return ret ;
1814
- }
1815
-
1816
1814
static const struct qcom_geni_device_data qcom_geni_console_data = {
1817
1815
.console = true,
1818
1816
.mode = GENI_SE_FIFO ,
@@ -1824,12 +1822,7 @@ static const struct qcom_geni_device_data qcom_geni_uart_data = {
1824
1822
};
1825
1823
1826
1824
static const struct dev_pm_ops qcom_geni_serial_pm_ops = {
1827
- .suspend = pm_sleep_ptr (qcom_geni_serial_sys_suspend ),
1828
- .resume = pm_sleep_ptr (qcom_geni_serial_sys_resume ),
1829
- .freeze = pm_sleep_ptr (qcom_geni_serial_sys_suspend ),
1830
- .poweroff = pm_sleep_ptr (qcom_geni_serial_sys_suspend ),
1831
- .restore = pm_sleep_ptr (qcom_geni_serial_sys_hib_resume ),
1832
- .thaw = pm_sleep_ptr (qcom_geni_serial_sys_hib_resume ),
1825
+ SYSTEM_SLEEP_PM_OPS (qcom_geni_serial_suspend , qcom_geni_serial_resume )
1833
1826
};
1834
1827
1835
1828
static const struct of_device_id qcom_geni_serial_match_table [] = {
0 commit comments