Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 31 May 2014 14:27:50 +0000 (UTC)
From:      Luiz Otavio O Souza <loos@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r266922 - head/sys/dev/gpio
Message-ID:  <201405311427.s4VERoJd045189@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: loos
Date: Sat May 31 14:27:50 2014
New Revision: 266922
URL: http://svnweb.freebsd.org/changeset/base/266922

Log:
  Add a bounds verification to the SCL and SDA pin values.
  
  At attach, print the SCL and SDA pin numbers.
  
  Remove a stray blank line.
  
  Remove the GPIOBUS locking from gpioiic_reset(), it is already called with
  this lock held.  This fixes a crash when you try to scan the iicbus with
  i2c(8).

Modified:
  head/sys/dev/gpio/gpioiic.c

Modified: head/sys/dev/gpio/gpioiic.c
==============================================================================
--- head/sys/dev/gpio/gpioiic.c	Sat May 31 11:08:22 2014	(r266921)
+++ head/sys/dev/gpio/gpioiic.c	Sat May 31 14:27:50 2014	(r266922)
@@ -46,6 +46,8 @@ __FBSDID("$FreeBSD$");
 #include <dev/fdt/fdt_common.h>
 #endif
 
+#include <dev/gpio/gpiobusvar.h>
+
 #include <dev/iicbus/iiconf.h>
 #include <dev/iicbus/iicbus.h>
 
@@ -74,7 +76,6 @@ static int gpioiic_getsda(device_t);
 static int gpioiic_getscl(device_t);
 static int gpioiic_reset(device_t, u_char, u_char, u_char *);
 
-
 static int
 gpioiic_probe(device_t dev)
 {
@@ -91,13 +92,15 @@ gpioiic_probe(device_t dev)
 static int
 gpioiic_attach(device_t dev)
 {
-	struct gpioiic_softc	*sc = device_get_softc(dev);
 	device_t		bitbang;
 #ifdef FDT
 	phandle_t		node;
 	pcell_t			pin;
 #endif
+	struct gpiobus_ivar	*devi;
+	struct gpioiic_softc	*sc;
 
+	sc = device_get_softc(dev);
 	sc->sc_dev = dev;
 	sc->sc_busdev = device_get_parent(dev);
 	if (resource_int_value(device_get_name(dev),
@@ -116,6 +119,15 @@ gpioiic_attach(device_t dev)
 		sc->sda_pin = (int)pin;
 #endif
 
+	if (sc->scl_pin < 0 || sc->scl_pin > 1)
+		sc->scl_pin = SCL_PIN_DEFAULT;
+	if (sc->sda_pin < 0 || sc->sda_pin > 1)
+		sc->sda_pin = SDA_PIN_DEFAULT;
+
+	devi = GPIOBUS_IVAR(dev);
+	device_printf(dev, "SCL pin: %d, SDA pin: %d\n",
+	    devi->pins[sc->scl_pin], devi->pins[sc->sda_pin]);
+
 	/* add generic bit-banging code */
 	bitbang = device_add_child(dev, "iicbb", -1);
 	device_probe_and_attach(bitbang);
@@ -221,16 +233,11 @@ gpioiic_getsda(device_t dev)
 static int
 gpioiic_reset(device_t dev, u_char speed, u_char addr, u_char *oldaddr)
 {
-	struct gpioiic_softc		*sc = device_get_softc(dev);
-
-	GPIOBUS_LOCK_BUS(sc->sc_busdev);
-	GPIOBUS_ACQUIRE_BUS(sc->sc_busdev, sc->sc_dev);
+	struct gpioiic_softc		*sc;
 
+	sc = device_get_softc(dev);
 	gpioiic_reset_bus(sc->sc_dev);
 
-	GPIOBUS_RELEASE_BUS(sc->sc_busdev, sc->sc_dev);
-	GPIOBUS_UNLOCK_BUS(sc->sc_busdev);
-
 	return (IIC_ENOADDR);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405311427.s4VERoJd045189>