Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/sandpoint Rewritten to take advantage of the new MI...
details: https://anonhg.NetBSD.org/src/rev/92e963bcb501
branches: trunk
changeset: 760751:92e963bcb501
user: phx <phx%NetBSD.org@localhost>
date: Wed Jan 12 18:09:03 2011 +0000
description:
Rewritten to take advantage of the new MI motoi2c code.
diffstat:
sys/arch/sandpoint/conf/files.sandpoint | 4 +-
sys/arch/sandpoint/sandpoint/iic_eumb.c | 299 ++-----------------------------
2 files changed, 25 insertions(+), 278 deletions(-)
diffs (truncated from 361 to 300 lines):
diff -r 82294c6fe00a -r 92e963bcb501 sys/arch/sandpoint/conf/files.sandpoint
--- a/sys/arch/sandpoint/conf/files.sandpoint Wed Jan 12 18:06:26 2011 +0000
+++ b/sys/arch/sandpoint/conf/files.sandpoint Wed Jan 12 18:09:03 2011 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: files.sandpoint,v 1.26 2010/05/29 22:47:02 phx Exp $
+# $NetBSD: files.sandpoint,v 1.27 2011/01/12 18:09:03 phx Exp $
#
# Motorola's "SandPoint" evaluation board and multiplied descendents.
#
@@ -48,7 +48,7 @@
file arch/sandpoint/sandpoint/eumb.c eumb
attach com at eumb with com_eumb
file arch/sandpoint/sandpoint/com_eumb.c com_eumb needs-flag
-device ociic: i2cbus, i2cexec
+device ociic: motoi2c, i2cbus
attach ociic at eumb with iic_eumb
file arch/sandpoint/sandpoint/iic_eumb.c iic_eumb
diff -r 82294c6fe00a -r 92e963bcb501 sys/arch/sandpoint/sandpoint/iic_eumb.c
--- a/sys/arch/sandpoint/sandpoint/iic_eumb.c Wed Jan 12 18:06:26 2011 +0000
+++ b/sys/arch/sandpoint/sandpoint/iic_eumb.c Wed Jan 12 18:09:03 2011 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: iic_eumb.c,v 1.9 2010/10/31 11:08:06 nisimura Exp $ */
+/* $NetBSD: iic_eumb.c,v 1.10 2011/01/12 18:09:03 phx Exp $ */
/*-
- * Copyright (c) 2010 Frank Wille.
+ * Copyright (c) 2010,2011 Frank Wille.
* All rights reserved.
*
* Written by Frank Wille for The NetBSD Project.
@@ -29,308 +29,55 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: iic_eumb.c,v 1.9 2010/10/31 11:08:06 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: iic_eumb.c,v 1.10 2011/01/12 18:09:03 phx Exp $");
#include <sys/param.h>
#include <sys/device.h>
-#include <sys/systm.h>
-#include <sys/mutex.h>
#include <machine/bus.h>
-#include <machine/intr.h>
-#include <machine/pio.h>
-
-#include <dev/i2c/i2cvar.h>
-
+#include <dev/i2c/motoi2cvar.h>
#include <sandpoint/sandpoint/eumbvar.h>
struct iic_eumb_softc {
- struct device sc_dev;
- bus_space_tag_t sc_iot;
- bus_space_handle_t sc_ioh;
- struct i2c_controller sc_i2c;
- kmutex_t sc_buslock;
- bool sc_start;
+ device_t sc_dev;
+ struct motoi2c_softc sc_motoi2c;
};
static int iic_eumb_match(struct device *, struct cfdata *, void *);
static void iic_eumb_attach(struct device *, struct device *, void *);
-CFATTACH_DECL(iic_eumb, sizeof(struct iic_eumb_softc),
+CFATTACH_DECL_NEW(iic_eumb, sizeof(struct iic_eumb_softc),
iic_eumb_match, iic_eumb_attach, NULL, NULL);
-static int motoi2c_acquire_bus(void *, int);
-static void motoi2c_release_bus(void *, int);
-static int motoi2c_send_start(void *, int);
-static int motoi2c_send_stop(void *, int);
-static int motoi2c_initiate_xfer(void *, uint16_t, int);
-static int motoi2c_read_byte(void *, uint8_t *, int);
-static int motoi2c_write_byte(void *, uint8_t, int);
-static int motoi2c_waitxferdone(struct iic_eumb_softc *);
-
-struct iic_eumb_softc *iic_eumb;
-
-static struct i2c_controller motoi2c = {
- .ic_acquire_bus = motoi2c_acquire_bus,
- .ic_release_bus = motoi2c_release_bus,
- .ic_send_start = motoi2c_send_start,
- .ic_send_stop = motoi2c_send_stop,
- .ic_initiate_xfer = motoi2c_initiate_xfer,
- .ic_read_byte = motoi2c_read_byte,
- .ic_write_byte = motoi2c_write_byte,
-};
-
-/*
- * This I2C controller seems to share a common design with
- * i.MX/MC9328. Different names in bit field definition and
- * not suffered from document error.
- */
-#define I2CADR 0x0000 /* my own I2C addr to respond for an external master */
-#define I2CFDR 0x0004 /* frequency devider */
-#define I2CCR 0x0008 /* control */
-#define CR_MEN 0x80 /* enable this HW */
-#define CR_MIEN 0x40 /* enable interrupt */
-#define CR_MSTA 0x20 /* 0->1 activates START, 1->0 makes STOP condition */
-#define CR_MTX 0x10 /* 1 for Tx, 0 for Rx */
-#define CR_TXAK 0x08 /* 1 makes no acknowledge when Rx */
-#define CR_RSTA 0x04 /* generate repeated START condition */
-#define I2CSR 0x000c /* status */
-#define SR_MCF 0x80 /* 0 means transfer in progress, 1 when completed */
-#define SR_MBB 0x20 /* 1 before STOP condition is detected */
-#define SR_MAL 0x10 /* arbitration was lost */
-#define SR_MIF 0x02 /* indicates data transter completion */
-#define SR_RXAK 0x01 /* 1 to indicate receive has completed */
-#define I2CDR 0x0010 /* data */
-
-#define I2C_READ(r) bus_space_read_4(sc->sc_iot, sc->sc_ioh, (r))
-#define I2C_WRITE(r,v) bus_space_write_4(sc->sc_iot, sc->sc_ioh, (r), (v))
-#define I2C_SETCLR(r, s, c) \
- bus_space_write_4(sc->sc_iot, sc->sc_ioh, (r), \
- (bus_space_read_4(sc->sc_iot, sc->sc_ioh, (r)) | (s)) & ~(c))
-
static int found;
static int
-iic_eumb_match(struct device *parent, struct cfdata *cf, void *aux)
+iic_eumb_match(device_t parent, cfdata_t cf, void *aux)
{
- return (found == 0);
-}
-
-static void
-iic_eumb_attach(struct device *parent, struct device *self, void *aux)
-{
- struct iic_eumb_softc *sc;
- struct eumb_attach_args *eaa;
- struct i2cbus_attach_args iba;
- bus_space_handle_t ioh;
-
- sc = (struct iic_eumb_softc *)self;
- eaa = aux;
- found = 1;
- printf("\n");
-
- bus_space_map(eaa->eumb_bt, 0x3000, 0x20, 0, &ioh);
- mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_NONE);
-
- iic_eumb = sc;
- sc->sc_i2c = motoi2c;
- sc->sc_i2c.ic_cookie = sc;
- sc->sc_iot = eaa->eumb_bt;
- sc->sc_ioh = ioh;
- sc->sc_start = false;
- memset(&iba, 0, sizeof(iba));
- iba.iba_tag = &sc->sc_i2c;
-
- I2C_WRITE(I2CCR, 0); /* reset before changing anything */
- I2C_WRITE(I2CFDR, 0x1031); /* DFFSR=0x10, divider 3072 (0x31) */
- I2C_WRITE(I2CADR, 0x7f << 1); /* our slave address is 0x7f */
- I2C_WRITE(I2CSR, 0); /* clear status flags */
- I2C_WRITE(I2CCR, CR_MEN); /* enable the I2C module */
-
- config_found_ia(&sc->sc_dev, "i2cbus", &iba, iicbus_print);
-
-#if 0
- /* we do not use the I2C interrupt yet */
- intr_establish(16 + 16, IST_LEVEL, IPL_BIO, motoic2_intr, sc);
-#endif
-}
-
-static int
-motoi2c_acquire_bus(void *v, int flags)
-{
- struct iic_eumb_softc *sc;
-
- sc = v;
- mutex_enter(&sc->sc_buslock);
- return 0;
+ return found == 0;
}
static void
-motoi2c_release_bus(void *v, int flags)
-{
- struct iic_eumb_softc *sc;
-
- sc = v;
- mutex_exit(&sc->sc_buslock);
-}
-
-static int
-motoi2c_send_start(void *v, int flags)
-{
- struct iic_eumb_softc *sc;
- int timo;
-
- sc = v;
-
- if (!sc->sc_start && (I2C_READ(I2CSR) & SR_MBB) != 0) {
- /* wait for bus becoming available */
- timo = 100;
- do
- DELAY(10);
- while (--timo > 0 && (I2C_READ(I2CSR) & SR_MBB) != 0);
-
- if (timo == 0) {
-#ifdef DEBUG
- printf("%s: bus is busy\n", __func__);
-#endif
- return -1;
- }
- }
- else if (sc->sc_start &&
- (I2C_READ(I2CSR) & (SR_MIF | SR_MAL)) == SR_MIF) {
- sc->sc_start = false;
-#ifdef DEBUG
- printf("%s: lost the bus\n", __func__);
-#endif
- return -1;
- }
-
- /* reset interrupt and arbitration-lost flags */
- I2C_SETCLR(I2CSR, 0, SR_MIF | SR_MAL);
-
- if (!sc->sc_start) {
- /* generate start condition */
- I2C_SETCLR(I2CCR, CR_MSTA | CR_MTX, CR_TXAK | CR_RSTA);
- sc->sc_start = true;
- } else /* repeated start, we still own the bus */
- I2C_SETCLR(I2CCR, CR_RSTA | CR_MTX, CR_TXAK);
-
- return 0;
-}
-
-static int
-motoi2c_send_stop(void *v, int flags)
-{
- struct iic_eumb_softc *sc;
-
- sc = v;
- I2C_SETCLR(I2CCR, 0, CR_MSTA | CR_RSTA | CR_TXAK);
- sc->sc_start = false;
- DELAY(100);
- return 0;
-}
-
-static int
-motoi2c_initiate_xfer(void *v, i2c_addr_t addr, int flags)
+iic_eumb_attach(device_t parent, device_t self, void *aux)
{
struct iic_eumb_softc *sc;
-
- sc = v;
-
- /* start condition */
- if (motoi2c_send_start(v, flags) != 0)
- return -1;
-
- /* send target address and transfer direction */
- I2C_WRITE(I2CDR, (addr << 1) | ((flags & I2C_F_READ) ? 1 : 0));
+ struct eumb_attach_args *eaa;
+ bus_space_handle_t ioh;
- if (motoi2c_waitxferdone(sc) == 0) {
- if (flags & I2C_F_READ) {
- /* clear TX mode */
- I2C_SETCLR(I2CCR, 0, CR_MTX);
- /*
- * A dummy read is required to start with
- * receiving bytes.
- */
- (void)I2C_READ(I2CDR);
- }
- if (flags & I2C_F_STOP)
- return motoi2c_send_stop(v, flags);
- return 0;
- }
- return -1;
-}
+ sc = device_private(self);
+ sc->sc_dev = self;
+ eaa = aux;
+ found = 1;
-static int
-motoi2c_read_byte(void *v, uint8_t *bytep, int flags)
-{
- struct iic_eumb_softc *sc;
-
- sc = v;
-
- /* wait for next byte */
- if (motoi2c_waitxferdone(sc) != 0)
- return -1;
-
- /* no TX-acknowledge for next byte */
- if (flags & I2C_F_LAST)
- I2C_SETCLR(I2CCR, CR_TXAK, 0);
-
- *bytep = I2C_READ(I2CDR);
+ aprint_naive("\n");
+ aprint_normal("\n");
Home |
Main Index |
Thread Index |
Old Index