mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-29 10:08:59 +00:00
e7bfda2c24
This change makes the names of Broadcom targets consistent by using the common notation based on SoC/CPU ID (which is used internally anyway), bcmXXXX instead of brcmXXXX. This is even used for target TITLE in make menuconfig already, only the short target name used brcm so far. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
485 lines
12 KiB
Diff
485 lines
12 KiB
Diff
From 5a50cb0d53344a2429831b00925d6183d4d332e1 Mon Sep 17 00:00:00 2001
|
|
From: Jonas Gorski <jogo@openwrt.org>
|
|
Date: Sun, 9 Mar 2014 03:54:05 +0100
|
|
Subject: [PATCH 40/44] MIPS: BCM63XX: move device registration code into its
|
|
own file
|
|
|
|
Move device registration code into its own file to allow sharing it
|
|
between board implementations.
|
|
|
|
Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|
---
|
|
arch/mips/bcm63xx/boards/Makefile | 1 +
|
|
arch/mips/bcm63xx/boards/board_bcm963xx.c | 188 +-------------------------
|
|
arch/mips/bcm63xx/boards/board_common.c | 215 ++++++++++++++++++++++++++++++
|
|
arch/mips/bcm63xx/boards/board_common.h | 8 ++
|
|
4 files changed, 223 insertions(+), 183 deletions(-)
|
|
create mode 100644 arch/mips/bcm63xx/boards/board_common.c
|
|
create mode 100644 arch/mips/bcm63xx/boards/board_common.h
|
|
|
|
--- a/arch/mips/bcm63xx/boards/Makefile
|
|
+++ b/arch/mips/bcm63xx/boards/Makefile
|
|
@@ -1 +1,2 @@
|
|
+obj-y += board_common.o
|
|
obj-$(CONFIG_BOARD_BCM963XX) += board_bcm963xx.o
|
|
--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
|
|
+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
|
|
@@ -12,33 +12,21 @@
|
|
#include <linux/init.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/string.h>
|
|
-#include <linux/platform_device.h>
|
|
-#include <linux/ssb/ssb.h>
|
|
#include <asm/addrspace.h>
|
|
#include <bcm63xx_board.h>
|
|
#include <bcm63xx_cpu.h>
|
|
-#include <bcm63xx_dev_uart.h>
|
|
#include <bcm63xx_regs.h>
|
|
#include <bcm63xx_io.h>
|
|
#include <bcm63xx_nvram.h>
|
|
-#include <bcm63xx_dev_pci.h>
|
|
-#include <bcm63xx_dev_enet.h>
|
|
-#include <bcm63xx_dev_flash.h>
|
|
-#include <bcm63xx_dev_hsspi.h>
|
|
-#include <bcm63xx_dev_pcmcia.h>
|
|
-#include <bcm63xx_dev_spi.h>
|
|
-#include <bcm63xx_dev_usb_ehci.h>
|
|
-#include <bcm63xx_dev_usb_ohci.h>
|
|
-#include <bcm63xx_dev_usb_usbd.h>
|
|
#include <board_bcm963xx.h>
|
|
|
|
+#include "board_common.h"
|
|
+
|
|
#include <uapi/linux/bcm933xx_hcs.h>
|
|
|
|
|
|
#define HCS_OFFSET_128K 0x20000
|
|
|
|
-static struct board_info board;
|
|
-
|
|
/*
|
|
* known 3368 boards
|
|
*/
|
|
@@ -695,52 +683,6 @@ static const struct board_info __initcon
|
|
};
|
|
|
|
/*
|
|
- * Register a sane SPROMv2 to make the on-board
|
|
- * bcm4318 WLAN work
|
|
- */
|
|
-#ifdef CONFIG_SSB_PCIHOST
|
|
-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,
|
|
-};
|
|
-
|
|
-int bcm63xx_get_fallback_sprom(struct ssb_bus *bus, struct ssb_sprom *out)
|
|
-{
|
|
- if (bus->bustype == SSB_BUSTYPE_PCI) {
|
|
- memcpy(out, &bcm63xx_sprom, sizeof(struct ssb_sprom));
|
|
- return 0;
|
|
- } else {
|
|
- pr_err("unable to fill SPROM for given bustype\n");
|
|
- return -EINVAL;
|
|
- }
|
|
-}
|
|
-#endif
|
|
-
|
|
-/*
|
|
- * return board name for /proc/cpuinfo
|
|
- */
|
|
-const char *board_get_name(void)
|
|
-{
|
|
- return board.name;
|
|
-}
|
|
-
|
|
-/*
|
|
* early init callback, read nvram data from flash and checksum it
|
|
*/
|
|
void __init board_prom_init(void)
|
|
@@ -785,137 +727,15 @@ void __init board_prom_init(void)
|
|
if (strncmp(board_name, bcm963xx_boards[i]->name, 16))
|
|
continue;
|
|
/* copy, board desc array is marked initdata */
|
|
- memcpy(&board, bcm963xx_boards[i], sizeof(board));
|
|
+ board_early_setup(bcm963xx_boards[i]);
|
|
break;
|
|
}
|
|
|
|
- /* bail out if board is not found, will complain later */
|
|
- if (!board.name[0]) {
|
|
+ /* warn if board is not found, will complain later */
|
|
+ if (i == ARRAY_SIZE(bcm963xx_boards)) {
|
|
char name[17];
|
|
memcpy(name, board_name, 16);
|
|
name[16] = 0;
|
|
pr_err("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");
|
|
- pr_info("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");
|
|
-}
|
|
-
|
|
-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,
|
|
-};
|
|
-
|
|
-/*
|
|
- * third stage init callback, register all board devices.
|
|
- */
|
|
-int __init board_register_devices(void)
|
|
-{
|
|
- if (board.has_uart0)
|
|
- bcm63xx_uart_register(0);
|
|
-
|
|
- if (board.has_uart1)
|
|
- bcm63xx_uart_register(1);
|
|
-
|
|
- if (board.has_pccard)
|
|
- bcm63xx_pcmcia_register();
|
|
-
|
|
- if (board.has_enet0 &&
|
|
- !bcm63xx_nvram_get_mac_address(board.enet0.mac_addr))
|
|
- bcm63xx_enet_register(0, &board.enet0);
|
|
-
|
|
- if (board.has_enet1 &&
|
|
- !bcm63xx_nvram_get_mac_address(board.enet1.mac_addr))
|
|
- bcm63xx_enet_register(1, &board.enet1);
|
|
-
|
|
- if (board.has_enetsw &&
|
|
- !bcm63xx_nvram_get_mac_address(board.enetsw.mac_addr))
|
|
- bcm63xx_enetsw_register(&board.enetsw);
|
|
-
|
|
- if (board.has_usbd)
|
|
- bcm63xx_usbd_register(&board.usbd);
|
|
-
|
|
- if (board.has_ehci0)
|
|
- bcm63xx_ehci_register();
|
|
-
|
|
- if (board.has_ohci0)
|
|
- bcm63xx_ohci_register();
|
|
-
|
|
- /* Generate MAC address for WLAN and register our SPROM,
|
|
- * do this after registering enet devices
|
|
- */
|
|
-#ifdef CONFIG_SSB_PCIHOST
|
|
- if (!bcm63xx_nvram_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_register_fallback_sprom(
|
|
- &bcm63xx_get_fallback_sprom) < 0)
|
|
- pr_err("failed to register fallback SPROM\n");
|
|
- }
|
|
-#endif
|
|
-
|
|
- bcm63xx_spi_register();
|
|
-
|
|
- bcm63xx_hsspi_register();
|
|
-
|
|
- bcm63xx_flash_register();
|
|
-
|
|
- bcm63xx_led_data.num_leds = ARRAY_SIZE(board.leds);
|
|
- bcm63xx_led_data.leds = board.leds;
|
|
-
|
|
- platform_device_register(&bcm63xx_gpio_leds);
|
|
-
|
|
- if (board.ephy_reset_gpio && board.ephy_reset_gpio_flags)
|
|
- gpio_request_one(board.ephy_reset_gpio,
|
|
- board.ephy_reset_gpio_flags, "ephy-reset");
|
|
-
|
|
- return 0;
|
|
}
|
|
--- /dev/null
|
|
+++ b/arch/mips/bcm63xx/boards/board_common.c
|
|
@@ -0,0 +1,214 @@
|
|
+/*
|
|
+ * 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 <mbizon@freebox.fr>
|
|
+ * 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/ssb/ssb.h>
|
|
+#include <asm/addrspace.h>
|
|
+#include <bcm63xx_board.h>
|
|
+#include <bcm63xx_cpu.h>
|
|
+#include <bcm63xx_dev_uart.h>
|
|
+#include <bcm63xx_regs.h>
|
|
+#include <bcm63xx_io.h>
|
|
+#include <bcm63xx_nvram.h>
|
|
+#include <bcm63xx_gpio.h>
|
|
+#include <bcm63xx_dev_pci.h>
|
|
+#include <bcm63xx_dev_enet.h>
|
|
+#include <bcm63xx_dev_flash.h>
|
|
+#include <bcm63xx_dev_hsspi.h>
|
|
+#include <bcm63xx_dev_pcmcia.h>
|
|
+#include <bcm63xx_dev_spi.h>
|
|
+#include <bcm63xx_dev_usb_ehci.h>
|
|
+#include <bcm63xx_dev_usb_ohci.h>
|
|
+#include <bcm63xx_dev_usb_usbd.h>
|
|
+#include <board_bcm963xx.h>
|
|
+
|
|
+#define PFX "board: "
|
|
+
|
|
+static struct board_info board;
|
|
+
|
|
+/*
|
|
+ * Register a sane SPROMv2 to make the on-board
|
|
+ * bcm4318 WLAN work
|
|
+ */
|
|
+#ifdef CONFIG_SSB_PCIHOST
|
|
+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,
|
|
+};
|
|
+
|
|
+int bcm63xx_get_fallback_sprom(struct ssb_bus *bus, struct ssb_sprom *out)
|
|
+{
|
|
+ if (bus->bustype == SSB_BUSTYPE_PCI) {
|
|
+ memcpy(out, &bcm63xx_sprom, sizeof(struct ssb_sprom));
|
|
+ return 0;
|
|
+ } else {
|
|
+ printk(KERN_ERR PFX "unable to fill SPROM for given bustype.\n");
|
|
+ return -EINVAL;
|
|
+ }
|
|
+}
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * return board name for /proc/cpuinfo
|
|
+ */
|
|
+const char *board_get_name(void)
|
|
+{
|
|
+ return board.name;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * setup board for device registration
|
|
+ */
|
|
+void __init board_early_setup(const struct board_info *target)
|
|
+{
|
|
+ u32 val;
|
|
+
|
|
+ memcpy(&board, target, 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;
|
|
+
|
|
+#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");
|
|
+}
|
|
+
|
|
+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,
|
|
+};
|
|
+
|
|
+/*
|
|
+ * third stage init callback, register all board devices.
|
|
+ */
|
|
+int __init board_register_devices(void)
|
|
+{
|
|
+ if (board.has_uart0)
|
|
+ bcm63xx_uart_register(0);
|
|
+
|
|
+ if (board.has_uart1)
|
|
+ bcm63xx_uart_register(1);
|
|
+
|
|
+ if (board.has_pccard)
|
|
+ bcm63xx_pcmcia_register();
|
|
+
|
|
+ if (board.has_enet0 &&
|
|
+ !bcm63xx_nvram_get_mac_address(board.enet0.mac_addr))
|
|
+ bcm63xx_enet_register(0, &board.enet0);
|
|
+
|
|
+ if (board.has_enet1 &&
|
|
+ !bcm63xx_nvram_get_mac_address(board.enet1.mac_addr))
|
|
+ bcm63xx_enet_register(1, &board.enet1);
|
|
+
|
|
+ if (board.has_enetsw &&
|
|
+ !bcm63xx_nvram_get_mac_address(board.enetsw.mac_addr))
|
|
+ bcm63xx_enetsw_register(&board.enetsw);
|
|
+
|
|
+ if (board.has_usbd)
|
|
+ bcm63xx_usbd_register(&board.usbd);
|
|
+
|
|
+ if (board.has_ehci0)
|
|
+ bcm63xx_ehci_register();
|
|
+
|
|
+ if (board.has_ohci0)
|
|
+ bcm63xx_ohci_register();
|
|
+
|
|
+ /* Generate MAC address for WLAN and register our SPROM,
|
|
+ * do this after registering enet devices
|
|
+ */
|
|
+#ifdef CONFIG_SSB_PCIHOST
|
|
+ if (!bcm63xx_nvram_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_register_fallback_sprom(
|
|
+ &bcm63xx_get_fallback_sprom) < 0)
|
|
+ pr_err(PFX "failed to register fallback SPROM\n");
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ bcm63xx_spi_register();
|
|
+
|
|
+ bcm63xx_hsspi_register();
|
|
+
|
|
+ bcm63xx_flash_register();
|
|
+
|
|
+ bcm63xx_led_data.num_leds = ARRAY_SIZE(board.leds);
|
|
+ bcm63xx_led_data.leds = board.leds;
|
|
+
|
|
+ platform_device_register(&bcm63xx_gpio_leds);
|
|
+
|
|
+ if (board.ephy_reset_gpio && board.ephy_reset_gpio_flags)
|
|
+ gpio_request_one(board.ephy_reset_gpio,
|
|
+ board.ephy_reset_gpio_flags, "ephy-reset");
|
|
+
|
|
+ return 0;
|
|
+}
|
|
--- /dev/null
|
|
+++ b/arch/mips/bcm63xx/boards/board_common.h
|
|
@@ -0,0 +1,8 @@
|
|
+#ifndef __BOARD_COMMON_H
|
|
+#define __BOARD_COMMON_H
|
|
+
|
|
+#include <board_bcm963xx.h>
|
|
+
|
|
+void board_early_setup(const struct board_info *board);
|
|
+
|
|
+#endif /* __BOARD_COMMON_H */
|