Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/macppc add support for the Keywest I2C and snapper ...



details:   https://anonhg.NetBSD.org/src/rev/38eebf5bf3f7
branches:  trunk
changeset: 556782:38eebf5bf3f7
user:      grant <grant%NetBSD.org@localhost>
date:      Sat Dec 27 02:19:34 2003 +0000

description:
add support for the Keywest I2C and snapper audio device, as found on
some iBook and PowerBook models.

this driver was written by Tsubai Masanari and further hacked on by
Jared D. McNeill to work on his iBook.

the driver is limited (master volume control only, and I haven't
tested recording) but has been functioning perfectly on my PowerBook
g4 DVI (ivory) for some time.

ok'd by matt.

diffstat:

 sys/arch/macppc/conf/GENERIC      |     7 +-
 sys/arch/macppc/conf/files.macppc |    12 +-
 sys/arch/macppc/dev/ki2c.c        |   367 +++++++++
 sys/arch/macppc/dev/snapper.c     |  1399 +++++++++++++++++++++++++++++++++++++
 4 files changed, 1782 insertions(+), 3 deletions(-)

diffs (truncated from 1834 to 300 lines):

diff -r 9fd632c4f589 -r 38eebf5bf3f7 sys/arch/macppc/conf/GENERIC
--- a/sys/arch/macppc/conf/GENERIC      Sat Dec 27 01:16:55 2003 +0000
+++ b/sys/arch/macppc/conf/GENERIC      Sat Dec 27 02:19:34 2003 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.169 2003/12/22 10:10:41 dyoung Exp $
+# $NetBSD: GENERIC,v 1.170 2003/12/27 02:19:34 grant Exp $
 #
 # GENERIC machine description file
 # 
@@ -22,7 +22,7 @@
 
 options        INCLUDE_CONFIG_FILE     # embed config file in kernel binary
 
-#ident                 "GENERIC-$Revision: 1.169 $"
+#ident                 "GENERIC-$Revision: 1.170 $"
 
 maxusers       32
 
@@ -301,7 +301,9 @@
 # If you uncomment this, you'll also want to uncomment "audio* at awacs?"
 # below.
 #awacs*        at obio?                        # Apple audio device
+#ki2c* at obio?                        # Keywest I2C
 wi*    at obio?                        # AirMac
+#snapper* at obio?                     # Snapper audio device
 
 cardslot* at cbb?
 cardbus* at cardslot?
@@ -429,6 +431,7 @@
 audio* at eap?
 #audio*        at eso?
 #audio*        at fms?
+#audio*        at snapper?
 #audio*        at sv?
 audio* at uaudio?
 
diff -r 9fd632c4f589 -r 38eebf5bf3f7 sys/arch/macppc/conf/files.macppc
--- a/sys/arch/macppc/conf/files.macppc Sat Dec 27 01:16:55 2003 +0000
+++ b/sys/arch/macppc/conf/files.macppc Sat Dec 27 02:19:34 2003 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files.macppc,v 1.60 2003/11/19 02:54:50 matt Exp $
+#      $NetBSD: files.macppc,v 1.61 2003/12/27 02:19:34 grant Exp $
 #
 # macppc-specific configuration info
 
@@ -198,4 +198,14 @@
 
 file arch/macppc/macppc/rbus_machdep.c         cardbus
 
+# Keywest I2C
+device ki2c {}
+attach ki2c at obio
+file arch/macppc/dev/ki2c.c                    ki2c
+
+# snapper audio
+device snapper: audiobus, auconv, mulaw, aurateconv
+attach snapper at obio
+file arch/macppc/dev/snapper.c                 snapper
+
 include "arch/macppc/conf/majors.macppc"
