REKLAMA

board_bcm963xx.c

D-Link dsl-2640B i Openwrt - opinie, jak wgrywać itd.

Heh dopiero teraz się zorientowałem, że kompilowałem i luci i webif. Pakiety kmod-ppp kmod-pppoa są również dostępne. Następnym razem skompiluje z nimi. Interfejs ppp0 dodawałem do listy ręcznie, ale niczego to nie zmieniało. Sterowniki właściwie to nie wiem czy domyślnie się kompilują. Wydaje mi się, że tak gdyż nigdzie nie znalazłem opcji aby skompilować bez nich. Co do rozwiązania problemu z "Kernel Panic" to dodałem do pliku: target/linux/brcm63xx/files/arch/mips/bcm63xx/boards/board_bcm963xx.c static struct board_info __initdata board_96348 = { .name = "D-4P-W", .expected_cpu_id = 0x6348, .has_enet0 = 1, .has_enet1 = 1, .has_pci = 1, .enet0 = { .has_phy = 1, .use_internal_phy = 1, }, .enet1 = { .force_speed_100 = 1, .force_duplex_full = 1, }, .has_ohci0 = 1, }; Oraz nieco dalej w tym samym pliku: &board_96348, Wyniki poleceń które które chciałeś podam później ponieważ ten router zapewnia mi dostęp do internetu i muszę "oprogramowaniem żonglować". W załączniku wstawiam orginalną wersje modyfikowanego pliku. EDIT: ifconfig -a root@OpenWrt:/# ifconfig -a br-lan Link encap:Ethernet HWaddr 00:21:91:1A:57:54 inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:341 errors:0 dropped:0 overruns:0 frame:0 TX packets:363 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:46526 (45.4 KiB) TX bytes:102501 (100.0 KiB) eth0 Link encap:Ethernet HWaddr 00:21:91:1A:57:53 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:16 eth1 Link encap:Ethernet HWaddr 00:21:91:1A:57:54 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:796 errors:0 dropped:0 overruns:0 frame:0 TX packets:772 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:120199 (117.3 KiB) TX bytes:201368 (196.6 KiB) Interrupt:15 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Po "ifup wan" wypluwa to samo. opkg list_installed root@OpenWrt:/# opkg list_installed base-files - 34-r19034 busybox - 1.15.3-1 dnsmasq - 2.51-2 dropbear - 0.52-3 firewall - 1-9 gpioctl - 1.0-1 hostapd-mini - 20091129-1 hotplug2 - 1.0-beta-1 iptables - 1.4.4-3 iptables-mod-conntrack - 1.4.4-3 iptables-mod-nat - 1.4.4-3 iw - 0.9.18-1 kernel - 2.6.30.10-1 kmod-atm - 2.6.30.10-1 kmod-b43 - 2.6.30.10+2009-12-05-8 kmod-crc-ccitt - 2.6.30.10-1 kmod-crypto-aes - 2.6.30.10-1 kmod-crypto-arc4 - 2.6.30.10-1 kmod-crypto-core - 2.6.30.10-1 kmod-ipt-conntrack - 2.6.30.10-1 kmod-ipt-core - 2.6.30.10-1 kmod-ipt-nat - 2.6.30.10-1 kmod-ipt-nathelper - 2.6.30.10-1 kmod-mac80211 - 2.6.30.10+2009-12-05-8 kmod-ppp - 2.6.30.10-1 kmod-pppoa - 2.6.30.10-1 kmod-pppoe - 2.6.30.10-1 kmod-switch - 2.6.30.10-2 libc - 0.9.30.1-34 libgcc - 4.3.3+cs-34 libiptc - 1.4.4-3 liblua - 5.1.4-5 libncurses - 5.7-1 libnl-tiny - 0.1-1 libuci - 0.7.5-1 libuci-lua - 0.7.5-1 libxtables - 1.4.4-3 lua - 5.1.4-5 luci-admin-core - 0.9+svn5660-1 luci-admin-full - 0.9+svn5660-1 luci-admin-mini - 0.9+svn5660-1 luci-app-firewall - 0.9+svn5660-1 luci-cbi - 0.9+svn5660-1 luci-core - 0.9+svn5660-1 luci-http - 0.9+svn5660-1 luci-i18n-english - 0.9+svn5660-1 luci-ipkg - 0.9+svn5660-1 luci-lmo - 0.9+svn5660-1 luci-lucid - 0.9+svn5660-1 luci-nixio - 0.9+svn5660-1 luci-px5g - 0.9+svn5660-1 luci-sgi-cgi - 0.9+svn5660-1 luci-sys - 0.9+svn5660-1 luci-theme-base - 0.9+svn5660-1 luci-theme-openwrt - 0.9+svn5660-1 luci-uci - 0.9+svn5660-1 luci-uvl - 0.9+svn5660-1 luci-web - 0.9+svn5660-1 mtd - 10 nano - 2.2.1-1 opkg - 503-2 ppp - 2.4.4-4 ppp-mod-pppoe - 2.4.4-4 uci - 0.7.5-1 ucitrigger - 0.7.5-1 udevtrigger - 106-1 wireless-tools - 29-4


