diff options
| author | Karthikeyan Ramasubramanian <kramasub@codeaurora.org> | 2016-09-26 17:30:08 -0600 |
|---|---|---|
| committer | Karthikeyan Ramasubramanian <kramasub@codeaurora.org> | 2016-10-20 12:37:41 -0600 |
| commit | 4c65e88972394d62b1a801b271934d170aa2217b (patch) | |
| tree | 79e892bb87ac19b489bd1332d676ec1cc67371aa | |
| parent | 1ff56658f3493b9e56cb30d1ddcd7e6646d14c85 (diff) | |
soc: qcom: glink_spi_xprt: Add support for WDSP SSR
Handle WDSP_EVENT_PRE_SHUTDOWN event to indicate link down event to G-Link
core and the clients of G-Link. Handle WDSP_EVENT_POST_BOOTUP event to
indicate link up event.
CRs-Fixed: 1080354
Change-Id: I12c04ceb7af51cc5d2f0c79b524ef783dc5f749e
Signed-off-by: Karthikeyan Ramasubramanian <kramasub@codeaurora.org>
| -rw-r--r-- | drivers/soc/qcom/glink_spi_xprt.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/soc/qcom/glink_spi_xprt.c b/drivers/soc/qcom/glink_spi_xprt.c index 66caa6ecaad2..47c66c892736 100644 --- a/drivers/soc/qcom/glink_spi_xprt.c +++ b/drivers/soc/qcom/glink_spi_xprt.c @@ -875,21 +875,20 @@ static void __rx_worker(struct edge_info *einfo) int rcu_id; rcu_id = srcu_read_lock(&einfo->use_ref); + if (einfo->in_ssr) { + srcu_read_unlock(&einfo->use_ref, rcu_id); + return; + } + if (unlikely(!einfo->rx_fifo_start)) { rx_avail = glink_spi_xprt_read_avail(einfo); if (!rx_avail) { srcu_read_unlock(&einfo->use_ref, rcu_id); return; } - einfo->in_ssr = false; einfo->xprt_if.glink_core_if_ptr->link_up(&einfo->xprt_if); } - if (einfo->in_ssr) { - srcu_read_unlock(&einfo->use_ref, rcu_id); - return; - } - glink_spi_xprt_set_poll_mode(einfo); while (inactive_cycles < MAX_INACTIVE_CYCLES) { if (einfo->tx_resume_needed && @@ -1818,9 +1817,16 @@ static int glink_wdsp_cmpnt_event_handler(struct device *dev, spi_dev = to_spi_device(sdev); einfo->spi_dev = spi_dev; break; + case WDSP_EVENT_POST_BOOTUP: + einfo->in_ssr = false; + synchronize_srcu(&einfo->use_ref); + /* No break here to trigger fake rx_worker */ case WDSP_EVENT_IPC1_INTR: queue_kthread_work(&einfo->kworker, &einfo->kwork); break; + case WDSP_EVENT_PRE_SHUTDOWN: + ssr(&einfo->xprt_if); + break; default: pr_debug("%s: unhandled event %d", __func__, event); break; @@ -2040,7 +2046,6 @@ static int glink_spi_probe(struct platform_device *pdev) init_xprt_cfg(einfo, subsys_name); init_xprt_if(einfo); - einfo->in_ssr = true; einfo->fifo_size = DEFAULT_FIFO_SIZE; init_kthread_work(&einfo->kwork, rx_worker); init_kthread_worker(&einfo->kworker); |
