bool "Support mx35pdk"
        select CPU_ARM1136
 
-config TARGET_RPI
-       bool "Support rpi"
-       select CPU_ARM1176
-
-config TARGET_RPI_2
-       bool "Support rpi_2"
-       select CPU_V7
+config ARCH_BCM283X
+       bool "Broadcom BCM283X family"
 
 config TARGET_INTEGRATORAP_CM946ES
        bool "Support integratorap_cm946es"
 
 source "arch/arm/mach-at91/Kconfig"
 
-source "arch/arm/mach-davinci/Kconfig"
+source "arch/arm/mach-bcm283x/Kconfig"
 
-source "arch/arm/cpu/arm1176/bcm2835/Kconfig"
+source "arch/arm/mach-davinci/Kconfig"
 
 source "arch/arm/cpu/armv7/exynos/Kconfig"
 
 source "board/phytec/pcm051/Kconfig"
 source "board/ppcag/bg0900/Kconfig"
 source "board/pxa255_idp/Kconfig"
-source "board/raspberrypi/rpi/Kconfig"
-source "board/raspberrypi/rpi_2/Kconfig"
 source "board/samsung/smdk2410/Kconfig"
 source "board/sandisk/sansa_fuze_plus/Kconfig"
 source "board/scb9328/Kconfig"
 
 # Machine directory name.  This list is sorted alphanumerically
 # by CONFIG_* macro name.
 machine-$(CONFIG_ARCH_AT91)            += at91
+machine-$(CONFIG_ARCH_BCM283X)         += bcm283x
 machine-$(CONFIG_ARCH_DAVINCI)         += davinci
 machine-$(CONFIG_ARCH_HIGHBANK)                += highbank
 machine-$(CONFIG_ARCH_KEYSTONE)                += keystone
 
 
 extra-y        = start.o
 obj-y  = cpu.o
-
-obj-$(CONFIG_BCM2835) += bcm2835/
 
+++ /dev/null
-if TARGET_RPI || TARGET_RPI_2
-
-config DM
-       default y
-
-config DM_SERIAL
-       default y
-
-config DM_GPIO
-       default y
-
-endif
 
+++ /dev/null
-#
-# (C) Copyright 2012 Stephen Warren
-#
-# SPDX-License-Identifier:     GPL-2.0
-#
-
-obj-y  := lowlevel_init.o
-obj-y  += init.o reset.o timer.o mbox.o
 
