* adds support for speedport w502V

* bump kernel to 2.6.33.4
 * make ethernet be configurable as MII/RMII
 * on xway we now assign a static amount of cp1 ram (still need to find a
sane value)
 * remove bogus board.c
 * jiffies were running with a (1 << 2) multiplier

SVN-Revision: 21485
This commit is contained in:
John Crispin 2010-05-17 10:06:46 +00:00
parent b12999bdbe
commit c8f606c760
18 changed files with 215 additions and 557 deletions

View file

@ -10,15 +10,14 @@ ARCH:=mips
BOARD:=ifxmips BOARD:=ifxmips
BOARDNAME:=Infineon Mips BOARDNAME:=Infineon Mips
FEATURES:=squashfs jffs2 atm FEATURES:=squashfs jffs2 atm
SUBTARGETS:=ar9 danube SUBTARGETS:=danube ar9
LINUX_VERSION:=2.6.33.2 LINUX_VERSION:=2.6.33.4
CFLAGS=-Os -pipe -mips32r2 -mtune=mips32r2 -funit-at-a-time CFLAGS=-Os -pipe -mips32r2 -mtune=mips32r2 -funit-at-a-time
include $(INCLUDE_DIR)/target.mk include $(INCLUDE_DIR)/target.mk
DEFAULT_PACKAGES+=uboot-lantiq DEFAULT_PACKAGES+=uboot-lantiq kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl ifxmips-dsl-api ifxmips-dsl-control ifx-tapidemo
#kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl ifxmips-dsl-api ifxmips-dsl-control ifx-tapidemo
#define Target/Description #define Target/Description
# Build firmware images for Infineon Mips Controllers # Build firmware images for Infineon Mips Controllers

View file

@ -11,7 +11,6 @@ CONFIG_ARCH_REQUIRE_GPIOLIB=y
# CONFIG_ARCH_SUPPORTS_MSI is not set # CONFIG_ARCH_SUPPORTS_MSI is not set
CONFIG_ARCH_SUPPORTS_OPROFILE=y CONFIG_ARCH_SUPPORTS_OPROFILE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_ATM=y
# CONFIG_BCM47XX is not set # CONFIG_BCM47XX is not set
# CONFIG_BCM63XX is not set # CONFIG_BCM63XX is not set
CONFIG_BITREVERSE=y CONFIG_BITREVERSE=y
@ -56,7 +55,8 @@ CONFIG_CPU_SUPPORTS_HIGHMEM=y
CONFIG_CSRC_R4K=y CONFIG_CSRC_R4K=y
CONFIG_CSRC_R4K_LIB=y CONFIG_CSRC_R4K_LIB=y
CONFIG_DANUBE_MACH_ARV4519=y CONFIG_DANUBE_MACH_ARV4519=y
CONFIG_DANUBE_MACH_ARV452=y CONFIG_DANUBE_MACH_ARV4520=y
CONFIG_DANUBE_MACH_ARV4525=y
CONFIG_DANUBE_MACH_EASY4010=y CONFIG_DANUBE_MACH_EASY4010=y
CONFIG_DANUBE_MACH_EASY50712=y CONFIG_DANUBE_MACH_EASY50712=y
CONFIG_DECOMPRESS_LZMA=y CONFIG_DECOMPRESS_LZMA=y
@ -143,8 +143,6 @@ CONFIG_KALLSYMS=y
CONFIG_LEDS_GPIO=y CONFIG_LEDS_GPIO=y
CONFIG_LEDS_IFXMIPS=y CONFIG_LEDS_IFXMIPS=y
CONFIG_LOONGSON_UART_BASE=y CONFIG_LOONGSON_UART_BASE=y
CONFIG_LZMA_COMPRESS=y
CONFIG_LZMA_DECOMPRESS=y
# CONFIG_MACH_ALCHEMY is not set # CONFIG_MACH_ALCHEMY is not set
# CONFIG_MACH_DECSTATION is not set # CONFIG_MACH_DECSTATION is not set
# CONFIG_MACH_JAZZ is not set # CONFIG_MACH_JAZZ is not set

View file

@ -1 +0,0 @@
obj-y := reset.o prom.o setup.o irq.o dma-core.o pmu.o board.o clock.o gpio.o timer.o dev-gpio-buttons.o

View file

@ -1,6 +1,8 @@
#ifndef _IFXMIPS_DEVICES_H__ #ifndef _IFXMIPS_DEVICES_H__
#define _IFXMIPS_DEVICES_H__ #define _IFXMIPS_DEVICES_H__
#include <ifxmips_platform.h>
void __init ifxmips_register_gpio_dev(void); void __init ifxmips_register_gpio_dev(void);
void __init ifxmips_register_gpio_leds(struct gpio_led *leds, int cnt); void __init ifxmips_register_gpio_leds(struct gpio_led *leds, int cnt);
void __init ifxmips_register_leds(struct gpio_led *leds, int cnt); void __init ifxmips_register_leds(struct gpio_led *leds, int cnt);

View file

