diff options
author | Arun Murthy <arun.murthy@stericsson.com> | 2011-11-14 14:24:10 +0530 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-05-22 10:59:20 +0200 |
commit | cc6634371a05f53bac9e3d6436aa26b5338d4a84 (patch) | |
tree | 5039f2dfd145ae225711632bc78944e7ef6b5649 | |
parent | 895997faaaff7ab9fb3f19cf9f6c981e5b337bc6 (diff) |
mfd: dbx500-prcmu: modem reset request
Add an API to initiate modem reset request. This is a blocking call
and not to be called from interrupt context.
ST-Ericsson Linux next: NA
ST-Ericsson ID: 341807
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: Ib4fa17e1507b014859b68137a04430d51b797b5e
Signed-off-by: Arun Murthy <arun.murthy@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/37614
Reviewed-by: Rabin VINCENT <rabin.vincent@stericsson.com>
-rw-r--r-- | drivers/mfd/db5500-prcmu.c | 28 | ||||
-rw-r--r-- | include/linux/mfd/db5500-prcmu.h | 2 | ||||
-rw-r--r-- | include/linux/mfd/dbx500-prcmu.h | 2 |
3 files changed, 31 insertions, 1 deletions
diff --git a/drivers/mfd/db5500-prcmu.c b/drivers/mfd/db5500-prcmu.c index 3f1e481fb11..59c27186d47 100644 --- a/drivers/mfd/db5500-prcmu.c +++ b/drivers/mfd/db5500-prcmu.c @@ -163,6 +163,7 @@ enum mb4_header { MB4H_CFG_HOTDOG = 7, MB4H_CFG_HOTMON = 8, MB4H_CFG_HOTPERIOD = 10, + MB4H_CGF_MODEM_RESET = 13, }; /* Mailbox 4 ACK headers */ @@ -170,6 +171,7 @@ enum mb4_ack_header { MB4H_ACK_CFG_HOTDOG = 5, MB4H_ACK_CFG_HOTMON = 6, MB4H_ACK_CFG_HOTPERIOD = 8, + MB4H_ACK_CFG_MODEM_RESET = 11, }; /* Mailbox 5 headers. */ @@ -604,6 +606,31 @@ void prcmu_ape_ack(void) } /** + * db5500_prcmu_modem_reset - Assert a Reset on modem + * + * This function will assert a reset request to the modem. Prior to that + * PRCM_HOSTACCESS_REQ must be '0'. + */ +void db5500_prcmu_modem_reset(void) +{ + mutex_lock(&mb4_transfer.lock); + + /* PRCM_HOSTACCESS_REQ = 0, before asserting a reset */ + prcmu_modem_rel(); + while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(4)) + cpu_relax(); + + writeb(MB4H_CGF_MODEM_RESET, PRCM_REQ_MB4_HEADER); + writel(MBOX_BIT(4), _PRCMU_BASE + PRCM_MBOX_CPU_SET); + wait_for_completion(&mb4_transfer.work); + if (mb4_transfer.ack.status != RC_SUCCESS || + mb4_transfer.ack.header != MB4H_CGF_MODEM_RESET) + printk(KERN_ERR, + "ACK not received for modem reset interrupt\n"); + mutex_unlock(&mb4_transfer.lock); +} + +/** * prcmu_config_clkout - Configure one of the programmable clock outputs. * @clkout: The CLKOUT number (0 or 1). * @source: Clock source. @@ -1823,6 +1850,7 @@ static bool read_mailbox_4(void) case MB4H_ACK_CFG_HOTDOG: case MB4H_ACK_CFG_HOTMON: case MB4H_ACK_CFG_HOTPERIOD: + case MB4H_ACK_CFG_MODEM_RESET: mb4_transfer.ack.status = readb(PRCM_ACK_MB4_REQUESTS); break; default: diff --git a/include/linux/mfd/db5500-prcmu.h b/include/linux/mfd/db5500-prcmu.h index 8b8470cb24e..937589d46df 100644 --- a/include/linux/mfd/db5500-prcmu.h +++ b/include/linux/mfd/db5500-prcmu.h @@ -33,6 +33,7 @@ void prcmu_modem_rel(void); void prcmu_ape_ack(void); #endif bool db5500_prcmu_is_modem_requested(void); +void db5500_prcmu_modem_reset(void); int db5500_prcmu_set_arm_opp(u8 opp); int db5500_prcmu_get_arm_opp(void); int db5500_prcmu_set_ape_opp(u8 opp); @@ -141,6 +142,7 @@ static inline u16 db5500_prcmu_get_reset_code(void) return 0; } +static inline void db5500_prcmu_modem_reset(void) {} static inline bool db5500_prcmu_is_modem_requested(void) { return 0; diff --git a/include/linux/mfd/dbx500-prcmu.h b/include/linux/mfd/dbx500-prcmu.h index 4baf982fabf..c6d11826172 100644 --- a/include/linux/mfd/dbx500-prcmu.h +++ b/include/linux/mfd/dbx500-prcmu.h @@ -452,7 +452,7 @@ void prcmu_ac_sleep_req(void); static inline void prcmu_modem_reset(void) { if (cpu_is_u5500()) - return; + return db5500_prcmu_modem_reset(); else return db8500_prcmu_modem_reset(); } |