svn commit: r307068 - head/sys/arm/broadcom/bcm2835

Oleksandr Tymoshenko gonzo at FreeBSD.org
Tue Oct 11 21:40:17 UTC 2016


Author: gonzo
Date: Tue Oct 11 21:40:15 2016
New Revision: 307068
URL: https://svnweb.freebsd.org/changeset/base/307068

Log:
  Make Rapsberry Pi watchdog driver compatible with upstream DTS
  
  - Fix compatibility strings
  - Compensate the difference in base address for our custom DTS and
      upstream one (for backward compatibility)

Modified:
  head/sys/arm/broadcom/bcm2835/bcm2835_wdog.c

Modified: head/sys/arm/broadcom/bcm2835/bcm2835_wdog.c
==============================================================================
--- head/sys/arm/broadcom/bcm2835/bcm2835_wdog.c	Tue Oct 11 21:37:34 2016	(r307067)
+++ head/sys/arm/broadcom/bcm2835/bcm2835_wdog.c	Tue Oct 11 21:40:15 2016	(r307068)
@@ -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);


More information about the svn-src-all mailing list