hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/tty/serial/qcom_geni_serial.c
....@@ -125,6 +125,7 @@
125125 u32 tx_fifo_width;
126126 u32 rx_fifo_depth;
127127 bool setup;
128
+ unsigned long clk_rate;
128129 int (*handle_rx)(struct uart_port *uport, u32 bytes, bool drop);
129130 unsigned int baud;
130131 void *rx_fifo;
....@@ -866,9 +867,10 @@
866867 return IRQ_HANDLED;
867868 }
868869
869
-static void get_tx_fifo_size(struct qcom_geni_serial_port *port)
870
+static int setup_fifos(struct qcom_geni_serial_port *port)
870871 {
871872 struct uart_port *uport;
873
+ u32 old_rx_fifo_depth = port->rx_fifo_depth;
872874
873875 uport = &port->uport;
874876 port->tx_fifo_depth = geni_se_get_tx_fifo_depth(&port->se);
....@@ -876,6 +878,16 @@
876878 port->rx_fifo_depth = geni_se_get_rx_fifo_depth(&port->se);
877879 uport->fifosize =
878880 (port->tx_fifo_depth * port->tx_fifo_width) / BITS_PER_BYTE;
881
+
882
+ if (port->rx_fifo && (old_rx_fifo_depth != port->rx_fifo_depth) && port->rx_fifo_depth) {
883
+ port->rx_fifo = devm_krealloc(uport->dev, port->rx_fifo,
884
+ port->rx_fifo_depth * sizeof(u32),
885
+ GFP_KERNEL);
886
+ if (!port->rx_fifo)
887
+ return -ENOMEM;
888
+ }
889
+
890
+ return 0;
879891 }
880892
881893
....@@ -890,6 +902,7 @@
890902 u32 rxstale = DEFAULT_BITS_PER_CHAR * STALE_TIMEOUT;
891903 u32 proto;
892904 u32 pin_swap;
905
+ int ret;
893906
894907 proto = geni_se_read_proto(&port->se);
895908 if (proto != GENI_SE_UART) {
....@@ -899,7 +912,9 @@
899912
900913 qcom_geni_serial_stop_rx(uport);
901914
902
- get_tx_fifo_size(port);
915
+ ret = setup_fifos(port);
916
+ if (ret)
917
+ return ret;
903918
904919 writel(rxstale, uport->membase + SE_UART_RX_STALE_CNT);
905920
....@@ -1008,6 +1023,7 @@
10081023 goto out_restart_rx;
10091024
10101025 uport->uartclk = clk_rate;
1026
+ port->clk_rate = clk_rate;
10111027 dev_pm_opp_set_rate(uport->dev, clk_rate);
10121028 ser_clk_cfg = SER_CLK_EN;
10131029 ser_clk_cfg |= clk_div << CLK_DIV_SHFT;
....@@ -1291,10 +1307,13 @@
12911307
12921308 if (new_state == UART_PM_STATE_ON && old_state == UART_PM_STATE_OFF) {
12931309 geni_icc_enable(&port->se);
1310
+ if (port->clk_rate)
1311
+ dev_pm_opp_set_rate(uport->dev, port->clk_rate);
12941312 geni_se_resources_on(&port->se);
12951313 } else if (new_state == UART_PM_STATE_OFF &&
12961314 old_state == UART_PM_STATE_ON) {
12971315 geni_se_resources_off(&port->se);
1316
+ dev_pm_opp_set_rate(uport->dev, 0);
12981317 geni_icc_disable(&port->se);
12991318 }
13001319 }
....@@ -1453,13 +1472,6 @@
14531472 uart_remove_one_port(drv, uport);
14541473 goto err;
14551474 }
1456
-
1457
- /*
1458
- * Set pm_runtime status as ACTIVE so that wakeup_irq gets
1459
- * enabled/disabled from dev_pm_arm_wake_irq during system
1460
- * suspend/resume respectively.
1461
- */
1462
- pm_runtime_set_active(&pdev->dev);
14631475
14641476 if (port->wakeup_irq > 0) {
14651477 device_init_wakeup(&pdev->dev, true);