svn commit: r307878 - in head/sys/arm: allwinner conf

Emmanuel Vadot manu at FreeBSD.org
Mon Oct 24 20:33:44 UTC 2016


Author: manu
Date: Mon Oct 24 20:33:42 2016
New Revision: 307878
URL: https://svnweb.freebsd.org/changeset/base/307878

Log:
  allwinner: Add support for P2WI in RSB driver
  
  Push-Pull Two Wire interface is a almost compatible iic like bus used
  in sun6i SoC. It's only use is to communicate with the power management IC.
  
  Reviewed by:	jmcneill
  MFC after:	1 week
  Relnotes:	yes

Modified:
  head/sys/arm/allwinner/aw_rsb.c
  head/sys/arm/allwinner/files.allwinner
  head/sys/arm/conf/GENERIC

Modified: head/sys/arm/allwinner/aw_rsb.c
==============================================================================
--- head/sys/arm/allwinner/aw_rsb.c	Mon Oct 24 19:24:07 2016	(r307877)
+++ head/sys/arm/allwinner/aw_rsb.c	Mon Oct 24 20:33:42 2016	(r307878)
@@ -27,7 +27,7 @@
  */
 
 /*
- * Allwinner RSB (Reduced Serial Bus)
+ * Allwinner RSB (Reduced Serial Bus) and P2WI (Push-Pull Two Wire Interface)
  */
 
 #include <sys/cdefs.h>
@@ -92,8 +92,12 @@ __FBSDID("$FreeBSD$");
 #define	RSB_ADDR_PMIC_SECONDARY	0x745
 #define	RSB_ADDR_PERIPH_IC	0xe89
 
+#define	A31_P2WI	1
+#define	A23_RSB		2
+
 static struct ofw_compat_data compat_data[] = {
-	{ "allwinner,sun8i-a23-rsb",		1 },
+	{ "allwinner,sun6i-a31-p2wi",		A31_P2WI },
+	{ "allwinner,sun8i-a23-rsb",		A23_RSB },
 	{ NULL,					0 }
 };
 
@@ -131,6 +135,7 @@ struct rsb_softc {
 	int		busy;
 	uint32_t	status;
 	uint16_t	cur_addr;
+	int		type;
 
 	struct iic_msg	*msg;
 };
