summaryrefslogtreecommitdiffstats
path: root/sys/mips
diff options
context:
space:
mode:
authorlandonf <landonf@FreeBSD.org>2016-06-04 19:39:05 +0000
committerlandonf <landonf@FreeBSD.org>2016-06-04 19:39:05 +0000
commit6ca5cb08dc00b533e51ef4dc6cd48b2c5ecab751 (patch)
treea2d6b5fff64d680b8b8691fbec1f8c3ed1b0906a /sys/mips
parent05a96f91516b68de58945e078d1b08834517db86 (diff)
downloadFreeBSD-src-6ca5cb08dc00b533e51ef4dc6cd48b2c5ecab751.zip
FreeBSD-src-6ca5cb08dc00b533e51ef4dc6cd48b2c5ecab751.tar.gz
bhnd(4): Add support for chipc-attached flash
This adds support for serial (via SPI) and parallel (via CFI) flash as found on BCM47xx/BCM53xx SoCs. Submitted by: Michael Zhilin <mizhka@gmail.com> Approved by: adrian (mentor) Differential Revision: https://reviews.freebsd.org/D6250
Diffstat (limited to 'sys/mips')
-rw-r--r--sys/mips/broadcom/uart_bus_chipc.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/sys/mips/broadcom/uart_bus_chipc.c b/sys/mips/broadcom/uart_bus_chipc.c
index fa2fa2d..29b84ec 100644
--- a/sys/mips/broadcom/uart_bus_chipc.c
+++ b/sys/mips/broadcom/uart_bus_chipc.c
@@ -45,9 +45,12 @@ __FBSDID("$FreeBSD$");
#include <dev/uart/uart_bus.h>
#include <dev/uart/uart_cpu.h>
+#include <dev/bhnd/cores/chipc/chipcvar.h>
+
#include "uart_if.h"
#include "bhnd_chipc_if.h"
+
static int uart_chipc_probe(device_t dev);
extern SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs;
@@ -55,9 +58,18 @@ extern SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs;
static void
uart_chipc_identify(driver_t *driver, device_t parent)
{
- struct chipc_capabilities *caps;
+ struct chipc_caps *caps;
- caps = BHND_CHIPC_GET_CAPABILITIES(parent);
+ if (device_find_child(parent, "uart", -1) != NULL)
+ return;
+
+ caps = BHND_CHIPC_GET_CAPS(parent);
+
+ if (caps == NULL) {
+ device_printf(parent, "error: can't retrieve ChipCommon "
+ "capabilities\n");
+ return;
+ }
if (caps->num_uarts == 0)
return;
@@ -74,6 +86,7 @@ uart_chipc_probe(device_t dev)
struct uart_softc *sc;
struct resource *res;
int rid;
+ int err;
rid = 0;
res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);
@@ -97,7 +110,11 @@ uart_chipc_probe(device_t dev)
sc->sc_bas.bst = sc->sc_sysdev->bas.bst;
sc->sc_bas.bsh = sc->sc_sysdev->bas.bsh;
- bus_release_resource(dev, SYS_RES_MEMORY, rid, res);
+ err = bus_release_resource(dev, SYS_RES_MEMORY, rid, res);
+ if (err) {
+ device_printf(dev, "can't release resource [%d]\n", rid);
+ return (ENXIO);
+ }
/* We use internal SoC clock generator with non-standart freq MHz */
return (uart_bus_probe(dev, 0, sc->sc_sysdev->bas.rclk, 0, 0));
OpenPOWER on IntegriCloud