NetBSD Problem Report #44687

From www@NetBSD.org  Sat Mar  5 11:44:51 2011
Return-Path: <www@NetBSD.org>
Received: from mail.netbsd.org (mail.netbsd.org [204.152.190.11])
	by www.NetBSD.org (Postfix) with ESMTP id 5B5E563B91F
	for <gnats-bugs@gnats.NetBSD.org>; Sat,  5 Mar 2011 11:44:51 +0000 (UTC)
Message-Id: <20110305114447.C684163B907@www.NetBSD.org>
Date: Sat,  5 Mar 2011 11:44:47 +0000 (UTC)
From: jasper@pointless.net
Reply-To: jasper@pointless.net
To: gnats-bugs@NetBSD.org
Subject: patch to support the NXP PCA9544A I2C bus multiplxer
X-Send-Pr-Version: www-1.0

>Number:         44687
>Category:       kern
>Synopsis:       patch to support the NXP PCA9544A I2C bus multiplxer
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    kern-bug-people
>State:          open
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Sat Mar 05 11:45:00 +0000 2011
>Last-Modified:  Sun Mar 27 18:45:01 +0000 2011
>Originator:     Jasper Wallace
>Release:        5.99.45
>Organization:
Pointless.net
>Environment:
NetBSD monstrosity 5.99.45 NetBSD 5.99.45 (MONSTROSITY) #30: Sat Mar  5 08:33:13 GMT 2011  jasper@limpit:/home/jasper/develop/netbsd/netbsd-src-and-build/tree/l.64/obj/sys/arch/amd64/compile/MONSTROSITY amd64

>Description:
The Tyan S3992 has 2 i2c buses, access to which are switched by an NXP PCA9544A I2C bus multiplxer which we don't support.

>How-To-Repeat:
Obtain a Tyan S3992. Be filled with a irrational urge to support all the devices on it's SMBus. 
>Fix:

If the patch is mangled you can also find it here:

http://pointless.net/~jasper/S3992-patches/iicmux.patch

