From bb72dacc6534bedaa47657790337ad26167c9506 Mon Sep 17 00:00:00 2001 From: lyx Date: Mon, 9 Aug 2010 01:29:53 -0700 Subject: [PATCH] modify dm9000 for info_sdk --- arch/arm/mach-rk2818/board-infosdk.c | 104 +++++++++++++++- arch/arm/mach-rk2818/board-midsdk.c | 166 ++++++++++++-------------- arch/arm/mach-rk2818/board-phonesdk.c | 165 ++++++++++++------------- arch/arm/mach-rk2818/board-raho.c | 165 ++++++++++++------------- arch/arm/mach-rk2818/devices.c | 42 ------- arch/arm/mach-rk2818/devices.h | 2 - drivers/net/Kconfig | 8 -- drivers/net/dm9000.c | 44 +++---- include/linux/dm9000.h | 7 +- 9 files changed, 353 insertions(+), 350 deletions(-) mode change 100644 => 100755 arch/arm/mach-rk2818/board-infosdk.c mode change 100644 => 100755 arch/arm/mach-rk2818/board-midsdk.c mode change 100644 => 100755 drivers/net/Kconfig mode change 100644 => 100755 include/linux/dm9000.h diff --git a/arch/arm/mach-rk2818/board-infosdk.c b/arch/arm/mach-rk2818/board-infosdk.c old mode 100644 new mode 100755 index ad6fb52f5bbe..b009ad900190 --- a/arch/arm/mach-rk2818/board-infosdk.c +++ b/arch/arm/mach-rk2818/board-infosdk.c @@ -37,6 +37,7 @@ #include #include +#include #include "devices.h" @@ -448,11 +449,104 @@ struct rk2818bl_info rk2818_bl_info = { .pw_iomux = GPIOF34_UART3_SEL_NAME, }; -static struct platform_device *devices[] __initdata = { - &rk2818_device_uart1, +/******************************************************** +* dm9000 net work devices +* author:lyx +********************************************************/ #ifdef CONFIG_DM9000 - &rk2818_device_dm9k, +/* +GPIOA5_FLASHCS1_SEL_NAME IOMUXB_FLASH_CS1 +GPIOA6_FLASHCS2_SEL_NAME IOMUXB_FLASH_CS2 +GPIOA7_FLASHCS3_SEL_NAME IOMUXB_FLASH_CS3 +GPIOE_SPI1_FLASH_SEL1_NAME IOMUXA_FLASH_CS45 +GPIOE_SPI1_FLASH_SEL_NAME IOMUXA_FLASH_CS67 +*/ +#define DM9000_USE_NAND_CS 1 //cs can be 1,2,3,4,5,6 or 7 +#define DM9000_CS_IOMUX_NAME GPIOA5_FLASHCS1_SEL_NAME +#define DM9000_CS_IOMUX_MODE IOMUXB_FLASH_CS1 +#define DM9000_NET_INT_PIN RK2818_PIN_PE2 +#define DM9000_INT_IOMUX_NAME GPIOA23_UART2_SEL_NAME +#define DM9000_INT_IOMUX_MODE IOMUXB_GPIO0_A23 +#define DM9000_INT_INIT_VALUE GPIOPullDown +#define DM9000_IRQ IRQF_TRIGGER_HIGH +#define DM9000_IO_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x8) +#define DM9000_DATA_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x4) + +int dm9k_gpio_set(void) +{ + //cs + rk2818_mux_api_set(DM9000_CS_IOMUX_NAME, DM9000_CS_IOMUX_MODE); + + //int + rk2818_mux_api_set(DM9000_INT_IOMUX_NAME, DM9000_INT_IOMUX_MODE); + + if (gpio_request(DM9000_NET_INT_PIN, "dm9000 interrupt")) { + gpio_free(DM9000_NET_INT_PIN); + rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME); + rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME); + printk("[fun:%s line:%d], request gpio for net interrupt fail\n", __func__,__LINE__); + + return -1; + } + gpio_pull_updown(DM9000_NET_INT_PIN, DM9000_INT_INIT_VALUE); + gpio_direction_input(DM9000_NET_INT_PIN); + + return 0; +} +int dm9k_gpio_free(void) +{ + gpio_free(DM9000_NET_INT_PIN); + rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME); + rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME); + return 0; +} +int dm9k_get_gpio_irq(void) +{ + return gpio_to_irq(DM9000_NET_INT_PIN); +} + +static struct resource dm9k_resource[] = { + [0] = { + .start = DM9000_IO_ADDR, + .end = DM9000_IO_ADDR + 3, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = DM9000_DATA_ADDR, + .end = DM9000_DATA_ADDR + 3, + .flags = IORESOURCE_MEM, + }, + [2] = { + .start = DM9000_NET_INT_PIN, + .end = DM9000_NET_INT_PIN, + .flags = IORESOURCE_IRQ | DM9000_IRQ, + } + +}; + +/* for the moment we limit ourselves to 8bit IO until some + * better IO routines can be written and tested +*/ +struct dm9000_plat_data dm9k_platdata = { + .flags = DM9000_PLATF_8BITONLY, + .io_init = dm9k_gpio_set, + .io_deinit = dm9k_gpio_free, + .get_irq_num = dm9k_get_gpio_irq, +}; + +struct platform_device rk2818_device_dm9k = { + .name = "dm9000", + .id = 0, + .num_resources = ARRAY_SIZE(dm9k_resource), + .resource = dm9k_resource, + .dev = { + .platform_data = &dm9k_platdata, + } +}; #endif + +static struct platform_device *devices[] __initdata = { + &rk2818_device_uart1, #ifdef CONFIG_I2C0_RK2818 &rk2818_device_i2c0, #endif @@ -480,6 +574,10 @@ static struct platform_device *devices[] __initdata = { #ifdef CONFIG_MTD_NAND_RK2818 &rk2818_nand_device, #endif +#ifdef CONFIG_DM9000 + &rk2818_device_dm9k, +#endif + #ifdef CONFIG_DWC_OTG &rk2818_device_dwc_otg, #endif diff --git a/arch/arm/mach-rk2818/board-midsdk.c b/arch/arm/mach-rk2818/board-midsdk.c old mode 100644 new mode 100755 index 527c226a2b87..af814beafce9 --- a/arch/arm/mach-rk2818/board-midsdk.c +++ b/arch/arm/mach-rk2818/board-midsdk.c @@ -443,109 +443,99 @@ struct rk2818bl_info rk2818_bl_info = { .pw_iomux = GPIOA23_UART2_SEL_NAME, }; +/******************************************************** +* dm9000 net work devices +* author:lyx +********************************************************/ #ifdef CONFIG_DM9000 -#define NET_INT_PIN RK2818_PIN_PE2 -/*dm9000 gpio set*/ +/* +GPIOA5_FLASHCS1_SEL_NAME IOMUXB_FLASH_CS1 +GPIOA6_FLASHCS2_SEL_NAME IOMUXB_FLASH_CS2 +GPIOA7_FLASHCS3_SEL_NAME IOMUXB_FLASH_CS3 +GPIOE_SPI1_FLASH_SEL1_NAME IOMUXA_FLASH_CS45 +GPIOE_SPI1_FLASH_SEL_NAME IOMUXA_FLASH_CS67 +*/ +#define DM9000_USE_NAND_CS 1 //cs can be 1,2,3,4,5,6 or 7 +#define DM9000_CS_IOMUX_NAME GPIOA5_FLASHCS1_SEL_NAME +#define DM9000_CS_IOMUX_MODE IOMUXB_FLASH_CS1 +#define DM9000_NET_INT_PIN RK2818_PIN_PE2 +#define DM9000_INT_IOMUX_NAME GPIOE_SPI1_FLASH_SEL1_NAME +#define DM9000_INT_IOMUX_MODE IOMUXA_GPIO1_A12 +#define DM9000_INT_INIT_VALUE GPIOPullDown +#define DM9000_IRQ IRQF_TRIGGER_HIGH +#define DM9000_IO_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x8) +#define DM9000_DATA_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x4) + int dm9k_gpio_set(void) { //cs -#ifdef CONFIG_DM9000_CHIP_SELECT - switch (CONFIG_DM9000_CHIP_SELECT) { - case 1: - rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); - break; - case 2: - rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2); - break; - case 3: - rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3); - break; - case 4: - case 5: - rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45); - break; - case 6: - case 7: - rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67); - break; - default: - break; - } -#endif + rk2818_mux_api_set(DM9000_CS_IOMUX_NAME, DM9000_CS_IOMUX_MODE); //int - rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_GPIO1_A12); - if (gpio_request(NET_INT_PIN, "dm9000 interrupt")) { - gpio_free(NET_INT_PIN); - rk2818_mux_api_mode_resume(GPIOA1_HOSTDATA17_SEL_NAME); + rk2818_mux_api_set(DM9000_INT_IOMUX_NAME, DM9000_INT_IOMUX_MODE); + + if (gpio_request(DM9000_NET_INT_PIN, "dm9000 interrupt")) { + gpio_free(DM9000_NET_INT_PIN); + rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME); + rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME); printk("[fun:%s line:%d], request gpio for net interrupt fail\n", __func__,__LINE__); - goto err; + return -1; } - gpio_pull_updown(NET_INT_PIN, GPIOPullDown); - gpio_direction_input(NET_INT_PIN); - return 0; -err: + gpio_pull_updown(DM9000_NET_INT_PIN, DM9000_INT_INIT_VALUE); + gpio_direction_input(DM9000_NET_INT_PIN); -#ifdef CONFIG_DM9000_CHIP_SELECT - switch (CONFIG_DM9000_CHIP_SELECT) { - case 1: - rk2818_mux_api_mode_resume(GPIOA5_FLASHCS1_SEL_NAME); - break; - case 2: - rk2818_mux_api_mode_resume(GPIOA6_FLASHCS2_SEL_NAME); - break; - case 3: - rk2818_mux_api_mode_resume(GPIOA7_FLASHCS3_SEL_NAME); - break; - case 4: - case 5: - rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL1_NAME); - break; - case 6: - case 7: - rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL_NAME); - break; - default: - break; - } -#endif - return -1; + return 0; } -void dm9k_gpio_free(void) +int dm9k_gpio_free(void) { - gpio_free(NET_INT_PIN); - rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL1_NAME); -#ifdef CONFIG_DM9000_CHIP_SELECT - switch (CONFIG_DM9000_CHIP_SELECT) { - case 1: - rk2818_mux_api_mode_resume(GPIOA5_FLASHCS1_SEL_NAME); - break; - case 2: - rk2818_mux_api_mode_resume(GPIOA6_FLASHCS2_SEL_NAME); - break; - case 3: - rk2818_mux_api_mode_resume(GPIOA7_FLASHCS3_SEL_NAME); - break; - case 4: - case 5: - rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL1_NAME); - break; - case 6: - case 7: - rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL_NAME); - break; - default: - break; - } -#endif + gpio_free(DM9000_NET_INT_PIN); + rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME); + rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME); + return 0; +} +int dm9k_get_gpio_irq(void) +{ + return gpio_to_irq(DM9000_NET_INT_PIN); } -struct dm9000_plat_data dm9k_platdata = { +static struct resource dm9k_resource[] = { + [0] = { + .start = DM9000_IO_ADDR, + .end = DM9000_IO_ADDR + 3, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = DM9000_DATA_ADDR, + .end = DM9000_DATA_ADDR + 3, + .flags = IORESOURCE_MEM, + }, + [2] = { + .start = DM9000_NET_INT_PIN, + .end = DM9000_NET_INT_PIN, + .flags = IORESOURCE_IRQ | DM9000_IRQ, + } + +}; + +/* for the moment we limit ourselves to 8bit IO until some + * better IO routines can be written and tested +*/ +struct dm9000_plat_data dm9k_platdata = { .flags = DM9000_PLATF_8BITONLY, - .pin_int = NET_INT_PIN, - .net_gpio_set = dm9k_gpio_set, - .net_gpio_free = dm9k_gpio_free, + .io_init = dm9k_gpio_set, + .io_deinit = dm9k_gpio_free, + .get_irq_num = dm9k_get_gpio_irq, +}; + +struct platform_device rk2818_device_dm9k = { + .name = "dm9000", + .id = 0, + .num_resources = ARRAY_SIZE(dm9k_resource), + .resource = dm9k_resource, + .dev = { + .platform_data = &dm9k_platdata, + } }; #endif diff --git a/arch/arm/mach-rk2818/board-phonesdk.c b/arch/arm/mach-rk2818/board-phonesdk.c index 01be1f09d66d..b30f5fe7b4e6 100755 --- a/arch/arm/mach-rk2818/board-phonesdk.c +++ b/arch/arm/mach-rk2818/board-phonesdk.c @@ -449,108 +449,99 @@ struct rk2818bl_info rk2818_bl_info = { .pw_iomux = GPIOF34_UART3_SEL_NAME, }; +/******************************************************** +* dm9000 net work devices +* author:lyx +********************************************************/ #ifdef CONFIG_DM9000 -#define NET_INT_PIN RK2818_PIN_PA1 -/*dm9000 gpio set*/ +/* +GPIOA5_FLASHCS1_SEL_NAME IOMUXB_FLASH_CS1 +GPIOA6_FLASHCS2_SEL_NAME IOMUXB_FLASH_CS2 +GPIOA7_FLASHCS3_SEL_NAME IOMUXB_FLASH_CS3 +GPIOE_SPI1_FLASH_SEL1_NAME IOMUXA_FLASH_CS45 +GPIOE_SPI1_FLASH_SEL_NAME IOMUXA_FLASH_CS67 +*/ +#define DM9000_USE_NAND_CS 1 //cs can be 1,2,3,4,5,6 or 7 +#define DM9000_CS_IOMUX_NAME GPIOA5_FLASHCS1_SEL_NAME +#define DM9000_CS_IOMUX_MODE IOMUXB_FLASH_CS1 +#define DM9000_NET_INT_PIN RK2818_PIN_PA1 +#define DM9000_INT_IOMUX_NAME GPIOA1_HOSTDATA17_SEL_NAME +#define DM9000_INT_IOMUX_MODE IOMUXB_GPIO0_A1 +#define DM9000_INT_INIT_VALUE GPIOPullDown +#define DM9000_IRQ IRQF_TRIGGER_HIGH +#define DM9000_IO_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x8) +#define DM9000_DATA_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x4) + int dm9k_gpio_set(void) { //cs -#ifdef CONFIG_DM9000_CHIP_SELECT - switch (CONFIG_DM9000_CHIP_SELECT) { - case 1: - rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); - break; - case 2: - rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2); - break; - case 3: - rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3); - break; - case 4: - case 5: - rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45); - break; - case 6: - case 7: - rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67); - break; - default: - break; - } -#endif + rk2818_mux_api_set(DM9000_CS_IOMUX_NAME, DM9000_CS_IOMUX_MODE); //int - rk2818_mux_api_set(GPIOA1_HOSTDATA17_SEL_NAME, IOMUXB_GPIO0_A1); - if (gpio_request(NET_INT_PIN, "dm9000 interrupt")) { - gpio_free(NET_INT_PIN); - rk2818_mux_api_mode_resume(GPIOA1_HOSTDATA17_SEL_NAME); + rk2818_mux_api_set(DM9000_INT_IOMUX_NAME, DM9000_INT_IOMUX_MODE); + + if (gpio_request(DM9000_NET_INT_PIN, "dm9000 interrupt")) { + gpio_free(DM9000_NET_INT_PIN); + rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME); + rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME); printk("[fun:%s line:%d], request gpio for net interrupt fail\n", __func__,__LINE__); - goto err; + + return -1; } - gpio_pull_updown(NET_INT_PIN, GPIOPullDown); - gpio_direction_input(NET_INT_PIN); + gpio_pull_updown(DM9000_NET_INT_PIN, DM9000_INT_INIT_VALUE); + gpio_direction_input(DM9000_NET_INT_PIN); + return 0; - -err: -#ifdef CONFIG_DM9000_CHIP_SELECT - switch (CONFIG_DM9000_CHIP_SELECT) { - case 1: - rk2818_mux_api_mode_resume(GPIOA5_FLASHCS1_SEL_NAME); - break; - case 2: - rk2818_mux_api_mode_resume(GPIOA6_FLASHCS2_SEL_NAME); - break; - case 3: - rk2818_mux_api_mode_resume(GPIOA7_FLASHCS3_SEL_NAME); - break; - case 4: - case 5: - rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL1_NAME); - break; - case 6: - case 7: - rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL_NAME); - break; - default: - break; - } -#endif - return -1; } -void dm9k_gpio_free(void) +int dm9k_gpio_free(void) { - gpio_free(NET_INT_PIN); - rk2818_mux_api_mode_resume(GPIOA1_HOSTDATA17_SEL_NAME); -#ifdef CONFIG_DM9000_CHIP_SELECT - switch (CONFIG_DM9000_CHIP_SELECT) { - case 1: - rk2818_mux_api_mode_resume(GPIOA5_FLASHCS1_SEL_NAME); - break; - case 2: - rk2818_mux_api_mode_resume(GPIOA6_FLASHCS2_SEL_NAME); - break; - case 3: - rk2818_mux_api_mode_resume(GPIOA7_FLASHCS3_SEL_NAME); - break; - case 4: - case 5: - rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL1_NAME); - break; - case 6: - case 7: - rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL_NAME); - break; - default: - break; - } -#endif + gpio_free(DM9000_NET_INT_PIN); + rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME); + rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME); + return 0; } +int dm9k_get_gpio_irq(void) +{ + return gpio_to_irq(DM9000_NET_INT_PIN); +} + +static struct resource dm9k_resource[] = { + [0] = { + .start = DM9000_IO_ADDR, + .end = DM9000_IO_ADDR + 3, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = DM9000_DATA_ADDR, + .end = DM9000_DATA_ADDR + 3, + .flags = IORESOURCE_MEM, + }, + [2] = { + .start = DM9000_NET_INT_PIN, + .end = DM9000_NET_INT_PIN, + .flags = IORESOURCE_IRQ | DM9000_IRQ, + } +}; + +/* for the moment we limit ourselves to 8bit IO until some + * better IO routines can be written and tested +*/ struct dm9000_plat_data dm9k_platdata = { .flags = DM9000_PLATF_8BITONLY, - .pin_int = NET_INT_PIN, - .net_gpio_set = dm9k_gpio_set, - .net_gpio_free = dm9k_gpio_free, + .io_init = dm9k_gpio_set, + .io_deinit = dm9k_gpio_free, + .get_irq_num = dm9k_get_gpio_irq, +}; + +struct platform_device rk2818_device_dm9k = { + .name = "dm9000", + .id = 0, + .num_resources = ARRAY_SIZE(dm9k_resource), + .resource = dm9k_resource, + .dev = { + .platform_data = &dm9k_platdata, + } }; #endif diff --git a/arch/arm/mach-rk2818/board-raho.c b/arch/arm/mach-rk2818/board-raho.c index d1aa810bb6cd..e52be0a72bdd 100755 --- a/arch/arm/mach-rk2818/board-raho.c +++ b/arch/arm/mach-rk2818/board-raho.c @@ -616,108 +616,99 @@ struct rk2818bl_info rk2818_bl_info = { .pw_iomux = GPIOF34_UART3_SEL_NAME, }; +/******************************************************** +* dm9000 net work devices +* author:lyx +********************************************************/ #ifdef CONFIG_DM9000 -#define NET_INT_PIN RK2818_PIN_PA1 -/*dm9000 gpio set*/ +/* +GPIOA5_FLASHCS1_SEL_NAME IOMUXB_FLASH_CS1 +GPIOA6_FLASHCS2_SEL_NAME IOMUXB_FLASH_CS2 +GPIOA7_FLASHCS3_SEL_NAME IOMUXB_FLASH_CS3 +GPIOE_SPI1_FLASH_SEL1_NAME IOMUXA_FLASH_CS45 +GPIOE_SPI1_FLASH_SEL_NAME IOMUXA_FLASH_CS67 +*/ +#define DM9000_USE_NAND_CS 1 //cs can be 1,2,3,4,5,6 or 7 +#define DM9000_CS_IOMUX_NAME GPIOA5_FLASHCS1_SEL_NAME +#define DM9000_CS_IOMUX_MODE IOMUXB_FLASH_CS1 +#define DM9000_NET_INT_PIN RK2818_PIN_PA1 +#define DM9000_INT_IOMUX_NAME GPIOA1_HOSTDATA17_SEL_NAME +#define DM9000_INT_IOMUX_MODE IOMUXB_GPIO0_A1 +#define DM9000_INT_INIT_VALUE GPIOPullDown +#define DM9000_IRQ IRQF_TRIGGER_HIGH +#define DM9000_IO_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x8) +#define DM9000_DATA_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x4) + int dm9k_gpio_set(void) { //cs -#ifdef CONFIG_DM9000_CHIP_SELECT - switch (CONFIG_DM9000_CHIP_SELECT) { - case 1: - rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); - break; - case 2: - rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2); - break; - case 3: - rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3); - break; - case 4: - case 5: - rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45); - break; - case 6: - case 7: - rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67); - break; - default: - break; - } -#endif + rk2818_mux_api_set(DM9000_CS_IOMUX_NAME, DM9000_CS_IOMUX_MODE); //int - rk2818_mux_api_set(GPIOA1_HOSTDATA17_SEL_NAME, IOMUXB_GPIO0_A1); - if (gpio_request(NET_INT_PIN, "dm9000 interrupt")) { - gpio_free(NET_INT_PIN); - rk2818_mux_api_mode_resume(GPIOA1_HOSTDATA17_SEL_NAME); + rk2818_mux_api_set(DM9000_INT_IOMUX_NAME, DM9000_INT_IOMUX_MODE); + + if (gpio_request(DM9000_NET_INT_PIN, "dm9000 interrupt")) { + gpio_free(DM9000_NET_INT_PIN); + rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME); + rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME); printk("[fun:%s line:%d], request gpio for net interrupt fail\n", __func__,__LINE__); - goto err; + + return -1; } - gpio_pull_updown(NET_INT_PIN, GPIOPullDown); - gpio_direction_input(NET_INT_PIN); - return 0; -err: + gpio_pull_updown(DM9000_NET_INT_PIN, DM9000_INT_INIT_VALUE); + gpio_direction_input(DM9000_NET_INT_PIN); -#ifdef CONFIG_DM9000_CHIP_SELECT - switch (CONFIG_DM9000_CHIP_SELECT) { - case 1: - rk2818_mux_api_mode_resume(GPIOA5_FLASHCS1_SEL_NAME); - break; - case 2: - rk2818_mux_api_mode_resume(GPIOA6_FLASHCS2_SEL_NAME); - break; - case 3: - rk2818_mux_api_mode_resume(GPIOA7_FLASHCS3_SEL_NAME); - break; - case 4: - case 5: - rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL1_NAME); - break; - case 6: - case 7: - rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL_NAME); - break; - default: - break; - } -#endif - return -1; + return 0; } -void dm9k_gpio_free(void) +int dm9k_gpio_free(void) { - gpio_free(NET_INT_PIN); - rk2818_mux_api_mode_resume(GPIOA1_HOSTDATA17_SEL_NAME); -#ifdef CONFIG_DM9000_CHIP_SELECT - switch (CONFIG_DM9000_CHIP_SELECT) { - case 1: - rk2818_mux_api_mode_resume(GPIOA5_FLASHCS1_SEL_NAME); - break; - case 2: - rk2818_mux_api_mode_resume(GPIOA6_FLASHCS2_SEL_NAME); - break; - case 3: - rk2818_mux_api_mode_resume(GPIOA7_FLASHCS3_SEL_NAME); - break; - case 4: - case 5: - rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL1_NAME); - break; - case 6: - case 7: - rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL_NAME); - break; - default: - break; - } -#endif + gpio_free(DM9000_NET_INT_PIN); + rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME); + rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME); + return 0; } +int dm9k_get_gpio_irq(void) +{ + return gpio_to_irq(DM9000_NET_INT_PIN); +} + +static struct resource dm9k_resource[] = { + [0] = { + .start = DM9000_IO_ADDR, + .end = DM9000_IO_ADDR + 3, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = DM9000_DATA_ADDR, + .end = DM9000_DATA_ADDR + 3, + .flags = IORESOURCE_MEM, + }, + [2] = { + .start = DM9000_NET_INT_PIN, + .end = DM9000_NET_INT_PIN, + .flags = IORESOURCE_IRQ | DM9000_IRQ, + } +}; + +/* for the moment we limit ourselves to 8bit IO until some + * better IO routines can be written and tested +*/ struct dm9000_plat_data dm9k_platdata = { .flags = DM9000_PLATF_8BITONLY, - .pin_int = NET_INT_PIN, - .net_gpio_set = dm9k_gpio_set, - .net_gpio_free = dm9k_gpio_free, + .io_init = dm9k_gpio_set, + .io_deinit = dm9k_gpio_free, + .get_irq_num = dm9k_get_gpio_irq, +}; + +struct platform_device rk2818_device_dm9k = { + .name = "dm9000", + .id = 0, + .num_resources = ARRAY_SIZE(dm9k_resource), + .resource = dm9k_resource, + .dev = { + .platform_data = &dm9k_platdata, + } }; #endif diff --git a/arch/arm/mach-rk2818/devices.c b/arch/arm/mach-rk2818/devices.c index c0885e341e0f..b97febc98d99 100755 --- a/arch/arm/mach-rk2818/devices.c +++ b/arch/arm/mach-rk2818/devices.c @@ -27,7 +27,6 @@ #include #include -#include #include #include #include @@ -322,47 +321,6 @@ struct platform_device rk2818_soc_camera_pdrv = { }; #endif -//net device -/* DM9000 */ -#ifdef CONFIG_DM9000 -#ifdef CONFIG_DM9000_CHIP_SELECT -#define DM9000_CS CONFIG_DM9000_CHIP_SELECT -#else -#define DM9000_CS 1 -#endif -static struct resource dm9k_resource[] = { - [0] = { - .start = RK2818_NANDC_PHYS + 0x800 + (DM9000_CS*0x100 + 0x8), //nand_cs1+nand_cmd - .end = RK2818_NANDC_PHYS + 0x800 + (DM9000_CS*0x100 + 0x8) + 3, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = RK2818_NANDC_PHYS + 0x800 + (DM9000_CS*0x100 + 0x4), //nand_cs1+nand_data - .end = RK2818_NANDC_PHYS + 0x800 + (DM9000_CS*0x100 + 0x4) + 3, - .flags = IORESOURCE_MEM, - }, - [2] = { - .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, - } -}; - -/* for the moment we limit ourselves to 8bit IO until some - * better IO routines can be written and tested -*/ - -//dm9k_platdata.flags = DM9000_PLATF_8BITONLY; - -struct platform_device rk2818_device_dm9k = { - .name = "dm9000", - .id = 0, - .num_resources = ARRAY_SIZE(dm9k_resource), - .resource = dm9k_resource, - .dev = { - .platform_data = &dm9k_platdata, - } -}; -#endif - /*ADC*/ static struct resource rk2818_adc_resource[] = { { diff --git a/arch/arm/mach-rk2818/devices.h b/arch/arm/mach-rk2818/devices.h index 45a78afc5f0c..52444d86bae1 100755 --- a/arch/arm/mach-rk2818/devices.h +++ b/arch/arm/mach-rk2818/devices.h @@ -37,8 +37,6 @@ extern struct platform_device rk2818_device_sdmmc0; extern struct platform_device rk2818_device_sdmmc1; extern struct rk2818_sdmmc_platform_data default_sdmmc0_data; extern struct rk2818_sdmmc_platform_data default_sdmmc1_data; -extern struct platform_device rk2818_device_dm9k; -extern struct dm9000_plat_data dm9k_platdata; extern struct platform_device rk2818_device_i2s; extern struct platform_device rk2818_device_pmem; extern struct platform_device rk2818_device_pmem_dsp; diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig old mode 100644 new mode 100755 index 2ccf896d55a7..41a3405c6fe3 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -957,14 +957,6 @@ choice tristate "DM9000 with NOR Interface" endchoice endif - -config DM9000_CHIP_SELECT - int "the number of nandc chip select for DM9000" - depends on DM9000_USE_NAND_CONTROL - default 1 - help - select the cs for dm9000 - config DM9000_FORCE_SIMPLE_PHY_POLL bool "Force simple NSR based PHY polling" diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c index 5247ac01581b..cb0e7017c160 100755 --- a/drivers/net/dm9000.c +++ b/drivers/net/dm9000.c @@ -1228,13 +1228,8 @@ dm9000_open(struct net_device *dev) irqflags |= IRQF_SHARED; - #ifndef CONFIG_MACH_RK2818MID - if (request_irq(dev->irq, dm9000_interrupt, IRQF_TRIGGER_HIGH, dev->name, dev)) - return -EAGAIN; - #else if (request_irq(dev->irq, dm9000_interrupt, irqflags, dev->name, dev)) return -EAGAIN; - #endif /* Initialize DM9000 board */ dm9000_reset(db); @@ -1515,34 +1510,20 @@ dm9000_probe(struct platform_device *pdev) /* fill in parameters for net-dev structure */ ndev->base_addr = (unsigned long)db->io_addr; -#if 0 - rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); - - #ifdef CONFIG_MACH_RK2818MID - rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_GPIO1_A12); - ndev->irq = gpio_to_irq(db->irq_res->start); - #else - rk2818_mux_api_set(GPIOA1_HOSTDATA17_SEL_NAME, IOMUXB_GPIO0_A1); - if (gpio_request(db->irq_res->start, "dm9000 interrupt")) { - gpio_free(db->irq_res->start); - dev_err(db->dev, "failed to request gpio\n"); - ret = -EINVAL; - goto out; - } - gpio_pull_updown(db->irq_res->start, GPIOPullDown); - ndev->irq = gpio_to_irq(db->irq_res->start); - #endif -#endif - - if (pdata->net_gpio_set) { - if (pdata->net_gpio_set()) { + //io init for dm9000 , modify by lyx@20100809 + if (pdata && pdata->io_init) { + if (pdata->io_init()) { ret = -EINVAL; goto out; } } - - ndev->irq = gpio_to_irq(pdata->pin_int); - + if (pdata && pdata->get_irq_num) { + ndev->irq = pdata->get_irq_num(); + } + else { + ndev->irq = db->irq_res->start; + } + /* ensure at least we have a default set of IO routines */ dm9000_set_io(db, iosize); @@ -1735,6 +1716,11 @@ static int __devexit dm9000_drv_remove(struct platform_device *pdev) { struct net_device *ndev = platform_get_drvdata(pdev); + struct dm9000_plat_data *pdata = pdev->dev.platform_data; + + //deinit io for dm9000 + if (pdata && pdata->io_deinit) + pdata->io_deinit(); platform_set_drvdata(pdev, NULL); diff --git a/include/linux/dm9000.h b/include/linux/dm9000.h old mode 100644 new mode 100755 index 15ace65f982b..8b621fa50e3a --- a/include/linux/dm9000.h +++ b/include/linux/dm9000.h @@ -29,11 +29,10 @@ struct dm9000_plat_data { unsigned int flags; unsigned char dev_addr[6]; - unsigned int pin_int; //gpio init&deinit - int (*net_gpio_set)(void); - void (*net_gpio_free)(void); - + int (*io_init)(void); + int (*io_deinit)(void); + int (*get_irq_num)(void); /* allow replacement IO routines */ -- 2.34.1