aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
authorOlof Johansson <olof@lixom.net>2013-12-29 16:22:19 -0500
committerOlof Johansson <olof@lixom.net>2013-12-29 16:22:19 -0500
commit5aa88ce1137ca46164cc05dca3d7ee75ddee93d8 (patch)
tree6434854704d946222186f245c3a4ef5b5e9b8133 /drivers/tty
parent05c6c359db5384999310d376c7f850b726949058 (diff)
parentb016b646e8676858f39ea9be760494b04b9ee0af (diff)
Merge tag 'renesas-sh-sci-for-v3.14' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas into next/cleanup
From Simon Horman: Renesas SH SCI updates for v3.14 Updates for the SH SCI serial driver * Convert to clk_prepare/unprepare * Fix warnings due to improper casts and printk formats * tag 'renesas-sh-sci-for-v3.14' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas: serial: sh-sci: Convert to clk_prepare/unprepare serial: sh-sci: Don't enable/disable port from within break timer serial: sh-sci: Fix warnings due to improper casts and printk formats Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/serial/sh-sci.c39
1 files changed, 22 insertions, 17 deletions
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 7d8103cd3e2e..1a3fc7a2e4db 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -421,9 +421,9 @@ static void sci_port_enable(struct sci_port *sci_port)
421 421
422 pm_runtime_get_sync(sci_port->port.dev); 422 pm_runtime_get_sync(sci_port->port.dev);
423 423
424 clk_enable(sci_port->iclk); 424 clk_prepare_enable(sci_port->iclk);
425 sci_port->port.uartclk = clk_get_rate(sci_port->iclk); 425 sci_port->port.uartclk = clk_get_rate(sci_port->iclk);
426 clk_enable(sci_port->fclk); 426 clk_prepare_enable(sci_port->fclk);
427} 427}
428 428
429static void sci_port_disable(struct sci_port *sci_port) 429static void sci_port_disable(struct sci_port *sci_port)
@@ -431,8 +431,16 @@ static void sci_port_disable(struct sci_port *sci_port)
431 if (!sci_port->port.dev) 431 if (!sci_port->port.dev)
432 return; 432 return;
433 433
434 clk_disable(sci_port->fclk); 434 /* Cancel the break timer to ensure that the timer handler will not try
435 clk_disable(sci_port->iclk); 435 * to access the hardware with clocks and power disabled. Reset the
436 * break flag to make the break debouncing state machine ready for the
437 * next break.
438 */
439 del_timer_sync(&sci_port->break_timer);
440 sci_port->break_flag = 0;
441
442 clk_disable_unprepare(sci_port->fclk);
443 clk_disable_unprepare(sci_port->iclk);
436 444
437 pm_runtime_put_sync(sci_port->port.dev); 445 pm_runtime_put_sync(sci_port->port.dev);
438} 446}
@@ -557,7 +565,7 @@ static inline int sci_rxd_in(struct uart_port *port)
557 return 1; 565 return 1;
558 566
559 /* Cast for ARM damage */ 567 /* Cast for ARM damage */
560 return !!__raw_readb((void __iomem *)s->cfg->port_reg); 568 return !!__raw_readb((void __iomem *)(uintptr_t)s->cfg->port_reg);
561} 569}
562 570
563/* ********************************************************************** * 571/* ********************************************************************** *
@@ -733,8 +741,6 @@ static void sci_break_timer(unsigned long data)
733{ 741{
734 struct sci_port *port = (struct sci_port *)data; 742 struct sci_port *port = (struct sci_port *)data;
735 743
736 sci_port_enable(port);
737
738 if (sci_rxd_in(&port->port) == 0) { 744 if (sci_rxd_in(&port->port) == 0) {
739 port->break_flag = 1; 745 port->break_flag = 1;
740 sci_schedule_break_timer(port); 746 sci_schedule_break_timer(port);
@@ -744,8 +750,6 @@ static void sci_break_timer(unsigned long data)
744 sci_schedule_break_timer(port); 750 sci_schedule_break_timer(port);
745 } else 751 } else
746 port->break_flag = 0; 752 port->break_flag = 0;
747
748 sci_port_disable(port);
749} 753}
750 754
751static int sci_handle_errors(struct uart_port *port) 755static int sci_handle_errors(struct uart_port *port)
@@ -1309,7 +1313,7 @@ static int sci_dma_rx_push(struct sci_port *s, size_t count)
1309 } 1313 }
1310 1314
1311 if (room < count) 1315 if (room < count)
1312 dev_warn(port->dev, "Rx overrun: dropping %u bytes\n", 1316 dev_warn(port->dev, "Rx overrun: dropping %zu bytes\n",
1313 count - room); 1317 count - room);
1314 if (!room) 1318 if (!room)
1315 return room; 1319 return room;
@@ -1442,7 +1446,7 @@ static void work_fn_rx(struct work_struct *work)
1442 int count; 1446 int count;
1443 1447
1444 chan->device->device_control(chan, DMA_TERMINATE_ALL, 0); 1448 chan->device->device_control(chan, DMA_TERMINATE_ALL, 0);
1445 dev_dbg(port->dev, "Read %u bytes with cookie %d\n", 1449 dev_dbg(port->dev, "Read %zu bytes with cookie %d\n",
1446 sh_desc->partial, sh_desc->cookie); 1450 sh_desc->partial, sh_desc->cookie);
1447 1451
1448 spin_lock_irqsave(&port->lock, flags); 1452 spin_lock_irqsave(&port->lock, flags);
@@ -1691,16 +1695,17 @@ static void sci_request_dma(struct uart_port *port)
1691 s->chan_tx = chan; 1695 s->chan_tx = chan;
1692 sg_init_table(&s->sg_tx, 1); 1696 sg_init_table(&s->sg_tx, 1);
1693 /* UART circular tx buffer is an aligned page. */ 1697 /* UART circular tx buffer is an aligned page. */
1694 BUG_ON((int)port->state->xmit.buf & ~PAGE_MASK); 1698 BUG_ON((uintptr_t)port->state->xmit.buf & ~PAGE_MASK);
1695 sg_set_page(&s->sg_tx, virt_to_page(port->state->xmit.buf), 1699 sg_set_page(&s->sg_tx, virt_to_page(port->state->xmit.buf),
1696 UART_XMIT_SIZE, (int)port->state->xmit.buf & ~PAGE_MASK); 1700 UART_XMIT_SIZE,
1701 (uintptr_t)port->state->xmit.buf & ~PAGE_MASK);
1697 nent = dma_map_sg(port->dev, &s->sg_tx, 1, DMA_TO_DEVICE); 1702 nent = dma_map_sg(port->dev, &s->sg_tx, 1, DMA_TO_DEVICE);
1698 if (!nent) 1703 if (!nent)
1699 sci_tx_dma_release(s, false); 1704 sci_tx_dma_release(s, false);
1700 else 1705 else
1701 dev_dbg(port->dev, "%s: mapped %d@%p to %x\n", __func__, 1706 dev_dbg(port->dev, "%s: mapped %d@%p to %pad\n", __func__,
1702 sg_dma_len(&s->sg_tx), 1707 sg_dma_len(&s->sg_tx), port->state->xmit.buf,
1703 port->state->xmit.buf, sg_dma_address(&s->sg_tx)); 1708 &sg_dma_address(&s->sg_tx));
1704 1709
1705 s->sg_len_tx = nent; 1710 s->sg_len_tx = nent;
1706 1711
@@ -1740,7 +1745,7 @@ static void sci_request_dma(struct uart_port *port)
1740 1745
1741 sg_init_table(sg, 1); 1746 sg_init_table(sg, 1);
1742 sg_set_page(sg, virt_to_page(buf[i]), s->buf_len_rx, 1747 sg_set_page(sg, virt_to_page(buf[i]), s->buf_len_rx,
1743 (int)buf[i] & ~PAGE_MASK); 1748 (uintptr_t)buf[i] & ~PAGE_MASK);
1744 sg_dma_address(sg) = dma[i]; 1749 sg_dma_address(sg) = dma[i];
1745 } 1750 }
1746 1751