Basic support for the m5253demo board from Freescale.  This is a work in
progress, currently only the dm9000 ethernet interface is supported.  More
patches to come ;)

This patch is against the v3.4-rc6 for_next branch of the m68knommu.git

Signed-off-by: Steven King <sfk...@fdwdc.com>
---
 arch/m68k/Kconfig.machine               |    7 ++
 arch/m68k/include/asm/io_no.h           |    8 ++
 arch/m68k/include/asm/m525xsim.h        |    4 +
 arch/m68k/platform/coldfire/Makefile    |    1 +
 arch/m68k/platform/coldfire/m5253demo.c |  125 +++++++++++++++++++++++++++++++
 5 files changed, 145 insertions(+)

diff --git a/arch/m68k/Kconfig.machine b/arch/m68k/Kconfig.machine
index 7cdf6b0..10c97dc 100644
--- a/arch/m68k/Kconfig.machine
+++ b/arch/m68k/Kconfig.machine
@@ -252,6 +252,13 @@ config M5249C3
        help
          Support for the Motorola M5249C3 board.
 
+config M5253DEMO
+       bool "Freescale M5253DEMO board support"
+       depends on M525x
+       select FREESCALE
+       help
+         Support for the Freescale M5253DEMO board.
+
 config M5271EVB
        bool "Freescale (Motorola) M5271EVB board support"
        depends on M5271
diff --git a/arch/m68k/include/asm/io_no.h b/arch/m68k/include/asm/io_no.h
index 353bf75..3d18c94 100644
--- a/arch/m68k/include/asm/io_no.h
+++ b/arch/m68k/include/asm/io_no.h
@@ -135,6 +135,14 @@ static inline void io_insl(unsigned int addr, void *buf, 
int len)
 #define insw(a,b,l) io_insw(a,b,l)
 #define insl(a,b,l) io_insl(a,b,l)
 
+#define writesb(a, b, l) io_outsb((unsigned int)a, b, l)
+#define writesw(a, b, l) io_outsw((unsigned int)a, b, l)
+#define writesl(a, b, l) io_outsl((unsigned int)a, b, l)
+
+#define readsb(a, b, l) io_insb((unsigned int)a, b, l)
+#define readsw(a, b, l) io_insw((unsigned int)a, b, l)
+#define readsl(a, b, l) io_insl((unsigned int)a, b, l)
+
 #define IO_SPACE_LIMIT 0xffffffff
 
 
diff --git a/arch/m68k/include/asm/m525xsim.h b/arch/m68k/include/asm/m525xsim.h
index 3d62b9d..46fbb34 100644
--- a/arch/m68k/include/asm/m525xsim.h
+++ b/arch/m68k/include/asm/m525xsim.h
@@ -105,6 +105,10 @@
 #define MCFQSPI_CS0            15
 #define MCFQSPI_CS1            16
 #define MCFQSPI_CS2            24
