aboutsummaryrefslogtreecommitdiff
path: root/sys/arm/broadcom/bcm2835
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arm/broadcom/bcm2835')
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_audio.c13
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_bsc.c11
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_bscreg.h4
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_bscvar.h4
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_clkman.c9
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_clkman.h4
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c29
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_dma.c37
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_dma.h4
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_fb.c4
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_fbd.c8
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_firmware.c3
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_firmware.h2
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_ft5406.c3
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_gpio.c92
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_intr.c7
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_machdep.c31
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_mbox.c5
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_mbox.h4
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h3
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_pwm.c8
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_rng.c3
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_sdhci.c8
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_sdhost.c8
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_spi.c42
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_spireg.h4
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_spivar.h6
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_systimer.c312
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_vcbus.c6
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_vcbus.h4
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_vcio.c2
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_wdog.c4
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_wdog.h3
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2836.c19
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2836_mp.c3
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2836_mp.h2
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2838_pci.c60
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2838_xhci.c6
-rw-r--r--sys/arm/broadcom/bcm2835/bcm283x_dwc_fdt.c3
-rw-r--r--sys/arm/broadcom/bcm2835/files.bcm28353
-rw-r--r--sys/arm/broadcom/bcm2835/files.bcm28361
-rw-r--r--sys/arm/broadcom/bcm2835/files.bcm283x1
-rw-r--r--sys/arm/broadcom/bcm2835/raspberrypi_gpio.c7
-rw-r--r--sys/arm/broadcom/bcm2835/std.bcm283510
-rw-r--r--sys/arm/broadcom/bcm2835/std.bcm28361
-rw-r--r--sys/arm/broadcom/bcm2835/std.rpi1
-rw-r--r--sys/arm/broadcom/bcm2835/vc_vchi_audioserv_defs.h2
47 files changed, 211 insertions, 595 deletions
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_audio.c b/sys/arm/broadcom/bcm2835/bcm2835_audio.c
index 36b1dc86535b..13f309dd3f11 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_audio.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_audio.c
@@ -28,7 +28,6 @@
#endif
#include <dev/sound/pcm/sound.h>
-#include <dev/sound/chip.h>
#include "mixer_if.h"
@@ -38,8 +37,6 @@
#include "vc_vchi_audioserv_defs.h"
-SND_DECLARE_FILE("$FreeBSD$");
-
/* Audio destination */
#define DEST_AUTO 0
#define DEST_HEADPHONES 1
@@ -870,14 +867,14 @@ bcm2835_audio_delayed_init(void *xsc)
goto no;
}
- if (pcm_register(sc->dev, sc, 1, 0)) {
- device_printf(sc->dev, "pcm_register failed\n");
- goto no;
- }
+ pcm_init(sc->dev, sc);
pcm_addchan(sc->dev, PCMDIR_PLAY, &bcmchan_class, sc);
snprintf(status, SND_STATUSLEN, "at VCHIQ");
- pcm_setstatus(sc->dev, status);
+ if (pcm_register(sc->dev, status)) {
+ device_printf(sc->dev, "pcm_register failed\n");
+ goto no;
+ }
bcm2835_audio_reset_channel(&sc->pch);
bcm2835_audio_create_worker(sc);
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_bsc.c b/sys/arm/broadcom/bcm2835/bcm2835_bsc.c
index da5f54a9eea0..a4cbef7d528f 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_bsc.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_bsc.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2001 Tsubai Masanari.
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
@@ -30,8 +30,6 @@
*
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
/*
* Driver for bcm2835 i2c-compatible two-wire bus, named 'BSC' on this SoC.
*
@@ -344,14 +342,15 @@ bcm_bsc_attach(device_t dev)
bcm_bsc_reset(sc);
BCM_BSC_UNLOCK(sc);
- sc->sc_iicbus = device_add_child(dev, "iicbus", -1);
+ sc->sc_iicbus = device_add_child(dev, "iicbus", DEVICE_UNIT_ANY);
if (sc->sc_iicbus == NULL) {
bcm_bsc_detach(dev);
return (ENXIO);
}
/* Probe and attach the iicbus when interrupts are available. */
- return (bus_delayed_attach_children(dev));
+ bus_delayed_attach_children(dev);
+ return (0);
}
static int
@@ -362,8 +361,6 @@ bcm_bsc_detach(device_t dev)
bus_generic_detach(dev);
sc = device_get_softc(dev);
- if (sc->sc_iicbus != NULL)
- device_delete_child(dev, sc->sc_iicbus);
mtx_destroy(&sc->sc_mtx);
if (sc->sc_intrhand)
bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_intrhand);
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_bscreg.h b/sys/arm/broadcom/bcm2835/bcm2835_bscreg.h
index 4b9532053807..e993bec9e394 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_bscreg.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_bscreg.h
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
* Copyright (c) 2013 Luiz Otavio O Souza <loos@freebsd.org>
@@ -25,8 +25,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
#ifndef _BCM2835_BSCREG_H_
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_bscvar.h b/sys/arm/broadcom/bcm2835/bcm2835_bscvar.h
index b57607ea597e..d859594eec33 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_bscvar.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_bscvar.h
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
* Copyright (c) 2013 Luiz Otavio O Souza <loos@freebsd.org>
@@ -25,8 +25,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
#ifndef _BCM2835_BSCVAR_H
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_clkman.c b/sys/arm/broadcom/bcm2835/bcm2835_clkman.c
index 40fb75a3b050..7061acbba820 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_clkman.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_clkman.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2017 Poul-Henning Kamp <phk@FreeBSD.org>
*
@@ -26,9 +26,6 @@
*
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
@@ -51,6 +48,7 @@ __FBSDID("$FreeBSD$");
#include <arm/broadcom/bcm2835/bcm2835_clkman.h>
static struct ofw_compat_data compat_data[] = {
+ {"brcm,bcm2711-cprman", 1},
{"brcm,bcm2835-cprman", 1},
{"broadcom,bcm2835-cprman", 1},
{NULL, 0}
@@ -114,7 +112,8 @@ bcm2835_clkman_attach(device_t dev)
sc->sc_m_bst = rman_get_bustag(sc->sc_m_res);
sc->sc_m_bsh = rman_get_bushandle(sc->sc_m_res);
- return (bus_generic_attach(dev));
+ bus_attach_children(dev);
+ return (0);
}
uint32_t
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_clkman.h b/sys/arm/broadcom/bcm2835/bcm2835_clkman.h
index 488bb1d65504..89281ee5d76a 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_clkman.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_clkman.h
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2017 Poul-Henning Kamp <phk@FreeBSD.org>
*
@@ -23,8 +23,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
#ifndef _BCM2835_CLKMAN_H_
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c b/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c
index 49a7dcff9b59..2bcf6ba8da1e 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c
@@ -25,9 +25,6 @@
*
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
@@ -64,17 +61,10 @@ __FBSDID("$FreeBSD$");
#define HZ2MHZ(freq) ((freq) / (1000 * 1000))
#define MHZ2HZ(freq) ((freq) * (1000 * 1000))
-#ifdef SOC_BCM2835
-#define OFFSET2MVOLT(val) (1200 + ((val) * 25))
-#define MVOLT2OFFSET(val) (((val) - 1200) / 25)
-#define DEFAULT_ARM_FREQUENCY 700
-#define DEFAULT_LOWEST_FREQ 300
-#else
#define OFFSET2MVOLT(val) (((val) / 1000))
#define MVOLT2OFFSET(val) (((val) * 1000))
#define DEFAULT_ARM_FREQUENCY 600
#define DEFAULT_LOWEST_FREQ 600
-#endif
#define DEFAULT_CORE_FREQUENCY 250
#define DEFAULT_SDRAM_FREQUENCY 400
#define TRANSITION_LATENCY 1000
@@ -1214,9 +1204,9 @@ bcm2835_cpufreq_identify(driver_t *driver, device_t parent)
return;
DPRINTF("driver=%p, parent=%p\n", driver, parent);
- if (device_find_child(parent, "bcm2835_cpufreq", -1) != NULL)
+ if (device_find_child(parent, "bcm2835_cpufreq", DEVICE_UNIT_ANY) != NULL)
return;
- if (BUS_ADD_CHILD(parent, 0, "bcm2835_cpufreq", -1) == NULL)
+ if (BUS_ADD_CHILD(parent, 0, "bcm2835_cpufreq", DEVICE_UNIT_ANY) == NULL)
device_printf(parent, "add child failed\n");
}
@@ -1510,20 +1500,6 @@ bcm2835_cpufreq_make_freq_list(device_t dev, struct cf_setting *sets,
if (min_freq > cpufreq_lowest_freq)
min_freq = cpufreq_lowest_freq;
-#ifdef SOC_BCM2835
- /* from freq to min_freq */
- for (idx = 0; idx < *count && freq >= min_freq; idx++) {
- if (freq > sc->arm_min_freq)
- volts = sc->max_voltage_core;
- else
- volts = sc->min_voltage_core;
- sets[idx].freq = freq;
- sets[idx].volts = volts;
- sets[idx].lat = TRANSITION_LATENCY;
- sets[idx].dev = dev;
- freq -= MHZSTEP;
- }
-#else
/* XXX RPi2 have only 900/600MHz */
idx = 0;
volts = sc->min_voltage_core;
@@ -1539,7 +1515,6 @@ bcm2835_cpufreq_make_freq_list(device_t dev, struct cf_setting *sets,
sets[idx].dev = dev;
idx++;
}
-#endif
*count = idx;
return (0);
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_dma.c b/sys/arm/broadcom/bcm2835/bcm2835_dma.c
index 5f9ecb0b7981..3515b0315e56 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_dma.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_dma.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2013 Daisuke Aoyama <aoyama@peach.ne.jp>
* Copyright (c) 2013 Oleksandr Tymoshenko <gonzo@bluezbox.com>
@@ -27,9 +27,6 @@
*
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
@@ -328,6 +325,9 @@ bcm_dma_allocate(int req_ch)
int ch = BCM_DMA_CH_INVALID;
int i;
+ if (sc == NULL)
+ return (BCM_DMA_CH_INVALID);
+
if (req_ch >= BCM_DMA_CH_MAX)
return (BCM_DMA_CH_INVALID);
@@ -343,13 +343,10 @@ bcm_dma_allocate(int req_ch)
break;
}
}
- }
- else {
- if (sc->sc_dma_ch[req_ch].flags & BCM_DMA_CH_FREE) {
- ch = req_ch;
- sc->sc_dma_ch[ch].flags &= ~BCM_DMA_CH_FREE;
- sc->sc_dma_ch[ch].flags |= BCM_DMA_CH_USED;
- }
+ } else if (sc->sc_dma_ch[req_ch].flags & BCM_DMA_CH_FREE) {
+ ch = req_ch;
+ sc->sc_dma_ch[ch].flags &= ~BCM_DMA_CH_FREE;
+ sc->sc_dma_ch[ch].flags |= BCM_DMA_CH_USED;
}
mtx_unlock(&sc->sc_mtx);
@@ -364,6 +361,9 @@ bcm_dma_free(int ch)
{
struct bcm_dma_softc *sc = bcm_dma_sc;
+ if (sc == NULL)
+ return (-1);
+
if (ch < 0 || ch >= BCM_DMA_CH_MAX)
return (-1);
@@ -392,6 +392,9 @@ bcm_dma_setup_intr(int ch, void (*func)(int, void *), void *arg)
struct bcm_dma_softc *sc = bcm_dma_sc;
struct bcm_dma_cb *cb;
+ if (sc == NULL)
+ return (-1);
+
if (ch < 0 || ch >= BCM_DMA_CH_MAX)
return (-1);
@@ -531,6 +534,9 @@ bcm_dma_reg_dump(int ch)
int i;
uint32_t reg;
+ if (sc == NULL)
+ return;
+
if (ch < 0 || ch >= BCM_DMA_CH_MAX)
return;
@@ -558,6 +564,9 @@ bcm_dma_start(int ch, vm_paddr_t src, vm_paddr_t dst, int len)
struct bcm_dma_softc *sc = bcm_dma_sc;
struct bcm_dma_cb *cb;
+ if (sc == NULL)
+ return (-1);
+
if (ch < 0 || ch >= BCM_DMA_CH_MAX)
return (-1);
@@ -597,6 +606,9 @@ bcm_dma_length(int ch)
struct bcm_dma_softc *sc = bcm_dma_sc;
struct bcm_dma_cb *cb;
+ if (sc == NULL)
+ return (0);
+
if (ch < 0 || ch >= BCM_DMA_CH_MAX)
return (0);
@@ -764,5 +776,6 @@ static driver_t bcm_dma_driver = {
sizeof(struct bcm_dma_softc),
};
-DRIVER_MODULE(bcm_dma, simplebus, bcm_dma_driver, 0, 0);
+EARLY_DRIVER_MODULE(bcm_dma, simplebus, bcm_dma_driver, 0, 0,
+ BUS_PASS_SUPPORTDEV + BUS_PASS_ORDER_MIDDLE);
MODULE_VERSION(bcm_dma, 1);
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_dma.h b/sys/arm/broadcom/bcm2835/bcm2835_dma.h
index 44c2cd34e804..78a1d0e7625b 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_dma.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_dma.h
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2013 Daisuke Aoyama <aoyama@peach.ne.jp>
* Copyright (c) 2013 Oleksandr Tymoshenko <gonzo@bluezbox.com>
@@ -24,8 +24,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
#ifndef _BCM2835_DMA_H_
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_fb.c b/sys/arm/broadcom/bcm2835/bcm2835_fb.c
index 7f70cd280efa..fd198afa18b4 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_fb.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_fb.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
* All rights reserved.
@@ -26,8 +26,6 @@
* SUCH DAMAGE.
*
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_fbd.c b/sys/arm/broadcom/bcm2835/bcm2835_fbd.c
index 2b0b89d36342..50e8689e9d83 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_fbd.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_fbd.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
* Copyright (c) 2012, 2013 The FreeBSD Foundation
@@ -30,8 +30,6 @@
* SUCH DAMAGE.
*
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
@@ -152,12 +150,12 @@ bcm_fb_setup_fbd(struct bcmsc_softc *sc)
fbd = device_add_child(sc->dev, "fbd", device_get_unit(sc->dev));
if (fbd == NULL) {
device_printf(sc->dev, "Failed to add fbd child\n");
- pmap_unmapdev(sc->info.fb_vbase, sc->info.fb_size);
+ pmap_unmapdev((void *)sc->info.fb_vbase, sc->info.fb_size);
return (ENXIO);
} else if (device_probe_and_attach(fbd) != 0) {
device_printf(sc->dev, "Failed to attach fbd device\n");
device_delete_child(sc->dev, fbd);
- pmap_unmapdev(sc->info.fb_vbase, sc->info.fb_size);
+ pmap_unmapdev((void *)sc->info.fb_vbase, sc->info.fb_size);
return (ENXIO);
}
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_firmware.c b/sys/arm/broadcom/bcm2835/bcm2835_firmware.c
index 5137511619fc..c1d23c0222cd 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_firmware.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_firmware.c
@@ -28,9 +28,6 @@
* SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_firmware.h b/sys/arm/broadcom/bcm2835/bcm2835_firmware.h
index 666e450914f8..8c77dac7d710 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_firmware.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_firmware.h
@@ -26,8 +26,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
#ifndef _BCM2835_FIRMWARE_H_
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_ft5406.c b/sys/arm/broadcom/bcm2835/bcm2835_ft5406.c
index d3a75b765561..bb8833574471 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_ft5406.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_ft5406.c
@@ -25,9 +25,6 @@
*
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_gpio.c b/sys/arm/broadcom/bcm2835/bcm2835_gpio.c
index 56605ca08c62..93ee5d7c8bd3 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_gpio.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_gpio.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@FreeBSD.org>
* Copyright (c) 2012-2015 Luiz Otavio O Souza <loos@FreeBSD.org>
@@ -28,8 +28,6 @@
*
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include "opt_platform.h"
#include <sys/param.h>
@@ -64,8 +62,10 @@ __FBSDID("$FreeBSD$");
#endif
#define BCM_GPIO_IRQS 4
-#define BCM_GPIO_PINS 54
#define BCM_GPIO_PINS_PER_BANK 32
+#define BCM2835_GPIO_PINS 54
+#define BCM2711_GPIO_PINS 58
+#define BCM_GPIO_PINS BCM2711_GPIO_PINS
#define BCM_GPIO_DEFAULT_CAPS (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT | \
GPIO_PIN_PULLUP | GPIO_PIN_PULLDOWN | GPIO_INTR_LEVEL_LOW | \
@@ -85,6 +85,10 @@ __FBSDID("$FreeBSD$");
#define BCM2835_PUD_DOWN 1
#define BCM2835_PUD_UP 2
+#define BCM2711_PUD_OFF 0
+#define BCM2711_PUD_DOWN 2
+#define BCM2711_PUD_UP 1
+
static struct resource_spec bcm_gpio_res_spec[] = {
{ SYS_RES_MEMORY, 0, RF_ACTIVE },
{ SYS_RES_IRQ, 0, RF_ACTIVE }, /* bank 0 interrupt */
@@ -112,6 +116,8 @@ struct bcm_gpio_softc {
bus_space_tag_t sc_bst;
bus_space_handle_t sc_bsh;
void * sc_intrhand[BCM_GPIO_IRQS];
+ bool sc_is2711;
+ u_int sc_maxpins;
int sc_gpio_npins;
int sc_ro_npins;
int sc_ro_pins[BCM_GPIO_PINS];
@@ -151,8 +157,13 @@ enum bcm_gpio_pud {
#define BCM_GPIO_GPLEN(_bank) (0x70 + _bank * 4) /* Low Level irq */
#define BCM_GPIO_GPAREN(_bank) (0x7c + _bank * 4) /* Async Rising Edge */
#define BCM_GPIO_GPAFEN(_bank) (0x88 + _bank * 4) /* Async Falling Egde */
-#define BCM_GPIO_GPPUD(_bank) (0x94) /* Pin Pull up/down */
-#define BCM_GPIO_GPPUDCLK(_bank) (0x98 + _bank * 4) /* Pin Pull up clock */
+#define BCM2835_GPIO_GPPUD(_bank) (0x94) /* Pin Pull up/down */
+#define BCM2835_GPIO_GPPUDCLK(_bank) (0x98 + _bank * 4) /* Pin Pull up clock */
+
+#define BCM2711_GPIO_GPPUD(x) (0x0e4 + (x) * sizeof(uint32_t)) /* Pin Pull up/down */
+#define BCM2711_GPIO_MASK (0x3)
+#define BCM2711_GPIO_SHIFT(n) (((n) % 16) * 2)
+#define BCM2711_GPIO_REGID(n) ((n) / 16)
static struct ofw_compat_data compat_data[] = {
{"broadcom,bcm2835-gpio", 1},
@@ -289,16 +300,39 @@ bcm_gpio_set_function(struct bcm_gpio_softc *sc, uint32_t pin, uint32_t f)
static void
bcm_gpio_set_pud(struct bcm_gpio_softc *sc, uint32_t pin, uint32_t state)
{
- uint32_t bank;
-
/* Must be called with lock held. */
BCM_GPIO_LOCK_ASSERT(sc);
- bank = BCM_GPIO_BANK(pin);
- BCM_GPIO_WRITE(sc, BCM_GPIO_GPPUD(0), state);
- BCM_GPIO_WRITE(sc, BCM_GPIO_GPPUDCLK(bank), BCM_GPIO_MASK(pin));
- BCM_GPIO_WRITE(sc, BCM_GPIO_GPPUD(0), 0);
- BCM_GPIO_WRITE(sc, BCM_GPIO_GPPUDCLK(bank), 0);
+ if (sc->sc_is2711) { /* BCM2711 */
+ u_int regid = BCM2711_GPIO_REGID(pin);
+ u_int shift = BCM2711_GPIO_SHIFT(pin);
+ uint32_t reg;
+
+ switch (state) {
+ case BCM2835_PUD_OFF:
+ state = BCM2711_PUD_OFF;
+ break;
+ case BCM2835_PUD_DOWN:
+ state = BCM2711_PUD_DOWN;
+ break;
+ case BCM2835_PUD_UP:
+ state = BCM2711_PUD_UP;
+ break;
+ }
+
+ reg = BCM_GPIO_READ(sc, BCM2711_GPIO_GPPUD(regid));
+ reg &= ~(BCM2711_GPIO_MASK << shift);
+ reg |= (state << shift);
+ BCM_GPIO_WRITE(sc, BCM2711_GPIO_GPPUD(regid), reg);
+ } else { /* BCM2835 */
+ uint32_t bank;
+
+ bank = BCM_GPIO_BANK(pin);
+ BCM_GPIO_WRITE(sc, BCM2835_GPIO_GPPUD(0), state);
+ BCM_GPIO_WRITE(sc, BCM2835_GPIO_GPPUDCLK(bank), BCM_GPIO_MASK(pin));
+ BCM_GPIO_WRITE(sc, BCM2835_GPIO_GPPUD(0), 0);
+ BCM_GPIO_WRITE(sc, BCM2835_GPIO_GPPUDCLK(bank), 0);
+ }
}
static void
@@ -376,8 +410,10 @@ bcm_gpio_get_bus(device_t dev)
static int
bcm_gpio_pin_max(device_t dev, int *maxpin)
{
+ struct bcm_gpio_softc *sc;
- *maxpin = BCM_GPIO_PINS - 1;
+ sc = device_get_softc(dev);
+ *maxpin = sc->sc_maxpins - 1;
return (0);
}
@@ -770,16 +806,19 @@ bcm_gpio_attach(device_t dev)
}
sc->sc_bst = rman_get_bustag(sc->sc_res[0]);
sc->sc_bsh = rman_get_bushandle(sc->sc_res[0]);
- /* Setup the GPIO interrupt handler. */
- if (bcm_gpio_intr_attach(dev)) {
- device_printf(dev, "unable to setup the gpio irq handler\n");
- goto fail;
- }
/* Find our node. */
gpio = ofw_bus_get_node(sc->sc_dev);
if (!OF_hasprop(gpio, "gpio-controller"))
/* Node is not a GPIO controller. */
goto fail;
+ /* Guess I'm BCM2711 or not. */
+ sc->sc_is2711 = ofw_bus_node_is_compatible(gpio, "brcm,bcm2711-gpio");
+ sc->sc_maxpins = sc->sc_is2711 ? BCM2711_GPIO_PINS : BCM2835_GPIO_PINS;
+ /* Setup the GPIO interrupt handler. */
+ if (bcm_gpio_intr_attach(dev)) {
+ device_printf(dev, "unable to setup the gpio irq handler\n");
+ goto fail;
+ }
/*
* Find the read-only pins. These are pins we never touch or bad
* things could happen.
@@ -787,7 +826,7 @@ bcm_gpio_attach(device_t dev)
if (bcm_gpio_get_reserved_pins(sc) == -1)
goto fail;
/* Initialize the software controlled pins. */
- for (i = 0, j = 0; j < BCM_GPIO_PINS; j++) {
+ for (i = 0, j = 0; j < sc->sc_maxpins; j++) {
snprintf(sc->sc_gpio_pins[i].gp_name, GPIOMAXNAME,
"pin %d", j);
func = bcm_gpio_get_function(sc, j);
@@ -798,13 +837,14 @@ bcm_gpio_attach(device_t dev)
}
sc->sc_gpio_npins = i;
bcm_gpio_sysctl_init(sc);
- sc->sc_busdev = gpiobus_attach_bus(dev);
- if (sc->sc_busdev == NULL)
- goto fail;
fdt_pinctrl_register(dev, "brcm,pins");
fdt_pinctrl_configure_tree(dev);
+ sc->sc_busdev = gpiobus_add_bus(dev);
+ if (sc->sc_busdev == NULL)
+ goto fail;
+ bus_attach_children(dev);
return (0);
fail:
@@ -956,7 +996,7 @@ bcm_gpio_pic_attach(struct bcm_gpio_softc *sc)
const char *name;
name = device_get_nameunit(sc->sc_dev);
- for (irq = 0; irq < BCM_GPIO_PINS; irq++) {
+ for (irq = 0; irq < sc->sc_maxpins; irq++) {
sc->sc_isrcs[irq].bgi_irq = irq;
sc->sc_isrcs[irq].bgi_mask = BCM_GPIO_MASK(irq);
sc->sc_isrcs[irq].bgi_mode = GPIO_INTR_CONFORM;
@@ -1044,7 +1084,7 @@ bcm_gpio_pic_map_fdt(struct bcm_gpio_softc *sc, struct intr_map_data_fdt *daf,
return (EINVAL);
irq = daf->cells[0];
- if (irq >= BCM_GPIO_PINS || bcm_gpio_pin_is_ro(sc, irq))
+ if (irq >= sc->sc_maxpins || bcm_gpio_pin_is_ro(sc, irq))
return (EINVAL);
/* Only reasonable modes are supported. */
@@ -1075,7 +1115,7 @@ bcm_gpio_pic_map_gpio(struct bcm_gpio_softc *sc, struct intr_map_data_gpio *dag,
uint32_t mode;
irq = dag->gpio_pin_num;
- if (irq >= BCM_GPIO_PINS || bcm_gpio_pin_is_ro(sc, irq))
+ if (irq >= sc->sc_maxpins || bcm_gpio_pin_is_ro(sc, irq))
return (EINVAL);
mode = dag->gpio_intr_mode;
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_intr.c b/sys/arm/broadcom/bcm2835/bcm2835_intr.c
index af662ae3ba51..65ada57c0b60 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_intr.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_intr.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Damjan Marion <dmarion@Freebsd.org>
* All rights reserved.
@@ -29,8 +29,6 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include "opt_platform.h"
#include <sys/param.h>
@@ -407,7 +405,8 @@ bcm_intc_attach(device_t dev)
sc->intc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
RF_ACTIVE);
if (sc->intc_irq_res == NULL) {
- if (intr_pic_claim_root(dev, xref, bcm2835_intc_intr, sc, 0) != 0) {
+ if (intr_pic_claim_root(dev, xref, bcm2835_intc_intr, sc, INTR_ROOT_IRQ)
+ != 0) {
/* XXX clean up */
device_printf(dev, "could not set PIC as a root\n");
return (ENXIO);
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_machdep.c b/sys/arm/broadcom/bcm2835/bcm2835_machdep.c
index 683fb4986a41..be6b8971437d 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_machdep.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_machdep.c
@@ -41,9 +41,6 @@
#include "opt_ddb.h"
#include "opt_platform.h"
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
@@ -64,9 +61,6 @@ __FBSDID("$FreeBSD$");
#include "platform_if.h"
-#ifdef SOC_BCM2835
-static platform_devmap_init_t bcm2835_devmap_init;
-#endif
#ifdef SOC_BCM2836
static platform_devmap_init_t bcm2836_devmap_init;
#endif
@@ -94,20 +88,6 @@ bcm2835_late_init(platform_t plat)
}
}
-#ifdef SOC_BCM2835
-/*
- * Set up static device mappings.
- * All on-chip peripherals exist in a 16MB range starting at 0x20000000.
- * Map the entire range using 1MB section mappings.
- */
-static int
-bcm2835_devmap_init(platform_t plat)
-{
-
- devmap_add_entry(0x20000000, 0x01000000);
- return (0);
-}
-#endif
#ifdef SOC_BCM2836
static int
@@ -125,17 +105,6 @@ bcm2835_cpu_reset(platform_t plat)
bcmwd_watchdog_reset();
}
-#ifdef SOC_BCM2835
-static platform_method_t bcm2835_methods[] = {
- PLATFORMMETHOD(platform_devmap_init, bcm2835_devmap_init),
- PLATFORMMETHOD(platform_late_init, bcm2835_late_init),
- PLATFORMMETHOD(platform_cpu_reset, bcm2835_cpu_reset),
-
- PLATFORMMETHOD_END,
-};
-FDT_PLATFORM_DEF2(bcm2835, bcm2835_legacy, "bcm2835 (legacy)", 0, "raspberrypi,model-b", 100);
-FDT_PLATFORM_DEF2(bcm2835, bcm2835, "bcm2835", 0, "brcm,bcm2835", 100);
-#endif
#if defined(SOC_BCM2836) || defined(SOC_BRCM_BCM2837)
static platform_method_t bcm2836_methods[] = {
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_mbox.c b/sys/arm/broadcom/bcm2835/bcm2835_mbox.c
index cd1420e8d344..a3a3744ce43c 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_mbox.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_mbox.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
* All rights reserved.
@@ -26,9 +26,6 @@
* SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_mbox.h b/sys/arm/broadcom/bcm2835/bcm2835_mbox.h
index 3cd8699a704b..a907ff48b0a7 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_mbox.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_mbox.h
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
* All rights reserved.
@@ -24,8 +24,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
#ifndef _BCM2835_MBOX_H_
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h b/sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h
index df8c96d68f25..57130258a044 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h
@@ -22,14 +22,11 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
#ifndef _BCM2835_MBOX_PROP_H_
#define _BCM2835_MBOX_PROP_H_
-#include <sys/cdefs.h>
#include <sys/types.h>
/*
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_pwm.c b/sys/arm/broadcom/bcm2835/bcm2835_pwm.c
index ca472d1e3f3a..ad794a6d20ed 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_pwm.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_pwm.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2017 Poul-Henning Kamp <phk@FreeBSD.org>
* All rights reserved.
@@ -27,9 +27,6 @@
*
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
@@ -463,7 +460,8 @@ bcm_pwm_attach(device_t dev)
sc->period2 = 10000; /* 12.5 khz */
sc->ratio2 = 2500; /* 25% */
- return (bus_generic_attach(dev));
+ bus_attach_children(dev);
+ return (0);
}
static int
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_rng.c b/sys/arm/broadcom/bcm2835/bcm2835_rng.c
index 5067120c80fa..bc13bdba2238 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_rng.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_rng.c
@@ -24,9 +24,6 @@
* SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/kernel.h>
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c b/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
index 0e9be2205000..e0c4327d8e05 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
* All rights reserved.
@@ -26,8 +26,6 @@
* SUCH DAMAGE.
*
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
@@ -355,8 +353,8 @@ bcm_sdhci_attach(device_t dev)
sc->sc_sdhci_buffer_phys = rman_get_start(sc->sc_mem_res) +
SDHCI_BUFFER;
- bus_generic_probe(dev);
- bus_generic_attach(dev);
+ bus_identify_children(dev);
+ bus_attach_children(dev);
sdhci_start_slot(&sc->sc_slot);
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_sdhost.c b/sys/arm/broadcom/bcm2835/bcm2835_sdhost.c
index a3bfc206c0d2..2fe641ebe390 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_sdhost.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_sdhost.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2018 Klaus P. Ohrhallinger <k@7he.at>
* All rights reserved.
@@ -31,8 +31,6 @@
*
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
/*
* pin 48-53 - card slot
* pin 34-39 - radio module
@@ -474,8 +472,8 @@ bcm_sdhost_attach(device_t dev)
sdhci_init_slot(dev, &sc->sc_slot, 0);
- bus_generic_probe(dev);
- bus_generic_attach(dev);
+ bus_identify_children(dev);
+ bus_attach_children(dev);
sdhci_start_slot(&sc->sc_slot);
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_spi.c b/sys/arm/broadcom/bcm2835/bcm2835_spi.c
index b9d25d6c1b48..a1a77d9fabb0 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_spi.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_spi.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
* Copyright (c) 2013 Luiz Otavio O Souza <loos@freebsd.org>
@@ -27,8 +27,6 @@
* SUCH DAMAGE.
*
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
@@ -300,9 +298,10 @@ bcm_spi_attach(device_t dev)
bcm_spi_printr(dev);
#endif
- device_add_child(dev, "spibus", -1);
+ device_add_child(dev, "spibus", DEVICE_UNIT_ANY);
+ bus_attach_children(dev);
- return (bus_generic_attach(dev));
+ return (0);
}
static int
@@ -390,8 +389,10 @@ bcm_spi_intr(void *arg)
/* Check for end of transfer. */
if (sc->sc_written == sc->sc_len && sc->sc_read == sc->sc_len) {
/* Disable interrupts and the SPI engine. */
- bcm_spi_modifyreg(sc, SPI_CS,
- SPI_CS_TA | SPI_CS_INTR | SPI_CS_INTD, 0);
+ if ((sc->sc_flags & BCM_SPI_KEEP_CS) == 0) {
+ bcm_spi_modifyreg(sc, SPI_CS,
+ SPI_CS_TA | SPI_CS_INTR | SPI_CS_INTD, 0);
+ }
wakeup(sc->sc_dev);
}
@@ -440,16 +441,23 @@ bcm_spi_transfer(device_t dev, device_t child, struct spi_command *cmd)
/* If the controller is in use wait until it is available. */
BCM_SPI_LOCK(sc);
- while (sc->sc_flags & BCM_SPI_BUSY)
- mtx_sleep(dev, &sc->sc_mtx, 0, "bcm_spi", 0);
+ if (sc->sc_thread != curthread)
+ while (sc->sc_flags & BCM_SPI_BUSY)
+ mtx_sleep(dev, &sc->sc_mtx, 0, "bcm_spi", 0);
/* Now we have control over SPI controller. */
sc->sc_flags = BCM_SPI_BUSY;
+ if ((cmd->flags & SPI_FLAG_KEEP_CS) != 0)
+ sc->sc_flags |= BCM_SPI_KEEP_CS;
+
/* Clear the FIFO. */
- bcm_spi_modifyreg(sc, SPI_CS,
- SPI_CS_CLEAR_RXFIFO | SPI_CS_CLEAR_TXFIFO,
- SPI_CS_CLEAR_RXFIFO | SPI_CS_CLEAR_TXFIFO);
+ if (sc->sc_thread != curthread)
+ bcm_spi_modifyreg(sc, SPI_CS,
+ SPI_CS_CLEAR_RXFIFO | SPI_CS_CLEAR_TXFIFO,
+ SPI_CS_CLEAR_RXFIFO | SPI_CS_CLEAR_TXFIFO);
+
+ sc->sc_thread = curthread;
/* Save a pointer to the SPI command. */
sc->sc_cmd = cmd;
@@ -519,11 +527,15 @@ bcm_spi_transfer(device_t dev, device_t child, struct spi_command *cmd)
err = mtx_sleep(dev, &sc->sc_mtx, 0, "bcm_spi", hz * 2);
/* Make sure the SPI engine and interrupts are disabled. */
- bcm_spi_modifyreg(sc, SPI_CS, SPI_CS_TA | SPI_CS_INTR | SPI_CS_INTD, 0);
+ if (!(cmd->flags & SPI_FLAG_KEEP_CS)) {
+ bcm_spi_modifyreg(sc,
+ SPI_CS, SPI_CS_TA | SPI_CS_INTR | SPI_CS_INTD, 0);
+ sc->sc_thread = 0;
+ }
- /* Release the controller and wakeup the next thread waiting for it. */
- sc->sc_flags = 0;
wakeup_one(dev);
+ sc->sc_flags &= ~BCM_SPI_BUSY;
+ /* Release the controller and wakeup the next thread waiting for it. */
BCM_SPI_UNLOCK(sc);
/*
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_spireg.h b/sys/arm/broadcom/bcm2835/bcm2835_spireg.h
index a658f16c92b9..5806fee84020 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_spireg.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_spireg.h
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
* Copyright (c) 2013 Luiz Otavio O Souza <loos@freebsd.org>
@@ -25,8 +25,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
#ifndef _BCM2835_SPIREG_H_
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_spivar.h b/sys/arm/broadcom/bcm2835/bcm2835_spivar.h
index 75a17a449cb5..85b13626a026 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_spivar.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_spivar.h
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
* Copyright (c) 2013 Luiz Otavio O Souza <loos@freebsd.org>
@@ -25,8 +25,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
#ifndef _BCM2835_SPIVAR_H_
@@ -38,6 +36,7 @@ struct bcm_spi_softc {
struct resource * sc_mem_res;
struct resource * sc_irq_res;
struct spi_command *sc_cmd;
+ struct thread *sc_thread;
bus_space_tag_t sc_bst;
bus_space_handle_t sc_bsh;
uint32_t sc_len;
@@ -48,6 +47,7 @@ struct bcm_spi_softc {
};
#define BCM_SPI_BUSY 0x1
+#define BCM_SPI_KEEP_CS 0x2
#define BCM_SPI_WRITE(_sc, _off, _val) \
bus_space_write_4(_sc->sc_bst, _sc->sc_bsh, _off, _val)
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_systimer.c b/sys/arm/broadcom/bcm2835/bcm2835_systimer.c
deleted file mode 100644
index 64b450eda221..000000000000
--- a/sys/arm/broadcom/bcm2835/bcm2835_systimer.c
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
- *
- * Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
- * Copyright (c) 2012 Damjan Marion <dmarion@freebsd.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/bus.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/malloc.h>
-#include <sys/rman.h>
-#include <sys/timeet.h>
-#include <sys/timetc.h>
-#include <sys/watchdog.h>
-#include <machine/bus.h>
-#include <machine/cpu.h>
-#include <machine/intr.h>
-#include <machine/machdep.h>
-
-#include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_bus_subr.h>
-
-#include <machine/bus.h>
-
-#define BCM2835_NUM_TIMERS 4
-
-#define DEFAULT_TIMER 3
-#define DEFAULT_TIMER_NAME "BCM2835-3"
-#define DEFAULT_FREQUENCY 1000000
-#define MIN_PERIOD 5LLU
-
-#define SYSTIMER_CS 0x00
-#define SYSTIMER_CLO 0x04
-#define SYSTIMER_CHI 0x08
-#define SYSTIMER_C0 0x0C
-#define SYSTIMER_C1 0x10
-#define SYSTIMER_C2 0x14
-#define SYSTIMER_C3 0x18
-
-struct systimer {
- int index;
- bool enabled;
- struct eventtimer et;
-};
-
-struct bcm_systimer_softc {
- struct resource* mem_res;
- struct resource* irq_res[BCM2835_NUM_TIMERS];
- void* intr_hl[BCM2835_NUM_TIMERS];
- uint32_t sysclk_freq;
- bus_space_tag_t bst;
- bus_space_handle_t bsh;
- struct systimer st[BCM2835_NUM_TIMERS];
-};
-
-static struct resource_spec bcm_systimer_irq_spec[] = {
- { SYS_RES_IRQ, 0, RF_ACTIVE },
- { SYS_RES_IRQ, 1, RF_ACTIVE },
- { SYS_RES_IRQ, 2, RF_ACTIVE },
- { SYS_RES_IRQ, 3, RF_ACTIVE },
- { -1, 0, 0 }
-};
-
-static struct ofw_compat_data compat_data[] = {
- {"broadcom,bcm2835-system-timer", 1},
- {"brcm,bcm2835-system-timer", 1},
- {NULL, 0}
-};
-
-static struct bcm_systimer_softc *bcm_systimer_sc = NULL;
-
-/* Read/Write macros for Timer used as timecounter */
-#define bcm_systimer_tc_read_4(reg) \
- bus_space_read_4(bcm_systimer_sc->bst, \
- bcm_systimer_sc->bsh, reg)
-
-#define bcm_systimer_tc_write_4(reg, val) \
- bus_space_write_4(bcm_systimer_sc->bst, \
- bcm_systimer_sc->bsh, reg, val)
-
-static unsigned bcm_systimer_tc_get_timecount(struct timecounter *);
-
-static delay_func bcm_systimer_delay;
-
-static struct timecounter bcm_systimer_tc = {
- .tc_name = DEFAULT_TIMER_NAME,
- .tc_get_timecount = bcm_systimer_tc_get_timecount,
- .tc_poll_pps = NULL,
- .tc_counter_mask = ~0u,
- .tc_frequency = 0,
- .tc_quality = 1000,
-};
-
-static unsigned
-bcm_systimer_tc_get_timecount(struct timecounter *tc)
-{
- if (bcm_systimer_sc == NULL)
- return (0);
-
- return bcm_systimer_tc_read_4(SYSTIMER_CLO);
-}
-
-static int
-bcm_systimer_start(struct eventtimer *et, sbintime_t first, sbintime_t period)
-{
- struct systimer *st = et->et_priv;
- uint32_t clo, clo1;
- uint32_t count;
- register_t s;
-
- if (first != 0) {
- count = ((uint32_t)et->et_frequency * first) >> 32;
-
- s = intr_disable();
- clo = bcm_systimer_tc_read_4(SYSTIMER_CLO);
-restart:
- clo += count;
- /*
- * Clear pending interrupts
- */
- bcm_systimer_tc_write_4(SYSTIMER_CS, (1 << st->index));
- bcm_systimer_tc_write_4(SYSTIMER_C0 + st->index*4, clo);
- clo1 = bcm_systimer_tc_read_4(SYSTIMER_CLO);
- if ((int32_t)(clo1 - clo) >= 0) {
- count *= 2;
- clo = clo1;
- goto restart;
- }
- st->enabled = 1;
- intr_restore(s);
-
- return (0);
- }
-
- return (EINVAL);
-}
-
-static int
-bcm_systimer_stop(struct eventtimer *et)
-{
- struct systimer *st = et->et_priv;
- st->enabled = 0;
-
- return (0);
-}
-
-static int
-bcm_systimer_intr(void *arg)
-{
- struct systimer *st = (struct systimer *)arg;
- uint32_t cs;
-
- cs = bcm_systimer_tc_read_4(SYSTIMER_CS);
- if ((cs & (1 << st->index)) == 0)
- return (FILTER_STRAY);
-
- /* ACK interrupt */
- bcm_systimer_tc_write_4(SYSTIMER_CS, (1 << st->index));
- if (st->enabled) {
- if (st->et.et_active) {
- st->et.et_event_cb(&st->et, st->et.et_arg);
- }
- }
-
- return (FILTER_HANDLED);
-}
-
-static int
-bcm_systimer_probe(device_t dev)
-{
-
- if (!ofw_bus_status_okay(dev))
- return (ENXIO);
-
- if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
- return (ENXIO);
-
- return (BUS_PROBE_DEFAULT);
-}
-
-static int
-bcm_systimer_attach(device_t dev)
-{
- struct bcm_systimer_softc *sc = device_get_softc(dev);
- int err;
- int rid = 0;
-
- if (bcm_systimer_sc != NULL)
- return (EINVAL);
-
- sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);
- if (sc->mem_res == NULL) {
- device_printf(dev, "could not allocate memory resource\n");
- return (ENXIO);
- }
-
- sc->bst = rman_get_bustag(sc->mem_res);
- sc->bsh = rman_get_bushandle(sc->mem_res);
-
- /* Request the IRQ resources */
- err = bus_alloc_resources(dev, bcm_systimer_irq_spec,
- sc->irq_res);
- if (err) {
- device_printf(dev, "Error: could not allocate irq resources\n");
- return (ENXIO);
- }
-
- /* TODO: get frequency from FDT */
- sc->sysclk_freq = DEFAULT_FREQUENCY;
-
- /* Setup and enable the timer */
- if (bus_setup_intr(dev, sc->irq_res[DEFAULT_TIMER], INTR_TYPE_CLK,
- bcm_systimer_intr, NULL, &sc->st[DEFAULT_TIMER],
- &sc->intr_hl[DEFAULT_TIMER]) != 0) {
- bus_release_resources(dev, bcm_systimer_irq_spec,
- sc->irq_res);
- device_printf(dev, "Unable to setup the clock irq handler.\n");
- return (ENXIO);
- }
-
- sc->st[DEFAULT_TIMER].index = DEFAULT_TIMER;
- sc->st[DEFAULT_TIMER].enabled = 0;
- sc->st[DEFAULT_TIMER].et.et_name = DEFAULT_TIMER_NAME;
- sc->st[DEFAULT_TIMER].et.et_flags = ET_FLAGS_ONESHOT;
- sc->st[DEFAULT_TIMER].et.et_quality = 1000;
- sc->st[DEFAULT_TIMER].et.et_frequency = sc->sysclk_freq;
- sc->st[DEFAULT_TIMER].et.et_min_period =
- (MIN_PERIOD << 32) / sc->st[DEFAULT_TIMER].et.et_frequency + 1;
- sc->st[DEFAULT_TIMER].et.et_max_period =
- (0x7ffffffeLLU << 32) / sc->st[DEFAULT_TIMER].et.et_frequency;
- sc->st[DEFAULT_TIMER].et.et_start = bcm_systimer_start;
- sc->st[DEFAULT_TIMER].et.et_stop = bcm_systimer_stop;
- sc->st[DEFAULT_TIMER].et.et_priv = &sc->st[DEFAULT_TIMER];
- et_register(&sc->st[DEFAULT_TIMER].et);
-
- bcm_systimer_sc = sc;
-
- if (device_get_unit(dev) == 0)
- arm_set_delay(bcm_systimer_delay, sc);
-
- bcm_systimer_tc.tc_frequency = DEFAULT_FREQUENCY;
- tc_init(&bcm_systimer_tc);
-
- return (0);
-}
-
-static device_method_t bcm_systimer_methods[] = {
- DEVMETHOD(device_probe, bcm_systimer_probe),
- DEVMETHOD(device_attach, bcm_systimer_attach),
- { 0, 0 }
-};
-
-static driver_t bcm_systimer_driver = {
- "systimer",
- bcm_systimer_methods,
- sizeof(struct bcm_systimer_softc),
-};
-
-DRIVER_MODULE(bcm_systimer, simplebus, bcm_systimer_driver, 0, 0);
-
-static void
-bcm_systimer_delay(int usec, void *arg)
-{
- int32_t counts;
- uint32_t first, last;
-
- /* Get the number of times to count */
- counts = usec * (bcm_systimer_tc.tc_frequency / 1000000) + 1;
-
- first = bcm_systimer_tc_read_4(SYSTIMER_CLO);
-
- while (counts > 0) {
- last = bcm_systimer_tc_read_4(SYSTIMER_CLO);
- if (last == first)
- continue;
- if (last>first) {
- counts -= (int32_t)(last - first);
- } else {
- counts -= (int32_t)((0xFFFFFFFF - first) + last);
- }
- first = last;
- }
-}
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_vcbus.c b/sys/arm/broadcom/bcm2835/bcm2835_vcbus.c
index 7e5033f032c4..88b54467e0c8 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_vcbus.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_vcbus.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2019 Kyle Evans <kevans@FreeBSD.org>
*
@@ -23,13 +23,9 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
/*
* This file contains facilities for runtime determination of address space
* mappings for use in DMA/mailbox interactions. This is only used for the
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_vcbus.h b/sys/arm/broadcom/bcm2835/bcm2835_vcbus.h
index 77b408311e61..54180d644725 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_vcbus.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_vcbus.h
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
* All rights reserved.
@@ -24,8 +24,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
/*
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_vcio.c b/sys/arm/broadcom/bcm2835/bcm2835_vcio.c
index 40fb4e0ad8ee..d581c541ff73 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_vcio.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_vcio.c
@@ -22,8 +22,6 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_wdog.c b/sys/arm/broadcom/bcm2835/bcm2835_wdog.c
index bfc934ccd5ec..80cf22548791 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_wdog.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_wdog.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Alexander Rybalko <ray@freebsd.org>
* All rights reserved.
@@ -25,8 +25,6 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/bus.h>
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_wdog.h b/sys/arm/broadcom/bcm2835/bcm2835_wdog.h
index 214991820fdc..5dba6c0e6e4e 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_wdog.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_wdog.h
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Alexander Rybalko <ray@freebsd.org>
* All rights reserved.
@@ -25,7 +25,6 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD$
*/
#ifndef _BCM2835_WDOG_H_
#define _BCM2835_WDOG_H_
diff --git a/sys/arm/broadcom/bcm2835/bcm2836.c b/sys/arm/broadcom/bcm2835/bcm2836.c
index 50759cd45b6f..7ed9dedaa77e 100644
--- a/sys/arm/broadcom/bcm2835/bcm2836.c
+++ b/sys/arm/broadcom/bcm2835/bcm2836.c
@@ -27,8 +27,6 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include "opt_platform.h"
#include <sys/param.h>
@@ -369,7 +367,7 @@ bcm_lintc_ipi_dispatch(struct bcm_lintc_softc *sc, u_int cpu,
#else
dsb();
#endif
- intr_ipi_dispatch(ipi, tf);
+ intr_ipi_dispatch(ipi);
}
}
#endif
@@ -540,7 +538,7 @@ bcm_lintc_init_pmu_on_ap(struct bcm_lintc_softc *sc, u_int cpu)
}
static void
-bcm_lintc_init_secondary(device_t dev)
+bcm_lintc_init_secondary(device_t dev, uint32_t rootnum)
{
u_int cpu;
struct bcm_lintc_softc *sc;
@@ -648,7 +646,18 @@ bcm_lintc_pic_attach(struct bcm_lintc_softc *sc)
if (pic == NULL)
return (ENXIO);
- return (intr_pic_claim_root(sc->bls_dev, xref, bcm_lintc_intr, sc, 0));
+ error = intr_pic_claim_root(sc->bls_dev, xref, bcm_lintc_intr, sc,
+ INTR_ROOT_IRQ);
+ if (error != 0)
+ return (error);
+
+#ifdef SMP
+ error = intr_ipi_pic_register(sc->bls_dev, 0);
+ if (error != 0)
+ return (error);
+#endif
+
+ return (0);
}
static int
diff --git a/sys/arm/broadcom/bcm2835/bcm2836_mp.c b/sys/arm/broadcom/bcm2835/bcm2836_mp.c
index 0f2565a2e8ae..c9b5599a4162 100644
--- a/sys/arm/broadcom/bcm2835/bcm2836_mp.c
+++ b/sys/arm/broadcom/bcm2835/bcm2836_mp.c
@@ -28,9 +28,6 @@
*
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
diff --git a/sys/arm/broadcom/bcm2835/bcm2836_mp.h b/sys/arm/broadcom/bcm2835/bcm2836_mp.h
index 5f9ac8179f24..a175806d20b9 100644
--- a/sys/arm/broadcom/bcm2835/bcm2836_mp.h
+++ b/sys/arm/broadcom/bcm2835/bcm2836_mp.h
@@ -24,8 +24,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
#ifndef _BCM2836_MP_H_
diff --git a/sys/arm/broadcom/bcm2835/bcm2838_pci.c b/sys/arm/broadcom/bcm2835/bcm2838_pci.c
index c30eb73fc1b0..2b2ad1e3bdf8 100644
--- a/sys/arm/broadcom/bcm2835/bcm2838_pci.c
+++ b/sys/arm/broadcom/bcm2835/bcm2838_pci.c
@@ -16,8 +16,6 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*
- * $FreeBSD$
- *
*/
/*
@@ -27,9 +25,6 @@
* this driver is taken from the Raspberry Pi 4 Broadcom 2838 chip.
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/endian.h>
@@ -65,7 +60,7 @@ __FBSDID("$FreeBSD$");
#define REG_BRIDGE_CTRL 0x9210
#define BRIDGE_DISABLE_FLAG 0x1
#define BRIDGE_RESET_FLAG 0x2
-#define REG_BRIDGE_SERDES_MODE 0x4204
+#define REG_PCIE_HARD_DEBUG 0x4204
#define REG_DMA_CONFIG 0x4008
#define REG_DMA_WINDOW_LOW 0x4034
#define REG_DMA_WINDOW_HIGH 0x4038
@@ -91,6 +86,9 @@ __FBSDID("$FreeBSD$");
#define REG_EP_CONFIG_CHOICE 0x9000
#define REG_EP_CONFIG_DATA 0x8000
+#define L1SS_ENABLE 0x00200000
+#define CLKREQ_ENABLE 0x2
+
/*
* The system memory controller can address up to 16 GiB of physical memory
* (although at time of writing the largest memory size available for purchase
@@ -168,16 +166,14 @@ static void
bcm_pcib_set_reg(struct bcm_pcib_softc *sc, uint32_t reg, uint32_t val)
{
- bus_space_write_4(sc->base.base.bst, sc->base.base.bsh, reg,
- htole32(val));
+ bus_write_4(sc->base.base.res, reg, htole32(val));
}
static uint32_t
bcm_pcib_read_reg(struct bcm_pcib_softc *sc, uint32_t reg)
{
- return (le32toh(bus_space_read_4(sc->base.base.bst, sc->base.base.bsh,
- reg)));
+ return (le32toh(bus_read_4(sc->base.base.res, reg)));
}
static void
@@ -197,7 +193,7 @@ bcm_pcib_reset_controller(struct bcm_pcib_softc *sc)
DELAY(100);
- bcm_pcib_set_reg(sc, REG_BRIDGE_SERDES_MODE, 0);
+ bcm_pcib_set_reg(sc, REG_PCIE_HARD_DEBUG, 0);
DELAY(100);
}
@@ -318,8 +314,6 @@ bcm_pcib_read_config(device_t dev, u_int bus, u_int slot, u_int func, u_int reg,
int bytes)
{
struct bcm_pcib_softc *sc;
- bus_space_handle_t h;
- bus_space_tag_t t;
bus_addr_t offset;
uint32_t data;
@@ -330,18 +324,15 @@ bcm_pcib_read_config(device_t dev, u_int bus, u_int slot, u_int func, u_int reg,
mtx_lock(&sc->config_mtx);
offset = bcm_get_offset_and_prepare_config(sc, bus, slot, func, reg);
- t = sc->base.base.bst;
- h = sc->base.base.bsh;
-
switch (bytes) {
case 1:
- data = bus_space_read_1(t, h, offset);
+ data = bus_read_1(sc->base.base.res, offset);
break;
case 2:
- data = le16toh(bus_space_read_2(t, h, offset));
+ data = le16toh(bus_read_2(sc->base.base.res, offset));
break;
case 4:
- data = le32toh(bus_space_read_4(t, h, offset));
+ data = le32toh(bus_read_4(sc->base.base.res, offset));
break;
default:
data = ~0U;
@@ -357,8 +348,6 @@ bcm_pcib_write_config(device_t dev, u_int bus, u_int slot,
u_int func, u_int reg, uint32_t val, int bytes)
{
struct bcm_pcib_softc *sc;
- bus_space_handle_t h;
- bus_space_tag_t t;
uint32_t offset;
sc = device_get_softc(dev);
@@ -368,18 +357,15 @@ bcm_pcib_write_config(device_t dev, u_int bus, u_int slot,
mtx_lock(&sc->config_mtx);
offset = bcm_get_offset_and_prepare_config(sc, bus, slot, func, reg);
- t = sc->base.base.bst;
- h = sc->base.base.bsh;
-
switch (bytes) {
case 1:
- bus_space_write_1(t, h, offset, val);
+ bus_write_1(sc->base.base.res, offset, val);
break;
case 2:
- bus_space_write_2(t, h, offset, htole16(val));
+ bus_write_2(sc->base.base.res, offset, htole16(val));
break;
case 4:
- bus_space_write_4(t, h, offset, htole32(val));
+ bus_write_4(sc->base.base.res, offset, htole32(val));
break;
default:
break;
@@ -630,7 +616,7 @@ bcm_pcib_attach(device_t dev)
struct bcm_pcib_softc *sc;
pci_addr_t phys_base, pci_base;
bus_size_t size;
- uint32_t hardware_rev, bridge_state, link_state;
+ uint32_t hardware_rev, bridge_state, link_state, tmp;
int error, tries;
sc = device_get_softc(dev);
@@ -736,7 +722,18 @@ bcm_pcib_attach(device_t dev)
bcm_pcib_set_reg(sc, PCI_ID_VAL3,
PCIC_BRIDGE << CLASS_SHIFT | PCIS_BRIDGE_PCI << SUBCLASS_SHIFT);
- bcm_pcib_set_reg(sc, REG_BRIDGE_SERDES_MODE, 0x2);
+ tmp = bcm_pcib_read_reg(sc, REG_PCIE_HARD_DEBUG);
+ tmp |= CLKREQ_ENABLE;
+
+ if (ofw_bus_has_prop(dev, "brcm,enable-l1ss")) {
+ if (bootverbose)
+ device_printf(dev, "note: enabling L1SS due to OF "
+ "property brcm,enable-l1ss\n");
+
+ tmp |= L1SS_ENABLE;
+ }
+
+ bcm_pcib_set_reg(sc, REG_PCIE_HARD_DEBUG, tmp);
DELAY(100);
bcm_pcib_relocate_bridge_window(dev);
@@ -747,8 +744,9 @@ bcm_pcib_attach(device_t dev)
return (error);
/* Done. */
- device_add_child(dev, "pci", -1);
- return (bus_generic_attach(dev));
+ device_add_child(dev, "pci", DEVICE_UNIT_ANY);
+ bus_attach_children(dev);
+ return (0);
}
/*
diff --git a/sys/arm/broadcom/bcm2835/bcm2838_xhci.c b/sys/arm/broadcom/bcm2835/bcm2838_xhci.c
index 7c389771853d..25579d7227a5 100644
--- a/sys/arm/broadcom/bcm2835/bcm2838_xhci.c
+++ b/sys/arm/broadcom/bcm2835/bcm2838_xhci.c
@@ -16,8 +16,6 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*
- * $FreeBSD$
- *
*/
/*
@@ -30,8 +28,6 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/stdint.h>
#include <sys/stddef.h>
#include <sys/param.h>
@@ -216,3 +212,5 @@ DEFINE_CLASS_1(bcm_xhci, bcm_xhci_driver, bcm_xhci_methods,
DRIVER_MODULE(bcm_xhci, pci, bcm_xhci_driver, 0, 0);
MODULE_DEPEND(bcm_xhci, usb, 1, 1, 1);
+MODULE_DEPEND(bcm_xhci, pci, 1, 1, 1);
+MODULE_DEPEND(bcm_xhci, xhci, 1, 1, 1);
diff --git a/sys/arm/broadcom/bcm2835/bcm283x_dwc_fdt.c b/sys/arm/broadcom/bcm2835/bcm283x_dwc_fdt.c
index 1d995c38730c..056a388d1d77 100644
--- a/sys/arm/broadcom/bcm2835/bcm283x_dwc_fdt.c
+++ b/sys/arm/broadcom/bcm2835/bcm283x_dwc_fdt.c
@@ -25,9 +25,6 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/bus.h>
diff --git a/sys/arm/broadcom/bcm2835/files.bcm2835 b/sys/arm/broadcom/bcm2835/files.bcm2835
deleted file mode 100644
index 729379066d4c..000000000000
--- a/sys/arm/broadcom/bcm2835/files.bcm2835
+++ /dev/null
@@ -1,3 +0,0 @@
-# $FreeBSD$
-
-arm/broadcom/bcm2835/bcm2835_systimer.c standard
diff --git a/sys/arm/broadcom/bcm2835/files.bcm2836 b/sys/arm/broadcom/bcm2835/files.bcm2836
index 43b6b6c25c2d..5d222d530a79 100644
--- a/sys/arm/broadcom/bcm2835/files.bcm2836
+++ b/sys/arm/broadcom/bcm2835/files.bcm2836
@@ -1,4 +1,3 @@
-# $FreeBSD$
arm/broadcom/bcm2835/bcm2836.c standard
arm/broadcom/bcm2835/bcm2836_mp.c optional smp
diff --git a/sys/arm/broadcom/bcm2835/files.bcm283x b/sys/arm/broadcom/bcm2835/files.bcm283x
index 0af397566c17..44976f34d35a 100644
--- a/sys/arm/broadcom/bcm2835/files.bcm283x
+++ b/sys/arm/broadcom/bcm2835/files.bcm283x
@@ -1,4 +1,3 @@
-# $FreeBSD$
arm/broadcom/bcm2835/bcm2835_bsc.c optional bcm2835_bsc
arm/broadcom/bcm2835/bcm2835_cpufreq.c standard
diff --git a/sys/arm/broadcom/bcm2835/raspberrypi_gpio.c b/sys/arm/broadcom/bcm2835/raspberrypi_gpio.c
index d2d1fec770c3..b286654c6f18 100644
--- a/sys/arm/broadcom/bcm2835/raspberrypi_gpio.c
+++ b/sys/arm/broadcom/bcm2835/raspberrypi_gpio.c
@@ -1,5 +1,5 @@
/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@FreeBSD.org>
* Copyright (c) 2012-2015 Luiz Otavio O Souza <loos@FreeBSD.org>
@@ -28,8 +28,6 @@
*
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include "opt_platform.h"
#include <sys/param.h>
@@ -406,10 +404,11 @@ rpi_fw_gpio_attach(device_t dev)
}
}
free(names, M_OFWPROP);
- sc->sc_busdev = gpiobus_attach_bus(dev);
+ sc->sc_busdev = gpiobus_add_bus(dev);
if (sc->sc_busdev == NULL)
goto fail;
+ bus_attach_children(dev);
return (0);
fail:
diff --git a/sys/arm/broadcom/bcm2835/std.bcm2835 b/sys/arm/broadcom/bcm2835/std.bcm2835
deleted file mode 100644
index 08e9d763bc8f..000000000000
--- a/sys/arm/broadcom/bcm2835/std.bcm2835
+++ /dev/null
@@ -1,10 +0,0 @@
-# $FreeBSD$
-
-machine arm armv6
-cpu CPU_ARM1176
-makeoptions CONF_CFLAGS="-mcpu=arm1176jzf-s"
-options SOC_BCM2835
-
-files "../broadcom/bcm2835/files.bcm2835"
-files "../broadcom/bcm2835/files.bcm283x"
-
diff --git a/sys/arm/broadcom/bcm2835/std.bcm2836 b/sys/arm/broadcom/bcm2835/std.bcm2836
index ffcc562f8436..a66e46131d41 100644
--- a/sys/arm/broadcom/bcm2835/std.bcm2836
+++ b/sys/arm/broadcom/bcm2835/std.bcm2836
@@ -1,4 +1,3 @@
-# $FreeBSD$
machine arm armv7
cpu CPU_CORTEXA
diff --git a/sys/arm/broadcom/bcm2835/std.rpi b/sys/arm/broadcom/bcm2835/std.rpi
index 48593c117c59..54d5ffb8618b 100644
--- a/sys/arm/broadcom/bcm2835/std.rpi
+++ b/sys/arm/broadcom/bcm2835/std.rpi
@@ -1,3 +1,2 @@
-# $FreeBSD$
options LINUX_BOOT_ABI
diff --git a/sys/arm/broadcom/bcm2835/vc_vchi_audioserv_defs.h b/sys/arm/broadcom/bcm2835/vc_vchi_audioserv_defs.h
index 143c54385916..896e706ff492 100644
--- a/sys/arm/broadcom/bcm2835/vc_vchi_audioserv_defs.h
+++ b/sys/arm/broadcom/bcm2835/vc_vchi_audioserv_defs.h
@@ -23,8 +23,6 @@
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
*/
#ifndef _VC_AUDIO_DEFS_H_