fixes mdio, adds runtime board configuration for ifxmips

SVN-Revision: 11609
lede-17.01
John Crispin 2008-06-29 14:56:45 +00:00
parent 76215afdec
commit 979fb5a23e
5 changed files with 192 additions and 81 deletions

View File

@ -34,17 +34,31 @@
#include <asm/ifxmips/ifxmips.h>
#include <asm/ifxmips/ifxmips_mii0.h>
#define MAX_BOARD_NAME_LEN 32
#define MAX_IFXMIPS_DEVS 9
#define BOARD_DANUBE "Danube"
#define BOARD_DANUBE_CHIPID 0x10129083
#define SYSTEM_DANUBE "Danube"
#define SYSTEM_DANUBE_CHIPID1 0x10129083
#define SYSTEM_DANUBE_CHIPID2 0x3012B083
#define BOARD_TWINPASS "Twinpass"
#define BOARD_TWINPASS_CHIPID 0x3012D083
#define SYSTEM_TWINPASS "Twinpass"
#define SYSTEM_TWINPASS_CHIPID 0x3012D083
extern int ifxmips_pci_external_clock;
static unsigned int chiprev;
static struct platform_device *ifxmips_devs[MAX_IFXMIPS_DEVS];
static int cmdline_mac = 0;
char board_name[MAX_BOARD_NAME_LEN + 1] = { 0 };
struct ifxmips_board {
char name[32];
unsigned int system_type;
struct platform_device *devs[MAX_IFXMIPS_DEVS];
struct resource reset_resource;
struct resource gpiodev_resource;
int pci_external_clock;
int num_devs;
};
spinlock_t ebu_lock = SPIN_LOCK_UNLOCKED;
EXPORT_SYMBOL_GPL(ebu_lock);
@ -52,42 +66,35 @@ EXPORT_SYMBOL_GPL(ebu_lock);
static struct ifxmips_mac ifxmips_mii_mac;
static struct platform_device
ifxmips_led[] =
{
ifxmips_led =
{
.id = 0,
.name = "ifxmips_led",
},
};
static struct platform_device
ifxmips_gpio[] =
{
ifxmips_gpio =
{
.id = 0,
.name = "ifxmips_gpio",
},
.num_resources = 1,
};
static struct platform_device
ifxmips_mii[] =
{
ifxmips_mii =
{
.id = 0,
.name = "ifxmips_mii0",
.dev = {
.platform_data = &ifxmips_mii_mac,
}
},
};
static struct platform_device
ifxmips_wdt[] =
{
ifxmips_wdt =
{
.id = 0,
.name = "ifxmips_wdt",
},
};
static struct resource
@ -98,39 +105,20 @@ ifxmips_mtd_resource = {
};
static struct platform_device
ifxmips_mtd[] =
{
ifxmips_mtd =
{
.id = 0,
.name = "ifxmips_mtd",
.num_resources = 1,
.resource = &ifxmips_mtd_resource,
},
};
#ifdef CONFIG_GPIO_DEVICE
static struct resource
ifxmips_gpio_dev_resources[] = {
{
.name = "gpio",
.flags = 0,
.start = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) |
(1 << 4) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 12),
.end = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) |
(1 << 4) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 12),
},
};
static struct platform_device
ifxmips_gpio_dev[] = {
{
ifxmips_gpio_dev = {
.name = "GPIODEV",
.id = -1,
.num_resources = ARRAY_SIZE(ifxmips_gpio_dev_resources),
.resource = ifxmips_gpio_dev_resources,
}
.num_resources = 1,
};
#endif
const char*
get_system_type(void)
@ -138,17 +126,36 @@ get_system_type(void)
chiprev = ifxmips_r32(IFXMIPS_MPS_CHIPID);
switch(chiprev)
{
case BOARD_DANUBE_CHIPID:
return BOARD_DANUBE;
case SYSTEM_DANUBE_CHIPID1:
case SYSTEM_DANUBE_CHIPID2:
return SYSTEM_DANUBE;
case BOARD_TWINPASS_CHIPID:
return BOARD_TWINPASS;
case SYSTEM_TWINPASS_CHIPID:
return SYSTEM_TWINPASS;
}
return BOARD_SYSTEM_TYPE;
}
#define IS_HEX(x) (((x >='0' && x <= '9') || (x >='a' && x <= 'f') || (x >='A' && x <= 'F'))?(1):(0))
static int __init
ifxmips_set_board_type(char *str)
{
str = strchr(str, '=');
if(!str)
goto out;
str++;
if(strlen(str) > MAX_BOARD_NAME_LEN)
goto out;
strncpy(board_name, str, MAX_BOARD_NAME_LEN);
printk("bootloader told us, that this is a %s board\n", board_name);
out:
return 1;
}
__setup("ifxmips_board", ifxmips_set_board_type);
#define IS_HEX(x) \
(((x >='0' && x <= '9') || (x >='a' && x <= 'f') || (x >='A' && x <= 'F'))?(1):(0))
static int __init
ifxmips_set_mii0_mac(char *str)
{
@ -174,23 +181,122 @@ out:
}
__setup("mii0_mac", ifxmips_set_mii0_mac);
static struct ifxmips_board boards[] =
{
{
.name = "EASY50712",
.system_type = SYSTEM_DANUBE_CHIPID1,
.devs =
{
&ifxmips_led, &ifxmips_gpio, &ifxmips_mii,
&ifxmips_mtd, &ifxmips_wdt, &ifxmips_gpio_dev,
},
.reset_resource =
{
.name = "reset",
.start = 1,
.end = 15,
},
.gpiodev_resource =
{
.name = "gpio",
.start = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) |
(1 << 4) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 12),
.end = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) |
(1 << 4) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 12),
},
.num_devs = 6,
}, {
.name = "EASY4010",
.system_type = SYSTEM_TWINPASS_CHIPID,
.devs =
{
&ifxmips_led, &ifxmips_gpio, &ifxmips_mii,
&ifxmips_mtd, &ifxmips_wdt, &ifxmips_gpio_dev,
},
.reset_resource =
{
.name = "reset",
.start = 1,
.end = 15,
},
.gpiodev_resource =
{
.name = "gpio",
.start = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) |
(1 << 4) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 12),
.end = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) |
(1 << 4) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 12),
},
.num_devs = 6,
}, {
.name = "ARV4519",
.system_type = SYSTEM_DANUBE_CHIPID2,
.devs =
{
&ifxmips_led, &ifxmips_gpio, &ifxmips_mii,
&ifxmips_mtd, &ifxmips_wdt, &ifxmips_gpio_dev,
},
.reset_resource =
{
.name = "reset",
.start = 1,
.end = 12,
},
.gpiodev_resource =
{
.name = "gpio",
.start = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) |
(1 << 4) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 12),
.end = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) |
(1 << 4) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 12),
},
.pci_external_clock = 1,
.num_devs = 6,
},
};
struct ifxmips_board* ifxmips_find_board(void)
{
int i;
if(!*board_name)
return 0;
for(i = 0; i < ARRAY_SIZE(boards); i++)
if((boards[i].system_type == chiprev) && (!strcmp(boards[i].name, board_name)))
return &boards[i];
return 0;
}
int __init
ifxmips_init_devices(void)
{
int dev = 0;
struct ifxmips_board *board = ifxmips_find_board();
chiprev = ifxmips_r32(IFXMIPS_MPS_CHIPID);
if(!cmdline_mac)
random_ether_addr(ifxmips_mii_mac.mac);
ifxmips_devs[dev++] = ifxmips_led;
ifxmips_devs[dev++] = ifxmips_gpio;
ifxmips_devs[dev++] = ifxmips_mii;
ifxmips_devs[dev++] = ifxmips_mtd;
ifxmips_devs[dev++] = ifxmips_wdt;
#ifdef CONFIG_GPIO_DEVICE
ifxmips_devs[dev++] = ifxmips_gpio_dev;
#endif
return platform_add_devices(ifxmips_devs, dev);
if(!board)
{
switch(chiprev)
{
case SYSTEM_DANUBE_CHIPID1:
case SYSTEM_DANUBE_CHIPID2:
board = &boards[0];
break;
case SYSTEM_TWINPASS_CHIPID:
board = &boards[1];
break;
}
}
ifxmips_gpio.resource = &board->reset_resource;
ifxmips_gpio_dev.resource = &board->gpiodev_resource;
if(board->pci_external_clock)
ifxmips_pci_external_clock = 1;
printk("using board definition %s\n", board->name);
return platform_add_devices(board->devs, board->num_devs);
}
arch_initcall(ifxmips_init_devices);

