aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/imx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/tty/serial/imx.c')
-rw-r--r--drivers/tty/serial/imx.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index e7feceeebc2..267ec6da5af 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -204,7 +204,8 @@ struct imx_port {
204 unsigned int irda_inv_rx:1; 204 unsigned int irda_inv_rx:1;
205 unsigned int irda_inv_tx:1; 205 unsigned int irda_inv_tx:1;
206 unsigned short trcv_delay; /* transceiver delay */ 206 unsigned short trcv_delay; /* transceiver delay */
207 struct clk *clk; 207 struct clk *clk_ipg;
208 struct clk *clk_per;
208 struct imx_uart_data *devdata; 209 struct imx_uart_data *devdata;
209}; 210};
210 211
@@ -672,7 +673,7 @@ static int imx_setup_ufcr(struct imx_port *sport, unsigned int mode)
672 * RFDIV is set such way to satisfy requested uartclk value 673 * RFDIV is set such way to satisfy requested uartclk value
673 */ 674 */
674 val = TXTL << 10 | RXTL; 675 val = TXTL << 10 | RXTL;
675 ufcr_rfdiv = (clk_get_rate(sport->clk) + sport->port.uartclk / 2) 676 ufcr_rfdiv = (clk_get_rate(sport->clk_per) + sport->port.uartclk / 2)
676 / sport->port.uartclk; 677 / sport->port.uartclk;
677 678
678 if(!ufcr_rfdiv) 679 if(!ufcr_rfdiv)
@@ -1285,7 +1286,7 @@ imx_console_get_options(struct imx_port *sport, int *baud,
1285 else 1286 else
1286 ucfr_rfdiv = 6 - ucfr_rfdiv; 1287 ucfr_rfdiv = 6 - ucfr_rfdiv;
1287 1288
1288 uartclk = clk_get_rate(sport->clk); 1289 uartclk = clk_get_rate(sport->clk_per);
1289 uartclk /= ucfr_rfdiv; 1290 uartclk /= ucfr_rfdiv;
1290 1291
1291 { /* 1292 { /*
@@ -1503,14 +1504,22 @@ static int serial_imx_probe(struct platform_device *pdev)
1503 sport->timer.function = imx_timeout; 1504 sport->timer.function = imx_timeout;
1504 sport->timer.data = (unsigned long)sport; 1505 sport->timer.data = (unsigned long)sport;
1505 1506
1506 sport->clk = clk_get(&pdev->dev, "uart"); 1507 sport->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
1507 if (IS_ERR(sport->clk)) { 1508 if (IS_ERR(sport->clk_ipg)) {
1508 ret = PTR_ERR(sport->clk); 1509 ret = PTR_ERR(sport->clk_ipg);
1509 goto unmap; 1510 goto unmap;
1510 } 1511 }
1511 clk_prepare_enable(sport->clk);
1512 1512
1513 sport->port.uartclk = clk_get_rate(sport->clk); 1513 sport->clk_per = devm_clk_get(&pdev->dev, "per");
1514 if (IS_ERR(sport->clk_per)) {
1515 ret = PTR_ERR(sport->clk_per);
1516 goto unmap;
1517 }
1518
1519 clk_prepare_enable(sport->clk_per);
1520 clk_prepare_enable(sport->clk_ipg);
1521
1522 sport->port.uartclk = clk_get_rate(sport->clk_per);
1514 1523
1515 imx_ports[sport->port.line] = sport; 1524 imx_ports[sport->port.line] = sport;
1516 1525
@@ -1531,8 +1540,8 @@ deinit:
1531 if (pdata && pdata->exit) 1540 if (pdata && pdata->exit)
1532 pdata->exit(pdev); 1541 pdata->exit(pdev);
1533clkput: 1542clkput:
1534 clk_disable_unprepare(sport->clk); 1543 clk_disable_unprepare(sport->clk_per);
1535 clk_put(sport->clk); 1544 clk_disable_unprepare(sport->clk_ipg);
1536unmap: 1545unmap:
1537 iounmap(sport->port.membase); 1546 iounmap(sport->port.membase);
1538free: 1547free:
@@ -1550,11 +1559,10 @@ static int serial_imx_remove(struct platform_device *pdev)
1550 1559
1551 platform_set_drvdata(pdev, NULL); 1560 platform_set_drvdata(pdev, NULL);
1552 1561
1553 if (sport) { 1562 uart_remove_one_port(&imx_reg, &sport->port);
1554 uart_remove_one_port(&imx_reg, &sport->port); 1563
1555 clk_disable_unprepare(sport->clk); 1564 clk_disable_unprepare(sport->clk_per);
1556 clk_put(sport->clk); 1565 clk_disable_unprepare(sport->clk_ipg);
1557 }
1558 1566
1559 if (pdata && pdata->exit) 1567 if (pdata && pdata->exit)
1560 pdata->exit(pdev); 1568 pdata->exit(pdev);