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:
parent
3734b49d50
commit
49949532e7
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue