summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArun Murthy <arun.murthy@stericsson.com>2011-11-14 14:24:10 +0530
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 10:59:20 +0200
commitcc6634371a05f53bac9e3d6436aa26b5338d4a84 (patch)
tree5039f2dfd145ae225711632bc78944e7ef6b5649
parent895997faaaff7ab9fb3f19cf9f6c981e5b337bc6 (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.c28
-rw-r--r--include/linux/mfd/db5500-prcmu.h2
-rw-r--r--include/linux/mfd/dbx500-prcmu.h2
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();
}