msm_serial_hs: ensure system stays awake when client is active

When client has voted for resources, ensure that the system does
not get suspended.

Change-Id: Iaaa5c34cc834fd0556f444115b694eb3b1450f23
Signed-off-by: Naveen Kaje <nkaje@codeaurora.org>
This commit is contained in:
Naveen Kaje 2015-05-21 13:17:43 -06:00
parent 3734b49d50
commit 49949532e7
1 changed files with 12 additions and 6 deletions

View File

@ -216,6 +216,7 @@ struct msm_hs_port {
struct msm_hs_rx rx;
atomic_t clk_count;
struct msm_hs_wakeup wakeup;
struct wakeup_source ws;
struct dentry *loopback_dir;
struct work_struct clock_off_w; /* work for actual clock off */
@ -294,15 +295,15 @@ static int msm_hs_ioctl(struct uart_port *uport, unsigned int cmd,
switch (cmd) {
case MSM_ENABLE_UART_CLOCK: {
MSM_HS_DBG("%s():ENABLE UART CLOCK: cmd=%d, ioc %d\n", __func__,
cmd, ioctl_count);
MSM_HS_INFO("%s():ENABLE UART CLOCK: cmd=%d, ioc %d\n",
__func__, cmd, ioctl_count);
atomic_inc(&msm_uport->ioctl_count);
msm_hs_request_clock_on(&msm_uport->uport);
break;
}
case MSM_DISABLE_UART_CLOCK: {
MSM_HS_DBG("%s():DISABLE UART CLOCK: cmd=%d ioc %d\n", __func__,
cmd, ioctl_count);
MSM_HS_INFO("%s():DISABLE UART CLOCK: cmd=%d ioc %d\n",
__func__, cmd, ioctl_count);
if (ioctl_count <= 0) {
MSM_HS_WARN("%s():ioctl count -ve, client check voting",
__func__);
@ -319,7 +320,7 @@ static int msm_hs_ioctl(struct uart_port *uport, unsigned int cmd,
if (msm_uport->pm_state != MSM_HS_PM_ACTIVE)
state = 0;
ret = state;
MSM_HS_DBG("%s():GET UART CLOCK STATUS: cmd=%d state=%d\n",
MSM_HS_INFO("%s():GET UART CLOCK STATUS: cmd=%d state=%d\n",
__func__, cmd, state);
break;
}
@ -2273,6 +2274,7 @@ void msm_hs_request_clock_off(struct uart_port *uport)
if (msm_uport->obs)
atomic_set(&msm_uport->client_req_state, 1);
msm_hs_resource_unvote(msm_uport);
__pm_relax(&msm_uport->ws);
}
EXPORT_SYMBOL(msm_hs_request_clock_off);
@ -2281,6 +2283,7 @@ void msm_hs_request_clock_on(struct uart_port *uport)
struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport);
msm_hs_resource_vote(UARTDM_TO_MSM(uport));
__pm_stay_awake(&msm_uport->ws);
if (msm_uport->pm_state != MSM_HS_PM_ACTIVE) {
MSM_HS_WARN("%s(): %p runtime PM callback not invoked",
__func__, uport->dev);
@ -2500,6 +2503,7 @@ static int msm_hs_startup(struct uart_port *uport)
struct msm_hs_rx *rx = &msm_uport->rx;
struct sps_pipe *sps_pipe_handle_tx = tx->cons.pipe_handle;
struct sps_pipe *sps_pipe_handle_rx = rx->prod.pipe_handle;
struct tty_struct *tty = msm_uport->uport.state->port.tty;
rfr_level = uport->fifosize;
if (rfr_level > 16)
@ -2533,7 +2537,7 @@ static int msm_hs_startup(struct uart_port *uport)
}
}
wakeup_source_init(&msm_uport->ws, tty->name);
ret = msm_hs_config_uart_gpios(uport);
if (ret) {
MSM_HS_ERR("Uart GPIO request failed\n");
@ -2643,6 +2647,7 @@ unconfig_uart_gpios:
free_uart_irq:
free_irq(uport->irq, msm_uport);
deinit_uart_clk:
wakeup_source_trash(&msm_uport->ws);
msm_hs_resource_unvote(msm_uport);
MSM_HS_ERR("%s(): Error return\n", __func__);
return ret;
@ -3478,6 +3483,7 @@ static void msm_hs_shutdown(struct uart_port *uport)
else
disable_irq(uport->irq);
wakeup_source_trash(&msm_uport->ws);
msm_uport->wakeup.enabled = false;
/* make sure tx lh finishes */
flush_kthread_worker(&msm_uport->tx.kworker);