Wed Dec 7 09:08:00 2011 UTC ()
consolidate bit twiddling functions into one generic case and a bunch of
macros, use them


(macallan)
diff -r1.6 -r1.7 src/sys/dev/pci/voyager.c
diff -r1.3 -r1.4 src/sys/dev/pci/voyagervar.h

cvs diff -r1.6 -r1.7 src/sys/dev/pci/voyager.c (expand / switch to context diff)
--- src/sys/dev/pci/voyager.c 2011/10/20 22:04:10 1.6
+++ src/sys/dev/pci/voyager.c 2011/12/07 09:08:00 1.7
@@ -1,4 +1,4 @@
-/*	$NetBSD: voyager.c,v 1.6 2011/10/20 22:04:10 macallan Exp $	*/
+/*	$NetBSD: voyager.c,v 1.7 2011/12/07 09:08:00 macallan Exp $	*/
 
 /*
  * Copyright (c) 2009, 2011 Michael Lorenz
@@ -26,7 +26,7 @@
  */
  
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: voyager.c,v 1.6 2011/10/20 22:04:10 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: voyager.c,v 1.7 2011/12/07 09:08:00 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -222,13 +222,20 @@
 	config_found_ia(sc->sc_dev, "voyagerbus", &vaa, voyager_print);
 	strcpy(vaa.vaa_name, "pwmclock");
 	config_found_ia(sc->sc_dev, "voyagerbus", &vaa, voyager_print);
+	strcpy(vaa.vaa_name, "vac");
+	config_found_ia(sc->sc_dev, "voyagerbus", &vaa, voyager_print);
 
+	/* we use this mutex wether there's an i2c bus or not */
+	mutex_init(&sc->sc_i2c_lock, MUTEX_DEFAULT, IPL_NONE);
+
+	/*
+	 * see if the i2c pins are configured as gpio and if so, use them
+	 * should probably be a compile time option
+	 */
 	reg = bus_space_read_4(sc->sc_memt, sc->sc_regh, SM502_GPIO0_CONTROL);
 	if ((reg & GPIO_I2C_BITS) == 0) {
 		/* both bits as outputs */
-		reg = bus_space_read_4(sc->sc_memt, sc->sc_regh, SM502_GPIO_DIR0);
-		reg |= GPIO_I2C_BITS;
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, SM502_GPIO_DIR0, reg);
+		voyager_gpio_dir(sc, 0xffffffff, GPIO_I2C_BITS);
 		
 		/* Fill in the i2c tag */
 		sc->sc_i2c.ic_cookie = sc;
@@ -240,10 +247,12 @@
 		sc->sc_i2c.ic_read_byte = voyager_i2c_read_byte;
 		sc->sc_i2c.ic_write_byte = voyager_i2c_write_byte;
 		sc->sc_i2c.ic_exec = NULL;
-		mutex_init(&sc->sc_i2c_lock, MUTEX_DEFAULT, IPL_NONE);
 		iba.iba_tag = &sc->sc_i2c;
 		config_found_ia(self, "i2cbus", &iba, iicbus_print);
 	}
+	voyager_control_gpio(sc, ~(1 << 16), 0);
+	voyager_gpio_dir(sc, 0xffffffff, 1 << 16);
+	voyager_write_gpio(sc, 0xffffffff, 1 << 16);
 }
 
 static int
@@ -354,34 +363,18 @@
 	return ret;
 }
 
-/* gpio stuff */
 void
-voyager_write_gpio(void *cookie, uint32_t mask, uint32_t bits)
+voyager_twiddle_bits(void *cookie, int regnum, uint32_t mask, uint32_t bits)
 {
 	struct voyager_softc *sc = cookie;
 	uint32_t reg;
 
 	/* don't interfere with i2c ops */
 	mutex_enter(&sc->sc_i2c_lock);
-	reg = bus_space_read_4(sc->sc_memt, sc->sc_regh, SM502_GPIO_DATA0);
+	reg = bus_space_read_4(sc->sc_memt, sc->sc_regh, regnum);
 	reg &= mask;
 	reg |= bits;
-	bus_space_write_4(sc->sc_memt, sc->sc_regh, SM502_GPIO_DATA0, reg);
-	mutex_exit(&sc->sc_i2c_lock);
-}
-
-void
-voyager_control_gpio(void *cookie, uint32_t mask, uint32_t bits)
-{
-	struct voyager_softc *sc = cookie;
-	uint32_t reg;
-
-	/* don't interfere with i2c ops */
-	mutex_enter(&sc->sc_i2c_lock);
-	reg = bus_space_read_4(sc->sc_memt, sc->sc_regh, SM502_GPIO0_CONTROL);
-	reg &= mask;
-	reg |= bits;
-	bus_space_write_4(sc->sc_memt, sc->sc_regh, SM502_GPIO0_CONTROL, reg);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, regnum, reg);
 	mutex_exit(&sc->sc_i2c_lock);
 }
 

cvs diff -r1.3 -r1.4 src/sys/dev/pci/voyagervar.h (expand / switch to context diff)
--- src/sys/dev/pci/voyagervar.h 2011/10/18 17:57:40 1.3
+++ src/sys/dev/pci/voyagervar.h 2011/12/07 09:08:00 1.4
@@ -1,4 +1,4 @@
-/*	$NetBSD: voyagervar.h,v 1.3 2011/10/18 17:57:40 macallan Exp $	*/
+/*	$NetBSD: voyagervar.h,v 1.4 2011/12/07 09:08:00 macallan Exp $	*/
 
 /*
  * Copyright (c) 2011 Michael Lorenz
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: voyagervar.h,v 1.3 2011/10/18 17:57:40 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: voyagervar.h,v 1.4 2011/12/07 09:08:00 macallan Exp $");
 
 #ifndef VOYAGERVAR_H
 #define VOYAGERVAR_H
@@ -45,10 +45,19 @@
 	char			vaa_name[32];
 };
 
+void voyager_twiddle_bits(void *, int, uint32_t, uint32_t);
+
 /* set gpio bits - (register & param1) | param2 */
-void voyager_write_gpio(void *, uint32_t, uint32_t);
+#define voyager_write_gpio(cookie, m_and, m_or) \
+	voyager_twiddle_bits(cookie, SM502_GPIO_DATA0, m_and, m_or)
 /* control gpio pin usage - 0 is gpio, 1 is other stuff ( like PWM ) */
-void voyager_control_gpio(void *, uint32_t, uint32_t);
+#define voyager_control_gpio(cookie, m_and, m_or) \
+	voyager_twiddle_bits(cookie, SM502_GPIO0_CONTROL, m_and, m_or)
+/* gpio direction - 1 is output */
+#define voyager_gpio_dir(cookie, m_and, m_or) \
+	voyager_twiddle_bits(cookie, SM502_GPIO_DIR0, m_and, m_or)
+#define voyager_control_power_0(cookie, m_and, m_or) \
+	voyager_twiddle_bits(cookie, SM502_POWER_MODE0_GATE, m_and, m_or)
 
 void *voyager_establish_intr(device_t, int, int (*)(void *), void *);
 void  voyager_disestablish_intr(device_t, void *);