svn commit: r297684 - head/sys/arm/freescale/imx

Ian Lepore ian at FreeBSD.org
Thu Apr 7 19:51:28 UTC 2016


Author: ian
Date: Thu Apr  7 19:51:27 2016
New Revision: 297684
URL: https://svnweb.freebsd.org/changeset/base/297684

Log:
  Remove unecessary locking, mostly from places where a read is done of a
  value that can't ever be in an inconsistant intermediate state even when
  some other thread is in the middle of writing the value/register.
  
  Locking of the hardware remains in the few places that do r-m-w operations.
  Locking of metadata access is restricted to places using memcpy or sprintf
  to modify the metadata.

Modified:
  head/sys/arm/freescale/imx/imx_gpio.c

Modified: head/sys/arm/freescale/imx/imx_gpio.c
==============================================================================
--- head/sys/arm/freescale/imx/imx_gpio.c	Thu Apr  7 19:17:47 2016	(r297683)
+++ head/sys/arm/freescale/imx/imx_gpio.c	Thu Apr  7 19:51:27 2016	(r297684)
@@ -451,22 +451,27 @@ static void
 imx51_gpio_pin_configure(struct imx51_gpio_softc *sc, struct gpio_pin *pin,
     unsigned int flags)
 {
+	u_int newflags;
 
 	mtx_lock_spin(&sc->sc_mtx);
 
 	/*
-	 * Manage input/output
+	 * Manage input/output; other flags not supported yet.
+	 *
+	 * Note that changes to pin->gp_flags must be acccumulated in newflags
+	 * and stored with a single writeback to gp_flags at the end, to enable
+	 * unlocked reads of that value elsewhere.
 	 */
-	if (flags & (GPIO_PIN_INPUT|GPIO_PIN_OUTPUT)) {
-		pin->gp_flags &= ~(GPIO_PIN_INPUT|GPIO_PIN_OUTPUT);
+	if (flags & (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT)) {
+		newflags = pin->gp_flags & ~(GPIO_PIN_INPUT | GPIO_PIN_OUTPUT);
 		if (flags & GPIO_PIN_OUTPUT) {
-			pin->gp_flags |= GPIO_PIN_OUTPUT;
+			newflags |= GPIO_PIN_OUTPUT;
 			SET4(sc, IMX_GPIO_OE_REG, (1U << pin->gp_pin));
-		}
-		else {
-			pin->gp_flags |= GPIO_PIN_INPUT;
+		} else {
+			newflags |= GPIO_PIN_INPUT;
 			CLEAR4(sc, IMX_GPIO_OE_REG, (1U << pin->gp_pin));
 		}
+		pin->gp_flags = newflags;
 	}
 
 	mtx_unlock_spin(&sc->sc_mtx);
@@ -503,9 +508,7 @@ imx51_gpio_pin_getcaps(device_t dev, uin
 	if (pin >= sc->gpio_npins)
 		return (EINVAL);
 
-	mtx_lock_spin(&sc->sc_mtx);
 	*caps = sc->gpio_pins[pin].gp_caps;
-	mtx_unlock_spin(&sc->sc_mtx);
 
 	return (0);
 }
@@ -520,9 +523,7 @@ imx51_gpio_pin_getflags(device_t dev, ui
 	if (pin >= sc->gpio_npins)
 		return (EINVAL);
 
-	mtx_lock_spin(&sc->sc_mtx);
 	*flags = sc->gpio_pins[pin].gp_flags;
-	mtx_unlock_spin(&sc->sc_mtx);
 
 	return (0);
 }
@@ -588,9 +589,7 @@ imx51_gpio_pin_get(device_t dev, uint32_
 	if (pin >= sc->gpio_npins)
 		return (EINVAL);
 
-	mtx_lock_spin(&sc->sc_mtx);
 	*val = (READ4(sc, IMX_GPIO_DR_REG) >> pin) & 1;
-	mtx_unlock_spin(&sc->sc_mtx);
 
 	return (0);
 }


More information about the svn-src-all mailing list