@@ -270,8 +275,8 @@ rsb_transfer(device_t dev, struct iic_ms
 	sc = device_get_softc(dev);
 
 	/*
-	 * RSB is not really an I2C or SMBus controller, so there are some
-	 * restrictions imposed by the driver.
+	 * P2WI and RSB are not really I2C or SMBus controllers, so there are
+	 * some restrictions imposed by the driver.
 	 *
 	 * Transfers must contain exactly two messages. The first is always
 	 * a write, containing a single data byte offset. Data will either
@@ -284,34 +289,36 @@ rsb_transfer(device_t dev, struct iic_ms
 	    msgs[0].len != 1 || msgs[1].len > RSB_MAXLEN)
 		return (EINVAL);
 
-	/* The controller can read or write 1, 2, or 4 bytes at a time. */
-	if ((msgs[1].flags & IIC_M_RD) != 0) {
-		switch (msgs[1].len) {
-		case 1:
-			cmd = CMD_RD8;
-			break;
-		case 2:
-			cmd = CMD_RD16;
-			break;
-		case 4:
-			cmd = CMD_RD32;
-			break;
-		default:
-			return (EINVAL);
-		}
-	} else {
-		switch (msgs[1].len) {
-		case 1:
-			cmd = CMD_WR8;
-			break;
-		case 2:
-			cmd = CMD_WR16;
-			break;
-		case 4:	
-			cmd = CMD_WR32;
-			break;
-		default:
-			return (EINVAL);
+	/* The RSB controller can read or write 1, 2, or 4 bytes at a time. */
+	if (sc->type == A23_RSB) {
+		if ((msgs[1].flags & IIC_M_RD) != 0) {
+			switch (msgs[1].len) {
+			case 1:
+				cmd = CMD_RD8;
+				break;
+			case 2:
+				cmd = CMD_RD16;
+				break;
+			case 4:
+				cmd = CMD_RD32;
+				break;
+			default:
+				return (EINVAL);
+			}
+		} else {
+			switch (msgs[1].len) {
+			case 1:
+				cmd = CMD_WR8;
+				break;
+			case 2:
+				cmd = CMD_WR16;
+				break;
+			case 4:
+				cmd = CMD_WR32;
+				break;
+			default:
+				return (EINVAL);
+			}
 		}
 	}
 
@@ -322,13 +329,15 @@ rsb_transfer(device_t dev, struct iic_ms
 	sc->status = 0;
 
 	/* Select current run-time address if necessary */
-	device_addr = msgs[0].slave >> 1;
-	if (sc->cur_addr != device_addr) {
-		error = rsb_set_rta(dev, device_addr);
-		if (error != 0)
-			goto done;
-		sc->cur_addr = device_addr;
-		sc->status = 0;
+	if (sc->type == A23_RSB) {
+		device_addr = msgs[0].slave >> 1;
+		if (sc->cur_addr != device_addr) {
+			error = rsb_set_rta(dev, device_addr);
+			if (error != 0)
+				goto done;
+			sc->cur_addr = device_addr;
+			sc->status = 0;
+		}
 	}
 
 	/* Clear interrupt status */
@@ -344,8 +353,9 @@ rsb_transfer(device_t dev, struct iic_ms
 		RSB_WRITE(sc, RSB_DATA0, data[0]);
 	}
 
-	/* Set command type */
-	RSB_WRITE(sc, RSB_CMD, cmd);
+	/* Set command type for RSB */
+	if (sc->type == A23_RSB)
+		RSB_WRITE(sc, RSB_CMD, cmd);
 
 	/* Program data length register and transfer direction */
 	dlen = msgs[0].len - 1;
@@ -379,10 +389,17 @@ rsb_probe(device_t dev)
 	if (!ofw_bus_status_okay(dev))
 		return (ENXIO);
 
-	if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
+	switch (ofw_bus_search_compatible(dev, compat_data)->ocd_data) {
+	case A23_RSB:
+		device_set_desc(dev, "Allwinner RSB");
+		break;
+	case A31_P2WI:
+		device_set_desc(dev, "Allwinner P2WI");
+		break;
+	default:
 		return (ENXIO);
+	}
 
-	device_set_desc(dev, "Allwinner RSB");
 	return (BUS_PROBE_DEFAULT);
 }
 
@@ -395,6 +412,8 @@ rsb_attach(device_t dev)
 	sc = device_get_softc(dev);
 	mtx_init(&sc->mtx, device_get_nameunit(dev), "rsb", MTX_DEF);
 
+	sc->type = ofw_bus_search_compatible(dev, compat_data)->ocd_data;
+
 	if (clk_get_by_ofw_index(dev, 0, 0, &sc->clk) == 0) {
 		error = clk_enable(sc->clk);
 		if (error != 0) {

Modified: head/sys/arm/allwinner/files.allwinner
==============================================================================
--- head/sys/arm/allwinner/files.allwinner	Mon Oct 24 19:24:07 2016	(r307877)
+++ head/sys/arm/allwinner/files.allwinner	Mon Oct 24 20:33:42 2016	(r307878)
@@ -12,7 +12,7 @@ arm/allwinner/a10_mmc.c			optional	mmc
 arm/allwinner/a10_sramc.c		standard
 arm/allwinner/aw_nmi.c			optional	intrng
 arm/allwinner/aw_if_dwc.c		optional	dwc
-arm/allwinner/aw_rsb.c			optional	rsb
+arm/allwinner/aw_rsb.c			optional	rsb | p2wi
 arm/allwinner/aw_rtc.c			standard
 arm/allwinner/aw_ts.c			standard
 arm/allwinner/aw_wdog.c			standard

Modified: head/sys/arm/conf/GENERIC
==============================================================================
--- head/sys/arm/conf/GENERIC	Mon Oct 24 19:24:07 2016	(r307877)
+++ head/sys/arm/conf/GENERIC	Mon Oct 24 20:33:42 2016	(r307878)
@@ -106,7 +106,8 @@ device		psci
 device		iicbus
 device		iic
 device		twsi
-device		rsb
+device		rsb			# Allwinner Reduced Serial Bus
+device		p2wi			# Allwinner Push-Pull Two Wire
 device		axp209			# AXP209 Power Management Unit
 device		axp81x			# AXP813/818 Power Management Unit
 device		bcm2835_bsc


More information about the svn-src-head mailing list