diff options
author | Kumar Sanghvi <kumar.sanghvi@stericsson.com> | 2011-04-08 19:05:15 +0530 |
---|---|---|
committer | Mathieu J. Poirier <mathieu.poirier@linaro.org> | 2011-11-10 11:12:12 -0700 |
commit | 31af1fbeb9c71d6ac45c3465fcf64d1a3fe44e4c (patch) | |
tree | 11f467ec355a406ca477caa55e9ce1aeac3c2daf | |
parent | 87c3dead0945f1e805a0e3c7054c938d5a8201ce (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.c | 29 |
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; |