1 From 7e6b22225e16fbb22dbf7f2113d8c6d65333818c Mon Sep 17 00:00:00 2001
2 From: Jonas Gorski <jogo@openwrt.org>
3 Date: Sun, 9 Mar 2014 04:55:52 +0100
4 Subject: [PATCH 44/44] MIPS: BCM63XX: add inventel Livebox support
7 arch/mips/bcm63xx/boards/Kconfig | 6 +
8 arch/mips/bcm63xx/boards/Makefile | 1 +
9 arch/mips/bcm63xx/boards/board_common.c | 2 +-
10 arch/mips/bcm63xx/boards/board_common.h | 6 +
11 arch/mips/bcm63xx/boards/board_livebox.c | 193 +++++++++++++++++++++++++++++++
12 5 files changed, 207 insertions(+), 1 deletion(-)
13 create mode 100644 arch/mips/bcm63xx/boards/board_livebox.c
15 --- a/arch/mips/bcm63xx/boards/Kconfig
16 +++ b/arch/mips/bcm63xx/boards/Kconfig
17 @@ -7,4 +7,10 @@ config BOARD_BCM963XX
22 + bool "Inventel Livebox(es) boards"
25 + Inventel Livebox boards using the RedBoot bootloader.
28 --- a/arch/mips/bcm63xx/boards/Makefile
29 +++ b/arch/mips/bcm63xx/boards/Makefile
31 obj-y += board_common.o
32 obj-$(CONFIG_BOARD_BCM963XX) += board_bcm963xx.o
33 +obj-$(CONFIG_BOARD_LIVEBOX) += board_livebox.o
34 --- a/arch/mips/bcm63xx/boards/board_common.c
35 +++ b/arch/mips/bcm63xx/boards/board_common.c
36 @@ -96,7 +96,7 @@ void __init board_prom_init(void)
37 if (fw_arg3 == CFE_EPTSEAL)
38 board_bcm963xx_init();
40 - panic("unsupported bootloader detected");
41 + board_livebox_init();
44 static int (*board_get_mac_address)(u8 mac[ETH_ALEN]);
45 --- a/arch/mips/bcm63xx/boards/board_common.h
46 +++ b/arch/mips/bcm63xx/boards/board_common.h
47 @@ -12,4 +12,10 @@ void board_bcm963xx_init(void);
48 static inline void board_bcm963xx_init(void) { }
51 +#if defined(CONFIG_BOARD_LIVEBOX)
52 +void board_livebox_init(void);
54 +static inline void board_livebox_init(void) { }
57 #endif /* __BOARD_COMMON_H */
59 +++ b/arch/mips/bcm63xx/boards/board_livebox.c
62 + * This file is subject to the terms and conditions of the GNU General Public
63 + * License. See the file "COPYING" in the main directory of this archive
66 + * Copyright (C) 2008 Florian Fainelli <florian@openwrt.org>
69 +#include <linux/init.h>
70 +#include <linux/kernel.h>
71 +#include <linux/string.h>
72 +#include <linux/input.h>
73 +#include <asm/addrspace.h>
74 +#include <bcm63xx_board.h>
75 +#include <bcm63xx_cpu.h>
76 +#include <bcm63xx_regs.h>
77 +#include <bcm63xx_io.h>
78 +#include <bcm63xx_dev_flash.h>
79 +#include <board_bcm963xx.h>
81 +#include "board_common.h"
83 +#define PFX "board_livebox: "
85 +#define LIVEBOX_KEYS_POLL_INTERVAL 20
86 +#define LIVEBOX_KEYS_DEBOUNCE_INTERVAL (LIVEBOX_KEYS_POLL_INTERVAL * 3)
88 +static unsigned int mac_addr_used = 0;
93 +#ifdef CONFIG_BCM63XX_CPU_6348
94 +static struct board_info __initdata board_livebox_blue5g = {
95 + .name = "Livebox-blue-5g",
96 + .expected_cpu_id = 0x6348,
105 + .use_internal_phy = 1,
113 + .ephy_reset_gpio = 6,
114 + .ephy_reset_gpio_flags = GPIOF_INIT_HIGH,
119 + .has_dsp = 0, /*TODO some Liveboxes have dsp*/
129 + .name = "Livebox-blue-5g:red:adsl-fail",
132 + .default_trigger = "default-on",
135 + .name = "Livebox-blue-5g:red:adsl",
139 + .name = "Livebox-blue-5g:red:traffic",
143 + .name = "Livebox-blue-5g:red:phone",
147 + .name = "Livebox-blue-5g:red:wifi",
159 + .debounce_interval = LIVEBOX_KEYS_DEBOUNCE_INTERVAL,
167 + .debounce_interval = LIVEBOX_KEYS_DEBOUNCE_INTERVAL,
172 + .ephy_reset_gpio = 6,
173 + .ephy_reset_gpio_flags = GPIOF_INIT_HIGH,
180 +static const struct board_info __initdata *bcm963xx_boards[] = {
181 +#ifdef CONFIG_BCM63XX_CPU_6348
182 + &board_livebox_blue5g
187 + * register & return a new board mac address
189 +static int livebox_get_mac_address(u8 *mac)
194 + memcpy(mac, (u8 *)0xBEBFF377, ETH_ALEN);
196 + p = mac + ETH_ALEN - 1;
197 + count = mac_addr_used;
205 + } while (p != mac);
209 + printk(KERN_ERR PFX "unable to fetch mac address\n");
218 + * early init callback
220 +#define LIVEBOX_GPIO_DETECT_MASK 0x000000ff
221 +#define LIVEBOX_BOOT_ADDR 0x1e400000
223 +#define LIVEBOX_HW_BLUE5G_9 0x90
225 +void __init board_livebox_init(void)
229 + const struct board_info *board;
231 + /* Get hardware version */
232 + val = bcm_gpio_readl(GPIO_CTL_LO_REG);
233 + val &= ~LIVEBOX_GPIO_DETECT_MASK;
234 + bcm_gpio_writel(val, GPIO_CTL_LO_REG);
236 + hw_version = bcm_gpio_readl(GPIO_DATA_LO_REG) & LIVEBOX_GPIO_DETECT_MASK;
237 + switch (hw_version) {
238 + case LIVEBOX_HW_BLUE5G_9:
239 + printk(KERN_INFO PFX "Livebox BLUE5G.9\n");
240 + board = bcm963xx_boards[0];
243 + printk(KERN_INFO PFX "Unknown livebox version: %02x\n", hw_version);
244 + /* use default livebox configuration */
245 + board = bcm963xx_boards[0];
249 + /* use default livebox configuration */
250 + board_early_setup(board, livebox_get_mac_address);
252 + /* read base address of boot chip select (0) */
253 + val = bcm_mpi_readl(MPI_CSBASE_REG(0));
254 + val &= MPI_CSBASE_BASE_MASK;
255 + if (val != LIVEBOX_BOOT_ADDR) {
256 + printk(KERN_NOTICE PFX "flash address is: 0x%08x, forcing to: 0x%08x\n",
257 + val, LIVEBOX_BOOT_ADDR);
258 + bcm63xx_flash_force_phys_base_address(LIVEBOX_BOOT_ADDR, 0x1ebfffff);