summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-10-22 11:26:56 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-10-22 11:26:56 -0700
commit59fb1afb3626079df716fba6205b011f77fb45b1 (patch)
treee8ca5c898d9c3ac3a349294eaf974e829d8004b6 /drivers
parentc33b570e3937e1ad775858716eec186d748f312e (diff)
parent4c65e88972394d62b1a801b271934d170aa2217b (diff)
Merge "soc: qcom: glink_spi_xprt: Add support for WDSP SSR"
Diffstat (limited to 'drivers')
-rw-r--r--drivers/soc/qcom/glink_spi_xprt.c19
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);