.. | .. |
---|
125 | 125 | u32 tx_fifo_width; |
---|
126 | 126 | u32 rx_fifo_depth; |
---|
127 | 127 | bool setup; |
---|
| 128 | + unsigned long clk_rate; |
---|
128 | 129 | int (*handle_rx)(struct uart_port *uport, u32 bytes, bool drop); |
---|
129 | 130 | unsigned int baud; |
---|
130 | 131 | void *rx_fifo; |
---|
.. | .. |
---|
866 | 867 | return IRQ_HANDLED; |
---|
867 | 868 | } |
---|
868 | 869 | |
---|
869 | | -static void get_tx_fifo_size(struct qcom_geni_serial_port *port) |
---|
| 870 | +static int setup_fifos(struct qcom_geni_serial_port *port) |
---|
870 | 871 | { |
---|
871 | 872 | struct uart_port *uport; |
---|
| 873 | + u32 old_rx_fifo_depth = port->rx_fifo_depth; |
---|
872 | 874 | |
---|
873 | 875 | uport = &port->uport; |
---|
874 | 876 | port->tx_fifo_depth = geni_se_get_tx_fifo_depth(&port->se); |
---|
.. | .. |
---|
876 | 878 | port->rx_fifo_depth = geni_se_get_rx_fifo_depth(&port->se); |
---|
877 | 879 | uport->fifosize = |
---|
878 | 880 | (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; |
---|
879 | 891 | } |
---|
880 | 892 | |
---|
881 | 893 | |
---|
.. | .. |
---|
890 | 902 | u32 rxstale = DEFAULT_BITS_PER_CHAR * STALE_TIMEOUT; |
---|
891 | 903 | u32 proto; |
---|
892 | 904 | u32 pin_swap; |
---|
| 905 | + int ret; |
---|
893 | 906 | |
---|
894 | 907 | proto = geni_se_read_proto(&port->se); |
---|
895 | 908 | if (proto != GENI_SE_UART) { |
---|
.. | .. |
---|
899 | 912 | |
---|
900 | 913 | qcom_geni_serial_stop_rx(uport); |
---|
901 | 914 | |
---|
902 | | - get_tx_fifo_size(port); |
---|
| 915 | + ret = setup_fifos(port); |
---|
| 916 | + if (ret) |
---|
| 917 | + return ret; |
---|
903 | 918 | |
---|
904 | 919 | writel(rxstale, uport->membase + SE_UART_RX_STALE_CNT); |
---|
905 | 920 | |
---|
.. | .. |
---|
1008 | 1023 | goto out_restart_rx; |
---|
1009 | 1024 | |
---|
1010 | 1025 | uport->uartclk = clk_rate; |
---|
| 1026 | + port->clk_rate = clk_rate; |
---|
1011 | 1027 | dev_pm_opp_set_rate(uport->dev, clk_rate); |
---|
1012 | 1028 | ser_clk_cfg = SER_CLK_EN; |
---|
1013 | 1029 | ser_clk_cfg |= clk_div << CLK_DIV_SHFT; |
---|
.. | .. |
---|
1291 | 1307 | |
---|
1292 | 1308 | if (new_state == UART_PM_STATE_ON && old_state == UART_PM_STATE_OFF) { |
---|
1293 | 1309 | geni_icc_enable(&port->se); |
---|
| 1310 | + if (port->clk_rate) |
---|
| 1311 | + dev_pm_opp_set_rate(uport->dev, port->clk_rate); |
---|
1294 | 1312 | geni_se_resources_on(&port->se); |
---|
1295 | 1313 | } else if (new_state == UART_PM_STATE_OFF && |
---|
1296 | 1314 | old_state == UART_PM_STATE_ON) { |
---|
1297 | 1315 | geni_se_resources_off(&port->se); |
---|
| 1316 | + dev_pm_opp_set_rate(uport->dev, 0); |
---|
1298 | 1317 | geni_icc_disable(&port->se); |
---|
1299 | 1318 | } |
---|
1300 | 1319 | } |
---|
.. | .. |
---|
1453 | 1472 | uart_remove_one_port(drv, uport); |
---|
1454 | 1473 | goto err; |
---|
1455 | 1474 | } |
---|
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); |
---|
1463 | 1475 | |
---|
1464 | 1476 | if (port->wakeup_irq > 0) { |
---|
1465 | 1477 | device_init_wakeup(&pdev->dev, true); |
---|