}
 
 static void at91_poweroff(void)
-{
-       writel(AT91_SHDW_KEY | AT91_SHDW_SHDW, at91_shdwc_base + AT91_SHDW_CR);
-}
-
-static void at91_lpddr_poweroff(void)
 {
        asm volatile(
                /* Align to cache lines */
                "       ldr     r6, [%2, #" __stringify(AT91_SHDW_CR) "]\n\t"
 
                /* Power down SDRAM0 */
+               "       tst     %0, #0\n\t"
+               "       beq     1f\n\t"
                "       str     %1, [%0, #" __stringify(AT91_DDRSDRC_LPR) "]\n\t"
                /* Shutdown CPU */
-               "       str     %3, [%2, #" __stringify(AT91_SHDW_CR) "]\n\t"
+               "1:     str     %3, [%2, #" __stringify(AT91_SHDW_CR) "]\n\t"
 
                "       b       .\n\t"
                :
        if (pdev->dev.of_node)
                at91_poweroff_dt_set_wakeup_mode(pdev);
 
-       pm_power_off = at91_poweroff;
-
        np = of_find_compatible_node(NULL, NULL, "atmel,sama5d3-ddramc");
-       if (!np)
-               return 0;
+       if (np) {
+               mpddrc_base = of_iomap(np, 0);
+               of_node_put(np);
 
-       mpddrc_base = of_iomap(np, 0);
-       of_node_put(np);
+               if (!mpddrc_base) {
+                       ret = -ENOMEM;
+                       goto clk_disable;
+               }
 
-       if (!mpddrc_base)
-               return 0;
+               ddr_type = readl(mpddrc_base + AT91_DDRSDRC_MDR) &
+                                AT91_DDRSDRC_MD;
+               if (ddr_type != AT91_DDRSDRC_MD_LPDDR2 &&
+                   ddr_type != AT91_DDRSDRC_MD_LPDDR3) {
+                       iounmap(mpddrc_base);
+                       mpddrc_base = NULL;
+               }
+       }
 
-       ddr_type = readl(mpddrc_base + AT91_DDRSDRC_MDR) & AT91_DDRSDRC_MD;
-       if ((ddr_type == AT91_DDRSDRC_MD_LPDDR2) ||
-           (ddr_type == AT91_DDRSDRC_MD_LPDDR3))
-               pm_power_off = at91_lpddr_poweroff;
-       else
-               iounmap(mpddrc_base);
+       pm_power_off = at91_poweroff;
 
        return 0;
+
+clk_disable:
+       clk_disable_unprepare(sclk);
+       return ret;
 }
 
 static int __exit at91_poweroff_remove(struct platform_device *pdev)
 {
-       if (pm_power_off == at91_poweroff ||
-           pm_power_off == at91_lpddr_poweroff)
+       if (pm_power_off == at91_poweroff)
                pm_power_off = NULL;
 
+       if (mpddrc_base)
+               iounmap(mpddrc_base);
+
        clk_disable_unprepare(sclk);
 
        return 0;