@@ -17,8 +17,22 @@
/* VIC0: System, DMA, Timer */
-#define IRQ_EINT6 S5P_IRQ_VIC0(6)
-#define IRQ_EINT13 S5P_IRQ_VIC0(13)
+#define IRQ_EINT0 S5P_IRQ_VIC0(0)
+#define IRQ_EINT1 S5P_IRQ_VIC0(1)
+#define IRQ_EINT2 S5P_IRQ_VIC0(2)
+#define IRQ_EINT3 S5P_IRQ_VIC0(3)
+#define IRQ_EINT4 S5P_IRQ_VIC0(4)
+#define IRQ_EINT5 S5P_IRQ_VIC0(5)
+#define IRQ_EINT6 S5P_IRQ_VIC0(6)
+#define IRQ_EINT7 S5P_IRQ_VIC0(7)
+#define IRQ_EINT8 S5P_IRQ_VIC0(8)
+#define IRQ_EINT9 S5P_IRQ_VIC0(9)
+#define IRQ_EINT10 S5P_IRQ_VIC0(10)
+#define IRQ_EINT11 S5P_IRQ_VIC0(11)
+#define IRQ_EINT12 S5P_IRQ_VIC0(12)
+#define IRQ_EINT13 S5P_IRQ_VIC0(13)
+#define IRQ_EINT14 S5P_IRQ_VIC0(14)
+#define IRQ_EINT15 S5P_IRQ_VIC0(15)
#define IRQ_EINT16_31 S5P_IRQ_VIC0(16)
#define IRQ_BATF S5P_IRQ_VIC0(17)
#define IRQ_MDMA S5P_IRQ_VIC0(18)
diff --git a/arch/arm/mach-s5pv210/include/mach/map.h b/arch/arm/mach-s5pv210/include/mach/map.h
index ee81e4b..83e08d7 100755
--- a/arch/arm/mach-s5pv210/include/mach/map.h
+++ b/arch/arm/mach-s5pv210/include/mach/map.h
@@ -15,7 +15,9 @@
#include <plat/map-base.h>
#include <plat/map-s5p.h>
-
+//#define S5PV210_PA_DM9000 (0xA8000000) jhk add dm9000
+#define S5PV210_PA_DM9000 (0x88000300)
+#define S5P_PA_DM9000 S5PV210_PA_DM9000
#if defined(CONFIG_MACH_SMDKV210) || defined(CONFIG_MACH_MANGO210)
#define S5PV210_PA_SDRAM 0x20000000
#else
diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c
index 960c4ba..5c158be 100755
--- a/arch/arm/mach-s5pv210/mach-smdkv210.c
+++ b/arch/arm/mach-s5pv210/mach-smdkv210.c
@@ -1121,7 +1121,30 @@ static void mango210_board_cfg_gpio(void)
}
}
+#ifdef CONFIG_DM9000
+static void __init smdkc110_dm9000_set(void)
+{
+ unsigned int tmp;
+
+ tmp = ((0<<28)|(3<<24)|(7<<16)|(1<<12)|(3<<8)|(6<<4)|(0<<0));
+ __raw_writel(tmp, (S5P_SROM_BW+0x08));//Bc1
+
+ tmp = __raw_readl(S5P_SROM_BW);
+ tmp &= ~(0xf << 4);
+
+ tmp |= (0x1 << 4);
+ tmp |= (0x2 << 4);
+
+ __raw_writel(tmp, S5P_SROM_BW);
+
+ tmp = __raw_readl(S5PV210_MP01CON);
+ tmp &= ~(0xf << 4);
+ tmp |= (2 << 4);
+
+ __raw_writel(tmp, S5PV210_MP01CON);
+}
+#endif
static void __init mango210_sound_init(void)
{
@@ -1167,6 +1190,9 @@ static struct platform_device *mango210_devices[] __initdata = {
&s3c_device_i2c0,
&s3c_device_i2c1,
&s3c_device_i2c2,
+#ifdef CONFIG_DM9000
+ &s5p_device_dm9000,
+#endif
//#ifdef CONFIG_SND_S3C_SOC_AC97
&s5pv210_device_ac97,
//#endif
@@ -1754,7 +1780,9 @@ static void __init mango210_machine_init(void)
#ifdef CONFIG_ANDROID_PMEM
android_pmem_set_platdata();
#endif
-
+#ifdef CONFIG_DM9000
+ smdkc110_dm9000_set();
+#endif
mango210_sound_init();
s3c24xx_ts_set_platdata(&s3c_ts_platform);
diff --git a/arch/arm/plat-s5p/devs.c b/arch/arm/plat-s5p/devs.c
index 622a606..e06f5ac 100755
--- a/arch/arm/plat-s5p/devs.c
+++ b/arch/arm/plat-s5p/devs.c
@@ -11,6 +11,7 @@
*/
#include <linux/gpio.h>
+#include <linux/dm9000.h>
#include <linux/platform_device.h>
#include <mach/irqs.h>
@@ -22,6 +23,68 @@
#include <plat/media.h>
#include <plat/jpeg.h>
@@ -22,6 +23,68 @@
#include <plat/media.h>
#include <plat/jpeg.h>
#include <mach/media.h>
+/* DM9000 registrations */
+#ifdef CONFIG_DM9000
+static struct resource s5p_dm9000_resources[] = {
+ [0] = {
+ .start = S5P_PA_DM9000,
+ .end = S5P_PA_DM9000,
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = {
+#if defined(CONFIG_DM9000_16BIT)
+ .start = S5P_PA_DM9000 + 4,
+ .end = S5P_PA_DM9000 + 4,
+ .flags = IORESOURCE_MEM,
+#else
+ .start = S5P_PA_DM9000 + 1,
+ .end = S5P_PA_DM9000 + 1,
+ .flags = IORESOURCE_MEM,
+#endif
+ },
+ [2] = {
+ .start = IRQ_EINT9,
+ .end = IRQ_EINT9,
+ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
+ }
+};
+
+static struct dm9000_plat_data s5p_dm9000_platdata = {
+#if defined(CONFIG_DM9000_16BIT)
+ .flags = DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM,
+#else
+ .flags = DM9000_PLATF_8BITONLY | DM9000_PLATF_NO_EEPROM,
+#endif
+ .dev_addr = {0x00,0x09,0xc0,0xff,0xec,0x48},
+};
+
+struct platform_device s5p_device_dm9000 = {
+ .name = "dm9000",
+ .id = 0,
+ .dev = {
+ .platform_data = &s5p_dm9000_platdata,
+ }
+};
+
+/* need to get the ether addr from armboot */
+static int __init ethaddr_setup(char *line)
+{
+ char *ep;
+ int i;
+
+ /* there should really be routines to do this stuff */
+ for (i = 0; i < 6; i++) {
+ s5p_dm9000_platdata.dev_addr[i] = line ? simple_strtoul(line, &ep, 16) : 0;
+ if (line)
+ line = (*ep) ? ep+1 : ep;
+ }
+ printk("User MAC address: %pM\n", s5p_dm9000_platdata.dev_addr);
+ return 0;
+}
+__setup("ethaddr=", ethaddr_setup);
+#endif
#if defined(CONFIG_VIDEO_FIMC) || defined(CONFIG_CPU_FREQ) /* TODO: use existing dev */
static struct resource s3c_fimc0_resource[] = {
[0] = {
diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h
index 47fb437..332ef86 100755
--- a/arch/arm/plat-samsung/include/plat/devs.h
+++ b/arch/arm/plat-samsung/include/plat/devs.h
@@ -77,6 +77,7 @@ extern struct platform_device s3c_device_cfcon;
extern struct platform_device s3c_device_spi0;
extern struct platform_device s3c_device_spi1;
+extern struct platform_device s5p_device_dm9000;
extern struct platform_device s5pc100_device_spi0;
extern struct platform_device s5pc100_device_spi1;
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 906ef8f..f179436 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -985,6 +985,13 @@ config DM9000
To compile this driver as a module, choose M here. The module
will be called dm9000.
+config DM9000_16BIT
+ bool "DM9000 16-bit"
+ depends on DM9000
+ default n
+ help
+ Support DM9000 ethernet controller with 16bit data bus
+
config DM9000_DEBUGLEVEL
int "DM9000 maximum debug level"
depends on DM9000