aboutsummaryrefslogtreecommitdiff
path: root/sys/arm/broadcom
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arm/broadcom')
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_bsc.c8
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_common.c3
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_dma.c8
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_fb.c10
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_fbd.c12
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_gpio.c14
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_intr.c39
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_mbox.c16
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_sdhci.c18
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_spi.c8
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_vcbus.h15
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_wdog.c30
-rw-r--r--sys/arm/broadcom/bcm2835/bcm283x_dwc_fdt.c8
-rw-r--r--sys/arm/broadcom/bcm2835/files.bcm283x2
14 files changed, 153 insertions, 38 deletions
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_bsc.c b/sys/arm/broadcom/bcm2835/bcm2835_bsc.c
index debbf82cb2f1..706226999fde 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_bsc.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_bsc.c
@@ -52,6 +52,12 @@ __FBSDID("$FreeBSD$");
#include "iicbus_if.h"
+static struct ofw_compat_data compat_data[] = {
+ {"broadcom,bcm2835-bsc", 1},
+ {"brcm,bcm2708-i2c", 1},
+ {NULL, 0}
+};
+
static void bcm_bsc_intr(void *);
static int bcm_bsc_detach(device_t);
@@ -214,7 +220,7 @@ bcm_bsc_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-bsc"))
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
return (ENXIO);
device_set_desc(dev, "BCM2708/2835 BSC controller");
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_common.c b/sys/arm/broadcom/bcm2835/bcm2835_common.c
index 6f136f81da99..7d2ef761fa4a 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_common.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_common.c
@@ -52,7 +52,8 @@ fdt_intc_decode_ic(phandle_t node, pcell_t *intr, int *interrupt, int *trig,
int *pol)
{
- if (fdt_is_compatible(node, "broadcom,bcm2835-armctrl-ic")) {
+ if (fdt_is_compatible(node, "broadcom,bcm2835-armctrl-ic") ||
+ fdt_is_compatible(node, "brcm,bcm2836-armctrl-ic")) {
*interrupt = fdt32_to_cpu(intr[0]);
*trig = INTR_TRIGGER_CONFORM;
*pol = INTR_POLARITY_CONFORM;
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_dma.c b/sys/arm/broadcom/bcm2835/bcm2835_dma.c
index ace336cd5a00..3b6c03201fa1 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_dma.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_dma.c
@@ -152,6 +152,12 @@ struct bcm_dma_softc {
static struct bcm_dma_softc *bcm_dma_sc = NULL;
static uint32_t bcm_dma_channel_mask;
+static struct ofw_compat_data compat_data[] = {
+ {"broadcom,bcm2835-dma", 1},
+ {"brcm,bcm2835-dma", 1},
+ {NULL, 0}
+};
+
static void
bcm_dmamap_cb(void *arg, bus_dma_segment_t *segs,
int nseg, int err)
@@ -656,7 +662,7 @@ bcm_dma_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-dma"))
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
return (ENXIO);
device_set_desc(dev, "BCM2835 DMA Controller");
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_fb.c b/sys/arm/broadcom/bcm2835/bcm2835_fb.c
index cb0fc72ab0b6..58caac2cd884 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_fb.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_fb.c
@@ -111,6 +111,12 @@ struct bcmsc_softc {
static struct bcmsc_softc bcmsc;
+static struct ofw_compat_data compat_data[] = {
+ {"broadcom,bcm2835-fb", 1},
+ {"brcm,bcm2708-fb", 1},
+ {NULL, 0}
+};
+
static int bcm_fb_probe(device_t);
static int bcm_fb_attach(device_t);
static void bcmfb_update_margins(video_adapter_t *adp);
@@ -121,8 +127,9 @@ bcm_fb_probe(device_t dev)
{
int error;
- if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-fb"))
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
return (ENXIO);
+
device_set_desc(dev, "BCM2835 framebuffer device");
error = sc_probe_unit(device_get_unit(dev),
device_get_flags(dev) | SC_AUTODETECT_KBD);
@@ -196,6 +203,7 @@ static driver_t bcm_fb_driver = {
};
DRIVER_MODULE(bcm2835fb, ofwbus, bcm_fb_driver, bcm_fb_devclass, 0, 0);
+DRIVER_MODULE(bcm2835fb, simplebus, bcm_fb_driver, bcm_fb_devclass, 0, 0);
/*
* Video driver routines and glue.
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_fbd.c b/sys/arm/broadcom/bcm2835/bcm2835_fbd.c
index 1a7976275d22..04cc83a42c81 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_fbd.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_fbd.c
@@ -65,6 +65,12 @@ struct bcmsc_softc {
device_t dev;
};
+static struct ofw_compat_data compat_data[] = {
+ {"broadcom,bcm2835-fb", 1},
+ {"brcm,bcm2708-fb", 1},
+ {NULL, 0}
+};
+
static int bcm_fb_probe(device_t);
static int bcm_fb_attach(device_t);
@@ -113,8 +119,10 @@ bcm_fb_setup_fbd(struct bcmsc_softc *sc)
sc->info.fb_stride = fb.pitch;
sc->info.fb_width = fb.xres;
sc->info.fb_height = fb.yres;
+#ifdef VM_MEMATTR_WRITE_COMBINING
sc->info.fb_flags = FB_FLAG_MEMATTR;
sc->info.fb_memattr = VM_MEMATTR_WRITE_COMBINING;
+#endif
if (sc->fbswap) {
switch (sc->info.fb_bpp) {
@@ -191,7 +199,8 @@ bcm_fb_sysctl_init(struct bcmsc_softc *sc)
static int
bcm_fb_probe(device_t dev)
{
- if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-fb"))
+
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
return (ENXIO);
device_set_desc(dev, "BCM2835 VT framebuffer driver");
@@ -265,3 +274,4 @@ static driver_t bcm_fb_driver = {
};
DRIVER_MODULE(bcm2835fb, ofwbus, bcm_fb_driver, bcm_fb_devclass, 0, 0);
+DRIVER_MODULE(bcm2835fb, simplebus, bcm_fb_driver, bcm_fb_devclass, 0, 0);
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_gpio.c b/sys/arm/broadcom/bcm2835/bcm2835_gpio.c
index 0b59d5202b1f..ed3bbae998fe 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_gpio.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_gpio.c
@@ -82,8 +82,6 @@ static struct resource_spec bcm_gpio_res_spec[] = {
{ SYS_RES_MEMORY, 0, RF_ACTIVE },
{ SYS_RES_IRQ, 0, RF_ACTIVE }, /* bank 0 interrupt */
{ SYS_RES_IRQ, 1, RF_ACTIVE }, /* bank 1 interrupt */
- { SYS_RES_IRQ, 2, RF_ACTIVE }, /* bank 1 interrupt (mirrored) */
- { SYS_RES_IRQ, 3, RF_ACTIVE }, /* bank 0-1 interrupt (united) */
{ -1, 0, 0 }
};
@@ -159,6 +157,12 @@ enum bcm_gpio_pud {
#define BCM_GPIO_GPPUD(_bank) (0x94) /* Pin Pull up/down */
#define BCM_GPIO_GPPUDCLK(_bank) (0x98 + _bank * 4) /* Pin Pull up clock */
+static struct ofw_compat_data compat_data[] = {
+ {"broadcom,bcm2835-gpio", 1},
+ {"brcm,bcm2835-gpio", 1},
+ {NULL, 0}
+};
+
static struct bcm_gpio_softc *bcm_gpio_sc = NULL;
#ifdef INTRNG
@@ -672,11 +676,11 @@ bcm_gpio_get_reserved_pins(struct bcm_gpio_softc *sc)
phandle_t gpio, node, reserved;
ssize_t len;
- /* Get read-only pins. */
+ /* Get read-only pins if they're provided */
gpio = ofw_bus_get_node(sc->sc_dev);
if (bcm_gpio_get_ro_pins(sc, gpio, "broadcom,read-only",
"read-only") != 0)
- return (-1);
+ return (0);
/* Traverse the GPIO subnodes to find the reserved pins node. */
reserved = 0;
node = OF_child(gpio);
@@ -742,7 +746,7 @@ bcm_gpio_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-gpio"))
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
return (ENXIO);
device_set_desc(dev, "BCM2708/2835 GPIO controller");
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_intr.c b/sys/arm/broadcom/bcm2835/bcm2835_intr.c
index b6a74542bc68..9f7bd7f44d32 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_intr.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_intr.c
@@ -270,6 +270,7 @@ bcm_intc_map_intr(device_t dev, struct intr_map_data *data,
u_int irq;
struct intr_map_data_fdt *daf;
struct bcm_intc_softc *sc;
+ bool valid;
if (data->type != INTR_MAP_DATA_FDT)
return (ENOTSUP);
@@ -277,8 +278,36 @@ bcm_intc_map_intr(device_t dev, struct intr_map_data *data,
daf = (struct intr_map_data_fdt *)data;
if (daf->ncells == 1)
irq = daf->cells[0];
- else if (daf->ncells == 2)
- irq = daf->cells[0] * 32 + daf->cells[1];
+ else if (daf->ncells == 2) {
+ valid = true;
+ switch (daf->cells[0]) {
+ case 0:
+ irq = daf->cells[1];
+ if (irq >= BANK1_START)
+ valid = false;
+ break;
+ case 1:
+ irq = daf->cells[1] + BANK1_START;
+ if (irq > BANK1_END)
+ valid = false;
+ break;
+ case 2:
+ irq = daf->cells[1] + BANK2_START;
+ if (irq > BANK2_END)
+ valid = false;
+ break;
+ default:
+ valid = false;
+ break;
+ }
+
+ if (!valid) {
+ device_printf(dev,
+ "invalid IRQ config: bank=%d, irq=%d\n",
+ daf->cells[0], daf->cells[1]);
+ return (EINVAL);
+ }
+ }
else
return (EINVAL);
@@ -355,7 +384,8 @@ bcm_intc_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-armctrl-ic"))
+ if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-armctrl-ic") &&
+ !ofw_bus_is_compatible(dev, "brcm,bcm2836-armctrl-ic"))
return (ENXIO);
device_set_desc(dev, "BCM2835 Interrupt Controller");
return (BUS_PROBE_DEFAULT);
@@ -438,7 +468,8 @@ static driver_t bcm_intc_driver = {
static devclass_t bcm_intc_devclass;
-DRIVER_MODULE(intc, simplebus, bcm_intc_driver, bcm_intc_devclass, 0, 0);
+EARLY_DRIVER_MODULE(intc, simplebus, bcm_intc_driver, bcm_intc_devclass,
+ 0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LATE);
#ifndef INTRNG
int
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_mbox.c b/sys/arm/broadcom/bcm2835/bcm2835_mbox.c
index ce04596cb0ad..2fc0a9e70f08 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_mbox.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_mbox.c
@@ -92,6 +92,12 @@ struct bcm_mbox_softc {
#define mbox_write_4(sc, reg, val) \
bus_space_write_4((sc)->bst, (sc)->bsh, reg, val)
+static struct ofw_compat_data compat_data[] = {
+ {"broadcom,bcm2835-mbox", 1},
+ {"brcm,bcm2835-mbox", 1},
+ {NULL, 0}
+};
+
static int
bcm_mbox_read_msg(struct bcm_mbox_softc *sc, int *ochan)
{
@@ -138,12 +144,12 @@ bcm_mbox_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (ofw_bus_is_compatible(dev, "broadcom,bcm2835-mbox")) {
- device_set_desc(dev, "BCM2835 VideoCore Mailbox");
- return(BUS_PROBE_DEFAULT);
- }
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
+ return (ENXIO);
+
+ device_set_desc(dev, "BCM2835 VideoCore Mailbox");
- return (ENXIO);
+ return (BUS_PROBE_DEFAULT);
}
static int
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c b/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
index 700edcc7bc35..b74fefd958e1 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
@@ -71,6 +71,12 @@ __FBSDID("$FreeBSD$");
static int bcm2835_sdhci_hs = 1;
static int bcm2835_sdhci_pio_mode = 0;
+static struct ofw_compat_data compat_data[] = {
+ {"broadcom,bcm2835-sdhci", 1},
+ {"brcm,bcm2835-mmc", 1},
+ {NULL, 0}
+};
+
TUNABLE_INT("hw.bcm2835.sdhci.hs", &bcm2835_sdhci_hs);
TUNABLE_INT("hw.bcm2835.sdhci.pio_mode", &bcm2835_sdhci_pio_mode);
@@ -126,10 +132,11 @@ bcm_sdhci_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-sdhci"))
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
return (ENXIO);
device_set_desc(dev, "Broadcom 2708 SDHCI controller");
+
return (BUS_PROBE_DEFAULT);
}
@@ -239,8 +246,9 @@ bcm_sdhci_attach(device_t dev)
goto fail;
}
- sc->sc_sdhci_buffer_phys = BUS_SPACE_PHYSADDR(sc->sc_mem_res,
- SDHCI_BUFFER);
+ /* FIXME: Fix along with other BUS_SPACE_PHYSADDR instances */
+ sc->sc_sdhci_buffer_phys = rman_get_start(sc->sc_mem_res) +
+ SDHCI_BUFFER;
bus_generic_probe(dev);
bus_generic_attach(dev);
@@ -545,7 +553,7 @@ bcm_sdhci_read_dma(device_t dev, struct sdhci_slot *slot)
slot->curcmd->data->len - slot->offset);
KASSERT((left & 3) == 0,
- ("%s: len = %d, not word-aligned", __func__, left));
+ ("%s: len = %zu, not word-aligned", __func__, left));
if (bus_dmamap_load(sc->sc_dma_tag, sc->sc_dma_map,
(uint8_t *)slot->curcmd->data->data + slot->offset, left,
@@ -574,7 +582,7 @@ bcm_sdhci_write_dma(device_t dev, struct sdhci_slot *slot)
slot->curcmd->data->len - slot->offset);
KASSERT((left & 3) == 0,
- ("%s: len = %d, not word-aligned", __func__, left));
+ ("%s: len = %zu, not word-aligned", __func__, left));
if (bus_dmamap_load(sc->sc_dma_tag, sc->sc_dma_map,
(uint8_t *)slot->curcmd->data->data + slot->offset, left,
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_spi.c b/sys/arm/broadcom/bcm2835/bcm2835_spi.c
index 857e43dcd1e2..b30fac7819c9 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_spi.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_spi.c
@@ -56,6 +56,12 @@ __FBSDID("$FreeBSD$");
#include "spibus_if.h"
+static struct ofw_compat_data compat_data[] = {
+ {"broadcom,bcm2835-spi", 1},
+ {"brcm,bcm2835-spi", 1},
+ {NULL, 0}
+};
+
static void bcm_spi_intr(void *);
#ifdef BCM_SPI_DEBUG
@@ -231,7 +237,7 @@ bcm_spi_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-spi"))
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
return (ENXIO);
device_set_desc(dev, "BCM2708/2835 SPI controller");
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_vcbus.h b/sys/arm/broadcom/bcm2835/bcm2835_vcbus.h
index e1d44b31f76d..1b540d9be10f 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_vcbus.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_vcbus.h
@@ -33,16 +33,23 @@
#ifndef _BCM2835_VCBUS_H_
#define _BCM2835_VCBUS_H_
+/*
+ * ARM64 define its SOC options in opt_soc.h
+ */
+#if defined(__aarch64__)
+#include "opt_soc.h"
+#endif
+
#define BCM2835_VCBUS_SDRAM_CACHED 0x40000000
#define BCM2835_VCBUS_IO_BASE 0x7E000000
#define BCM2835_VCBUS_SDRAM_UNCACHED 0xC0000000
-#ifdef SOC_BCM2836
-#define BCM2835_ARM_IO_BASE 0x3f000000
-#define BCM2835_VCBUS_SDRAM_BASE BCM2835_VCBUS_SDRAM_UNCACHED
-#else
+#if defined(SOC_BCM2835)
#define BCM2835_ARM_IO_BASE 0x20000000
#define BCM2835_VCBUS_SDRAM_BASE BCM2835_VCBUS_SDRAM_CACHED
+#else
+#define BCM2835_ARM_IO_BASE 0x3f000000
+#define BCM2835_VCBUS_SDRAM_BASE BCM2835_VCBUS_SDRAM_UNCACHED
#endif
#define BCM2835_ARM_IO_SIZE 0x01000000
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_wdog.c b/sys/arm/broadcom/bcm2835/bcm2835_wdog.c
index 04488db2b853..39b16e34c5c8 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_wdog.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_wdog.c
@@ -52,8 +52,8 @@ __FBSDID("$FreeBSD$");
#define BCM2835_WDOG_TIME_MASK 0x000fffff
#define BCM2835_WDOG_TIME_SHIFT 0
-#define READ(_sc, _r) bus_space_read_4((_sc)->bst, (_sc)->bsh, (_r))
-#define WRITE(_sc, _r, _v) bus_space_write_4((_sc)->bst, (_sc)->bsh, (_r), (_v))
+#define READ(_sc, _r) bus_space_read_4((_sc)->bst, (_sc)->bsh, (_r) + (_sc)->regs_offset)
+#define WRITE(_sc, _r, _v) bus_space_write_4((_sc)->bst, (_sc)->bsh, (_r) + (_sc)->regs_offset, (_v))
#define BCM2835_RSTC_WRCFG_CLR 0xffffffcf
#define BCM2835_RSTC_WRCFG_SET 0x00000030
@@ -75,6 +75,17 @@ struct bcmwd_softc {
int wdog_period;
char wdog_passwd;
struct mtx mtx;
+ int regs_offset;
+};
+
+#define BSD_DTB 1
+#define UPSTREAM_DTB 2
+#define UPSTREAM_DTB_REGS_OFFSET 0x1c
+
+static struct ofw_compat_data compat_data[] = {
+ {"broadcom,bcm2835-wdt", BSD_DTB},
+ {"brcm,bcm2835-pm-wdt", UPSTREAM_DTB},
+ {NULL, 0}
};
static void bcmwd_watchdog_fn(void *private, u_int cmd, int *error);
@@ -86,12 +97,12 @@ bcmwd_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (ofw_bus_is_compatible(dev, "broadcom,bcm2835-wdt")) {
- device_set_desc(dev, "BCM2708/2835 Watchdog");
- return (BUS_PROBE_DEFAULT);
- }
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
+ return (ENXIO);
+
+ device_set_desc(dev, "BCM2708/2835 Watchdog");
- return (ENXIO);
+ return (BUS_PROBE_DEFAULT);
}
static int
@@ -119,6 +130,11 @@ bcmwd_attach(device_t dev)
sc->bst = rman_get_bustag(sc->res);
sc->bsh = rman_get_bushandle(sc->res);
+ /* compensate base address difference */
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data
+ == UPSTREAM_DTB)
+ sc->regs_offset = UPSTREAM_DTB_REGS_OFFSET;
+
bcmwd_lsc = sc;
mtx_init(&sc->mtx, "BCM2835 Watchdog", "bcmwd", MTX_DEF);
EVENTHANDLER_REGISTER(watchdog_list, bcmwd_watchdog_fn, sc, 0);
diff --git a/sys/arm/broadcom/bcm2835/bcm283x_dwc_fdt.c b/sys/arm/broadcom/bcm2835/bcm283x_dwc_fdt.c
index 75b505c8d82d..2fc25afe2cd5 100644
--- a/sys/arm/broadcom/bcm2835/bcm283x_dwc_fdt.c
+++ b/sys/arm/broadcom/bcm2835/bcm283x_dwc_fdt.c
@@ -51,6 +51,12 @@ __FBSDID("$FreeBSD$");
#include <arm/broadcom/bcm2835/bcm2835_mbox_prop.h>
+static struct ofw_compat_data compat_data[] = {
+ {"broadcom,bcm2835-usb", 1},
+ {"brcm,bcm2708-usb", 1},
+ {NULL, 0}
+};
+
static device_probe_t bcm283x_dwc_otg_probe;
static device_attach_t bcm283x_dwc_otg_attach;
@@ -61,7 +67,7 @@ bcm283x_dwc_otg_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-usb"))
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
return (ENXIO);
device_set_desc(dev, "DWC OTG 2.0 integrated USB controller (bcm283x)");
diff --git a/sys/arm/broadcom/bcm2835/files.bcm283x b/sys/arm/broadcom/bcm2835/files.bcm283x
index a92a35422003..21c99c146065 100644
--- a/sys/arm/broadcom/bcm2835/files.bcm283x
+++ b/sys/arm/broadcom/bcm2835/files.bcm283x
@@ -9,7 +9,7 @@ arm/broadcom/bcm2835/bcm2835_fbd.c optional vt
arm/broadcom/bcm2835/bcm2835_ft5406.c optional evdev bcm2835_ft5406
arm/broadcom/bcm2835/bcm2835_gpio.c optional gpio
arm/broadcom/bcm2835/bcm2835_intr.c standard
-arm/broadcom/bcm2835/bcm2835_machdep.c standard
+arm/broadcom/bcm2835/bcm2835_machdep.c optional platform
arm/broadcom/bcm2835/bcm2835_mbox.c standard
arm/broadcom/bcm2835/bcm2835_rng.c optional random
arm/broadcom/bcm2835/bcm2835_sdhci.c optional sdhci