ifeq ($(CONFIG_PM),y)
 obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o headsmp.o
+# i.MX6SL reuses pm-imx6q.c
+obj-$(CONFIG_SOC_IMX6SL) += pm-imx6q.o
 endif
 
 # i.MX5 based machines
 
        base = of_iomap(np, 0);
        WARN_ON(!base);
 
+       /* Reuse imx6q pm code */
+       imx6q_pm_set_ccm_base(base);
+
        /*                                              name                reg       shift width parent_names     num_parents */
        clks[IMX6SL_CLK_STEP]             = imx_clk_mux("step",             base + 0xc,  8,  1, step_sels,         ARRAY_SIZE(step_sels));
        clks[IMX6SL_CLK_PLL1_SW]          = imx_clk_mux("pll1_sw",          base + 0xc,  2,  1, pll1_sw_sels,      ARRAY_SIZE(pll1_sw_sels));
 
        of_platform_populate(NULL, of_default_bus_match_table, NULL, parent);
 
        imx6sl_fec_init();
+       imx_anatop_init();
+       /* Reuse imx6q pm code */
+       imx6q_pm_init();
 }
 
 static void __init imx6sl_init_irq(void)
 
 #endif
 
 #ifndef __ASSEMBLY__
+static inline bool cpu_is_imx6sl(void)
+{
+       return __mxc_cpu_type == MXC_CPU_IMX6SL;
+}
+
 static inline bool cpu_is_imx6dl(void)
 {
        return __mxc_cpu_type == MXC_CPU_IMX6DL;
 
                val |= 0x3 << BP_CLPCR_STBY_COUNT;
                val |= BM_CLPCR_VSTBY;
                val |= BM_CLPCR_SBYOS;
+               if (cpu_is_imx6sl()) {
+                       val |= BM_CLPCR_BYPASS_PMIC_READY;
+                       val |= BM_CLPCR_BYP_MMDC_CH0_LPM_HS;
+               } else {
+                       val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS;
+               }
                break;
        default:
                return -EINVAL;
                imx_set_cpu_jump(0, v7_cpu_resume);
                /* Zzz ... */
                cpu_suspend(0, imx6q_suspend_finish);
-               imx_smp_prepare();
+               if (cpu_is_imx6q() || cpu_is_imx6dl())
+                       imx_smp_prepare();
                imx_anatop_post_resume();
                imx_gpc_post_resume();
                imx6q_enable_rbc(false);