[PATCH 05/14] ppc mpc5200: add function to configure a chipselect

Sascha Hauer s.hauer at pengutronix.de
Tue Sep 27 04:28:20 EDT 2011


Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 arch/ppc/mach-mpc5xxx/cpu.c                  |   70 ++++++++++++++++++++++++++
 arch/ppc/mach-mpc5xxx/include/mach/mpc5xxx.h |    4 ++
 2 files changed, 74 insertions(+), 0 deletions(-)

diff --git a/arch/ppc/mach-mpc5xxx/cpu.c b/arch/ppc/mach-mpc5xxx/cpu.c
index cf2ca2f..649f08a 100644
--- a/arch/ppc/mach-mpc5xxx/cpu.c
+++ b/arch/ppc/mach-mpc5xxx/cpu.c
@@ -30,6 +30,7 @@
 #include <mach/mpc5xxx.h>
 #include <asm/processor.h>
 #include <asm/byteorder.h>
+#include <asm/io.h>
 #include <init.h>
 #include <types.h>
 #include <mach/clocks.h>
@@ -130,3 +131,72 @@ unsigned long mpc5200_get_sdram_size(unsigned int cs)
 
 	return size;
 }
+
+struct mpc5200_cs {
+	void *start;
+	void *stop;
+	void *cfg;
+	unsigned int addecr;
+};
+
+static struct mpc5200_cs chipselects[] = {
+	{
+		.start = (void *)MPC5XXX_CS0_START,
+		.stop = (void *)MPC5XXX_CS0_STOP,
+		.cfg = (void *)MPC5XXX_CS0_CFG,
+		.addecr = 1 << 16,
+	}, {
+		.start = (void *)MPC5XXX_CS1_START,
+		.stop = (void *)MPC5XXX_CS1_STOP,
+		.cfg = (void *)MPC5XXX_CS1_CFG,
+		.addecr = 1 << 17,
+	}, {
+		.start = (void *)MPC5XXX_CS2_START,
+		.stop = (void *)MPC5XXX_CS2_STOP,
+		.cfg = (void *)MPC5XXX_CS2_CFG,
+		.addecr = 1 << 18,
+	}, {
+		.start = (void *)MPC5XXX_CS3_START,
+		.stop = (void *)MPC5XXX_CS3_STOP,
+		.cfg = (void *)MPC5XXX_CS3_CFG,
+		.addecr = 1 << 19,
+	}, {
+		.start = (void *)MPC5XXX_CS4_START,
+		.stop = (void *)MPC5XXX_CS4_STOP,
+		.cfg = (void *)MPC5XXX_CS4_CFG,
+		.addecr = 1 << 20,
+	}, {
+		.start = (void *)MPC5XXX_CS5_START,
+		.stop = (void *)MPC5XXX_CS5_STOP,
+		.cfg = (void *)MPC5XXX_CS5_CFG,
+		.addecr = 1 << 21,
+	}, {
+		.start = (void *)MPC5XXX_CS6_START,
+		.stop = (void *)MPC5XXX_CS6_STOP,
+		.cfg = (void *)MPC5XXX_CS6_CFG,
+		.addecr = 1 << 26,
+	}, {
+		.start = (void *)MPC5XXX_CS7_START,
+		.stop = (void *)MPC5XXX_CS7_STOP,
+		.cfg = (void *)MPC5XXX_CS7_CFG,
+		.addecr = 1 << 27,
+	}, {
+		.start = (void *)MPC5XXX_BOOTCS_START,
+		.stop = (void *)MPC5XXX_BOOTCS_STOP,
+		.cfg = (void *)MPC5XXX_CS0_CFG,
+		.addecr = 1 << 25,
+	},
+};
+
+void mpc5200_setup_cs(int cs, unsigned long start, unsigned long size, u32 cfg)
+{
+	u32 addecr;
+
+	out_be32(chipselects[cs].start, START_REG(start));
+	out_be32(chipselects[cs].stop, STOP_REG(start, size));
+	out_be32(chipselects[cs].cfg, cfg);
+
+	addecr = in_be32((void *)MPC5XXX_ADDECR);
+	addecr |= chipselects[cs].addecr | 1;
+	out_be32((void *)MPC5XXX_ADDECR, addecr);
+}
diff --git a/arch/ppc/mach-mpc5xxx/include/mach/mpc5xxx.h b/arch/ppc/mach-mpc5xxx/include/mach/mpc5xxx.h
index aad2418..558f331 100644
--- a/arch/ppc/mach-mpc5xxx/include/mach/mpc5xxx.h
+++ b/arch/ppc/mach-mpc5xxx/include/mach/mpc5xxx.h
@@ -782,6 +782,10 @@ void loadtask(int basetask, int tasks);
 /* retrieve configured sdram size connected to a chipselect */
 unsigned long mpc5200_get_sdram_size(unsigned int cs);
 
+/* configure a local plus bus chip select */
+#define MPC5200_BOOTCS 8
+void mpc5200_setup_cs(int cs, unsigned long start, unsigned long size, u32 cfg);
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* __ASMPPC_MPC5XXX_H */
-- 
1.7.6.3




More information about the barebox mailing list