/branches/18.06.1/target/linux/brcm63xx/patches-4.9/207-MIPS-BCM63XX-move-device-registration-code-into-its-.patch |
@@ -0,0 +1,484 @@ |
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 */ |