diff options
Diffstat (limited to 'target/linux/brcm63xx/patches-2.6.37/454-board_livebox.patch')
| -rw-r--r-- | target/linux/brcm63xx/patches-2.6.37/454-board_livebox.patch | 251 | 
1 files changed, 251 insertions, 0 deletions
| diff --git a/target/linux/brcm63xx/patches-2.6.37/454-board_livebox.patch b/target/linux/brcm63xx/patches-2.6.37/454-board_livebox.patch new file mode 100644 index 000000000..6c390456c --- /dev/null +++ b/target/linux/brcm63xx/patches-2.6.37/454-board_livebox.patch @@ -0,0 +1,251 @@ +--- a/arch/mips/bcm63xx/boards/Kconfig ++++ b/arch/mips/bcm63xx/boards/Kconfig +@@ -8,4 +8,10 @@ config BOARD_BCM963XX + 	select SSB +        help +  ++config BOARD_LIVEBOX ++	bool "Inventel Livebox(es) boards" ++	select SSB ++	help ++	 Inventel Livebox boards using the RedBoot bootloader. ++ + endchoice +--- a/arch/mips/bcm63xx/boards/Makefile ++++ b/arch/mips/bcm63xx/boards/Makefile +@@ -1,3 +1,4 @@ + obj-$(CONFIG_BOARD_BCM963XX)		+= board_bcm963xx.o ++obj-$(CONFIG_BOARD_LIVEBOX)		+= board_livebox.o +  + EXTRA_CFLAGS += -Werror +--- /dev/null ++++ b/arch/mips/bcm63xx/boards/board_livebox.c +@@ -0,0 +1,228 @@ ++/* ++ * 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 Florian Fainelli <florian@openwrt.org> ++ */ ++ ++#include <linux/init.h> ++#include <linux/kernel.h> ++#include <linux/string.h> ++#include <linux/platform_device.h> ++#include <linux/mtd/mtd.h> ++#include <linux/mtd/partitions.h> ++#include <linux/mtd/physmap.h> ++#include <linux/input.h> ++#include <linux/gpio_buttons.h> ++#include <asm/addrspace.h> ++#include <bcm63xx_board.h> ++#include <bcm63xx_cpu.h> ++#include <bcm63xx_regs.h> ++#include <bcm63xx_io.h> ++#include <bcm63xx_dev_uart.h> ++#include <bcm63xx_dev_pci.h> ++#include <bcm63xx_dev_enet.h> ++#include <bcm63xx_dev_pcmcia.h> ++#include <bcm63xx_dev_usb_ohci.h> ++#include <bcm63xx_dev_usb_ehci.h> ++#include <board_bcm963xx.h> ++ ++#define PFX	"board_livebox: " ++ ++static unsigned int mac_addr_used = 0; ++static struct board_info board; ++ ++/* ++ * known 6348 boards ++ */ ++#ifdef CONFIG_BCM63XX_CPU_6348 ++static struct board_info __initdata board_livebox = { ++	.name				= "Livebox", ++	.expected_cpu_id		= 0x6348, ++ ++	.has_uart0			= 1, ++	.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, ++}; ++#endif ++ ++/* ++ * all boards ++ */ ++static const struct board_info __initdata *bcm963xx_boards[] = { ++#ifdef CONFIG_BCM63XX_CPU_6348 ++	&board_livebox ++#endif ++}; ++ ++/* ++ * early init callback ++ */ ++void __init board_prom_init(void) ++{ ++	u32 val; ++ ++	/* read base address of boot chip select (0) */ ++	val = bcm_mpi_readl(MPI_CSBASE_REG(0)); ++	val &= MPI_CSBASE_BASE_MASK; ++ ++	/* assume board is a Livebox */ ++	memcpy(&board, bcm963xx_boards[0], sizeof(board)); ++ ++	/* 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; ++ ++	if (board.has_pci) { ++		bcm63xx_pci_enabled = 1; ++		if (BCMCPU_IS_6348()) ++			val |= GPIO_MODE_6348_G2_PCI; ++	} ++ ++	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 default_mac[ETH_ALEN] = {0x00, 0x07, 0x3A, 0x00, 0x00, 0x00}; ++	u8 *p; ++	int count; ++ ++	memcpy(mac, default_mac, 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), ++}; ++ ++ ++/* ++ * third stage init callback, register all board devices. ++ */ ++int __init board_register_devices(void) ++{ ++	u32 val; ++ ++	if (board.has_uart0) ++		bcm63xx_uart_register(0); ++ ++	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(); ++ ++ ++	/* read base address of boot chip select (0) */ ++	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); ++ ++	return 0; ++} ++ | 
