summaryrefslogtreecommitdiff
path: root/drivers/mfd
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 /drivers/mfd
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>
Diffstat (limited to 'drivers/mfd')
-rw-r--r--drivers/mfd/db5500-prcmu.c28
1 files changed, 28 insertions, 0 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: