Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 287055
b: refs/heads/master
c: 43cf7c0
h: refs/heads/master
i:
  287053: fa9880f
  287051: 1090006
  287047: 04ff5ab
  287039: 67f8adc
v: v3
  • Loading branch information
Paul Walmsley authored and Greg Kroah-Hartman committed Jan 24, 2012
1 parent d0779ce commit 260929a
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0a697b22252c9d7208b5fb3e9fbd124dd229f1d2
refs/heads/master: 43cf7c0bebf50d0b68aa42ae6d24cf08e3f24823
1 change: 1 addition & 0 deletions trunk/arch/arm/plat-omap/include/plat/omap-serial.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ struct uart_omap_port {
u32 context_loss_cnt;
u32 errata;
u8 wakeups_enabled;
u8 max_tx_count;

struct pm_qos_request pm_qos_request;
u32 latency;
Expand Down
51 changes: 50 additions & 1 deletion trunk/drivers/tty/serial/omap-serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,49 @@ static inline void serial_omap_clear_fifos(struct uart_omap_port *up)
serial_out(up, UART_FCR, 0);
}

/**
* serial_omap_block_cpu_low_power_state - prevent MPU pwrdm from leaving ON
* @up: struct uart_omap_port *
*
* Prevent the MPU powerdomain from entering a power state lower than
* ON. (It should be sufficient to prevent it from entering INACTIVE,
* but there is presently no easy way to do this.) This works around
* a suspected silicon bug in the OMAP UART IP blocks. The UARTs should
* wake the PRCM when the transmit FIFO threshold interrupt is raised, but
* they do not. See also serial_omap_allow_cpu_low_power_state(). No
* return value.
*/
static void serial_omap_block_cpu_low_power_state(struct uart_omap_port *up)
{
#ifdef CONFIG_CPU_IDLE
up->latency = 1;
schedule_work(&up->qos_work);
#else
up->max_tx_count = 1;
#endif
}

/**
* serial_omap_allow_cpu_low_power_state - remove power state restriction on MPU
* @up: struct uart_omap_port *
*
* Cancel the effects of serial_omap_block_cpu_low_power_state().
* This should allow the MPU powerdomain to enter a power state lower
* than ON, assuming the rest of the kernel is not restricting it.
* This works around a suspected silicon bug in the OMAP UART IP
* blocks. The UARTs should wake the PRCM when the transmit FIFO
* threshold interrupt is raised, but they do not. No return value.
*/
static void serial_omap_allow_cpu_low_power_state(struct uart_omap_port *up)
{
#ifdef CONFIG_CPU_IDLE
up->latency = up->calc_latency;
schedule_work(&up->qos_work);
#else
up->max_tx_count = up->port.fifosize / 4;
#endif
}

/*
* serial_omap_get_divisor - calculate divisor value
* @port: uart port info
Expand Down Expand Up @@ -163,6 +206,9 @@ static void serial_omap_stop_tx(struct uart_port *port)
serial_out(up, UART_IER, up->ier);
}

if (!up->use_dma)
serial_omap_allow_cpu_low_power_state(up);

pm_runtime_mark_last_busy(&up->pdev->dev);
pm_runtime_put_autosuspend(&up->pdev->dev);
}
Expand Down Expand Up @@ -264,7 +310,7 @@ static void transmit_chars(struct uart_omap_port *up)
serial_omap_stop_tx(&up->port);
return;
}
count = up->port.fifosize / 4;
count = up->max_tx_count;
do {
serial_out(up, UART_TX, xmit->buf[xmit->tail]);
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
Expand Down Expand Up @@ -297,6 +343,7 @@ static void serial_omap_start_tx(struct uart_port *port)

if (!up->use_dma) {
pm_runtime_get_sync(&up->pdev->dev);
serial_omap_block_cpu_low_power_state(up);
serial_omap_enable_ier_thri(up);
pm_runtime_mark_last_busy(&up->pdev->dev);
pm_runtime_put_autosuspend(&up->pdev->dev);
Expand Down Expand Up @@ -1421,6 +1468,8 @@ static int serial_omap_probe(struct platform_device *pdev)
up->port.fifosize = 64;
up->port.ops = &serial_omap_pops;

up->max_tx_count = up->port.fifosize / 4;

if (pdev->dev.of_node)
up->port.line = of_alias_get_id(pdev->dev.of_node, "serial");
else
Expand Down

0 comments on commit 260929a

Please sign in to comment.