arm64: zynqmp: Prepare psu_init rework
authorMichal Simek <michal.simek@xilinx.com>
Wed, 10 Jan 2018 08:36:09 +0000 (09:36 +0100)
committerMichal Simek <michal.simek@xilinx.com>
Tue, 30 Jan 2018 13:29:18 +0000 (14:29 +0100)
Move generic functions to common location psu_spl_init.c. Function
declarations are added to private header.
These changes are done in connection to the fact that still files from
HDF can be copied over and compilation should pass.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/arm/cpu/armv8/zynqmp/Makefile
arch/arm/cpu/armv8/zynqmp/psu_spl_init.c [new file with mode: 0644]
arch/arm/cpu/armv8/zynqmp/spl.c
arch/arm/include/asm/arch-zynqmp/psu_init_gpl.h [new file with mode: 0644]
arch/arm/include/asm/arch-zynqmp/sys_proto.h
board/xilinx/zynqmp/zynqmp.c

index 72dee3ded48f4c6213a90f8a68f5f1bafb9adc2f..dde1a0f658f0001b0bde274de61094ca3e1b070b 100644 (file)
@@ -9,3 +9,4 @@ obj-y   += clk.o
 obj-y  += cpu.o
 obj-$(CONFIG_MP)       += mp.o
 obj-$(CONFIG_SPL_BUILD) += spl.o handoff.o
+obj-$(CONFIG_ZYNQMP_PSU_INIT_ENABLED)  += psu_spl_init.o
diff --git a/arch/arm/cpu/armv8/zynqmp/psu_spl_init.c b/arch/arm/cpu/armv8/zynqmp/psu_spl_init.c
new file mode 100644 (file)
index 0000000..28d3957
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2018 Xilinx, Inc.
+ *
+ * Michal Simek <michal.simek@xilinx.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/psu_init_gpl.h>
+
+#define PSU_MASK_POLL_TIME 1100000
+
+int __maybe_unused mask_pollonvalue(unsigned long add, u32 mask, u32 value)
+{
+       int i = 0;
+
+       while ((__raw_readl(add) & mask) != value) {
+               if (i == PSU_MASK_POLL_TIME)
+                       return 0;
+               i++;
+       }
+       return 1;
+}
+
+__weak int mask_poll(u32 add, u32 mask)
+{
+       int i = 0;
+       unsigned long addr = add;
+
+       while (!(__raw_readl(addr) & mask)) {
+               if (i == PSU_MASK_POLL_TIME)
+                       return 0;
+               i++;
+       }
+       return 1;
+}
+
+__weak u32 mask_read(u32 add, u32 mask)
+{
+       unsigned long addr = add;
+
+       return __raw_readl(addr) & mask;
+}
+
+__weak void mask_delay(u32 delay)
+{
+       udelay(delay);
+}
+
+__weak void psu_mask_write(unsigned long offset, unsigned long mask,
+                          unsigned long val)
+{
+       unsigned long regval = 0;
+
+       regval = readl(offset);
+       regval &= ~(mask);
+       regval |= (val & mask);
+       writel(regval, offset);
+}
+
+__weak void prog_reg(unsigned long addr, unsigned long mask,
+                    unsigned long shift, unsigned long value)
+{
+       int rdata = 0;
+
+       rdata = readl(addr);
+       rdata = rdata & (~mask);
+       rdata = rdata | (value << shift);
+       writel(rdata, addr);
+}
+
+__weak int psu_init(void)
+{
+       /*
+        * This function is overridden by the one in
+        * board/xilinx/zynqmp/(platform)/psu_init_gpl.c, if it exists.
+        */
+       return -1;
+}
index 41ca74a2be2be6ec148de47d322f4e0d224d5dcd..bc7313a88bd02303d77f3c97558f8d1a83301a84 100644 (file)
@@ -129,15 +129,6 @@ u32 spl_boot_mode(const u32 boot_device)
        }
 }
 
-__weak int psu_init(void)
-{
-       /*
-        * This function is overridden by the one in
-        * board/xilinx/zynqmp/(platform)/psu_init_gpl.c, if it exists.
-        */
-       return -1;
-}
-
 #ifdef CONFIG_SPL_OS_BOOT
 int spl_start_uboot(void)
 {
diff --git a/arch/arm/include/asm/arch-zynqmp/psu_init_gpl.h b/arch/arm/include/asm/arch-zynqmp/psu_init_gpl.h
new file mode 100644 (file)
index 0000000..1f7d4f7
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _PSU_INIT_GPL_H_ /* prevent circular inclusions */
+#define _PSU_INIT_GPL_H_
+
+#include <asm/io.h>
+#include <common.h>
+
+int mask_pollonvalue(unsigned long add, u32 mask, u32 value);
+
+int mask_poll(u32 add, u32 mask);
+
+u32 mask_read(u32 add, u32 mask);
+
+void mask_delay(u32 delay);
+
+void psu_mask_write(unsigned long offset, unsigned long mask,
+                   unsigned long val);
+
+void prog_reg(unsigned long addr, unsigned long mask,
+             unsigned long shift, unsigned long value);
+
+int psu_init(void);
+
+#endif /* _PSU_INIT_GPL_H_ */
index 4dfabba80a5c0eb5c9c0da44bf24cffcdc078bfd..084d55a2b01f5ae5f64bf54cd5f60052ff2432af 100644 (file)
@@ -33,8 +33,6 @@ enum {
 int zynq_board_read_rom_ethaddr(unsigned char *ethaddr);
 unsigned int zynqmp_get_silicon_version(void);
 
-int psu_init(void);
-
 void handoff_setup(void);
 
 void zynqmp_pmufw_version(void);
index 6c8254b9824b2fca5693180f6ce1d67509129b66..ff0b3c75f53327faa489afab503fc9d3fce020bd 100644 (file)
@@ -13,6 +13,7 @@
 #include <asm/arch/clk.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/sys_proto.h>
+#include <asm/arch/psu_init_gpl.h>
 #include <asm/io.h>
 #include <usb.h>
 #include <dwc3-uboot.h>