diff -r 9fd632c4f589 -r 38eebf5bf3f7 sys/arch/macppc/dev/ki2c.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/macppc/dev/ki2c.c        Sat Dec 27 02:19:34 2003 +0000
@@ -0,0 +1,367 @@
+/*     $NetBSD: ki2c.c,v 1.1 2003/12/27 02:19:34 grant Exp $   */
+/*     Id: ki2c.c,v 1.7 2002/10/05 09:56:05 tsubai Exp */
+
+/*-
+ * Copyright (c) 2001 Tsubai Masanari.  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.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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/param.h>
+#include <sys/device.h>
+#include <sys/systm.h>
+
+#include <dev/ofw/openfirm.h>
+#include <uvm/uvm_extern.h>
+#include <machine/autoconf.h>
+
+/* Keywest I2C Register offsets */
+#define MODE   0
+#define CONTROL        1
+#define STATUS 2
+#define ISR    3
+#define IER    4
+#define ADDR   5
+#define SUBADDR        6
+#define DATA   7
+
+/* MODE */
+#define I2C_SPEED      0x03    /* Speed mask */
+#define  I2C_100kHz    0x00
+#define  I2C_50kHz     0x01
+#define  I2C_25kHz     0x02
+#define I2C_MODE       0x0c    /* Mode mask */
+#define  I2C_DUMBMODE  0x00    /*  Dumb mode */
+#define  I2C_STDMODE   0x04    /*  Standard mode */
+#define  I2C_STDSUBMODE        0x08    /*  Standard mode + sub address */
+#define  I2C_COMBMODE  0x0c    /*  Combined mode */
+#define I2C_PORT       0xf0    /* Port mask */
+
+/* CONTROL */
+#define I2C_CT_AAK     0x01    /* Send AAK */
+#define I2C_CT_ADDR    0x02    /* Send address(es) */
+#define I2C_CT_STOP    0x04    /* Send STOP */
+#define I2C_CT_START   0x08    /* Send START */
+
+/* STATUS */
+#define I2C_ST_BUSY    0x01    /* Busy */
+#define I2C_ST_LASTAAK 0x02    /* Last AAK */
+#define I2C_ST_LASTRW  0x04    /* Last R/W */
+#define I2C_ST_SDA     0x08    /* SDA */
+#define I2C_ST_SCL     0x10    /* SCL */
+
+/* ISR/IER */
+#define I2C_INT_DATA   0x01    /* Data byte sent/received */
+#define I2C_INT_ADDR   0x02    /* Address sent */
+#define I2C_INT_STOP   0x04    /* STOP condition sent */
+#define I2C_INT_START  0x08    /* START condition sent */
+
+/* I2C flags */
+#define I2C_BUSY       0x01
+#define I2C_READING    0x02
+#define I2C_ERROR      0x04
+
+struct ki2c_softc {
+       struct device sc_dev;
+       u_char *sc_reg;
+       int sc_regstep;
+
+       int sc_flags;
+       u_char *sc_data;
+       int sc_resid;
+};
+
+int ki2c_match(struct device *, struct cfdata *, void *);
+void ki2c_attach(struct device *, struct device *, void *);
+inline u_int ki2c_readreg(struct ki2c_softc *, int);
+inline void ki2c_writereg(struct ki2c_softc *, int, u_int);
+u_int ki2c_getmode(struct ki2c_softc *);
+void ki2c_setmode(struct ki2c_softc *, u_int);
+u_int ki2c_getspeed(struct ki2c_softc *);
+void ki2c_setspeed(struct ki2c_softc *, u_int);
+int ki2c_intr(struct ki2c_softc *);
+int ki2c_poll(struct ki2c_softc *, int);
+int ki2c_start(struct ki2c_softc *, int, int, void *, int);
+int ki2c_read(struct ki2c_softc *, int, int, void *, int);
+int ki2c_write(struct ki2c_softc *, int, int, const void *, int);
+
+struct cfattach ki2c_ca = {
+       "ki2c", {}, sizeof(struct ki2c_softc), ki2c_match, ki2c_attach
+};
+
+int
+ki2c_match(parent, match, aux)
+       struct device *parent;
+       struct cfdata *match;
+       void *aux;
+{
+       struct confargs *ca = aux;
+
+       if (strcmp(ca->ca_name, "i2c") == 0)
+               return 1;
+
+       return 0;
+}
+
+void
+ki2c_attach(parent, self, aux)
+       struct device *parent;
+       struct device *self;
+       void *aux;
+{
+       struct ki2c_softc *sc = (struct ki2c_softc *)self;
+       struct confargs *ca = aux;
+       int node = ca->ca_node;
+       int rate;
+
+       ca->ca_reg[0] += ca->ca_baseaddr;
+
+       if (OF_getprop(node, "AAPL,i2c-rate", &rate, 4) != 4) {
+               printf(": cannot get i2c-rate\n");
+               return;
+       }
+       if (OF_getprop(node, "AAPL,address", &sc->sc_reg, 4) != 4) {
+               printf(": unable to find i2c address\n");
+               return;
+       }
+       if (OF_getprop(node, "AAPL,address-step", &sc->sc_regstep, 4) != 4) {
+               printf(": unable to find i2c address step\n");
+               return;
+       }
+
+       printf("\n");
+
+       ki2c_writereg(sc, STATUS, 0);
+       ki2c_writereg(sc, ISR, 0);
+       ki2c_writereg(sc, IER, 0);
+
+       ki2c_setmode(sc, I2C_STDSUBMODE);
+       ki2c_setspeed(sc, I2C_100kHz);          /* XXX rate */
+}
+
+u_int
+ki2c_readreg(sc, reg)
+       struct ki2c_softc *sc;
+       int reg;
+{
+       u_char *addr = sc->sc_reg + sc->sc_regstep * reg;
+
+       return *addr;
+}
+
+void
+ki2c_writereg(sc, reg, val)
+       struct ki2c_softc *sc;
+       int reg;
+       u_int val;
+{
+       u_char *addr = sc->sc_reg + sc->sc_regstep * reg;
+
+       *addr = val;
+       asm volatile ("eieio");
+       delay(10);
+}
+
+u_int
+ki2c_getmode(sc)
+       struct ki2c_softc *sc;
+{
+       return ki2c_readreg(sc, MODE) & I2C_MODE;
+}
+
+void
+ki2c_setmode(sc, mode)
+       struct ki2c_softc *sc;
+       u_int mode;
+{
+       u_int x;
+
+       KASSERT((mode & ~I2C_MODE) == 0);
+       x = ki2c_readreg(sc, MODE);
+       x &= ~I2C_MODE;
+       x |= mode;
+       ki2c_writereg(sc, MODE, x);
+}
+
+u_int
+ki2c_getspeed(sc)
+       struct ki2c_softc *sc;
+{
+       return ki2c_readreg(sc, MODE) & I2C_SPEED;
+}
+
+void
+ki2c_setspeed(sc, speed)
+       struct ki2c_softc *sc;
+       u_int speed;
+{
+       u_int x;
+
+       KASSERT((speed & ~I2C_SPEED) == 0);
+       x = ki2c_readreg(sc, MODE);
+       x &= ~I2C_SPEED;
+       x |= speed;
+       ki2c_writereg(sc, MODE, x);
+}
+
+int
+ki2c_intr(sc)
+       struct ki2c_softc *sc;
+{
+       u_int isr, x;
+
+       isr = ki2c_readreg(sc, ISR);
+
+       if (isr & I2C_INT_ADDR) {
+#if 0



Home | Main Index | Thread Index | Old Index