summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKumar Sanghvi <kumar.sanghvi@stericsson.com>2011-04-08 19:05:15 +0530
committerMathieu J. Poirier <mathieu.poirier@linaro.org>2011-11-10 11:12:12 -0700
commit31af1fbeb9c71d6ac45c3465fcf64d1a3fe44e4c (patch)
tree11f467ec355a406ca477caa55e9ce1aeac3c2daf
parent87c3dead0945f1e805a0e3c7054c938d5a8201ce (diff)
u8500: shrm: Workaround for MSR
prcmu driver APIs like prcmu_ac_wake_req/prcmu_ac_sleep_req currently does not support multiple clients. To make the MSR feature working, this patch puts workaround in shrm driver due to the limitations of prcmu driver. ST-Ericsson ID: ER329867 Change-Id: Ic6092f89752e05c53436ec0e07c2f2945dbd56c5 Signed-off-by: Kumar Sanghvi <kumar.sanghvi@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/21077 Reviewed-by: QATEST Reviewed-by: Hemant-vilas RAMDASI <hemant.ramdasi@stericsson.com> Reviewed-by: Sebastien RAULT <sebastien.rault@stericsson.com> Tested-by: Sebastien RAULT <sebastien.rault@stericsson.com> Reviewed-by: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
-rw-r--r--drivers/misc/shrm/shrm_protocol.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/drivers/misc/shrm/shrm_protocol.c b/drivers/misc/shrm/shrm_protocol.c
index 351f78ecbc2..0831bc8803e 100644
--- a/drivers/misc/shrm/shrm_protocol.c
+++ b/drivers/misc/shrm/shrm_protocol.c
@@ -77,6 +77,21 @@ static void shm_ac_sleep_req_work(struct work_struct *work)
mutex_unlock(&ac_state_mutex);
}
+static void shm_ac_wake_req_work(struct work_struct *work)
+{
+ mutex_lock(&ac_state_mutex);
+ /* make sure that we bring down the ac-wake line
+ * so that prcmu driver will actually write
+ * to the PRCM_HOSTACCESS_REQ register on the
+ * next prcmu_ac_wake_req call
+ */
+ prcmu_ac_sleep_req();
+
+ atomic_inc(&ac_sleep_disable_count);
+ prcmu_ac_wake_req();
+ mutex_unlock(&ac_state_mutex);
+}
+
static u32 get_host_accessport_val(void)
{
u32 prcm_hostaccess;
@@ -369,6 +384,13 @@ void shm_ac_read_notif_0_tasklet(unsigned long tasklet_data)
/* multicast that modem is online */
nl_send_multicast_message(SHRM_NL_STATUS_MOD_ONLINE, GFP_ATOMIC);
+
+ /* This decrement corresponds to increment
+ * done in MSR sequecne
+ */
+ atomic_dec(&ac_sleep_disable_count);
+ queue_work(shm_dev->shm_ac_sleep_wq,
+ &shm_dev->shm_ac_sleep_req);
}
} else if (boot_state == BOOT_DONE) {
@@ -504,6 +526,9 @@ static int shrm_modem_reset_sequence(void)
/* reset the state for ac-wake LOW logic */
atomic_set(&ac_sleep_disable_count, 0);
+ queue_work(shm_dev->shm_ac_wake_wq,
+ &shm_dev->shm_ac_wake_req);
+
/* stop network queue */
shrm_stop_netdev(shm_dev->ndev);
@@ -535,9 +560,6 @@ static int shrm_modem_reset_sequence(void)
enable_irq(IRQ_PRCMU_CA_WAKE);
enable_irq(IRQ_PRCMU_CA_SLEEP);
- /* reset counter for ac-wake/ac-sleep logic */
- atomic_set(&ac_sleep_disable_count, 0);
-
return err;
}
#endif
@@ -730,6 +752,7 @@ int shrm_protocol_init(struct shrm_dev *shrm,
INIT_WORK(&shrm->shm_ca_wake_req, shm_ca_wake_req_work);
INIT_WORK(&shrm->shm_ca_sleep_req, shm_ca_sleep_req_work);
INIT_WORK(&shrm->shm_ac_sleep_req, shm_ac_sleep_req_work);
+ INIT_WORK(&shrm->shm_ac_wake_req, shm_ac_wake_req_work);
/* set tasklet data */
shm_ca_0_tasklet.data = (unsigned long)shrm;