+++ /dev/null
-/*
- * (C) Copyright 2012 Stephen Warren
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <common.h>
-
-int arch_cpu_init(void)
-{
-       icache_enable();
-
-       return 0;
-}
 
+++ /dev/null
-/*
- * (C) Copyright 2012 Stephen Warren
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-.globl lowlevel_init
-lowlevel_init:
-       mov     pc, lr
 
+++ /dev/null
-/*
- * (C) Copyright 2012 Stephen Warren
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-#include <common.h>
-#include <asm/io.h>
-#include <asm/arch/mbox.h>
-
-#define TIMEOUT 1000 /* ms */
-
-int bcm2835_mbox_call_raw(u32 chan, u32 send, u32 *recv)
-{
-       struct bcm2835_mbox_regs *regs =
-               (struct bcm2835_mbox_regs *)BCM2835_MBOX_PHYSADDR;
-       ulong endtime = get_timer(0) + TIMEOUT;
-       u32 val;
-
-       debug("time: %lu timeout: %lu\n", get_timer(0), endtime);
-
-       if (send & BCM2835_CHAN_MASK) {
-               printf("mbox: Illegal mbox data 0x%08x\n", send);
-               return -1;
-       }
-
-       /* Drain any stale responses */
-
-       for (;;) {
-               val = readl(®s->status);
-               if (val & BCM2835_MBOX_STATUS_RD_EMPTY)
-                       break;
-               if (get_timer(0) >= endtime) {
-                       printf("mbox: Timeout draining stale responses\n");
-                       return -1;
-               }
-               val = readl(®s->read);
-       }
-
-       /* Wait for space to send */
-
-       for (;;) {
-               val = readl(®s->status);
-               if (!(val & BCM2835_MBOX_STATUS_WR_FULL))
-                       break;
-               if (get_timer(0) >= endtime) {
-                       printf("mbox: Timeout waiting for send space\n");
-                       return -1;
-               }
-       }
-
-       /* Send the request */
-
-       val = BCM2835_MBOX_PACK(chan, send);
-       debug("mbox: TX raw: 0x%08x\n", val);
-       writel(val, ®s->write);
-
-       /* Wait for the response */
-
-       for (;;) {
-               val = readl(®s->status);
-               if (!(val & BCM2835_MBOX_STATUS_RD_EMPTY))
-                       break;
-               if (get_timer(0) >= endtime) {
-                       printf("mbox: Timeout waiting for response\n");
-                       return -1;
-               }
-       }
-
-       /* Read the response */
-
-       val = readl(®s->read);
-       debug("mbox: RX raw: 0x%08x\n", val);
-
-       /* Validate the response */
-
-       if (BCM2835_MBOX_UNPACK_CHAN(val) != chan) {
-               printf("mbox: Response channel mismatch\n");
-               return -1;
-       }
-
-       *recv = BCM2835_MBOX_UNPACK_DATA(val);
-
-       return 0;
-}
-
-#ifdef DEBUG
-void dump_buf(struct bcm2835_mbox_hdr *buffer)
-{
-       u32 *p;
-       u32 words;
-       int i;
-
-       p = (u32 *)buffer;
-       words = buffer->buf_size / 4;
-       for (i = 0; i < words; i++)
-               printf("    0x%04x: 0x%08x\n", i * 4, p[i]);
-}
-#endif
-
-int bcm2835_mbox_call_prop(u32 chan, struct bcm2835_mbox_hdr *buffer)
-{
-       int ret;
-       u32 rbuffer;
-       struct bcm2835_mbox_tag_hdr *tag;
-       int tag_index;
-
-#ifdef DEBUG
-       printf("mbox: TX buffer\n");
-       dump_buf(buffer);
-#endif
-
-       ret = bcm2835_mbox_call_raw(chan, (u32)buffer, &rbuffer);
-       if (ret)
-               return ret;
-       if (rbuffer != (u32)buffer) {
-               printf("mbox: Response buffer mismatch\n");
-               return -1;
-       }
-
-#ifdef DEBUG
-       printf("mbox: RX buffer\n");
-       dump_buf(buffer);
-#endif
-
-       /* Validate overall response status */
-
-       if (buffer->code != BCM2835_MBOX_RESP_CODE_SUCCESS) {
-               printf("mbox: Header response code invalid\n");
-               return -1;
-       }
-
-       /* Validate each tag's response status */
-
-       tag = (void *)(buffer + 1);
-       tag_index = 0;
-       while (tag->tag) {
-               if (!(tag->val_len & BCM2835_MBOX_TAG_VAL_LEN_RESPONSE)) {
-                       printf("mbox: Tag %d missing val_len response bit\n",
-                               tag_index);
-                       return -1;
-               }
-               /*
-                * Clear the reponse bit so clients can just look right at the
-                * length field without extra processing
-                */
-               tag->val_len &= ~BCM2835_MBOX_TAG_VAL_LEN_RESPONSE;
-               tag = (void *)(((u8 *)tag) + sizeof(*tag) + tag->val_buf_size);
-               tag_index++;
-       }
-
-       return 0;
-}
 