Pobierz plik - link do postu

/*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file " COPYING " in the main directory of this archive
* for more details.
*
* Copyright (C) 2008 Maxime Bizon & lt; mbizon@freebox.fr & gt;
* Copyright (C) 2009 Florian Fainelli & lt; florian@openwrt.org & gt;
*/

#include & lt; linux/init.h & gt;
#include & lt; linux/kernel.h & gt;
#include & lt; linux/string.h & gt;
#include & lt; linux/platform_device.h & gt;
#include & lt; linux/mtd/mtd.h & gt;
#include & lt; linux/mtd/partitions.h & gt;
#include & lt; linux/mtd/physmap.h & gt;
#include & lt; linux/ssb/ssb.h & gt;
#include & lt; linux/gpio_buttons.h & gt;
#include & lt; asm/addrspace.h & gt;
#include & lt; bcm63xx_board.h & gt;
#include & lt; bcm63xx_cpu.h & gt;
#include & lt; bcm63xx_regs.h & gt;
#include & lt; bcm63xx_io.h & gt;
#include & lt; bcm63xx_board.h & gt;
#include & lt; bcm63xx_dev_pci.h & gt;
#include & lt; bcm63xx_dev_uart.h & gt;
#include & lt; bcm63xx_dev_wdt.h & gt;
#include & lt; bcm63xx_dev_enet.h & gt;
#include & lt; bcm63xx_dev_dsp.h & gt;
#include & lt; bcm63xx_dev_pcmcia.h & gt;
#include & lt; bcm63xx_dev_usb_ohci.h & gt;
#include & lt; bcm63xx_dev_usb_ehci.h & gt;
#include & lt; bcm63xx_dev_usb_udc.h & gt;
#include & lt; bcm63xx_dev_spi.h & gt;
#include & lt; board_bcm963xx.h & gt;

#define PFX " board_bcm963xx: "

static struct bcm963xx_nvram nvram;
static unsigned int mac_addr_used = 0;
static struct board_info board;

/*
* known 6338 boards
*/

#ifdef CONFIG_BCM63XX_CPU_6338
static struct board_info __initdata board_96338gw = {
.name = " 96338GW " ,
.expected_cpu_id = 0x6338,

.has_enet0 = 1,
.enet0 = {
.force_speed_100 = 1,
.force_duplex_full = 1,
},

.has_ohci0 = 1,

.leds = {
{
.name = " adsl " ,
.gpio = 3,
.active_low = 1,
},
{
.name = " ses " ,
.gpio = 5,
.active_low = 1,
},
{
.name = " ppp-fail " ,
.gpio = 4,
.active_low = 1,
},
{
.name = " power " ,
.gpio = 0,
.active_low = 1,
.default_trigger = " default-on " ,
},
{
.name = " stop " ,
.gpio = 1,
.active_low = 1,
}
},
};

