svn commit: r299862 - head/sys/arm/allwinner

Jared McNeill jmcneill at FreeBSD.org
Sun May 15 16:43:48 UTC 2016


Author: jmcneill
Date: Sun May 15 16:43:47 2016
New Revision: 299862
URL: https://svnweb.freebsd.org/changeset/base/299862

Log:
  Reduce complexity of RSB by always using polling mode. Unfortunately
  gpiobus methods can be called with non-sleepable locks held.
  
  Reviewed by:	mmel

Modified:
  head/sys/arm/allwinner/aw_rsb.c
  head/sys/arm/allwinner/axp81x.c

Modified: head/sys/arm/allwinner/aw_rsb.c
==============================================================================
--- head/sys/arm/allwinner/aw_rsb.c	Sun May 15 15:56:48 2016	(r299861)
+++ head/sys/arm/allwinner/aw_rsb.c	Sun May 15 16:43:47 2016	(r299862)
@@ -38,7 +38,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/kernel.h>
-#include <sys/proc.h>
 #include <sys/module.h>
 #include <machine/bus.h>
 
@@ -100,7 +99,6 @@ static struct ofw_compat_data compat_dat
 
 static struct resource_spec rsb_spec[] = {
 	{ SYS_RES_MEMORY,	0,	RF_ACTIVE },
-	{ SYS_RES_IRQ,		0,	RF_ACTIVE },
 	{ -1, 0 }
 };
 