View File

@ -45,9 +45,9 @@
#define PINS_PER_PORT 16
#ifdef CONFIG_IFXMIPS_GPIO_RST_BTN
#define IFXMIPS_RST_PIN 15
#define IFXMIPS_RST_PORT 1
unsigned int rst_port = 1;
unsigned int rst_pin = 15;
static struct timer_list rst_button_timer;
extern struct sock *uevent_sock;
@ -306,7 +306,7 @@ reset_button_poll(unsigned long unused)
rst_button_timer.expires = jiffies + (HZ / 4);
add_timer(&rst_button_timer);
if (pressed != ifxmips_port_get_input(IFXMIPS_RST_PORT, IFXMIPS_RST_PIN))
if (pressed != ifxmips_port_get_input(rst_port, rst_pin))
{
if(pressed)
pressed = 0;
@ -333,10 +333,12 @@ ifxmips_gpio_probe(struct platform_device *dev)
int retval = 0;
#ifdef CONFIG_IFXMIPS_GPIO_RST_BTN
ifxmips_port_set_open_drain(IFXMIPS_RST_PORT, IFXMIPS_RST_PIN);
ifxmips_port_clear_altsel0(IFXMIPS_RST_PORT, IFXMIPS_RST_PIN);
ifxmips_port_clear_altsel1(IFXMIPS_RST_PORT, IFXMIPS_RST_PIN);
ifxmips_port_set_dir_in(IFXMIPS_RST_PORT, IFXMIPS_RST_PIN);
rst_port = dev->resource[0].start;
rst_pin = dev->resource[0].end;
ifxmips_port_set_open_drain(rst_port, rst_pin);
ifxmips_port_clear_altsel0(rst_port, rst_pin);
ifxmips_port_clear_altsel1(rst_port, rst_pin);
ifxmips_port_set_dir_in(rst_port, rst_pin);
seen = jiffies;
init_timer(&rst_button_timer);
rst_button_timer.function = reset_button_poll;

View File

@ -50,7 +50,7 @@ static struct pci_controller ifxmips_pci_controller =
};
u32 ifxmips_pci_mapped_cfg;
u32 ifxmips_pci_external_clock = 0;
int ifxmips_pci_external_clock = 0;
static int __init
ifxmips_pci_set_external_clk(char *str)