static struct board_info __initdata board_96338w = {
.name = " 96338W " ,
.expected_cpu_id = 0x6338,

.has_enet0 = 1,
.enet0 = {
.force_speed_100 = 1,
.force_duplex_full = 1,
},

.leds = {
{
.name = " adsl " ,
.gpio = 3,
.active_low = 1,
},
{
.name = " ses " ,
.gpio = 5,
.active_low = 1,
},
{
.name = " ppp-fail " ,
.gpio = 4,
.active_low = 1,
},
{
.name = " power " ,
.gpio = 0,
.active_low = 1,
.default_trigger = " default-on " ,
},
{
.name = " stop " ,
.gpio = 1,
.active_low = 1,
},
},
};
#endif

/*
* known 6345 boards
*/
#ifdef CONFIG_BCM63XX_CPU_6345
static struct board_info __initdata board_96345gw2 = {
.name = " 96345GW2 " ,
.expected_cpu_id = 0x6345,
};
#endif

/*
* known 6348 boards
*/
#ifdef CONFIG_BCM63XX_CPU_6348
static struct board_info __initdata board_96348r = {
.name = " 96348R " ,
.expected_cpu_id = 0x6348,

.has_enet0 = 1,
.has_pci = 1,

.enet0 = {
.has_phy = 1,
.use_internal_phy = 1,
},

.leds = {
{
.name = " adsl-fail " ,
.gpio = 2,
.active_low = 1,
},
{
.name = " ppp " ,
.gpio = 3,
.active_low = 1,
},
{
.name = " ppp-fail " ,
.gpio = 4,
.active_low = 1,
},
{
.name = " power " ,
.gpio = 0,
.active_low = 1,
.default_trigger = " default-on " ,

},
{
.name = " stop " ,
.gpio = 1,
.active_low = 1,
},
},
};

static struct board_info __initdata board_96348gw_10 = {
.name = " 96348GW-10 " ,
.expected_cpu_id = 0x6348,

.has_enet0 = 1,
.has_enet1 = 1,
.has_pci = 1,

.enet0 = {
.has_phy = 1,
.use_internal_phy = 1,
},
.enet1 = {
.force_speed_100 = 1,
.force_duplex_full = 1,
},

.has_ohci0 = 1,
.has_pccard = 1,
.has_ehci0 = 1,

.has_dsp = 1,
.dsp = {
.gpio_rst = 6,
.gpio_int = 34,
.cs = 2,
.ext_irq = 2,
},

.leds = {
{
.name = " adsl-fail " ,
.gpio = 2,
.active_low = 1,
},
{
.name = " ppp " ,
.gpio = 3,
.active_low = 1,
},
{
.name = " ppp-fail " ,
.gpio = 4,
.active_low = 1,
},
{
.name = " power " ,
.gpio = 0,
.active_low = 1,
.default_trigger = " default-on " ,
},
{
.name = " stop " ,
.gpio = 1,
.active_low = 1,
},
},
};

static struct board_info __initdata board_96348gw_11 = {
.name = " 96348GW-11 " ,
.expected_cpu_id = 0x6348,

.has_enet0 = 1,
.has_enet1 = 1,
.has_pci = 1,

.enet0 = {
.has_phy = 1,
.use_internal_phy = 1,
},

.enet1 = {
.force_speed_100 = 1,
.force_duplex_full = 1,
},


.has_ohci0 = 1,
.has_pccard = 1,
.has_ehci0 = 1,

.leds = {
{
.name = " adsl-fail " ,
.gpio = 2,
.active_low = 1,
},
{
.name = " ppp " ,
.gpio = 3,
.active_low = 1,
},
{
.name = " ppp-fail " ,
.gpio = 4,
.active_low = 1,
},
{
.name = " power " ,
.gpio = 0,
.active_low = 1,
.default_trigger = " default-on " ,
},
{
.name = " stop " ,
.gpio = 1,
.active_low = 1,
},
},
};

