forked from Minki/linux
df595746fa
When system enter suspend, we can set the DDR IO to high-Z state to save DDR IOs' power consumption, this operation can save many power(from ~26mA@1.5V to ~15mA@1.5V, measured on i.MX6Q SabreSD board, R25) of DDR IOs. To achieve that, we need to copy the suspend code to ocram and run the low level hardware related code(set DDR IOs to high-Z state) in ocram. If there is no ocram space available, then system will still do suspend in external DDR, hence no DDR IOs will be set to high-Z. The OCRAM usage layout is as below, ocram suspend region(4K currently): ======================== high address ====================== . . . ^ ^ ^ imx6_suspend code PM_INFO structure(imx6_cpu_pm_info) ======================== low address ======================= Reviewed-by: Sascha Hauer <s.hauer@pengutronix.de> Signed-off-by: Anson Huang <b20788@freescale.com> Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
86 lines
2.0 KiB
C
86 lines
2.0 KiB
C
/*
|
|
* Copyright 2013 Freescale Semiconductor, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
*/
|
|
|
|
#include <linux/irqchip.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of_platform.h>
|
|
#include <linux/mfd/syscon.h>
|
|
#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
|
|
#include <linux/regmap.h>
|
|
#include <asm/mach/arch.h>
|
|
#include <asm/mach/map.h>
|
|
|
|
#include "common.h"
|
|
#include "cpuidle.h"
|
|
|
|
static void __init imx6sl_fec_init(void)
|
|
{
|
|
struct regmap *gpr;
|
|
|
|
/* set FEC clock from internal PLL clock source */
|
|
gpr = syscon_regmap_lookup_by_compatible("fsl,imx6sl-iomuxc-gpr");
|
|
if (!IS_ERR(gpr)) {
|
|
regmap_update_bits(gpr, IOMUXC_GPR1,
|
|
IMX6SL_GPR1_FEC_CLOCK_MUX2_SEL_MASK, 0);
|
|
regmap_update_bits(gpr, IOMUXC_GPR1,
|
|
IMX6SL_GPR1_FEC_CLOCK_MUX1_SEL_MASK, 0);
|
|
} else {
|
|
pr_err("failed to find fsl,imx6sl-iomux-gpr regmap\n");
|
|
}
|
|
}
|
|
|
|
static void __init imx6sl_init_late(void)
|
|
{
|
|
/* imx6sl reuses imx6q cpufreq driver */
|
|
if (IS_ENABLED(CONFIG_ARM_IMX6Q_CPUFREQ))
|
|
platform_device_register_simple("imx6q-cpufreq", -1, NULL, 0);
|
|
|
|
imx6sl_cpuidle_init();
|
|
}
|
|
|
|
static void __init imx6sl_init_machine(void)
|
|
{
|
|
struct device *parent;
|
|
|
|
mxc_arch_reset_init_dt();
|
|
|
|
parent = imx_soc_device_init();
|
|
if (parent == NULL)
|
|
pr_warn("failed to initialize soc device\n");
|
|
|
|
of_platform_populate(NULL, of_default_bus_match_table, NULL, parent);
|
|
|
|
imx6sl_fec_init();
|
|
imx_anatop_init();
|
|
imx6sl_pm_init();
|
|
}
|
|
|
|
static void __init imx6sl_init_irq(void)
|
|
{
|
|
imx_init_revision_from_anatop();
|
|
imx_init_l2cache();
|
|
imx_src_init();
|
|
imx_gpc_init();
|
|
irqchip_init();
|
|
}
|
|
|
|
static const char *imx6sl_dt_compat[] __initconst = {
|
|
"fsl,imx6sl",
|
|
NULL,
|
|
};
|
|
|
|
DT_MACHINE_START(IMX6SL, "Freescale i.MX6 SoloLite (Device Tree)")
|
|
.map_io = debug_ll_io_init,
|
|
.init_irq = imx6sl_init_irq,
|
|
.init_machine = imx6sl_init_machine,
|
|
.init_late = imx6sl_init_late,
|
|
.dt_compat = imx6sl_dt_compat,
|
|
.restart = mxc_restart,
|
|
MACHINE_END
|