@ -11,7 +11,7 @@
/* for voice cpu (MIPS24K) */ /* for voice cpu (MIPS24K) */
unsigned int *prom_cp1_base; unsigned int *prom_cp1_base;
unsigned int prom_cp1_size; unsigned int prom_cp1_size = 0;
/* for Multithreading (APRP) on MIPS34K */ /* for Multithreading (APRP) on MIPS34K */
unsigned long physical_memsize; unsigned long physical_memsize;
@ -89,13 +89,6 @@ static void __init prom_init_cmdline(void)
char *a = (char *)KSEG1ADDR(argv[i]); char *a = (char *)KSEG1ADDR(argv[i]);
if (!argv[i]) if (!argv[i])
continue; continue;
/* for voice cpu on Twinpass/Danube */
if (cpu_data[0].cputype == CPU_24K)
if (!strncmp(a, "cp1_size=", 9))
{
prom_cp1_size = memparse(a + 9, &a);
continue;
}
if (strlen(arcs_cmdline) + strlen(a + 1) >= sizeof(arcs_cmdline)) if (strlen(arcs_cmdline) + strlen(a + 1) >= sizeof(arcs_cmdline))
{ {
early_printf("cmdline overflow, skipping: %s\n", a); early_printf("cmdline overflow, skipping: %s\n", a);
@ -125,6 +118,8 @@ static void __init prom_init_cmdline(void)
/* only on Twinpass/Danube a second CPU is used for Voice */ /* only on Twinpass/Danube a second CPU is used for Voice */
if ((cpu_data[0].cputype == CPU_24K) && (prom_cp1_size)) if ((cpu_data[0].cputype == CPU_24K) && (prom_cp1_size))
{ {
#define CP1_SIZE 2 << 20
prom_cp1_size = CP1_SIZE;
memsize -= prom_cp1_size; memsize -= prom_cp1_size;
prom_cp1_base = (unsigned int *)KSEG1ADDR(memsize); prom_cp1_base = (unsigned int *)KSEG1ADDR(memsize);

View file

@ -78,8 +78,11 @@ ifxmips_get_cpu_hz(void)
return CLOCK_333M; return CLOCK_333M;
case 4: case 4:
return DDR_HZ; return DDR_HZ;
case 8:
return DDR_HZ << 1;
default:
return DDR_HZ >> 1;
} }
return DDR_HZ >> 1;
} }
EXPORT_SYMBOL(ifxmips_get_cpu_hz); EXPORT_SYMBOL(ifxmips_get_cpu_hz);

View file

@ -18,25 +18,28 @@
#include "arcaydian.h" #include "arcaydian.h"
static int ifxmips_brn = 1; static int ifxmips_brn = 0;
int __init int __init
ifxmips_find_brn_mac(unsigned char *ifxmips_ethaddr) ifxmix_detect_brn_block(void)
{ {
unsigned char temp[8]; unsigned char temp[8];
memcpy_fromio(temp, memcpy_fromio(temp,
(void *)KSEG1ADDR(IFXMIPS_FLASH_START + 0x800000 - 0x10000), 8); (void *)KSEG1ADDR(IFXMIPS_FLASH_START + 0x800000 - 0x10000), 8);
if (!memcmp(temp, "BRN-BOOT", 8)) if (!memcmp(temp, "BRN-BOOT", 8))
{ ifxmips_brn = 1;
memcpy_fromio(ifxmips_ethaddr, return !ifxmips_brn;
(void *)KSEG1ADDR(IFXMIPS_FLASH_START + }
0x800000 - 0x10000 + 0x16), 6);
if (is_valid_ether_addr(ifxmips_ethaddr)) int __init
return 1; ifxmips_find_brn_mac(unsigned char *ifxmips_ethaddr)
} else { {
ifxmips_brn = 0; if(!ifxmips_brn)
} return 1;
return 0; memcpy_fromio(ifxmips_ethaddr,
(void *)KSEG1ADDR(IFXMIPS_FLASH_START +
0x800000 - 0x10000 + 0x16), 6);
return is_valid_ether_addr(ifxmips_ethaddr);
} }
int int

View file

@ -1,6 +1,7 @@
#ifndef _ARCAYDIAN_H__ #ifndef _ARCAYDIAN_H__
#define _ARCAYDIAN_H__ #define _ARCAYDIAN_H__
int __init ifxmix_detect_brn_block(void);
int __init ifxmips_find_brn_mac(unsigned char *ifxmips_ethaddr); int __init ifxmips_find_brn_mac(unsigned char *ifxmips_ethaddr);
#endif #endif

View file