static struct board_info __initdata board_96348gw = {
.name = " 96348GW " ,
.expected_cpu_id = 0x6348,

.has_enet0 = 1,
.has_enet1 = 1,
.has_pci = 1,

.enet0 = {
.has_phy = 1,
.use_internal_phy = 1,
},
.enet1 = {
.force_speed_100 = 1,
.force_duplex_full = 1,
},

.has_ohci0 = 1,
.has_dsp = 1,

.dsp = {
.gpio_rst = 6,
.gpio_int = 34,
.ext_irq = 2,
.cs = 2,
},

.leds = {
{
.name = " adsl-fail " ,
.gpio = 2,
.active_low = 1,
},
{
.name = " ppp " ,
.gpio = 3,
.active_low = 1,
},
{
.name = " ppp-fail " ,
.gpio = 4,
.active_low = 1,
},
{
.name = " power " ,
.gpio = 0,
.active_low = 1,
.default_trigger = " default-on " ,
},
{
.name = " stop " ,
.gpio = 1,
.active_low = 1,
},
},
};

static struct board_info __initdata board_FAST2404 = {
.name = " F@ST2404 " ,
.expected_cpu_id = 0x6348,

.has_enet0 = 1,
.has_enet1 = 1,
.has_pci = 1,

.enet0 = {
.has_phy = 1,
.use_internal_phy = 1,
},

.enet1 = {
.force_speed_100 = 1,
.force_duplex_full = 1,
},


.has_ohci0 = 1,
.has_pccard = 1,
.has_ehci0 = 1,
};

static struct board_info __initdata board_DV201AMR = {
.name = " DV201AMR " ,
.expected_cpu_id = 0x6348,

.has_pci = 1,
.has_ohci0 = 1,
.has_udc0 = 1,

.has_enet0 = 1,
.has_enet1 = 1,
.enet0 = {
.has_phy = 1,
.use_internal_phy = 1,
},
.enet1 = {
.force_speed_100 = 1,
.force_duplex_full = 1,
},
};

static struct board_info __initdata board_96348gw_a = {
.name = " 96348GW-A " ,
.expected_cpu_id = 0x6348,

.has_enet0 = 1,
.has_enet1 = 1,
.has_pci = 1,

.enet0 = {
.has_phy = 1,
.use_internal_phy = 1,
},
.enet1 = {
.force_speed_100 = 1,
.force_duplex_full = 1,
},

.has_ohci0 = 1,
};

static struct board_info __initdata board_rta1025w_16 = {
.name = " RTA1025W_16 " ,
.expected_cpu_id = 0x6348,

.has_enet0 = 1,
.has_enet1 = 1,
.has_pci = 1,

.enet0 = {
.has_phy = 1,
.use_internal_phy = 1,
},
.enet1 = {
.force_speed_100 = 1,
.force_duplex_full = 1,
},
};
#endif

/*
* known 6358 boards
*/
#ifdef CONFIG_BCM63XX_CPU_6358
static struct board_info __initdata board_96358vw = {
.name = " 96358VW " ,
.expected_cpu_id = 0x6358,

.has_enet0 = 1,
.has_enet1 = 1,
.has_pci = 1,

.enet0 = {
.has_phy = 1,
.use_internal_phy = 1,
},

.enet1 = {
.force_speed_100 = 1,
.force_duplex_full = 1,
},


.has_ohci0 = 1,
.has_pccard = 1,
.has_ehci0 = 1,

.leds = {
{
.name = " adsl-fail " ,
.gpio = 15,
.active_low = 1,
},
{
.name = " ppp " ,
.gpio = 22,
.active_low = 1,
},
{
.name = " ppp-fail " ,
.gpio = 23,
.active_low = 1,
},
{
.name = " power " ,
.gpio = 4,
.default_trigger = " default-on " ,
},
{
.name = " stop " ,
.gpio = 5,
},
},
};

