#include <linux/mailbox_client.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/of_address.h>
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
 #include <linux/pm_domain.h>
        struct device *dev = &pdev->dev;
        struct irq_domain *parent_domain;
        struct generic_pm_domain *genpd;
+       struct device_node *msgram_np;
        struct qcom_mpm_priv *priv;
        unsigned int pin_cnt;
+       struct resource res;
        int i, irq;
        int ret;
 
 
        raw_spin_lock_init(&priv->lock);
 
-       priv->base = devm_platform_ioremap_resource(pdev, 0);
-       if (IS_ERR(priv->base))
-               return PTR_ERR(priv->base);
+       /* If we have a handle to an RPM message ram partition, use it. */
+       msgram_np = of_parse_phandle(np, "qcom,rpm-msg-ram", 0);
+       if (msgram_np) {
+               ret = of_address_to_resource(msgram_np, 0, &res);
+               if (ret) {
+                       of_node_put(msgram_np);
+                       return ret;
+               }
+
+               /* Don't use devm_ioremap_resource, as we're accessing a shared region. */
+               priv->base = devm_ioremap(dev, res.start, resource_size(&res));
+               of_node_put(msgram_np);
+               if (IS_ERR(priv->base))
+                       return PTR_ERR(priv->base);
+       } else {
+               /* Otherwise, fall back to simple MMIO. */
+               priv->base = devm_platform_ioremap_resource(pdev, 0);
+               if (IS_ERR(priv->base))
+                       return PTR_ERR(priv->base);
+       }
 
        for (i = 0; i < priv->reg_stride; i++) {
                qcom_mpm_write(priv, MPM_REG_ENABLE, i, 0);