]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
ARM: zynq: Refactor PM code
authorSoren Brinkmann <soren.brinkmann@xilinx.com>
Wed, 30 Jul 2014 16:13:08 +0000 (09:13 -0700)
committerMichal Simek <michal.simek@xilinx.com>
Thu, 31 Jul 2014 09:45:54 +0000 (11:45 +0200)
Some PM features are enabled in zynq_pm_late_init() that are independent
of suspend support. Hence the code is refactored to always do the common
PM init.

Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/arm/mach-zynq/Makefile
arch/arm/mach-zynq/common.h
arch/arm/mach-zynq/pm.c

index 30ae83df5ae574d6a048b2ec8e0b713151e3d841..a2fcb6c22ef699736fa8e5ea337f08323b31569b 100644 (file)
@@ -3,12 +3,12 @@
 #
 
 # Common support
-obj-y                          := common.o slcr.o zynq_ocm.o
+obj-y                          := common.o slcr.o zynq_ocm.o pm.o
 
 obj-$(CONFIG_PCI_MSI)           += xaxipcie-msi.o
 obj-$(CONFIG_SMP)              += headsmp.o platsmp.o
 ORIG_AFLAGS := $(KBUILD_AFLAGS)
 KBUILD_AFLAGS = $(subst -march=armv6k,,$(ORIG_AFLAGS))
 AFLAGS_suspend.o               +=-Wa,-march=armv7-a -mcpu=cortex-a9
-obj-$(CONFIG_SUSPEND)          += pm.o suspend.o
+obj-$(CONFIG_SUSPEND)          += suspend.o
 obj-$(CONFIG_XILINX_AXIPCIE)    += xaxipcie.o
index a2607936f504dbf84787b57c0a8550c183d6bac7..9d1597dbb7e02eaed53917240d1f87563954c2f6 100644 (file)
@@ -44,15 +44,7 @@ extern void zynq_slcr_init_postload_fpga(void);
 extern void __iomem *zynq_slcr_base;
 extern void __iomem *zynq_scu_base;
 
-#ifdef CONFIG_SUSPEND
 int zynq_pm_late_init(void);
-#else
-static inline int zynq_pm_late_init(void)
-{
-       return 0;
-}
-#endif
-
 extern unsigned int zynq_sys_suspend_sz;
 int zynq_sys_suspend(void __iomem *ddrc_base, void __iomem *slcr_base);
 
index 0524c15a597363e7c8bd81c3b0cfe26b7806cd0f..1e03589f217fc58713002f375637802453b623fb 100644 (file)
@@ -44,6 +44,8 @@
 #define DDRC_SELFREFRESH_MASK  BIT(12)
 
 static void __iomem *ddrc_base;
+
+#ifdef CONFIG_SUSPEND
 static void __iomem *ocm_base;
 
 static int zynq_pm_prepare_late(void)
@@ -111,30 +113,6 @@ static const struct platform_suspend_ops zynq_pm_ops = {
        .valid          = suspend_valid_only_mem,
 };
 
-/**
- * zynq_pm_ioremap() - Create IO mappings
- * @comp:      DT compatible string
- * Returns a pointer to the mapped memory or NULL.
- *
- * Remap the memory region for a compatible DT node.
- */
-static void __iomem *zynq_pm_ioremap(const char *comp)
-{
-       struct device_node *np;
-       void __iomem *base = NULL;
-
-       np = of_find_compatible_node(NULL, NULL, comp);
-       if (np) {
-               base = of_iomap(np, 0);
-               of_node_put(np);
-       } else {
-               pr_warn("%s: no compatible node found for '%s'\n", __func__,
-                               comp);
-       }
-
-       return base;
-}
-
 /**
  * zynq_pm_remap_ocm() - Remap OCM
  * Returns a pointer to the mapped memory or NULL.
@@ -192,6 +170,53 @@ static void __iomem *zynq_pm_remap_ocm(void)
        return base;
 }
 
+static void zynq_pm_suspend_init(void)
+{
+       ocm_base = zynq_pm_remap_ocm();
+       if (!ocm_base) {
+               pr_warn("%s: Unable to map OCM.\n", __func__);
+       } else {
+               /*
+                * Copy code to suspend system into OCM. The suspend code
+                * needs to run from OCM as DRAM may no longer be available
+                * when the PLL is stopped.
+                */
+               memcpy((__force void *)ocm_base, &zynq_sys_suspend,
+                       zynq_sys_suspend_sz);
+               flush_icache_range((unsigned long)ocm_base,
+                       (unsigned long)(ocm_base) + zynq_sys_suspend_sz);
+       }
+
+       suspend_set_ops(&zynq_pm_ops);
+}
+#else  /* CONFIG_SUSPEND */
+static void zynq_pm_suspend_init(void) { };
+#endif /* CONFIG_SUSPEND */
+
+/**
+ * zynq_pm_ioremap() - Create IO mappings
+ * @comp:      DT compatible string
+ * Returns a pointer to the mapped memory or NULL.
+ *
+ * Remap the memory region for a compatible DT node.
+ */
+static void __iomem *zynq_pm_ioremap(const char *comp)
+{
+       struct device_node *np;
+       void __iomem *base = NULL;
+
+       np = of_find_compatible_node(NULL, NULL, comp);
+       if (np) {
+               base = of_iomap(np, 0);
+               of_node_put(np);
+       } else {
+               pr_warn("%s: no compatible node found for '%s'\n", __func__,
+                               comp);
+       }
+
+       return base;
+}
+
 int __init zynq_pm_late_init(void)
 {
        u32 reg;
@@ -214,22 +239,8 @@ int __init zynq_pm_late_init(void)
                writel(reg, ddrc_base + DDRC_DRAM_PARAM_REG3_OFFS);
        }
 
-       ocm_base = zynq_pm_remap_ocm();
-       if (!ocm_base) {
-               pr_warn("%s: Unable to map OCM.\n", __func__);
-       } else {
-               /*
-                * Copy code to suspend system into OCM. The suspend code
-                * needs to run from OCM as DRAM may no longer be available
-                * when the PLL is stopped.
-                */
-               memcpy((__force void *)ocm_base, &zynq_sys_suspend,
-                       zynq_sys_suspend_sz);
-               flush_icache_range((unsigned long)ocm_base,
-                       (unsigned long)(ocm_base) + zynq_sys_suspend_sz);
-       }
-
-       suspend_set_ops(&zynq_pm_ops);
+       /* set up suspend */
+       zynq_pm_suspend_init();
 
        return 0;
 }