--- /dev/null	2011-03-04 20:14:38.533221912 +0000
+++ src/sys/dev/i2c/iicmux.c	2011-03-05 08:32:52.000000000 +0000
@@ -0,0 +1,152 @@
+/* $NetBSD$ */
+
+/*-
+ * Copyright (c) 2011 Jasper Wallace
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JASPER WALLACE
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL JASPER WALLACE
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/rwlock.h>
+#include <sys/device.h>
+#include <sys/kernel.h>
+#include <sys/errno.h>
+
+#include <sys/bus.h>
+#include <dev/i2c/i2cvar.h>
+#include <dev/i2c/iicmuxreg.h>
+#include <dev/i2c/iicmuxvar.h>
+#include <dev/i2c/iicmuxchanvar.h>
+
+#include "locators.h"
+
+/*
+ * Driver for the PCA9544A quad i2c bus multiplexer/switch
+ */
+
+static int iicmux_match(device_t, cfdata_t, void *);
+static void iicmux_attach(device_t, device_t, void *);
+
+CFATTACH_DECL_NEW(iicmux, sizeof (struct iicmux_softc),
+    iicmux_match, iicmux_attach, NULL, NULL);
+
+static int iicmux_search(device_t parent, cfdata_t cf, const int *ldesc, void * aux);
+static int iicmux_print(void * aux, const char *pnp);
+
+static int
+iicmux_match(device_t parent, cfdata_t cf, void *aux)
+{
+	struct i2c_attach_args *ia = aux;
+	struct iicmuxchan_softc *psc = NULL;
+	struct iicmux_softc *ppsc = NULL;
+
+	/* check that the parent's parent isn't an instance of iicmuxchan,
+	 * this stops us recursivly attaching to ourself.
+	 * Check that the chanel's parents address isn't the same as ours.
+	 */
+	if (strstr(parent->dv_parent->dv_xname, "iicmuxchan") == parent->dv_parent->dv_xname) {
+	    psc = device_private(parent->dv_parent);
+	    ppsc = device_private(psc->parent);
+	    
+	    if (ia->ia_addr == ppsc->sc_address)
+	    {
+                return 0;
+            }
+        }
+
+	/* not much to probe for, so just check the address is possible */
+	if ((ia->ia_addr & IICMUX_ADDRMASK) == IICMUX_ADDR)
+		return 1;
+	return 0;
+}
+
+static void
+iicmux_attach(device_t parent, device_t self, void *aux)
+{
+	struct iicmux_softc *sc = device_private(self);
+	struct i2c_attach_args *ia = aux;
+	uint8_t current = 0;
+	int ret;
+
+	sc->sc_address = ia->ia_addr;
+	sc->sc_tag = ia->ia_tag;
+	sc->bus_type = ia->ia_type;
+	
+	rw_init(&sc->sc_rwlock);
+	
+	iic_acquire_bus(sc->sc_tag, 0);
+	ret = iic_smbus_receive_byte(sc->sc_tag, sc->sc_address, &current, 0);
+	iic_release_bus(sc->sc_tag, 0);
+
+	sc->current = (current & IICMUX_CHANMASK) - 4;
+
+	aprint_naive(": current channel: %d\n", sc->current);
+	aprint_normal(": current channel: %d\n", sc->current);
+		
+	config_search_ia(iicmux_search, self, "iicmux", NULL);
+}
+
+static int
+iicmux_print(void * aux, const char *pnp)
+{
+    struct iicmux_attach_args *ia = aux;
+    
+    aprint_normal(" channel %d", ia->channel);
+    
+    return(UNCONF);
+}
+
+static int
+iicmux_search(device_t parent, cfdata_t cf, const int *ldesc, void * aux)
+{
+    struct iicmux_attach_args ia;
+    
+    ia.channel = cf->cf_loc[IICMUXCF_CHANNEL];
+    
+    if (config_match(parent, cf, &ia) > 0)
+        config_attach(parent, cf, &ia, iicmux_print);
+    
+    return 0;
+}
+
+int iicmux_switchto(device_t self, int channel)
+{
+        struct iicmux_softc *sc = device_private(self);
+        int ret;
+
+        /*
+         * the child bus must aquire the (parent) bus before calling us
+         * also we should be locked.
+         */
+	KASSERT(rw_write_held(&sc->sc_rwlock));
+
+        ret = iic_smbus_send_byte(sc->sc_tag, sc->sc_address, channel + 4, 0);
+        sc->current = channel;
+
+        return ret;
+}
+
--- /dev/null	2011-03-04 20:14:38.533221912 +0000
+++ src/sys/dev/i2c/iicmuxchan.c	2011-03-05 08:30:57.000000000 +0000
@@ -0,0 +1,167 @@
+/* $NetBSD$ */
+
+/*-
+ * Copyright (c) 2011 Jasper Wallace
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JASPER WALLACE
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL JASPER WALLACE
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD$");
+
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/systm.h>
+#include <sys/rwlock.h>
+#include <sys/bus.h>
+#include <sys/intr.h>
+
+#include <dev/i2c/i2cvar.h>
+#include <dev/i2c/iicmuxchanvar.h>
+#include <dev/i2c/iicmuxvar.h>
+
+static int iicmuxchan_match(device_t, cfdata_t, void *);
+static void iicmuxchan_attach(device_t, device_t, void *);
+
+static int  iicmuxchan_acquire_bus(void *, int);
+static void iicmuxchan_release_bus(void *, int);
+static int  iicmuxchan_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t,
+		void *, size_t, int);
+
+static const struct i2c_controller iicmuxchancontroller = {
+	.ic_acquire_bus = iicmuxchan_acquire_bus,
+	.ic_release_bus = iicmuxchan_release_bus,
+	.ic_exec	= iicmuxchan_exec,
+};
+
+CFATTACH_DECL_NEW(iicmuxchan, sizeof (struct iicmuxchan_softc),
+  iicmuxchan_match, iicmuxchan_attach, NULL, NULL);
+
+static int
+iicmuxchan_match(device_t parent, cfdata_t cf, void *aux)
+{
+        struct iicmux_attach_args *ia = aux;
+
+        // not much to match on.
+        if (ia->channel < 0 || ia->channel > 3)
+          return 0;
+
+        return 1;
+}
+
+void
+iicmuxchan_attach(device_t parent, device_t self, void *aux)
+{
+        struct iicmuxchan_softc *sc = device_private(self);
+	struct iicmux_attach_args *ia = aux;
+	struct i2cbus_attach_args iba;
+	struct iicmux_softc * psc = device_private(parent);
+
+	rw_init(&sc->sc_rwlock);
+
+	sc->channel = ia->channel;
+	sc->parent = parent;
+	sc->sc_i2c = iicmuxchancontroller;
+	sc->sc_i2c.ic_cookie = sc;
+
+	memset(&iba, 0, sizeof(iba));
+	iba.iba_type = psc->bus_type; /* The parents bus type */
+	iba.iba_tag = &sc->sc_i2c;
+
+	aprint_naive("\n");
+	aprint_normal("\n");
+
+	config_found_ia(self, "i2cbus", &iba, iicbus_print);
+}
+
+static int
+iicmuxchan_acquire_bus(void *v, int flags)
+{
+	struct iicmuxchan_softc * const sc = v;
+	struct iicmux_softc * psc = device_private(sc->parent);
+	int ret;
+
+	/* XXX do something with flags == I2C_F_POLL */
+        rw_enter(&sc->sc_rwlock, RW_WRITER);
+
+	/* lock the parent bus */
+	ret = iic_acquire_bus(psc->sc_tag, flags);
+
+	if (ret != 0)
+	{
+	  /* if ret then we failed to acquire the parents lock
+	   * above and so we don't need to release it.
+	   */
+	  rw_exit(&sc->sc_rwlock);
+	  return ret;
+        }
+
+        /* acquire our parent device lock */
+        rw_enter(&psc->sc_rwlock, RW_WRITER);
+
+        /* are we already on the right channel? */
+        if (psc->current != sc->channel)
+        {
+              iicmux_switchto(sc->parent, sc->channel);
+        }
+	
+	return 0;
+}
+
+static void
+iicmuxchan_release_bus(void *v, int flags)
+{
+	struct iicmuxchan_softc * const sc = v;
+	struct iicmux_softc * psc = device_private(sc->parent);
+
+	rw_exit(&sc->sc_rwlock);
+	/* release parent bus */
+	iic_release_bus(psc->sc_tag, flags);
+	/* and parent device */
+	rw_exit(&psc->sc_rwlock);
+}
+
+int
+iicmuxchan_exec(void *v, i2c_op_t op, i2c_addr_t addr,
+	const void *cmdbuf, size_t cmdlen,
+	void *databuf, size_t datalen,
+	int flags)
+{
+	struct iicmuxchan_softc * const sc = v;
+	struct iicmux_softc * psc = device_private(sc->parent);
+	int ret;
+
+	KASSERT(rw_write_held(&sc->sc_rwlock));
+	KASSERT(rw_write_held(&psc->sc_rwlock));
+
+	/* this can trigger if a device on the bus dosn't acquire the
+         * bus before trying to use it.
+	 */
+	KASSERT(psc->current == sc->channel);
+	
+	/* fire it off using the parents bus tag. */
+	ret = iic_exec(psc->sc_tag, op, addr, cmdbuf, cmdlen, databuf, datalen,
+	                flags);
+	
+	return ret;
+}
--- /dev/null	2011-03-04 20:14:38.533221912 +0000
+++ src/sys/dev/i2c/iicmuxchanvar.h	2011-03-05 03:57:56.000000000 +0000
@@ -0,0 +1,50 @@
+/* $NetBSD$ */
+
+/*-
+ * Copyright (c) 2011 Jasper Wallace
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JASPER WALLACE
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL JASPER WALLACE
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _DEV_I2C_IICMUXCHANVAR_H_
+#define _DEV_I2C_IICMUXCHANVAR_H_
+
+#include <dev/i2c/i2cvar.h>
+#include <sys/rwlock.h>
+
+struct iicmuxchan_softc {
+        device_t		sc_dev;
+	bus_space_tag_t		sc_iot;
+	bus_space_handle_t	sc_ioh;
+
+	struct i2c_controller	sc_i2c;
+
+	krwlock_t		sc_rwlock;
+
+	int			channel;
+	device_t		parent; /* the actual controller */
+};
+
+void	iicmuxchan_attach_common(device_t, struct iicmuxchan_softc *);
+
+#endif /* !_DEV_I2C_IICMUXCHANVAR_H_ */
--- /dev/null	2011-03-04 20:14:38.533221912 +0000
+++ src/sys/dev/i2c/iicmuxreg.h	2011-03-05 03:57:55.000000000 +0000
@@ -0,0 +1,47 @@
+/* $NetBSD$ */
+
+/*-
+ * Copyright (c) 2011 Jasper Wallace
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JASPER WALLACE
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL JASPER WALLACE
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _DEV_I2C_IICMUXREG_H_
+#define _DEV_I2C_IICMUXREG_H_
+
+/*
+ * PCA9544A has bottom 3 address bits vairable, top 4 are 1110
+ */
+
+#define IICMUX_ADDR	0x70
+#define IICMUX_ADDRMASK	0x78
+
+#define IICMUX_CHAN0	4
+#define IICMUX_CHAN1	5
+#define IICMUX_CHAN2	6
+#define IICMUX_CHAN3	7
+
+#define IICMUX_CHANMASK	7
+#define IICMUX_INTMASK	0xf
+
+#endif /* _DEV_I2C_IICMUXREG_H_ */
--- /dev/null	2011-03-04 20:14:38.533221912 +0000
+++ src/sys/dev/i2c/iicmuxvar.h	2011-03-05 08:24:49.000000000 +0000
@@ -0,0 +1,53 @@
+/* $NetBSD$ */
+
+/*-
+ * Copyright (c) 2011 Jasper Wallace
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JASPER WALLACE
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL JASPER WALLACE
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _DEV_I2C_IICMUXVAR_H_
+#define _DEV_I2C_IICMUXVAR_H_
+
+
+#include <dev/i2c/i2cvar.h>
+#include <sys/rwlock.h>
+
+struct iicmux_attach_args {
+  int channel;
+};
+
+struct iicmux_softc {
+        device_t	sc_dev;
+	i2c_tag_t	sc_tag;
+	i2c_addr_t	sc_address;
+
+	int 		current; /* the current channel */
+	int		bus_type; /* type of i2c bus */
+
+	krwlock_t	sc_rwlock; /* lock for the sub busses, sort of. */
+};
+
+int iicmux_switchto(device_t, int);
+
+#endif /* !_DEV_I2C_IICMUXVAR_H_ */
Index: src/sys/dev/i2c/files.i2c
===================================================================
RCS file: /cvsroot/src/sys/dev/i2c/files.i2c,v
retrieving revision 1.33
diff -u -u -r1.33 files.i2c
--- src/sys/dev/i2c/files.i2c	14 Feb 2011 08:50:39 -0000	1.33
+++ src/sys/dev/i2c/files.i2c	5 Mar 2011 08:58:05 -0000
@@ -150,3 +150,14 @@
 device	ibmhawk: sysmon_envsys
 attach	ibmhawk at iic
 file	dev/i2c/ibmhawk.c		ibmhawk