+++ /dev/null
-/*
- * (C) Copyright 2012 Stephen Warren
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <common.h>
-#include <asm/io.h>
-#include <asm/arch/wdog.h>
-
-#define RESET_TIMEOUT 10
-
-void reset_cpu(ulong addr)
-{
-       struct bcm2835_wdog_regs *regs =
-               (struct bcm2835_wdog_regs *)BCM2835_WDOG_PHYSADDR;
-       uint32_t rstc;
-
-       rstc = readl(®s->rstc);
-       rstc &= ~BCM2835_WDOG_RSTC_WRCFG_MASK;
-       rstc |= BCM2835_WDOG_RSTC_WRCFG_FULL_RESET;
-
-       writel(BCM2835_WDOG_PASSWORD | RESET_TIMEOUT, ®s->wdog);
-       writel(BCM2835_WDOG_PASSWORD | rstc, ®s->rstc);
-}
 
+++ /dev/null
-/*
- * (C) Copyright 2012 Stephen Warren
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <common.h>
-#include <asm/io.h>
-#include <asm/arch/timer.h>
-
-ulong get_timer_us(ulong base)
-{
-       struct bcm2835_timer_regs *regs =
-               (struct bcm2835_timer_regs *)BCM2835_TIMER_PHYSADDR;
-
-       return readl(®s->clo) - base;
-}
-
-ulong get_timer(ulong base)
-{
-       ulong us = get_timer_us(0);
-       us /= (1000000 / CONFIG_SYS_HZ);
-       us -= base;
-       return us;
-}
-
-unsigned long long get_ticks(void)
-{
-       return get_timer(0);
-}
-
-ulong get_tbclk(void)
-{
-       return CONFIG_SYS_HZ;
-}
-
-void __udelay(unsigned long usec)
-{
-       ulong endtime;
-       signed long diff;
-
-       endtime = get_timer_us(0) + usec;
-
-       do {
-               ulong now = get_timer_us(0);
-               diff = endtime - now;
-       } while (diff >= 0);
-}
 
 
 obj-$(if $(filter am33xx,$(SOC)),y) += am33xx/
 obj-$(if $(filter armada-xp,$(SOC)),y) += armada-xp/
-obj-$(CONFIG_BCM2835) += bcm2835/
 obj-$(if $(filter bcm281xx,$(SOC)),y) += bcm281xx/
 obj-$(if $(filter bcmcygnus,$(SOC)),y) += bcmcygnus/
 obj-$(if $(filter bcmnsp,$(SOC)),y) += bcmnsp/
 
+++ /dev/null
-#
-# (C) Copyright 2012 Stephen Warren
-#
-# SPDX-License-Identifier:     GPL-2.0+
-#
-
-src_dir := ../../arm1176/bcm2835/
-
-obj-y  :=
-obj-y  += $(src_dir)/init.o
-obj-y  += $(src_dir)/reset.o
-obj-y  += $(src_dir)/timer.o
-obj-y  += $(src_dir)/mbox.o
 
--- /dev/null
+menu "Broadcom BCM283X family"
+       depends on ARCH_BCM283X
+
+choice
+       prompt "Broadcom BCM283X board select"
+
+config TARGET_RPI
+       bool "Raspberry Pi"
+       select CPU_ARM1176
+
+config TARGET_RPI_2
+       bool "Raspberry Pi 2"
+       select CPU_V7
+
+endchoice
+
+config DM
+       default y
+
+config DM_SERIAL
+       default y
+
+config DM_GPIO
+       default y
+
+config SYS_BOARD
+       default "rpi" if TARGET_RPI
+       default "rpi_2" if TARGET_RPI_2
+
+config SYS_VENDOR
+       default "raspberrypi"
+
+config SYS_SOC
+       default "bcm2835"
+
+config SYS_CONFIG_NAME
+       default "rpi" if TARGET_RPI
+       default "rpi_2" if TARGET_RPI_2
+
+endmenu
 
--- /dev/null
+#
+# (C) Copyright 2012 Stephen Warren
+#
+# SPDX-License-Identifier:     GPL-2.0
+#
+
+obj-$(CONFIG_TARGET_RPI) += lowlevel_init.o
+obj-y  += init.o reset.o timer.o mbox.o
 
--- /dev/null
+/*
+ * (C) Copyright 2012 Stephen Warren
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <common.h>
+
+int arch_cpu_init(void)
+{
+       icache_enable();
+
+       return 0;
+}
 
--- /dev/null
+/*
+ * (C) Copyright 2012 Stephen Warren
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+.globl lowlevel_init
+lowlevel_init:
+       mov     pc, lr
 
--- /dev/null
+/*
+ * (C) Copyright 2012 Stephen Warren
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/mbox.h>
+
+#define TIMEOUT 1000 /* ms */
+
+int bcm2835_mbox_call_raw(u32 chan, u32 send, u32 *recv)
+{
+       struct bcm2835_mbox_regs *regs =
+               (struct bcm2835_mbox_regs *)BCM2835_MBOX_PHYSADDR;
+       ulong endtime = get_timer(0) + TIMEOUT;
+       u32 val;
+
+       debug("time: %lu timeout: %lu\n", get_timer(0), endtime);
+
+       if (send & BCM2835_CHAN_MASK) {
+               printf("mbox: Illegal mbox data 0x%08x\n", send);
+               return -1;
+       }
+
+       /* Drain any stale responses */
+
+       for (;;) {
+               val = readl(®s->status);
+               if (val & BCM2835_MBOX_STATUS_RD_EMPTY)
+                       break;
+               if (get_timer(0) >= endtime) {
+                       printf("mbox: Timeout draining stale responses\n");
+                       return -1;
+               }
+               val = readl(®s->read);
+       }
+
+       /* Wait for space to send */
+
+       for (;;) {
+               val = readl(®s->status);
+               if (!(val & BCM2835_MBOX_STATUS_WR_FULL))
+                       break;
+               if (get_timer(0) >= endtime) {
+                       printf("mbox: Timeout waiting for send space\n");
+                       return -1;
+               }
+       }
+
+       /* Send the request */
+
+       val = BCM2835_MBOX_PACK(chan, send);
+       debug("mbox: TX raw: 0x%08x\n", val);
+       writel(val, ®s->write);
+
+       /* Wait for the response */
+
+       for (;;) {
+               val = readl(®s->status);
+               if (!(val & BCM2835_MBOX_STATUS_RD_EMPTY))
+                       break;
+               if (get_timer(0) >= endtime) {
+                       printf("mbox: Timeout waiting for response\n");
+                       return -1;
+               }
+       }
+
+       /* Read the response */
+
+       val = readl(®s->read);
+       debug("mbox: RX raw: 0x%08x\n", val);
+
+       /* Validate the response */
+
+       if (BCM2835_MBOX_UNPACK_CHAN(val) != chan) {
+               printf("mbox: Response channel mismatch\n");
+               return -1;
+       }
+
+       *recv = BCM2835_MBOX_UNPACK_DATA(val);
+
+       return 0;
+}
+
+#ifdef DEBUG
+void dump_buf(struct bcm2835_mbox_hdr *buffer)
+{
+       u32 *p;
+       u32 words;
+       int i;
+
+       p = (u32 *)buffer;
+       words = buffer->buf_size / 4;
+       for (i = 0; i < words; i++)
+               printf("    0x%04x: 0x%08x\n", i * 4, p[i]);
+}
+#endif
+
+int bcm2835_mbox_call_prop(u32 chan, struct bcm2835_mbox_hdr *buffer)
+{
+       int ret;
+       u32 rbuffer;
+       struct bcm2835_mbox_tag_hdr *tag;
+       int tag_index;
+
+#ifdef DEBUG
+       printf("mbox: TX buffer\n");
+       dump_buf(buffer);
+#endif
+
+       ret = bcm2835_mbox_call_raw(chan, (u32)buffer, &rbuffer);
+       if (ret)
+               return ret;
+       if (rbuffer != (u32)buffer) {
+               printf("mbox: Response buffer mismatch\n");
+               return -1;
+       }
+
+#ifdef DEBUG
+       printf("mbox: RX buffer\n");
+       dump_buf(buffer);
+#endif
+
+       /* Validate overall response status */
+
+       if (buffer->code != BCM2835_MBOX_RESP_CODE_SUCCESS) {
+               printf("mbox: Header response code invalid\n");
+               return -1;
+       }
+
+       /* Validate each tag's response status */
+
+       tag = (void *)(buffer + 1);
+       tag_index = 0;
+       while (tag->tag) {
+               if (!(tag->val_len & BCM2835_MBOX_TAG_VAL_LEN_RESPONSE)) {
+                       printf("mbox: Tag %d missing val_len response bit\n",
+                               tag_index);
+                       return -1;
+               }
+               /*
+                * Clear the reponse bit so clients can just look right at the
+                * length field without extra processing
+                */
+               tag->val_len &= ~BCM2835_MBOX_TAG_VAL_LEN_RESPONSE;
+               tag = (void *)(((u8 *)tag) + sizeof(*tag) + tag->val_buf_size);
+               tag_index++;
+       }
+
+       return 0;
+}
 