static struct board_info __initdata board_96358vw2 = {
.name = " 96358VW2 " ,
.expected_cpu_id = 0x6358,

.has_enet0 = 1,
.has_enet1 = 1,
.has_pci = 1,

.enet0 = {
.has_phy = 1,
.use_internal_phy = 1,
},

.enet1 = {
.force_speed_100 = 1,
.force_duplex_full = 1,
},


.has_ohci0 = 1,
.has_pccard = 1,
.has_ehci0 = 1,

.leds = {
{
.name = " adsl " ,
.gpio = 22,
.active_low = 1,
},
{
.name = " ppp-fail " ,
.gpio = 23,
},
{
.name = " power " ,
.gpio = 5,
.active_low = 1,
.default_trigger = " default-on " ,
},
{
.name = " stop " ,
.gpio = 4,
.active_low = 1,
},
},
};

static struct board_info __initdata board_AGPFS0 = {
.name = " AGPF-S0 " ,
.expected_cpu_id = 0x6358,

.has_enet0 = 1,
.has_enet1 = 1,
.has_pci = 1,

.enet0 = {
.has_phy = 1,
.use_internal_phy = 1,
},

.enet1 = {
.force_speed_100 = 1,
.force_duplex_full = 1,
},

.has_ohci0 = 1,
.has_ehci0 = 1,
};

static struct board_info __initdata board_DWVS0 = {
.name = " DWV-S0 " ,
.expected_cpu_id = 0x6358,

.has_enet0 = 1,
.has_enet1 = 1,
.has_pci = 1,

.enet0 = {
.has_phy = 1,
.use_internal_phy = 1,
},

.enet1 = {
.force_speed_100 = 1,
.force_duplex_full = 1,
},

.has_ohci0 = 1,
};
#endif

/*
* all boards
*/
static const struct board_info __initdata *bcm963xx_boards[] = {
#ifdef CONFIG_BCM63XX_CPU_6338
& board_96338gw,
& board_96338w,
#endif
#ifdef CONFIG_BCM63XX_CPU_6345
& board_96345gw2,
#endif
#ifdef CONFIG_BCM63XX_CPU_6348
& board_96348r,
& board_96348gw,
& board_96348gw_10,
& board_96348gw_11,
& board_FAST2404,
& board_DV201AMR,
& board_96348gw_a,
& board_rta1025w_16,
#endif

#ifdef CONFIG_BCM63XX_CPU_6358
& board_96358vw,
& board_96358vw2,
& board_AGPFS0,
& board_DWVS0,
#endif
};