+
+# PCA9544A i2c bus multiplexer
+device	iicmux {[channel = -1]}
+attach	iicmux at iic
+file	dev/i2c/iicmux.c		iicmux
+
+# the channel we're multiplexing
+device iicmuxchan: i2cbus
+attach iicmuxchan at iicmux
+file dev/i2c/iicmuxchan.c		iicmuxchan	needs-flag
+
Index: src/share/man/man4/Makefile
===================================================================
RCS file: /cvsroot/src/share/man/man4/Makefile,v
retrieving revision 1.548
diff -u -u -r1.548 Makefile
--- src/share/man/man4/Makefile	26 Jan 2011 18:48:12 -0000	1.548
+++ src/share/man/man4/Makefile	5 Mar 2011 11:36:39 -0000
@@ -29,8 +29,8 @@
 	glxtphy.4 gpib.4 gpio.4 gpiolock.4 gpiosim.4 gre.4 gphyter.4 gsip.4 \
 	hdaudio.4 hifn.4 hme.4 hpqlb.4 hptide.4 \
 	ichsmb.4 icmp.4 icp.4 icsphy.4 iee.4 ieee80211.4 \
-	ifmedia.4 igphy.4 igsfb.4 iha.4 ihphy.4 iic.4 inet.4 ikphy.4 inphy.4 \
-	intersil7170.4 \
+	ifmedia.4 igphy.4 igsfb.4 iha.4 ihphy.4 iic.4 iicmux.4 inet.4 \
+	ikphy.4 inphy.4 intersil7170.4 \
 	ioasic.4 ioat.4 iop.4 iophy.4 iopsp.4 ip.4 ipkdb.4 ipmi.4 ipw.4 \
 	iso.4 isp.4 isv.4 itesio.4 iteide.4 iwi.4 iwn.4 ixpide.4 \
 	jme.4 jmide.4 joy.4 \
