diff options
author | Arun Murthy <arun.murthy@stericsson.com> | 2012-05-21 04:58:21 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2012-07-08 18:16:10 -0400 |
commit | 5261e101198e7ef31a60d3aa97815a49c8b8fa20 (patch) | |
tree | 53e8157eaceb4c6448b8ca15c73368e5a04185d3 /drivers/mfd/db8500-prcmu.c | |
parent | 19d57ed5a308472a02e773f33c03ad4cb2ec6a9d (diff) |
mfd: Update db8500-prmcu hostport_access enable
Force the Modem wakeup by asserting the CaWakeReq signal before the
hostaccess_req/ack ping-pong sequence. The Awake_req signal is de-asserted
asserted at the same time than the hostaccess_req. Return error on failure
case so that the client using this can take appropiate steps.
Signed-off-by: Arun Murthy <arun.murthy@stericsson.com>
Acked-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/mfd/db8500-prcmu.c')
-rw-r--r-- | drivers/mfd/db8500-prcmu.c | 45 |
1 files changed, 19 insertions, 26 deletions
diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c index bf5a054a2b91..f4adcabb2a51 100644 --- a/drivers/mfd/db8500-prcmu.c +++ b/drivers/mfd/db8500-prcmu.c | |||
@@ -2269,10 +2269,10 @@ int prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size) | |||
2269 | /** | 2269 | /** |
2270 | * prcmu_ac_wake_req - should be called whenever ARM wants to wakeup Modem | 2270 | * prcmu_ac_wake_req - should be called whenever ARM wants to wakeup Modem |
2271 | */ | 2271 | */ |
2272 | void prcmu_ac_wake_req(void) | 2272 | int prcmu_ac_wake_req(void) |
2273 | { | 2273 | { |
2274 | u32 val; | 2274 | u32 val; |
2275 | u32 status; | 2275 | int ret = 0; |
2276 | 2276 | ||
2277 | mutex_lock(&mb0_transfer.ac_wake_lock); | 2277 | mutex_lock(&mb0_transfer.ac_wake_lock); |
2278 | 2278 | ||
@@ -2282,39 +2282,32 @@ void prcmu_ac_wake_req(void) | |||
2282 | 2282 | ||
2283 | atomic_set(&ac_wake_req_state, 1); | 2283 | atomic_set(&ac_wake_req_state, 1); |
2284 | 2284 | ||
2285 | retry: | 2285 | /* |
2286 | writel((val | PRCM_HOSTACCESS_REQ_HOSTACCESS_REQ), PRCM_HOSTACCESS_REQ); | 2286 | * Force Modem Wake-up before hostaccess_req ping-pong. |
2287 | * It prevents Modem to enter in Sleep while acking the hostaccess | ||
2288 | * request. The 31us delay has been calculated by HWI. | ||
2289 | */ | ||
2290 | val |= PRCM_HOSTACCESS_REQ_WAKE_REQ; | ||
2291 | writel(val, PRCM_HOSTACCESS_REQ); | ||
2292 | |||
2293 | udelay(31); | ||
2294 | |||
2295 | val |= PRCM_HOSTACCESS_REQ_HOSTACCESS_REQ; | ||
2296 | writel(val, PRCM_HOSTACCESS_REQ); | ||
2287 | 2297 | ||
2288 | if (!wait_for_completion_timeout(&mb0_transfer.ac_wake_work, | 2298 | if (!wait_for_completion_timeout(&mb0_transfer.ac_wake_work, |
2289 | msecs_to_jiffies(5000))) { | 2299 | msecs_to_jiffies(5000))) { |
2300 | #if defined(CONFIG_DBX500_PRCMU_DEBUG) | ||
2301 | db8500_prcmu_debug_dump(__func__, true, true); | ||
2302 | #endif | ||
2290 | pr_crit("prcmu: %s timed out (5 s) waiting for a reply.\n", | 2303 | pr_crit("prcmu: %s timed out (5 s) waiting for a reply.\n", |
2291 | __func__); | 2304 | __func__); |
2292 | goto unlock_and_return; | 2305 | ret = -EFAULT; |
2293 | } | ||
2294 | |||
2295 | /* | ||
2296 | * The modem can generate an AC_WAKE_ACK, and then still go to sleep. | ||
2297 | * As a workaround, we wait, and then check that the modem is indeed | ||
2298 | * awake (in terms of the value of the PRCM_MOD_AWAKE_STATUS | ||
2299 | * register, which may not be the whole truth). | ||
2300 | */ | ||
2301 | udelay(400); | ||
2302 | status = (readl(PRCM_MOD_AWAKE_STATUS) & BITS(0, 2)); | ||
2303 | if (status != (PRCM_MOD_AWAKE_STATUS_PRCM_MOD_AAPD_AWAKE | | ||
2304 | PRCM_MOD_AWAKE_STATUS_PRCM_MOD_COREPD_AWAKE)) { | ||
2305 | pr_err("prcmu: %s received ack, but modem not awake (0x%X).\n", | ||
2306 | __func__, status); | ||
2307 | udelay(1200); | ||
2308 | writel(val, PRCM_HOSTACCESS_REQ); | ||
2309 | if (wait_for_completion_timeout(&mb0_transfer.ac_wake_work, | ||
2310 | msecs_to_jiffies(5000))) | ||
2311 | goto retry; | ||
2312 | pr_crit("prcmu: %s timed out (5 s) waiting for AC_SLEEP_ACK.\n", | ||
2313 | __func__); | ||
2314 | } | 2306 | } |
2315 | 2307 | ||
2316 | unlock_and_return: | 2308 | unlock_and_return: |
2317 | mutex_unlock(&mb0_transfer.ac_wake_lock); | 2309 | mutex_unlock(&mb0_transfer.ac_wake_lock); |
2310 | return ret; | ||
2318 | } | 2311 | } |
2319 | 2312 | ||
2320 | /** | 2313 | /** |