--- /dev/null
+/*
+ * (C) Copyright 2012 Stephen Warren
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/wdog.h>
+
+#define RESET_TIMEOUT 10
+
+void reset_cpu(ulong addr)
+{
+       struct bcm2835_wdog_regs *regs =
+               (struct bcm2835_wdog_regs *)BCM2835_WDOG_PHYSADDR;
+       uint32_t rstc;
+
+       rstc = readl(®s->rstc);
+       rstc &= ~BCM2835_WDOG_RSTC_WRCFG_MASK;
+       rstc |= BCM2835_WDOG_RSTC_WRCFG_FULL_RESET;
+
+       writel(BCM2835_WDOG_PASSWORD | RESET_TIMEOUT, ®s->wdog);
+       writel(BCM2835_WDOG_PASSWORD | rstc, ®s->rstc);
+}
 
--- /dev/null
+/*
+ * (C) Copyright 2012 Stephen Warren
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/timer.h>
+
+ulong get_timer_us(ulong base)
+{
+       struct bcm2835_timer_regs *regs =
+               (struct bcm2835_timer_regs *)BCM2835_TIMER_PHYSADDR;
+
+       return readl(®s->clo) - base;
+}
+
+ulong get_timer(ulong base)
+{
+       ulong us = get_timer_us(0);
+       us /= (1000000 / CONFIG_SYS_HZ);
+       us -= base;
+       return us;
+}
+
+unsigned long long get_ticks(void)
+{
+       return get_timer(0);
+}
+
+ulong get_tbclk(void)
+{
+       return CONFIG_SYS_HZ;
+}
+
+void __udelay(unsigned long usec)
+{
+       ulong endtime;
+       signed long diff;
+
+       endtime = get_timer_us(0) + usec;
+
+       do {
+               ulong now = get_timer_us(0);
+               diff = endtime - now;
+       } while (diff >= 0);
+}
 
+++ /dev/null
-if TARGET_RPI
-
-config SYS_BOARD
-       default "rpi"
-
-config SYS_VENDOR
-       default "raspberrypi"
-
-config SYS_SOC
-       default "bcm2835"
-
-config SYS_CONFIG_NAME
-       default "rpi"
-
-endif
 
+++ /dev/null
-if TARGET_RPI_2
-
-config SYS_BOARD
-       default "rpi_2"
-
-config SYS_VENDOR
-       default "raspberrypi"
-
-config SYS_SOC
-       default "bcm2835"
-
-config SYS_CONFIG_NAME
-       default "rpi_2"
-
-endif
 
 CONFIG_ARM=y
+CONFIG_ARCH_BCM283X=y
 CONFIG_TARGET_RPI_2=y
 
 CONFIG_ARM=y
+CONFIG_ARCH_BCM283X=y
 CONFIG_TARGET_RPI=y