@@ -182,6 +182,7 @@
 MLINKS+=hdaudio.4 hdaudiobus.4
 MLINKS+=icp.4 icpsp.4
 MLINKS+=irframe.4 irda.4
+MLiNKS+=iicmux.4 iicmuxchan.4
 MLINKS+=le.4 bicc.4 le.4 nele.4 le.4 depca.4
 MLINKS+=midi.4 music.4
 MLINKS+=midi.4 rmidi.4
--- /dev/null	2011-03-04 20:14:38.533221912 +0000
+++ src/share/man/man4/iicmux.4	2011-03-05 11:38:59.000000000 +0000
@@ -0,0 +1,98 @@
+.\"	$NetBSD$
+.\"
+.\" Copyright (c) 2011 Jasper Wallace <jasper@pointless.net>
+.\"
+.\" Permission to use, copy, modify, and distribute this software for any
+.\" purpose with or without fee is hereby granted, provided that the above
+.\" copyright notice and this permission notice appear in all copies.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.\"
+.Dd March 5, 2011
+.Dt iicmux 4
+.Os
+.Sh NAME
+.Nm iicmux
+.Nd I2C Multiplexer
+.Sh SYNOPSIS
+.Cd "iicmux0 at iic?"
+.Cd "iicmuxchan0 at iicmux0 channel 2"
+.Cd "iicmuxchan1 at iicmux0 channel 3"
+.Sh DESCRIPTION
+The
+.Nm
+driver provides support for the
+.Tn Philips Semiconductors
+NXP PCA9544A
+.Xr iic
+bus multiplexer.
+The device supports up to 4 sub
+.Xr iic
+buses which are switched to as needed when devices on the child buses are accessed.
+Which channels to use should be specified by the channel argument to the
+iicmuxchan child devices.
+.Sh EXAMPLES
+For a
+.Tn Tyan
+S3992 this
+.Xr config 5
+works:
+.Bd -literal
+piixpm* at pci? dev ? function ?
+iic0 at piixpm?
+iicmux0 at iic0 addr 0x71
+iicmuxchan0 at iicmux0 channel 2
+iicmuxchan1 at iicmux0 channel 3
+iic1 at iicmuxchan0
+iic2 at iicmuxchan1
+dbcool* at iic1 addr 0x2E
+dbcool* at iic2 addr 0x2E
+spdmem* at iic1 addr 0x50
+spdmem* at iic2 addr 0x50
+spdmem* at iic1 addr 0x51
+spdmem* at iic2 addr 0x51
+spdmem* at iic1 addr 0x52
+spdmem* at iic2 addr 0x52
+spdmem* at iic1 addr 0x53
+spdmem* at iic2 addr 0x53
+spdmem* at iic1 addr 0x54
+spdmem* at iic2 addr 0x54
+spdmem* at iic1 addr 0x55
+spdmem* at iic2 addr 0x55
+spdmem* at iic1 addr 0x56
+spdmem* at iic2 addr 0x56
+spdmem* at iic1 addr 0x57
+spdmem* at iic2 addr 0x57
+.Ed
+.Sh SEE ALSO
+.Xr iic 4
+.Sh HISTORY
+The
+.Nm
+device appeared in
+.Nx 6.0 .
+.Sh AUTHORS
+The
+.Nm
+driver was written by
+.An Jasper Wallace .
+.Sh CAVEATS
+Due to the nature of I2C It's not possible to work out which channels
+actually have buses attached to them.
+You may be forced to resort to attaching a logic analyser onto the SMBus
+header pins on your motherboard and then running the BIOS's hardware
+monitoring to see which devices are at what addresses and channels.
+.Pp
+It's probably not a good idea to configure channels that you're not
+certain are physically present on your motherboard.
+.Sh BUGS
+Any devices configured on the child channels that share addresses with
+devices configured on the parent bus will break things horribly.
+.Pp
+Interrupt support is unimplemented.