@@ -125,12 +123,11 @@ static const struct {
 };
 
 struct rsb_softc {
-	struct resource	*res[2];
+	struct resource	*res;
 	struct mtx	mtx;
 	clk_t		clk;
 	hwreset_t	rst;
 	device_t	iicbus;
-	void		*ih;
 	int		busy;
 	uint32_t	status;
 	uint16_t	cur_addr;
@@ -141,8 +138,8 @@ struct rsb_softc {
 #define	RSB_LOCK(sc)			mtx_lock(&(sc)->mtx)
 #define	RSB_UNLOCK(sc)			mtx_unlock(&(sc)->mtx)
 #define	RSB_ASSERT_LOCKED(sc)		mtx_assert(&(sc)->mtx, MA_OWNED)
-#define	RSB_READ(sc, reg)		bus_read_4((sc)->res[0], (reg))
-#define	RSB_WRITE(sc, reg, val)	bus_write_4((sc)->res[0], (reg), (val))
+#define	RSB_READ(sc, reg)		bus_read_4((sc)->res, (reg))
+#define	RSB_WRITE(sc, reg, val)	bus_write_4((sc)->res, (reg), (val))
 
 static phandle_t
 rsb_get_node(device_t bus, device_t dev)
@@ -202,34 +199,24 @@ static int
 rsb_start(device_t dev)
 {
 	struct rsb_softc *sc;
-	int error, retry, polling;
+	int error, retry;
 
 	sc = device_get_softc(dev);
-	polling = cold || !THREAD_CAN_SLEEP();
 
 	RSB_ASSERT_LOCKED(sc);
 
-	/* Enable interrupts */
-	if (!polling)
-		RSB_WRITE(sc, RSB_INTE, INT_MASK);
-
 	/* Start the transfer */
 	RSB_WRITE(sc, RSB_CTRL, GLOBAL_INT_ENB | START_TRANS);
 
 	/* Wait for transfer to complete */
-	if (polling) {
-		error = ETIMEDOUT;
-		for (retry = RSB_I2C_TIMEOUT; retry > 0; retry--) {
-			sc->status |= RSB_READ(sc, RSB_INTS);
-			if ((sc->status & INT_TRANS_OVER) != 0) {
-				error = 0;
-				break;
-			}
-			DELAY((1000 * hz) / RSB_I2C_TIMEOUT);
+	error = ETIMEDOUT;
+	for (retry = RSB_I2C_TIMEOUT; retry > 0; retry--) {
+		sc->status |= RSB_READ(sc, RSB_INTS);
+		if ((sc->status & INT_TRANS_OVER) != 0) {
+			error = 0;
+			break;
 		}
-	} else {
-		error = mtx_sleep(sc, &sc->mtx, 0, "i2ciowait",
-		    RSB_I2C_TIMEOUT);
+		DELAY((1000 * hz) / RSB_I2C_TIMEOUT);
 	}
 	if (error == 0 && (sc->status & INT_TRANS_OVER) == 0) {
 		device_printf(dev, "transfer error, status 0x%08x\n",
@@ -237,9 +224,6 @@ rsb_start(device_t dev)
 		error = EIO;
 	}
 
-	/* Disable interrupts */
-	RSB_WRITE(sc, RSB_INTE, 0);
-
 	return (error);
 
 }
@@ -389,23 +373,6 @@ done:
 	return (error);
 }
 
-static void
-rsb_intr(void *arg)
-{
-	struct rsb_softc *sc;
-	uint32_t val;
-
-	sc = arg;
-
-	RSB_LOCK(sc);
-	val = RSB_READ(sc, RSB_INTS);
-	RSB_WRITE(sc, RSB_INTS, val);
-	sc->status |= val;
-	if ((sc->status & INT_MASK) != 0)
-		wakeup(sc);
-	RSB_UNLOCK(sc);
-}
-
 static int
 rsb_probe(device_t dev)
 {
@@ -443,19 +410,12 @@ rsb_attach(device_t dev)
 		}
 	}
 
-	if (bus_alloc_resources(dev, rsb_spec, sc->res) != 0) {
+	if (bus_alloc_resources(dev, rsb_spec, &sc->res) != 0) {
 		device_printf(dev, "cannot allocate resources for device\n");
 		error = ENXIO;
 		goto fail;
 	}
 
-	error = bus_setup_intr(dev, sc->res[1], INTR_TYPE_MISC | INTR_MPSAFE,
-	    NULL, rsb_intr, sc, &sc->ih);
-	if (error != 0) {
-		device_printf(dev, "cannot setup interrupt handler\n");
-		goto fail;
-	}
-
 	sc->iicbus = device_add_child(dev, "iicbus", -1);
 	if (sc->iicbus == NULL) {
 		device_printf(dev, "cannot add iicbus child device\n");
@@ -468,9 +428,7 @@ rsb_attach(device_t dev)
 	return (0);
 
 fail:
-	if (sc->ih != NULL)
-		bus_teardown_intr(dev, sc->res[1], sc->ih);
-	bus_release_resources(dev, rsb_spec, sc->res);
+	bus_release_resources(dev, rsb_spec, &sc->res);
 	if (sc->rst != NULL)
 		hwreset_release(sc->rst);
 	if (sc->clk != NULL)

Modified: head/sys/arm/allwinner/axp81x.c
==============================================================================
--- head/sys/arm/allwinner/axp81x.c	Sun May 15 15:56:48 2016	(r299861)
+++ head/sys/arm/allwinner/axp81x.c	Sun May 15 16:43:47 2016	(r299862)
@@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/rman.h>
 #include <sys/kernel.h>
 #include <sys/reboot.h>
-#include <sys/proc.h>
 #include <sys/gpio.h>
 #include <sys/module.h>
 #include <machine/bus.h>
@@ -246,7 +245,6 @@ axp81x_gpio_pin_getflags(device_t dev, u
 	sc = device_get_softc(dev);
 
 	AXP_LOCK(sc);
-	THREAD_SLEEPING_OK();
 	error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1);
 	if (error == 0) {
 		func = (data & AXP_GPIO_FUNC) >> AXP_GPIO_FUNC_SHIFT;
@@ -258,7 +256,6 @@ axp81x_gpio_pin_getflags(device_t dev, u
 		else
 			*flags = 0;
 	}
-	THREAD_NO_SLEEPING();
 	AXP_UNLOCK(sc);
 
 	return (error);
@@ -277,7 +274,6 @@ axp81x_gpio_pin_setflags(device_t dev, u
 	sc = device_get_softc(dev);
 
 	AXP_LOCK(sc);
-	THREAD_SLEEPING_OK();
 	error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1);
 	if (error == 0) {
 		data &= ~AXP_GPIO_FUNC;
@@ -287,7 +283,6 @@ axp81x_gpio_pin_setflags(device_t dev, u
 		}
 		error = axp81x_write(dev, axp81x_pins[pin].ctrl_reg, data);
 	}
-	THREAD_NO_SLEEPING();
 	AXP_UNLOCK(sc);
 
 	return (error);
@@ -306,7 +301,6 @@ axp81x_gpio_pin_get(device_t dev, uint32
 	sc = device_get_softc(dev);
 
 	AXP_LOCK(sc);
-	THREAD_SLEEPING_OK();
 	error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1);
 	if (error == 0) {
 		func = (data & AXP_GPIO_FUNC) >> AXP_GPIO_FUNC_SHIFT;
@@ -327,7 +321,6 @@ axp81x_gpio_pin_get(device_t dev, uint32
 			break;
 		}
 	}
-	THREAD_NO_SLEEPING();
 	AXP_UNLOCK(sc);
 
 	return (error);
@@ -346,7 +339,6 @@ axp81x_gpio_pin_set(device_t dev, uint32
 	sc = device_get_softc(dev);
 
 	AXP_LOCK(sc);
-	THREAD_SLEEPING_OK();
 	error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1);
 	if (error == 0) {
 		func = (data & AXP_GPIO_FUNC) >> AXP_GPIO_FUNC_SHIFT;
@@ -363,7 +355,6 @@ axp81x_gpio_pin_set(device_t dev, uint32
 	}
 	if (error == 0)
 		error = axp81x_write(dev, axp81x_pins[pin].ctrl_reg, data);
-	THREAD_NO_SLEEPING();
 	AXP_UNLOCK(sc);
 
 	return (error);
@@ -383,7 +374,6 @@ axp81x_gpio_pin_toggle(device_t dev, uin
 	sc = device_get_softc(dev);
 
 	AXP_LOCK(sc);
-	THREAD_SLEEPING_OK();
 	error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1);
 	if (error == 0) {
 		func = (data & AXP_GPIO_FUNC) >> AXP_GPIO_FUNC_SHIFT;
@@ -403,7 +393,6 @@ axp81x_gpio_pin_toggle(device_t dev, uin
 	}
 	if (error == 0)
 		error = axp81x_write(dev, axp81x_pins[pin].ctrl_reg, data);
-	THREAD_NO_SLEEPING();
 	AXP_UNLOCK(sc);
 
 	return (error);


More information about the svn-src-all mailing list