View File

@ -54,6 +54,7 @@ ifxmips_write_mdio(u32 phy_addr, u32 phy_reg, u16 phy_data)
while(ifxmips_r32(IFXMIPS_PPE32_MDIO_ACC) & MDIO_ACC_REQUEST);
ifxmips_w32(val, IFXMIPS_PPE32_MDIO_ACC);
}
EXPORT_SYMBOL(ifxmips_write_mdio);
unsigned short
ifxmips_read_mdio(u32 phy_addr, u32 phy_reg)
@ -67,6 +68,7 @@ ifxmips_read_mdio(u32 phy_addr, u32 phy_reg)
val = ifxmips_r32(IFXMIPS_PPE32_MDIO_ACC) & MDIO_ACC_VAL_MASK;
return val;
}
EXPORT_SYMBOL(ifxmips_read_mdio);
int
ifxmips_ifxmips_mii_open(struct net_device *dev)
@ -346,6 +348,7 @@ ifxmips_mii_probe(struct platform_device *dev)
ifxmips_mii0_dev->init = ifxmips_mii_dev_init;
memcpy(mac_addr, mac->mac, 6);
strcpy(ifxmips_mii0_dev->name, "eth%d");
ifxmips_mii_chip_init(REV_MII_MODE);
result = register_netdev(ifxmips_mii0_dev);
if (result)
{
@ -353,7 +356,6 @@ ifxmips_mii_probe(struct platform_device *dev)
goto out;
}
ifxmips_mii_chip_init(REV_MII_MODE);
printk(KERN_INFO "ifxmips_mii0: driver loaded!\n");
out:

View File

@ -182,7 +182,8 @@
#define REV_MII_MODE 2
/* mdio access */
#define IFXMIPS_PPE32_MDIO_ACC ((u32*)(IFXMIPS_PPE32_MEM_MAP + 0x1804))
#define IFXMIPS_PPE32_MDIO_CFG ((u32*)(IFXMIPS_PPE32_BASE_ADDR + 0x11800))
#define IFXMIPS_PPE32_MDIO_ACC ((u32*)(IFXMIPS_PPE32_BASE_ADDR + 0x11804))
#define MDIO_ACC_REQUEST 0x80000000
#define MDIO_ACC_READ 0x40000000