Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 281914
b: refs/heads/master
c: 2fd1496
h: refs/heads/master
v: v3
  • Loading branch information
Govindraj.R authored and Kevin Hilman committed Dec 15, 2011
1 parent 062945e commit b4bfc4a
Show file tree
Hide file tree
Showing 7 changed files with 42 additions and 43 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: 36fc2d15b120ef85be74c68b5ad74ac04fbefa8a
refs/heads/master: 2fd149645eb46d26130d7070c6de037dddf34880
6 changes: 0 additions & 6 deletions trunk/arch/arm/mach-omap2/cpuidle34xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
#include <plat/irqs.h>
#include "powerdomain.h"
#include "clockdomain.h"
#include <plat/serial.h>

#include "pm.h"
#include "control.h"
Expand Down Expand Up @@ -245,11 +244,6 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev,
struct omap3_idle_statedata *cx;
int ret;

if (!omap3_can_sleep()) {
new_state_idx = drv->safe_state_index;
goto select_state;
}

/*
* Prevent idle completely if CAM is active.
* CAM does not have wakeup capability in OMAP3.
Expand Down
2 changes: 0 additions & 2 deletions trunk/arch/arm/mach-omap2/pm24xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,6 @@ static int omap2_can_sleep(void)
{
if (omap2_fclks_active())
return 0;
if (!omap_uart_can_sleep())
return 0;
if (osc_ck->usecount > 1)
return 0;
if (omap_dma_running())
Expand Down
11 changes: 0 additions & 11 deletions trunk/arch/arm/mach-omap2/pm34xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
#include <plat/sram.h>
#include "clockdomain.h"
#include "powerdomain.h"
#include <plat/serial.h>
#include <plat/sdrc.h>
#include <plat/prcm.h>
#include <plat/gpmc.h>
Expand Down Expand Up @@ -456,21 +455,11 @@ void omap_sram_idle(void)
clkdm_allow_idle(mpu_pwrdm->pwrdm_clkdms[0]);
}

int omap3_can_sleep(void)
{
if (!omap_uart_can_sleep())
return 0;
return 1;
}

static void omap3_pm_idle(void)
{
local_irq_disable();
local_fiq_disable();

if (!omap3_can_sleep())
goto out;

if (omap_irq_pending() || need_resched())
goto out;

Expand Down
22 changes: 0 additions & 22 deletions trunk/arch/arm/mach-omap2/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,28 +82,6 @@ static struct omap_uart_port_info omap_serial_default_info[] __initdata = {
};

#ifdef CONFIG_PM

int omap_uart_can_sleep(void)
{
struct omap_uart_state *uart;
int can_sleep = 1;

list_for_each_entry(uart, &uart_list, node) {
if (!uart->clocked)
continue;

if (!uart->can_sleep) {
can_sleep = 0;
continue;
}

/* This UART can now safely sleep. */
omap_uart_allow_sleep(uart);
}

return can_sleep;
}

static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable)
{
struct omap_device *od = to_omap_device(pdev);
Expand Down
6 changes: 6 additions & 0 deletions trunk/arch/arm/plat-omap/include/plat/omap-serial.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

#include <linux/serial_core.h>
#include <linux/platform_device.h>
#include <linux/pm_qos.h>

#include <plat/mux.h>

Expand Down Expand Up @@ -130,6 +131,11 @@ struct uart_omap_port {
u32 context_loss_cnt;
u32 errata;
u8 wakeups_enabled;

struct pm_qos_request pm_qos_request;
u32 latency;
u32 calc_latency;
struct work_struct qos_work;
};

#endif /* __OMAP_SERIAL_H__ */
36 changes: 35 additions & 1 deletion trunk/drivers/tty/serial/omap-serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ static void serial_omap_rxdma_poll(unsigned long uart_no);
static int serial_omap_start_rxdma(struct uart_omap_port *up);
static void serial_omap_mdr1_errataset(struct uart_omap_port *up, u8 mdr1);

static struct workqueue_struct *serial_omap_uart_wq;

static inline unsigned int serial_in(struct uart_omap_port *up, int offset)
{
offset <<= up->port.regshift;
Expand Down Expand Up @@ -671,6 +673,14 @@ serial_omap_configure_xonxoff
serial_out(up, UART_LCR, up->lcr);
}

static void serial_omap_uart_qos_work(struct work_struct *work)
{
struct uart_omap_port *up = container_of(work, struct uart_omap_port,
qos_work);

pm_qos_update_request(&up->pm_qos_request, up->latency);
}

static void
serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
struct ktermios *old)
Expand Down Expand Up @@ -711,6 +721,12 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/13);
quot = serial_omap_get_divisor(port, baud);

/* calculate wakeup latency constraint */
up->calc_latency = (1000000 * up->port.fifosize) /
(1000 * baud / 8);
up->latency = up->calc_latency;
schedule_work(&up->qos_work);

up->dll = quot & 0xff;
up->dlh = quot >> 8;
up->mdr1 = UART_OMAP_MDR1_DISABLE;
Expand Down Expand Up @@ -1145,8 +1161,11 @@ static int serial_omap_suspend(struct device *dev)
{
struct uart_omap_port *up = dev_get_drvdata(dev);

if (up)
if (up) {
uart_suspend_port(&serial_omap_reg, &up->port);
flush_work_sync(&up->qos_work);
}

return 0;
}

Expand Down Expand Up @@ -1383,6 +1402,13 @@ static int serial_omap_probe(struct platform_device *pdev)
up->uart_dma.rx_dma_channel = OMAP_UART_DMA_CH_FREE;
}

up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
up->calc_latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
pm_qos_add_request(&up->pm_qos_request,
PM_QOS_CPU_DMA_LATENCY, up->latency);
serial_omap_uart_wq = create_singlethread_workqueue(up->name);
INIT_WORK(&up->qos_work, serial_omap_uart_qos_work);

pm_runtime_use_autosuspend(&pdev->dev);
pm_runtime_set_autosuspend_delay(&pdev->dev,
omap_up_info->autosuspend_timeout);
Expand Down Expand Up @@ -1416,6 +1442,8 @@ static int serial_omap_remove(struct platform_device *dev)
if (up) {
pm_runtime_disable(&up->pdev->dev);
uart_remove_one_port(&serial_omap_reg, &up->port);
pm_qos_remove_request(&up->pm_qos_request);

kfree(up);
}

Expand Down Expand Up @@ -1518,6 +1546,9 @@ static int serial_omap_runtime_suspend(struct device *dev)
(up->errata & UART_ERRATA_i291_DMA_FORCEIDLE))
pdata->set_forceidle(up->pdev);

up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
schedule_work(&up->qos_work);

return 0;
}

Expand All @@ -1538,6 +1569,9 @@ static int serial_omap_runtime_resume(struct device *dev)
if (up->use_dma && pdata->set_noidle &&
(up->errata & UART_ERRATA_i291_DMA_FORCEIDLE))
pdata->set_noidle(up->pdev);

up->latency = up->calc_latency;
schedule_work(&up->qos_work);
}

return 0;
Expand Down

0 comments on commit b4bfc4a

Please sign in to comment.