summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2011-09-22 11:28:07 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2011-09-27 10:27:31 +0200
commitbc1969658ba10447a1cff7792ce4c2786023663f (patch)
treeb27814a06545f3eec151e2984eed95b41077e882
parent0c638571f0168760c0157ec4c7be512a2353f6ad (diff)
downloadbarebox-bc1969658ba10447a1cff7792ce4c2786023663f.tar.gz
barebox-bc1969658ba10447a1cff7792ce4c2786023663f.tar.xz
ppc mpc5200: add function to configure a chipselect
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--arch/ppc/mach-mpc5xxx/cpu.c70
-rw-r--r--arch/ppc/mach-mpc5xxx/include/mach/mpc5xxx.h4
2 files changed, 74 insertions, 0 deletions
diff --git a/arch/ppc/mach-mpc5xxx/cpu.c b/arch/ppc/mach-mpc5xxx/cpu.c
index cf2ca2fb68..649f08a87d 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 aad2418fd4..558f331160 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 */