>Audit-Trail:
From: Jasper Wallace <jasper@pointless.net>
To: gnats-bugs@NetBSD.org
Cc: kern-bug-people@netbsd.org, gnats-admin@netbsd.org, netbsd-bugs@netbsd.org
Subject: Re: kern/44687: patch to support the NXP PCA9544A I2C bus
 multiplxer
Date: Sun, 27 Mar 2011 19:42:21 +0100 (BST)

 On Sat, 5 Mar 2011, jasper@pointless.net wrote:

 > >Number:         44687
 > >Category:       kern
 > >Synopsis:       patch to support the NXP PCA9544A I2C bus multiplxer

 oops forgot to include the setlist changes:

 Index: distrib/sets/lists/man/mi
 ===================================================================
 RCS file: /cvsroot/src/distrib/sets/lists/man/mi,v
 retrieving revision 1.1283
 diff -u -u -r1.1283 mi
 --- distrib/sets/lists/man/mi	26 Jan 2011 18:48:11 -0000	1.1283
 +++ distrib/sets/lists/man/mi	27 Mar 2011 18:00:56 -0000
 @@ -1144,6 +1144,7 @@
  ./usr/share/man/cat4/iha.0			man-sys-catman		.cat
  ./usr/share/man/cat4/ihphy.0			man-sys-catman		.cat
  ./usr/share/man/cat4/iic.0			man-sys-catman		.cat
 +./usr/share/man/cat4/iicmux.0			man-sys-catman		.cat
  ./usr/share/man/cat4/ikphy.0			man-sys-catman		.cat
  ./usr/share/man/cat4/imp.0			man-obsolete		obsolete
  ./usr/share/man/cat4/inet.0			man-sys-catman		.cat
 @@ -3868,6 +3869,7 @@
  ./usr/share/man/html4/iha.html			man-sys-htmlman		html
  ./usr/share/man/html4/ihphy.html		man-sys-htmlman		html
  ./usr/share/man/html4/iic.html			man-sys-htmlman		html
 +./usr/share/man/html4/iicmux.html		man-sys-htmlman		html
  ./usr/share/man/html4/ikphy.html		man-sys-htmlman		html
  ./usr/share/man/html4/inet.html			man-sys-htmlman		html
  ./usr/share/man/html4/inet6.html		man-sys-htmlman		html
 @@ -6429,6 +6431,7 @@
  ./usr/share/man/man4/iha.4			man-sys-man		.man
  ./usr/share/man/man4/ihphy.4			man-sys-man		.man
  ./usr/share/man/man4/iic.4			man-sys-man		.man
 +./usr/share/man/man4/iicmux.4			man-sys-man		.man
  ./usr/share/man/man4/ikphy.4			man-sys-man		.man
  ./usr/share/man/man4/imp.4			man-obsolete		obsolete
  ./usr/share/man/man4/inet.4			man-sys-man		.man


 -- 
 [http://pointless.net/]                                   [0x2ECA0975]

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.