@ -1,457 +0,0 @@
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* Copyright (C) 2007 John Crispin <blogic@openwrt.org>
*/
#include <linux/autoconf.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/mtd/physmap.h>
#include <linux/kernel.h>
#include <linux/reboot.h>
#include <linux/platform_device.h>
#include <linux/leds.h>
#include <linux/etherdevice.h>
#include <linux/reboot.h>
#include <linux/time.h>
#include <linux/io.h>
#include <linux/gpio.h>
#include <asm/bootinfo.h>
#include <asm/irq.h>
#include <ifxmips.h>
#include <ifxmips_irq.h>
#define MAX_BOARD_NAME_LEN 32
#define MAX_IFXMIPS_DEVS 9
#define SYSTEM_DANUBE "Danube"
#define SYSTEM_DANUBE_CHIPID1 0x00129083
#define SYSTEM_DANUBE_CHIPID2 0x0012B083
#define SYSTEM_TWINPASS "Twinpass"
#define SYSTEM_TWINPASS_CHIPID 0x0012D083
enum {
EASY50712,
EASY4010,
ARV4519,
ARV452,
};
extern int ifxmips_pci_external_clock;
extern int ifxmips_pci_req_mask;
static unsigned int chiprev;
static int cmdline_mac;
char board_name[MAX_BOARD_NAME_LEN + 1] = { 0 };
struct ifxmips_board {
int type;
char name[32];
unsigned int system_type;
struct platform_device **devs;
struct resource reset_resource;
struct resource gpiodev_resource;
struct gpio_led *ifxmips_leds;
struct gpio_led *gpio_leds;
int pci_external_clock;
int pci_req_mask;
int num_devs;
};
DEFINE_SPINLOCK(ebu_lock);
EXPORT_SYMBOL_GPL(ebu_lock);
extern unsigned char ifxmips_ethaddr[6];
static int ifxmips_brn;
static struct gpio_led_platform_data ifxmips_led_data;
static struct platform_device ifxmips_led = {
.id = 0,
.name = "ifxmips_led",
.dev = {
.platform_data = (void *) &ifxmips_led_data,
}
};
static struct platform_device ifxmips_gpio = {
.id = 0,
.name = "ifxmips_gpio",
.num_resources = 1,
};
static struct platform_device ifxmips_mii = {
.id = 0,
.name = "ifxmips_mii0",
.dev = {
.platform_data = ifxmips_ethaddr,
}
};
static struct platform_device ifxmips_wdt = {
.id = 0,
.name = "ifxmips_wdt",
};
static struct platform_device ifxmips_ebu = {
.id = 0,
.name = "ifxmips_ebu",
};
static struct resource ifxmips_mtd_resource = {
.start = IFXMIPS_FLASH_START,
.end = IFXMIPS_FLASH_START + IFXMIPS_FLASH_MAX - 1,
.flags = IORESOURCE_MEM,
};
static struct platform_device ifxmips_mtd = {
.id = 0,
.name = "ifxmips_mtd",
.num_resources = 1,
.resource = &ifxmips_mtd_resource,
};
static struct platform_device ifxmips_gpio_dev = {
.name = "GPIODEV",
.id = -1,
.num_resources = 1,
};
#ifdef CONFIG_LEDS_GPIO
static struct gpio_led arv4519_gpio_leds[] = {
{ .name = "ifx:green:power", .gpio = 3, .active_low = 1, },
{ .name = "ifx:red:power", .gpio = 7, .active_low = 1, },
{ .name = "ifx:green:adsl", .gpio = 4, .active_low = 1, },
{ .name = "ifx:green:internet", .gpio = 5, .active_low = 1, },
{ .name = "ifx:red:internet", .gpio = 8, .active_low = 1, },
{ .name = "ifx:green:wlan", .gpio = 6, .active_low = 1, },
{ .name = "ifx:green:usbpwr", .gpio = 14, .active_low = 1, },
{ .name = "ifx:green:usb", .gpio = 19, .active_low = 1, },
};
static struct gpio_led arv452_gpio_leds[] = {
{ .name = "ifx:blue:power", .gpio = 3, .active_low = 1, },
{ .name = "ifx:blue:adsl", .gpio = 4, .active_low = 1, },
{ .name = "ifx:blue:internet", .gpio = 5, .active_low = 1, },
{ .name = "ifx:red:power", .gpio = 6, .active_low = 1, },
{ .name = "ifx:yello:wps", .gpio = 7, .active_low = 1, },
{ .name = "ifx:red:wps", .gpio = 9, .active_low = 1, },
{ .name = "ifx:blue:voip", .gpio = 32, .active_low = 1, },
{ .name = "ifx:blue:fxs1", .gpio = 33, .active_low = 1, },
{ .name = "ifx:blue:fxs2", .gpio = 34, .active_low = 1, },
{ .name = "ifx:blue:fxo", .gpio = 35, .active_low = 1, },
{ .name = "ifx:blue:voice", .gpio = 36, .active_low = 1, },
{ .name = "ifx:blue:usb", .gpio = 37, .active_low = 1, },
{ .name = "ifx:blue:wlan", .gpio = 38, .active_low = 1, },
{ .name = "ifx:red:internet", .gpio = 41, .active_low = 1, },
};
static struct gpio_led_platform_data ifxmips_gpio_led_data;
static struct platform_device ifxmips_gpio_leds = {
.name = "leds-gpio",
.id = -1,
.dev = {
.platform_data = (void *) &ifxmips_gpio_led_data,
}
};
#endif
static struct resource dwc_usb_res[] = {
{
.name = "dwc3884_membase",
.flags = IORESOURCE_MEM,
.start = 0x1E101000,
.end = 0x1E101FFF
},
{
.name = "dwc3884_irq",
.flags = IORESOURCE_IRQ,
.start = IFXMIPS_USB_INT,
}
};
static struct platform_device dwc_usb =
{
.id = 0,
.name = "dwc3884-hcd",
.resource = dwc_usb_res,
.num_resources = ARRAY_SIZE(dwc_usb_res),
};
struct platform_device *easy50712_devs[] = {
&ifxmips_led, &ifxmips_gpio, &ifxmips_mii,
&ifxmips_mtd, &ifxmips_wdt, &ifxmips_gpio_dev, &dwc_usb
};
struct platform_device *easy4010_devs[] = {
&ifxmips_led, &ifxmips_gpio, &ifxmips_mii,
&ifxmips_mtd, &ifxmips_wdt, &ifxmips_gpio_dev, &dwc_usb
};
struct platform_device *arv5419_devs[] = {
&ifxmips_gpio, &ifxmips_mii, &ifxmips_mtd,
&ifxmips_gpio_dev, &ifxmips_wdt, &dwc_usb,
#ifdef CONFIG_LEDS_GPIO
&ifxmips_gpio_leds,
#endif
};
struct platform_device *arv452_devs[] = {
&ifxmips_gpio, &ifxmips_mii, &ifxmips_mtd,
&ifxmips_gpio_dev, &ifxmips_wdt, &dwc_usb,
&ifxmips_ebu,
#ifdef CONFIG_LEDS_GPIO
&ifxmips_gpio_leds,
#endif
};
static struct gpio_led easy50712_leds[] = {
{ .name = "ifx:green:test0", .gpio = 0,},
{ .name = "ifx:green:test1", .gpio = 1,},
{ .name = "ifx:green:test2", .gpio = 2,},
{ .name = "ifx:green:test3", .gpio = 3,},
};
static struct gpio_led easy4010_leds[] = {
{ .name = "ifx:green:test0", .gpio = 0,},
{ .name = "ifx:green:test1", .gpio = 1,},
{ .name = "ifx:green:test2", .gpio = 2,},
{ .name = "ifx:green:test3", .gpio = 3,},
};
static struct ifxmips_board boards[] = {
{
/* infineon eval kit */
.type = EASY50712,
.name = "EASY50712",
.system_type = SYSTEM_DANUBE_CHIPID1,
.devs = easy50712_devs,
.reset_resource = {.name = "reset", .start = 1, .end = 15,},
.gpiodev_resource = { .name = "gpio",
.start = (1 << 0) | (1 << 1),
.end = (1 << 0) | (1 << 1)},
.ifxmips_leds = easy50712_leds,
}, {
/* infineon eval kit */
.type = EASY4010,
.name = "EASY4010",
.system_type = SYSTEM_TWINPASS_CHIPID,
.devs = easy4010_devs,
.reset_resource = {.name = "reset", .start = 1, .end = 15},
.gpiodev_resource = { .name = "gpio",
.start = (1 << 0) | (1 << 1),
.end = (1 << 0) | (1 << 1)},
.ifxmips_leds = easy4010_leds,
}, {
/* arcaydian annex-a board used by thompson, airties, ... */
.type = ARV4519,
.name = "ARV4519",
.system_type = SYSTEM_DANUBE_CHIPID2,
.devs = arv5419_devs,
.reset_resource = {.name = "reset", .start = 1, .end = 14},
.pci_external_clock = 1,
#ifdef CONFIG_LEDS_GPIO
.gpio_leds = arv4519_gpio_leds,
#endif
}, {
/* arcaydian annex-b board used by airties, arcor */
.type = ARV452,
.name = "ARV452",
.system_type = SYSTEM_DANUBE_CHIPID2,
.devs = arv452_devs,
.reset_resource = {.name = "reset", .start = 1, .end = 14},
.pci_external_clock = 1,
#ifdef CONFIG_LEDS_GPIO
.gpio_leds = arv452_gpio_leds,
#endif
},
};
const char *get_system_type(void)
{
chiprev = (ifxmips_r32(IFXMIPS_MPS_CHIPID) & 0x0FFFFFFF);
switch (chiprev) {
case SYSTEM_DANUBE_CHIPID1:
case SYSTEM_DANUBE_CHIPID2:
return SYSTEM_DANUBE;
case SYSTEM_TWINPASS_CHIPID:
return SYSTEM_TWINPASS;
}
return BOARD_SYSTEM_TYPE;
}
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(KERN_INFO "bootloader told us, that this is a %s board\n",
board_name);
out:
return 1;
}
__setup("ifxmips_board", ifxmips_set_board_type);
static int __init ifxmips_set_ethaddr(char *str)
{
#define IS_HEX(x) \
(((x >= '0' && x <= '9') || (x >= 'a' && x <= 'f') \
|| (x >= 'A' && x <= 'F')) ? (1) : (0))
int i;
str = strchr(str, '=');
if (!str)
goto out;
str++;
if (strlen(str) != 17)
goto out;
for (i = 0; i < 6; i++) {
if (!IS_HEX(str[3 * i]) || !IS_HEX(str[(3 * i) + 1]))
goto out;
if ((i != 5) && (str[(3 * i) + 2] != ':'))
goto out;
ifxmips_ethaddr[i] = simple_strtoul(&str[3 * i], NULL, 16);
}
if (is_valid_ether_addr(ifxmips_ethaddr))
cmdline_mac = 1;
out:
return 1;
}
__setup("ethaddr", ifxmips_set_ethaddr);
int ifxmips_find_brn_block(void)
{
unsigned char temp[8];
memcpy_fromio(temp,
(void *)KSEG1ADDR(IFXMIPS_FLASH_START + 0x800000 - 0x10000), 8);
if (memcmp(temp, "BRN-BOOT", 8) == 0) {
if (!cmdline_mac)
memcpy_fromio(ifxmips_ethaddr,
(void *)KSEG1ADDR(IFXMIPS_FLASH_START +
0x800000 - 0x10000 + 0x16), 6);
if (is_valid_ether_addr(ifxmips_ethaddr))
cmdline_mac = 1;
return 1;
} else {
return 0;
}
}
int ifxmips_has_brn_block(void)
{
return ifxmips_brn;
}
EXPORT_SYMBOL(ifxmips_has_brn_block);
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)
{
struct ifxmips_board *board;
chiprev = (ifxmips_r32(IFXMIPS_MPS_CHIPID) & 0x0FFFFFFF);
board = ifxmips_find_board();
ifxmips_brn = ifxmips_find_brn_block();
if (!cmdline_mac)
random_ether_addr(ifxmips_ethaddr);
if (!board) {
switch (chiprev) {
case SYSTEM_DANUBE_CHIPID1:
case SYSTEM_DANUBE_CHIPID2:
default:
board = &boards[0];
break;
case SYSTEM_TWINPASS_CHIPID:
board = &boards[1];
break;
}
}
switch (board->type) {
case EASY50712:
board->num_devs = ARRAY_SIZE(easy50712_devs);
ifxmips_led_data.num_leds = ARRAY_SIZE(easy50712_leds);
break;
case EASY4010:
board->num_devs = ARRAY_SIZE(easy4010_devs);
ifxmips_led_data.num_leds = ARRAY_SIZE(easy4010_leds);
break;
case ARV4519:
/* set some sane defaults for the gpios */
gpio_set_value(3, 0);
gpio_set_value(4, 0);
gpio_set_value(5, 0);
gpio_set_value(6, 0);
gpio_set_value(7, 1);
gpio_set_value(8, 1);
gpio_set_value(19, 0);
board->num_devs = ARRAY_SIZE(arv5419_devs);
#ifdef CONFIG_LEDS_GPIO
ifxmips_gpio_led_data.num_leds = ARRAY_SIZE(arv4519_gpio_leds);
#endif
break;
case ARV452:
/* set some sane defaults for the gpios */
board->num_devs = ARRAY_SIZE(arv452_devs);
ifxmips_w32(0x8001e7ff, IFXMIPS_EBU_BUSCON1);
#ifdef CONFIG_LEDS_GPIO
ifxmips_gpio_led_data.num_leds = ARRAY_SIZE(arv452_gpio_leds);
#endif
break;
}
#ifdef CONFIG_LEDS_GPIO
ifxmips_gpio_led_data.leds = board->gpio_leds;
#endif
ifxmips_led_data.leds = board->ifxmips_leds;
printk(KERN_INFO "%s: adding %d devs\n",
__func__, board->num_devs);
ifxmips_gpio.resource = &board->reset_resource;
ifxmips_gpio_dev.resource = &board->gpiodev_resource;
if (board->pci_external_clock)
ifxmips_pci_external_clock = 1;
if (board->pci_req_mask)
ifxmips_pci_req_mask = board->pci_req_mask;
printk(KERN_INFO "using board definition %s\n", board->name);
return platform_add_devices(board->devs, board->num_devs);
}
arch_initcall(ifxmips_init_devices);