+#if !IS_ENABLED(CONFIG_DM9000)
+/* on the m5253demo the CS1/QSPICS3 is used as CS for the dm9000 */
+#define MCFQSPI_CS3            28
+#endif
 
 /*
  *     I2C module.
diff --git a/arch/m68k/platform/coldfire/Makefile 
b/arch/m68k/platform/coldfire/Makefile
index 82f0764..612f8cd 100644
--- a/arch/m68k/platform/coldfire/Makefile
+++ b/arch/m68k/platform/coldfire/Makefile
@@ -32,6 +32,7 @@ obj-$(CONFIG_M54xx)   += m54xx.o sltimers.o intc-2.o
 obj-$(CONFIG_NETtel)   += nettel.o
 obj-$(CONFIG_CLEOPATRA)        += nettel.o
 obj-$(CONFIG_FIREBEE)  += firebee.o
+obj-$(CONFIG_M5253DEMO)        += m5253demo.o
 
 obj-y                  += pinmux.o gpio.o
 extra-y := head.o
diff --git a/arch/m68k/platform/coldfire/m5253demo.c 
b/arch/m68k/platform/coldfire/m5253demo.c
new file mode 100644
index 0000000..9041e1b
--- /dev/null
+++ b/arch/m68k/platform/coldfire/m5253demo.c
@@ -0,0 +1,125 @@
+/***************************************************************************/
+/*
+ *     m5253demo.c -- board support for the Freescale M5253demo board
+ *
+ *     Copyright (C) 2012, Steven King <sfk...@fdwdc.com>
+ */
+
+/***************************************************************************/
+
+#include <linux/kernel.h>
+#include <linux/param.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/platform_device.h>
+#include <linux/gpio.h>
+#include <linux/dm9000.h>
+#include <asm/coldfire.h>
+#include <asm/mcfsim.h>
+
+
+/***************************************************************************/
+#if IS_ENABLED(CONFIG_DM9000)
+
+/* The m5253demo has the DM9000 at 0x0e0000300/0x0e0000304, gpio5/irq 37 */
+
+#define DM9000_ADDR    0xe0000300
+#define DM9000_DATA    0xe0000304
+#define DM9000_IRQ     MCF_IRQ_GPIO5
+
+#define DM9000_GPIO    (DM9000_IRQ - MCF_IRQ_GPIO0)
+
+static struct resource m5253demo_dm9000_resources[] = {
+       [0] = {
+               .start          = DM9000_ADDR,
+               .end            = DM9000_ADDR + 0x3,
+               .flags          = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start          = DM9000_DATA,
+               .end            = DM9000_DATA + 0x3,
+               .flags          = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start          = DM9000_IRQ,
+               .end            = DM9000_IRQ,
+               .flags          = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
+       },
+};
+
+static void m5253demo_dm9000_inblk(void __iomem *reg, void *data, int len)
+{
+       u16 *buf = data;
+       int n = (len + 1) >> 1;
+       while (n-- > 0)
+               *buf++ = readw(reg);
+}
+
+static void m5253demo_dm9000_outblk(void __iomem *reg, void *data, int len)
+{
+       u16 *buf = data;
+       int n = (len + 1) >> 1;
+       while (n-- > 0)
+               writew(*buf++, reg);
+}
+
+static void m5253demo_dm9000_dumpblk(void __iomem *reg, int len)
+{
+       int n = (len + 1) >> 1;
+       while (n-- > 0)
+               readw(reg);
+}
+
+static struct dm9000_plat_data m5253demo_dm9000_platdata = {
+       .flags          = DM9000_PLATF_NO_EEPROM,
+       .inblk          = m5253demo_dm9000_inblk,
+       .outblk         = m5253demo_dm9000_outblk,
+       .dumpblk        = m5253demo_dm9000_dumpblk,
+};
+
+static struct platform_device m5253demo_dm9000 = {
+       .name                   = "dm9000",
+       .id                     = -1,
+       .num_resources          = ARRAY_SIZE(m5253demo_dm9000_resources),
+       .resource               = m5253demo_dm9000_resources,
+       .dev.platform_data      = &m5253demo_dm9000_platdata,
+};
+
+static void __init m5253demo_dm9000_init(void)
+{
+       u32 r;
+       int status;
+
+       /* set the gpio function for DM9000_GPIO to gpio */
+       /* FIXME: replace with pinmux/pinctl support */
+       r = readl(MCFSIM2_GPIOFUNC);
+       r |= 1 << DM9000_GPIO;
+       writel(r, MCFSIM2_GPIOFUNC);
+
+       /* reserve the gpio so nothing else can request it */
+       /* FIXME: replace with pinmux/pinctl support */
+       status = gpio_request(DM9000_GPIO, "DM9000_GPIO");
+       if (status)
+               pr_warn("gpio_request for DM9000_GPIO failed\n");
+       /* set the priority level for DM9000 gpio irq */
+       r = readl(MCFINTC2_INTPRI_REG(DM9000_IRQ));
+       r &= ~MCFINTC2_INTPRI_BITS(0xf, DM9000_IRQ);
+       r |= MCFINTC2_INTPRI_BITS(0x4, DM9000_IRQ);
+       writel(r, MCFINTC2_INTPRI_REG(DM9000_IRQ));
+}
+#endif /* IS_ENABLED(CONFIG_DM9000) */
+
+static struct platform_device *m5253demo_devices[] __initdata = {
+       &m5253demo_dm9000,
+};
+
+static int __init m5253demo_init(void)
+{
+       m5253demo_dm9000_init();
+       platform_add_devices(m5253demo_devices, ARRAY_SIZE(m5253demo_devices));
+       return 0;
+}
+
+arch_initcall(m5253demo_init);
+
+/***************************************************************************/
_______________________________________________
uClinux-dev mailing list
uClinux-dev@uclinux.org
http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
This message was resent by uclinux-dev@uclinux.org
To unsubscribe see:
http://mailman.uclinux.org/mailman/options/uclinux-dev

Reply via email to