diff options
Diffstat (limited to 'drivers/serial/atmel_serial.c')
| -rw-r--r-- | drivers/serial/atmel_serial.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c index 61fb8b6d19af..d5efd6c77904 100644 --- a/drivers/serial/atmel_serial.c +++ b/drivers/serial/atmel_serial.c | |||
| @@ -1258,6 +1258,8 @@ static void __devinit atmel_init_port(struct atmel_uart_port *atmel_port, | |||
| 1258 | atmel_port->clk = clk_get(&pdev->dev, "usart"); | 1258 | atmel_port->clk = clk_get(&pdev->dev, "usart"); |
| 1259 | clk_enable(atmel_port->clk); | 1259 | clk_enable(atmel_port->clk); |
| 1260 | port->uartclk = clk_get_rate(atmel_port->clk); | 1260 | port->uartclk = clk_get_rate(atmel_port->clk); |
| 1261 | clk_disable(atmel_port->clk); | ||
| 1262 | /* only enable clock when USART is in use */ | ||
| 1261 | } | 1263 | } |
| 1262 | 1264 | ||
| 1263 | atmel_port->use_dma_rx = data->use_dma_rx; | 1265 | atmel_port->use_dma_rx = data->use_dma_rx; |
| @@ -1379,6 +1381,8 @@ static int __init atmel_console_setup(struct console *co, char *options) | |||
| 1379 | return -ENODEV; | 1381 | return -ENODEV; |
| 1380 | } | 1382 | } |
| 1381 | 1383 | ||
| 1384 | clk_enable(atmel_ports[co->index].clk); | ||
| 1385 | |||
| 1382 | UART_PUT_IDR(port, -1); | 1386 | UART_PUT_IDR(port, -1); |
| 1383 | UART_PUT_CR(port, ATMEL_US_RSTSTA | ATMEL_US_RSTRX); | 1387 | UART_PUT_CR(port, ATMEL_US_RSTSTA | ATMEL_US_RSTRX); |
| 1384 | UART_PUT_CR(port, ATMEL_US_TXEN | ATMEL_US_RXEN); | 1388 | UART_PUT_CR(port, ATMEL_US_TXEN | ATMEL_US_RXEN); |
| @@ -1403,7 +1407,7 @@ static struct console atmel_console = { | |||
| 1403 | .data = &atmel_uart, | 1407 | .data = &atmel_uart, |
| 1404 | }; | 1408 | }; |
| 1405 | 1409 | ||
| 1406 | #define ATMEL_CONSOLE_DEVICE &atmel_console | 1410 | #define ATMEL_CONSOLE_DEVICE (&atmel_console) |
| 1407 | 1411 | ||
| 1408 | /* | 1412 | /* |
| 1409 | * Early console initialization (before VM subsystem initialized). | 1413 | * Early console initialization (before VM subsystem initialized). |
| @@ -1534,6 +1538,15 @@ static int __devinit atmel_serial_probe(struct platform_device *pdev) | |||
| 1534 | if (ret) | 1538 | if (ret) |
| 1535 | goto err_add_port; | 1539 | goto err_add_port; |
| 1536 | 1540 | ||
| 1541 | if (atmel_is_console_port(&port->uart) | ||
| 1542 | && ATMEL_CONSOLE_DEVICE->flags & CON_ENABLED) { | ||
| 1543 | /* | ||
| 1544 | * The serial core enabled the clock for us, so undo | ||
| 1545 | * the clk_enable() in atmel_console_setup() | ||
| 1546 | */ | ||
| 1547 | clk_disable(port->clk); | ||
| 1548 | } | ||
| 1549 | |||
| 1537 | device_init_wakeup(&pdev->dev, 1); | 1550 | device_init_wakeup(&pdev->dev, 1); |
| 1538 | platform_set_drvdata(pdev, port); | 1551 | platform_set_drvdata(pdev, port); |
| 1539 | 1552 | ||
| @@ -1544,7 +1557,6 @@ err_add_port: | |||
| 1544 | port->rx_ring.buf = NULL; | 1557 | port->rx_ring.buf = NULL; |
| 1545 | err_alloc_ring: | 1558 | err_alloc_ring: |
| 1546 | if (!atmel_is_console_port(&port->uart)) { | 1559 | if (!atmel_is_console_port(&port->uart)) { |
| 1547 | clk_disable(port->clk); | ||
| 1548 | clk_put(port->clk); | 1560 | clk_put(port->clk); |
| 1549 | port->clk = NULL; | 1561 | port->clk = NULL; |
| 1550 | } | 1562 | } |
| @@ -1568,7 +1580,6 @@ static int __devexit atmel_serial_remove(struct platform_device *pdev) | |||
| 1568 | 1580 | ||
| 1569 | /* "port" is allocated statically, so we shouldn't free it */ | 1581 | /* "port" is allocated statically, so we shouldn't free it */ |
| 1570 | 1582 | ||
| 1571 | clk_disable(atmel_port->clk); | ||
| 1572 | clk_put(atmel_port->clk); | 1583 | clk_put(atmel_port->clk); |
| 1573 | 1584 | ||
| 1574 | return ret; | 1585 | return ret; |