View file

@ -20,6 +20,8 @@
#include <ifxmips.h> #include <ifxmips.h>
#include <ifxmips_irq.h> #include <ifxmips_irq.h>
#include "devices.h"
/* usb */ /* usb */
static struct resource dwc_usb_res[] = static struct resource dwc_usb_res[] =
{ {
@ -84,10 +86,16 @@ static struct platform_device danube_ethernet =
}; };
void __init void __init
danube_register_ethernet(unsigned char *mac) danube_register_ethernet(unsigned char *mac, int mii_mode)
{ {
struct ifxmips_eth_data *eth = kmalloc(sizeof(struct ifxmips_eth_data), GFP_KERNEL);
memset(eth, 0, sizeof(struct ifxmips_eth_data));
if(mac) if(mac)
danube_ethernet.dev.platform_data = mac; eth->mac = mac;
else
eth->mac = ifxmips_ethaddr;
eth->mii_mode = mii_mode;
danube_ethernet.dev.platform_data = eth;
platform_device_register(&danube_ethernet); platform_device_register(&danube_ethernet);
} }

View file

@ -10,7 +10,7 @@ enum {
void __init danube_register_usb(void); void __init danube_register_usb(void);
void __init danube_register_ebu_gpio(struct resource *resource, u32 value); void __init danube_register_ebu_gpio(struct resource *resource, u32 value);
void __init danube_register_ethernet(unsigned char *mac); void __init danube_register_ethernet(unsigned char *mac, int mii_mode);
void __init danube_register_pci(int clock, int irq_mask); void __init danube_register_pci(int clock, int irq_mask);
#endif #endif

View file

@ -9,6 +9,7 @@
#include <linux/input.h> #include <linux/input.h>
#include <machine.h> #include <machine.h>
#include <ifxmips.h>
#include <ifxmips_prom.h> #include <ifxmips_prom.h>
#include "arcaydian.h" #include "arcaydian.h"
@ -23,7 +24,7 @@
#define ARV452_LATCH_SWITCH (1 << 10) #define ARV452_LATCH_SWITCH (1 << 10)
#ifdef CONFIG_MTD_PARTITIONS #ifdef CONFIG_MTD_PARTITIONS
static struct mtd_partition arv452_partitions[] = static struct mtd_partition arv4520_partitions[] =
{ {
{ {
.name = "uboot", .name = "uboot",
@ -58,50 +59,21 @@ static struct mtd_partition arv452_partitions[] =
}; };
#endif #endif
static struct physmap_flash_data arv452_flash_data = { static struct physmap_flash_data arv4520_flash_data = {
#ifdef CONFIG_MTD_PARTITIONS #ifdef CONFIG_MTD_PARTITIONS
.nr_parts = ARRAY_SIZE(arv452_partitions), .nr_parts = ARRAY_SIZE(arv4520_partitions),
.parts = arv452_partitions, .parts = arv4520_partitions,
#endif #endif
}; };
static struct gpio_led static struct gpio_led
arv452_leds_gpio[] __initdata = { arv4520_leds_gpio[] __initdata = {
/*
{ .name = "ifx0", .gpio = 0, .active_low = 1, },
{ .name = "ifx1", .gpio = 1, .active_low = 1, },
{ .name = "ifx2", .gpio = 2, .active_low = 1, },
*/
{ .name = "ifx:blue:power", .gpio = 3, .active_low = 1, }, { .name = "ifx:blue:power", .gpio = 3, .active_low = 1, },
{ .name = "ifx:blue:adsl", .gpio = 4, .active_low = 1, }, { .name = "ifx:blue:adsl", .gpio = 4, .active_low = 1, },
{ .name = "ifx:blue:internet", .gpio = 5, .active_low = 1, }, { .name = "ifx:blue:internet", .gpio = 5, .active_low = 1, },
{ .name = "ifx:red:power", .gpio = 6, .active_low = 1, }, { .name = "ifx:red:power", .gpio = 6, .active_low = 1, },
{ .name = "ifx:yello:wps", .gpio = 7, .active_low = 1, }, { .name = "ifx:yello:wps", .gpio = 7, .active_low = 1, },
{ .name = "ifx:red:wps", .gpio = 9, .active_low = 1, }, { .name = "ifx:red:wps", .gpio = 9, .active_low = 1, },
/*
{ .name = "ifx10", .gpio = 10, .active_low = 1, },
{ .name = "ifx11", .gpio = 11, .active_low = 1, },
{ .name = "ifx12", .gpio = 12, .active_low = 1, },
{ .name = "ifx13", .gpio = 13, .active_low = 1, },
{ .name = "ifx14", .gpio = 14, .active_low = 1, },
{ .name = "ifx15", .gpio = 15, .active_low = 1, },
{ .name = "ifx16", .gpio = 16, .active_low = 1, },
{ .name = "ifx17", .gpio = 17, .active_low = 1, },
{ .name = "ifx18", .gpio = 18, .active_low = 1, },
{ .name = "ifx19", .gpio = 19, .active_low = 1, },
{ .name = "ifx20", .gpio = 20, .active_low = 1, },
{ .name = "ifx21", .gpio = 21, .active_low = 1, },
{ .name = "ifx22", .gpio = 22, .active_low = 1, },
{ .name = "ifx23", .gpio = 23, .active_low = 1, },
{ .name = "ifx24", .gpio = 24, .active_low = 1, },
{ .name = "ifx25", .gpio = 25, .active_low = 1, },
{ .name = "ifx26", .gpio = 26, .active_low = 1, },
{ .name = "ifx27", .gpio = 27, .active_low = 1, },
{ .name = "ifx28", .gpio = 28, .active_low = 1, },
{ .name = "ifx29", .gpio = 29, .active_low = 1, },
{ .name = "ifx30", .gpio = 30, .active_low = 1, },
{ .name = "ifx31", .gpio = 31, .active_low = 1, },
*/
{ .name = "ifx:blue:voip", .gpio = 32, .active_low = 1, }, { .name = "ifx:blue:voip", .gpio = 32, .active_low = 1, },
{ .name = "ifx:blue:fxs1", .gpio = 33, .active_low = 1, }, { .name = "ifx:blue:fxs1", .gpio = 33, .active_low = 1, },
{ .name = "ifx:blue:fxs2", .gpio = 34, .active_low = 1, }, { .name = "ifx:blue:fxs2", .gpio = 34, .active_low = 1, },
@ -109,20 +81,10 @@ arv452_leds_gpio[] __initdata = {
{ .name = "ifx:blue:voice", .gpio = 36, .active_low = 1, }, { .name = "ifx:blue:voice", .gpio = 36, .active_low = 1, },
{ .name = "ifx:blue:usb", .gpio = 37, .active_low = 1, }, { .name = "ifx:blue:usb", .gpio = 37, .active_low = 1, },
{ .name = "ifx:blue:wlan", .gpio = 38, .active_low = 1, }, { .name = "ifx:blue:wlan", .gpio = 38, .active_low = 1, },
/* { .name = "ifx39", .gpio = 39, .active_low = 1, },
{ .name = "ifx40", .gpio = 40, .active_low = 1, },
{ .name = "ifx41", .gpio = 41, .active_low = 1, },
{ .name = "ifx42", .gpio = 42, .active_low = 1, },
{ .name = "ifx43", .gpio = 43, .active_low = 1, },
{ .name = "ifx44", .gpio = 44, .active_low = 1, },
{ .name = "ifx45", .gpio = 45, .active_low = 1, },
{ .name = "ifx46", .gpio = 46, .active_low = 1, },
{ .name = "ifx47", .gpio = 47, .active_low = 1, },
*/
}; };
static struct gpio_button static struct gpio_button
arv452_gpio_buttons[] __initdata = { arv4520_gpio_buttons[] __initdata = {
{ {
.desc = "reset", .desc = "reset",
.type = EV_KEY, .type = EV_KEY,
@ -133,7 +95,7 @@ arv452_gpio_buttons[] __initdata = {
} }
}; };
static struct resource arv452_ebu_resource = static struct resource arv4520_ebu_resource =
{ {
.name = "ebu-gpio", .name = "ebu-gpio",
.start = ARV452_EBU_GPIO_START, .start = ARV452_EBU_GPIO_START,
@ -142,29 +104,32 @@ static struct resource arv452_ebu_resource =
}; };
static void __init static void __init
arv452_init(void) arv4520_init(void)
{ {
unsigned char mac[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; unsigned char mac[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
ifxmix_detect_brn_block();
ifxmips_find_brn_mac(mac); ifxmips_find_brn_mac(mac);
ifxmips_register_gpio(); ifxmips_register_gpio();
danube_register_ebu_gpio(&arv452_ebu_resource, ARV452_LATCH_SWITCH); danube_register_ebu_gpio(&arv4520_ebu_resource, ARV452_LATCH_SWITCH);
ifxmips_register_mtd(&arv452_flash_data); ifxmips_register_mtd(&arv4520_flash_data);
danube_register_pci(PCI_CLOCK_EXT, 0); danube_register_pci(PCI_CLOCK_EXT, 0);
ifxmips_register_wdt(); ifxmips_register_wdt();
ifxmips_register_gpio_leds(arv452_leds_gpio, ARRAY_SIZE(arv452_leds_gpio)); ifxmips_register_gpio_leds(arv4520_leds_gpio, ARRAY_SIZE(arv4520_leds_gpio));
danube_register_ethernet(mac); danube_register_ethernet(mac, REV_MII_MODE);
danube_register_usb(); danube_register_usb();
} }
MIPS_MACHINE(IFXMIPS_MACH_ARV452, MIPS_MACHINE(IFXMIPS_MACH_ARV4520,
"ARV452", "ARV4520",
"Airties WAV-281, Arcor A800", "Airties WAV-281, Arcor A800",
arv452_init); arv4520_init);

View file

@ -0,0 +1,135 @@
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/leds.h>
#include <linux/gpio.h>
#include <linux/gpio_buttons.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/input.h>
#include <machine.h>
#include <ifxmips.h>
#include <ifxmips_prom.h>
#include "arcaydian.h"
#include "devices.h"
#define ARV452_EBU_GPIO_START 0x14000000
#define ARV452_EBU_GPIO_SIZE 0x00001000
#define ARV452_GPIO_BUTTON_RESET 14
#define ARV452_BUTTONS_POLL_INTERVAL 20
#define ARV452_LATCH_SWITCH (1 << 10)
#ifdef CONFIG_MTD_PARTITIONS
static struct mtd_partition arv4525_partitions[] =
{
{
.name = "uboot",
.offset = 0x0,
.size = 0x20000,
},
{
.name = "uboot_env",
.offset = 0x20000,
.size = 0x0,
},
{
.name = "kernel",
.offset = 0x0,
.size = 0x0,
},
{
.name = "rootfs",
.offset = 0x0,
.size = 0x0,
},
{
.name = "board_config",
.offset = 0x3f0000,
.size = 0x10000,
},
{
.name = "openwrt",
.offset = 0x0,
.size = 0x0,
},
};
#endif
static struct physmap_flash_data arv4525_flash_data = {
#ifdef CONFIG_MTD_PARTITIONS
.nr_parts = ARRAY_SIZE(arv4525_partitions),
.parts = arv4525_partitions,
#endif
};
static struct gpio_led
arv4525_leds_gpio[] __initdata = {
{ .name = "ifx:blue:power", .gpio = 3, .active_low = 1, },
{ .name = "ifx:blue:adsl", .gpio = 4, .active_low = 1, },
{ .name = "ifx:blue:internet", .gpio = 5, .active_low = 1, },
{ .name = "ifx:red:power", .gpio = 6, .active_low = 1, },
{ .name = "ifx:yello:wps", .gpio = 7, .active_low = 1, },
{ .name = "ifx:red:wps", .gpio = 9, .active_low = 1, },
{ .name = "ifx:blue:voip", .gpio = 32, .active_low = 1, },
{ .name = "ifx:blue:fxs1", .gpio = 33, .active_low = 1, },
{ .name = "ifx:blue:fxs2", .gpio = 34, .active_low = 1, },
{ .name = "ifx:blue:fxo", .gpio = 35, .active_low = 1, },
{ .name = "ifx:blue:voice", .gpio = 36, .active_low = 1, },
{ .name = "ifx:blue:usb", .gpio = 37, .active_low = 1, },
{ .name = "ifx:blue:wlan", .gpio = 38, .active_low = 1, },
};
static struct gpio_button
arv4525_gpio_buttons[] __initdata = {
{
.desc = "reset",
.type = EV_KEY,
.code = BTN_0,
.threshold = 3,
.gpio = ARV452_GPIO_BUTTON_RESET,
.active_low = 1,
}
};
static struct resource arv4525_ebu_resource =
{
.name = "ebu-gpio",
.start = ARV452_EBU_GPIO_START,
.end = ARV452_EBU_GPIO_START + ARV452_EBU_GPIO_SIZE - 1,
.flags = IORESOURCE_MEM,
};
static void __init
arv4525_init(void)
{
unsigned char mac[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
ifxmix_detect_brn_block();
ifxmips_find_brn_mac(mac);
ifxmips_register_gpio();
danube_register_ebu_gpio(&arv4525_ebu_resource, ARV452_LATCH_SWITCH);
ifxmips_register_mtd(&arv4525_flash_data);
danube_register_pci(PCI_CLOCK_INT, 0);
ifxmips_register_wdt();
ifxmips_register_gpio_leds(arv4525_leds_gpio, ARRAY_SIZE(arv4525_leds_gpio));
danube_register_ethernet(mac, MII_MODE);
danube_register_usb();
}
MIPS_MACHINE(IFXMIPS_MACH_ARV4525,
"ARV4525",
"Speedport W502V",
arv4525_init);

View file

@ -9,6 +9,7 @@
#include <linux/input.h> #include <linux/input.h>
#include <machine.h> #include <machine.h>
#include <ifxmips.h>
#include <ifxmips_prom.h> #include <ifxmips_prom.h>
#include "devices.h" #include "devices.h"
@ -68,7 +69,7 @@ easy4010_init(void)
ifxmips_register_wdt(); ifxmips_register_wdt();
danube_register_ethernet(ifxmips_ethaddr); danube_register_ethernet(ifxmips_ethaddr, REV_MII_MODE);
danube_register_usb(); danube_register_usb();
} }

View file

@ -9,6 +9,7 @@
#include <linux/input.h> #include <linux/input.h>
#include <machine.h> #include <machine.h>
#include <ifxmips.h>
#include <ifxmips_prom.h> #include <ifxmips_prom.h>
#include "devices.h" #include "devices.h"
@ -60,8 +61,7 @@ easy50712_init(void)
{ {
ifxmips_register_gpio(); ifxmips_register_gpio();
//printk("ifxmips_register_gpio_dev\n"); ifxmips_register_gpio_dev();
//ifxmips_register_gpio_dev();
ifxmips_register_mtd(&easy50712_flash_data); ifxmips_register_mtd(&easy50712_flash_data);
@ -69,7 +69,7 @@ easy50712_init(void)
ifxmips_register_wdt(); ifxmips_register_wdt();
danube_register_ethernet(ifxmips_ethaddr); danube_register_ethernet(ifxmips_ethaddr, REV_MII_MODE);
danube_register_usb(); danube_register_usb();
} }

View file

@ -0,0 +1,9 @@
#ifndef _IFXMIPS_PLATFORM_H__
#define _IFXMIPS_PLATFORM_H__
struct ifxmips_eth_data {
const char *mac;
int mii_mode;
};
#endif

View file

@ -7,7 +7,8 @@ enum ifxmips_mach_type {
IFXMIPS_MACH_EASY50712, /* Danube evalkit */ IFXMIPS_MACH_EASY50712, /* Danube evalkit */
IFXMIPS_MACH_EASY4010, /* Twinpass evalkit */ IFXMIPS_MACH_EASY4010, /* Twinpass evalkit */
IFXMIPS_MACH_ARV4519, /* Airties WAV-221 */ IFXMIPS_MACH_ARV4519, /* Airties WAV-221 */
IFXMIPS_MACH_ARV452, /* Airties WAV-281, Arcor EasyboxA800 */ IFXMIPS_MACH_ARV4520, /* Airties WAV-281, Arcor EasyboxA800 */
IFXMIPS_MACH_ARV4525, /* Speedport W502V */
/* ASE based machines */ /* ASE based machines */
IFXMIPS_MACH_EASY50601, /* ASE wave board */ IFXMIPS_MACH_EASY50601, /* ASE wave board */

View file

@ -41,6 +41,7 @@
#include <ifxmips.h> #include <ifxmips.h>
#include <ifxmips_dma.h> #include <ifxmips_dma.h>
#include <ifxmips_pmu.h> #include <ifxmips_pmu.h>
#include <ifxmips_platform.h>
struct ifxmips_mii_priv { struct ifxmips_mii_priv {
struct net_device_stats stats; struct net_device_stats stats;
@ -267,11 +268,6 @@ void ifxmips_etop_dma_buffer_free(unsigned char *dataptr, void *opt)
} }
} }
static struct net_device_stats *ifxmips_get_stats(struct net_device *dev)
{
return &((struct ifxmips_mii_priv *)netdev_priv(dev))->stats;
}
static void static void
ifxmips_adjust_link(struct net_device *dev) ifxmips_adjust_link(struct net_device *dev)
{ {
@ -436,12 +432,12 @@ static int
ifxmips_mii_probe(struct platform_device *dev) ifxmips_mii_probe(struct platform_device *dev)
{ {
int result = 0; int result = 0;
unsigned char *mac = (unsigned char *)dev->dev.platform_data; struct ifxmips_eth_data *eth = (struct ifxmips_eth_data*)dev->dev.platform_data;
ifxmips_mii0_dev = alloc_etherdev(sizeof(struct ifxmips_mii_priv)); ifxmips_mii0_dev = alloc_etherdev(sizeof(struct ifxmips_mii_priv));
ifxmips_mii0_dev->netdev_ops = &ifxmips_eth_netdev_ops; ifxmips_mii0_dev->netdev_ops = &ifxmips_eth_netdev_ops;
memcpy(mac_addr, mac, 6); memcpy(mac_addr, eth->mac, 6);
strcpy(ifxmips_mii0_dev->name, "eth%d"); strcpy(ifxmips_mii0_dev->name, "eth%d");
ifxmips_mii_chip_init(REV_MII_MODE); ifxmips_mii_chip_init(eth->mii_mode);
result = register_netdev(ifxmips_mii0_dev); result = register_netdev(ifxmips_mii0_dev);
if (result) { if (result) {
printk(KERN_INFO "ifxmips_mii0: error %i registering device \"%s\"\n", result, ifxmips_mii0_dev->name); printk(KERN_INFO "ifxmips_mii0: error %i registering device \"%s\"\n", result, ifxmips_mii0_dev->name);