mirror of
https://github.com/torvalds/linux.git
synced 2026-06-09 15:12:59 +02:00
modify dm9000 for info_sdk
This commit is contained in:
parent
320c438262
commit
bb72dacc65
104
arch/arm/mach-rk2818/board-infosdk.c
Normal file → Executable file
104
arch/arm/mach-rk2818/board-infosdk.c
Normal file → Executable file
|
|
@ -37,6 +37,7 @@
|
|||
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/dm9000.h>
|
||||
|
||||
#include "devices.h"
|
||||
|
||||
|
|
@ -448,11 +449,104 @@ struct rk2818bl_info rk2818_bl_info = {
|
|||
.pw_iomux = GPIOF34_UART3_SEL_NAME,
|
||||
};
|
||||
|
||||
/********************************************************
|
||||
* dm9000 net work devices
|
||||
* author:lyx
|
||||
********************************************************/
|
||||
#ifdef CONFIG_DM9000
|
||||
/*
|
||||
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_DM9000
|
||||
&rk2818_device_dm9k,
|
||||
#endif
|
||||
#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
|
||||
|
|
|
|||
166
arch/arm/mach-rk2818/board-midsdk.c
Normal file → Executable file
166
arch/arm/mach-rk2818/board-midsdk.c
Normal file → Executable file
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
printk("[fun:%s line:%d], request gpio for net interrupt fail\n", __func__,__LINE__);
|
||||
goto err;
|
||||
}
|
||||
gpio_pull_updown(NET_INT_PIN, GPIOPullDown);
|
||||
gpio_direction_input(NET_INT_PIN);
|
||||
return 0;
|
||||
err:
|
||||
rk2818_mux_api_set(DM9000_INT_IOMUX_NAME, DM9000_INT_IOMUX_MODE);
|
||||
|
||||
#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;
|
||||
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;
|
||||
}
|
||||
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
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@
|
|||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include <linux/dm9000.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/rk2818_nand.h>
|
||||
#include <mach/iomux.h>
|
||||
|
|
@ -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[] = {
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
8
drivers/net/Kconfig
Normal file → Executable file
8
drivers/net/Kconfig
Normal file → Executable file
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
7
include/linux/dm9000.h
Normal file → Executable file
7
include/linux/dm9000.h
Normal file → Executable file
|
|
@ -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 */
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user