/*
* early init callback, read nvram data from flash and checksum it
*/
void __init board_prom_init(void)
{
unsigned int check_len, i;
u8 *boot_addr, *cfe, *p;
char cfe_version[32];
u32 val;

/* read base address of boot chip select (0)
* 6345 does not have MPI but boots from standard
* MIPS Flash address */
if (BCMCPU_IS_6345())
val = 0x1fc00000;
else {
val = bcm_mpi_readl(MPI_CSBASE_REG(0));
val & = MPI_CSBASE_BASE_MASK;
}
boot_addr = (u8 *)KSEG1ADDR(val);

/* dump cfe version */
cfe = boot_addr + BCM963XX_CFE_VERSION_OFFSET;
if (!memcmp(cfe, " cfe-v " , 5))
snprintf(cfe_version, sizeof(cfe_version), " %u.%u.%u-%u.%u " ,
cfe[5], cfe[6], cfe[7], cfe[8], cfe[9]);
else
strcpy(cfe_version, " unknown " );
printk(KERN_INFO PFX " CFE version: %s\n " , cfe_version);

/* extract nvram data */
memcpy( & nvram, boot_addr + BCM963XX_NVRAM_OFFSET, sizeof(nvram));

/* check checksum before using data */
if (nvram.version & lt; = 4)
check_len = offsetof(struct bcm963xx_nvram, checksum_old);
else
check_len = sizeof(nvram);
val = 0;
p = (u8 *) & nvram;
while (check_len--)
val += *p;
if (val) {
printk(KERN_ERR PFX " invalid nvram checksum\n " );
return;
}

/* find board by name */
for (i = 0; i & lt; ARRAY_SIZE(bcm963xx_boards); i++) {
if (strncmp(nvram.name, bcm963xx_boards[i]- & gt; name,
sizeof(nvram.name)))
continue;
/* copy, board desc array is marked initdata */
memcpy( & board, bcm963xx_boards[i], sizeof(board));
break;
}

/* bail out if board is not found, will complain later */
if (!board.name[0]) {
char name[17];
memcpy(name, nvram.name, 16);
name[16] = 0;
printk(KERN_ERR PFX " unknown bcm963xx board: %s\n " ,
name);
return;
}

/* setup pin multiplexing depending on board enabled device,
* this has to be done this early since PCI init is done
* inside arch_initcall */
val = 0;
#ifdef CONFIG_PCI
if (board.has_pci) {
bcm63xx_pci_enabled = 1;
if (BCMCPU_IS_6348())
val |= GPIO_MODE_6348_G2_PCI;
}
#endif
if (board.has_pccard) {
if (BCMCPU_IS_6348())
val |= GPIO_MODE_6348_G1_MII_PCCARD;
}

if (board.has_enet0 & & !board.enet0.use_internal_phy) {
if (BCMCPU_IS_6348())
val |= GPIO_MODE_6348_G3_EXT_MII |
GPIO_MODE_6348_G0_EXT_MII;
}

if (board.has_enet1 & & !board.enet1.use_internal_phy) {
if (BCMCPU_IS_6348())
val |= GPIO_MODE_6348_G3_EXT_MII |
GPIO_MODE_6348_G0_EXT_MII;
}

bcm_gpio_writel(val, GPIO_MODE_REG);
}

/*
* second stage init callback, good time to panic if we couldn't
* identify on which board we're running since early printk is working
*/
void __init board_setup(void)
{
if (!board.name[0])
panic( " unable to detect bcm963xx board " );
printk(KERN_INFO PFX " board name: %s\n " , board.name);

/* make sure we're running on expected cpu */
if (bcm63xx_get_cpu_id() != board.expected_cpu_id)
panic( " unexpected CPU for bcm963xx board " );
}

/*
* return board name for /proc/cpuinfo
*/
const char *board_get_name(void)
{
return board.name;
}

/*
* register & return a new board mac address
*/
static int board_get_mac_address(u8 *mac)
{
u8 *p;
int count;

if (mac_addr_used & gt; = nvram.mac_addr_count) {
printk(KERN_ERR PFX " not enough mac address\n " );
return -ENODEV;
}

memcpy(mac, nvram.mac_addr_base, ETH_ALEN);
p = mac + ETH_ALEN - 1;
count = mac_addr_used;

while (count--) {
do {
(*p)++;
if (*p != 0)
break;
p--;
} while (p != mac);
}

if (p == mac) {
printk(KERN_ERR PFX " unable to fetch mac address\n " );
return -ENODEV;
}

mac_addr_used++;
return 0;
}

static struct resource mtd_resources[] = {
{
.start = 0, /* filled at runtime */
.end = 0, /* filled at runtime */
.flags = IORESOURCE_MEM,
}
};

static struct platform_device mtd_dev = {
.name = " bcm963xx-flash " ,
.resource = mtd_resources,
.num_resources = ARRAY_SIZE(mtd_resources),
};

