#include <linux/irqdomain.h>
 #include <linux/slab.h>
 #include <linux/of_device.h>
+#include <linux/of_address.h>
 #include <linux/pinctrl/machine.h>
 #include <linux/pinctrl/pinctrl.h>
 #include <linux/pinctrl/pinmux.h>
 {
        const struct platform_device_id *platid = platform_get_device_id(pdev);
        struct device_node *np = pdev->dev.of_node;
+       struct device_node *prcm_np;
        struct nmk_pinctrl *npct;
        struct resource *res;
        unsigned int version = 0;
        if (version == PINCTRL_NMK_DB8540)
                nmk_pinctrl_db8540_init(&npct->soc);
 
+       if (np) {
+               prcm_np = of_parse_phandle(np, "prcm", 0);
+               if (prcm_np)
+                       npct->prcm_base = of_iomap(prcm_np, 0);
+       }
+
+       /* Allow platform passed information to over-write DT. */
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (res) {
+       if (res)
                npct->prcm_base = devm_ioremap(&pdev->dev, res->start,
                                               resource_size(res));
-               if (!npct->prcm_base) {
-                       dev_err(&pdev->dev,
-                               "failed to ioremap PRCM registers\n");
-                       return -ENOMEM;
+       if (!npct->prcm_base) {
+               if (version == PINCTRL_NMK_STN8815) {
+                       dev_info(&pdev->dev,
+                                "No PRCM base, "
+                                "assuming no ALT-Cx control is available\n");
+               } else {
+                       dev_err(&pdev->dev, "missing PRCM base address\n");
+                       return -EINVAL;
                }
-       } else if (version == PINCTRL_NMK_STN8815) {
-               dev_info(&pdev->dev,
-                        "No PRCM base, assume no ALT-Cx control is available\n");
-       } else {
-               dev_err(&pdev->dev, "missing PRCM base address\n");
-               return -EINVAL;
        }
 
        /*