/*
* Register a sane SPROMv2 to make the on-board
* bcm4318 WLAN work
*/
static struct ssb_sprom bcm63xx_sprom = {
.revision = 0x02,
.board_rev = 0x17,
.country_code = 0x0,
.ant_available_bg = 0x3,
.pa0b0 = 0x15ae,
.pa0b1 = 0xfa85,
.pa0b2 = 0xfe8d,
.pa1b0 = 0xffff,
.pa1b1 = 0xffff,
.pa1b2 = 0xffff,
.gpio0 = 0xff,
.gpio1 = 0xff,
.gpio2 = 0xff,
.gpio3 = 0xff,
.maxpwr_bg = 0x004c,
.itssi_bg = 0x00,
.boardflags_lo = 0x2848,
.boardflags_hi = 0x0000,
};

static struct resource gpiodev_resource = {
.start = 0xFFFFFFFF,
};

static struct gpio_led_platform_data bcm63xx_led_data;

static struct platform_device bcm63xx_gpio_leds = {
.name = " leds-gpio " ,
.id = 0,
.dev.platform_data = & bcm63xx_led_data,
};

struct gpio_buttons_platform_data bcm63xx_gpio_buttons_data = {
.poll_interval = 20,
};

struct platform_device bcm63xx_gpio_buttons_device = {
.name = " gpio-buttons " ,
.id = 0,
.dev.platform_data = & bcm63xx_gpio_buttons_data,
};


/*
* third stage init callback, register all board devices.
*/
int __init board_register_devices(void)
{
u32 val;

bcm63xx_uart_register();
bcm63xx_wdt_register();

if (!BCMCPU_IS_6345())
bcm63xx_spi_register();

if (board.has_pccard)
bcm63xx_pcmcia_register();

if (board.has_enet0 & &
!board_get_mac_address(board.enet0.mac_addr))
bcm63xx_enet_register(0, & board.enet0);

if (board.has_enet1 & &
!board_get_mac_address(board.enet1.mac_addr))
bcm63xx_enet_register(1, & board.enet1);

if (board.has_ohci0)
bcm63xx_ohci_register();

if (board.has_ehci0)
bcm63xx_ehci_register();

if (board.has_udc0)
bcm63xx_udc_register();

if (board.has_dsp)
bcm63xx_dsp_register( & board.dsp);

/* Generate MAC address for WLAN and
* register our SPROM */
#ifdef CONFIG_PCI
if (!board_get_mac_address(bcm63xx_sprom.il0mac)) {
memcpy(bcm63xx_sprom.et0mac, bcm63xx_sprom.il0mac, ETH_ALEN);
memcpy(bcm63xx_sprom.et1mac, bcm63xx_sprom.il0mac, ETH_ALEN);
if (ssb_arch_set_fallback_sprom( & bcm63xx_sprom) & lt; 0)
printk(KERN_ERR " failed to register fallback SPROM\n " );
}
#endif

/* read base address of boot chip select (0) */
if (BCMCPU_IS_6345())
val = 0x1fc00000;
else {
val = bcm_mpi_readl(MPI_CSBASE_REG(0));
val & = MPI_CSBASE_BASE_MASK;
}
mtd_resources[0].start = val;
mtd_resources[0].end = 0x1FFFFFFF;

platform_device_register( & mtd_dev);

/* Register GPIODEV */
platform_device_register_simple( " GPIODEV " , 0, & gpiodev_resource, 1);

bcm63xx_led_data.num_leds = ARRAY_SIZE(board.leds);
bcm63xx_led_data.leds = board.leds;

platform_device_register( & bcm63xx_gpio_leds);

if (board.reset_btn) {
bcm63xx_gpio_buttons_data.nbuttons = 1,
bcm63xx_gpio_buttons_data.buttons = board.reset_btn;

platform_device_register( & bcm63xx_gpio_buttons_device);
}

return 0;
}