Module Name: src
Committed By: nisimura
Date: Wed Dec 22 02:32:53 UTC 2021
Modified Files:
src/sys/arch/arm/sociox: sni_i2c.c
Log Message:
add register definitions. the design is BCM2835 I2C look-a-like.
To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/arm/sociox/sni_i2c.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/sociox/sni_i2c.c
diff -u src/sys/arch/arm/sociox/sni_i2c.c:1.13 src/sys/arch/arm/sociox/sni_i2c.c:1.14
--- src/sys/arch/arm/sociox/sni_i2c.c:1.13 Tue Dec 21 06:00:45 2021
+++ src/sys/arch/arm/sociox/sni_i2c.c Wed Dec 22 02:32:53 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: sni_i2c.c,v 1.13 2021/12/21 06:00:45 nisimura Exp $ */
+/* $NetBSD: sni_i2c.c,v 1.14 2021/12/22 02:32:53 nisimura Exp $ */
/*-
* Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sni_i2c.c,v 1.13 2021/12/21 06:00:45 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sni_i2c.c,v 1.14 2021/12/22 02:32:53 nisimura Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -53,23 +53,67 @@ __KERNEL_RCSID(0, "$NetBSD: sni_i2c.c,v
#include <dev/acpi/acpivar.h>
#include <dev/acpi/acpi_intr.h>
+#define BSR 0x00 /* status */
+#define BSR_BB (1U<<7) /* busy */
+#define BSR_RSC (1U<<6) /* repeated cycle condition */
+#define BSR_AL (1U<<5) /* arbitration lost */
+#define BSR_LRB (1U<<4) /* last bit received */
+#define BSR_XFR (1U<<3) /* start transfer */
+#define BSR_AAS (1U<<2) /* ??? address as slave */
+#define BSR_GCA (1U<<1) /* ??? general call address */
+#define BSR_FBT (1U<<0) /* first byte transfer detected */
+#define BCR 0x04 /* control */
+#define BCR_BERR (1U<<7) /* bus error report; W0C */
+#define BCR_BEIEN (1U<<6) /* enable bus error interrupt */
+#define BCR_SCC (1U<<5) /* make start condition */
+#define BCR_MSS (1U<<4) /* 1: xmit, 0: recv */
+#define BCR_ACK (1U<<3) /* make acknowledge at last byte */
+#define BCR_GCAA (1U<<2) /* ??? general call access ack */
+#define BCR_IEN (1U<<1) /* enable interupt */
+#define BCR_INT (1U<<0) /* interrupt report; W0C */
+#define CCR 0x08
+#define CCR_FM (1U<<6) /* speed; 1: fast, 0: standard */
+#define CCR_EN (1U<<5) /* enable clock feed */
+/* 4:0 clock rate select */
+#define ADR 0x0c /* 6:0 my own address */
+#define DAR 0x10 /* 7:0 data port */
+#define CSR 0x14 /* 5:0 clock divisor */
+#define FSR 0x18 /* bus clock frequency */
+#define BC2R 0x1c /* control 2 */
+#define BC2R_SDA (1U<<5) /* detected SDA signal */
+#define BC2R_SCL (1U<<5) /* detected SCL signal */
+#define BC2R_SDA_L (1U<<1) /* make SDA signal low */
+#define BC2R_SCL_L (1U<<1) /* make SCL signal low */
+
static int sniiic_fdt_match(device_t, struct cfdata *, void *);
static void sniiic_fdt_attach(device_t, device_t, void *);
static int sniiic_acpi_match(device_t, struct cfdata *, void *);
static void sniiic_acpi_attach(device_t, device_t, void *);
+typedef enum {
+ EXEC_IDLE = 0, /* sane and idle */
+ EXEC_ADDR = 1, /* send address bits */
+ EXEC_CMD = 2, /* send command bits */
+ EXEC_SEND = 3, /* data xmit */
+ EXEC_RECV = 4, /* data recv */
+ EXEC_DONE = 5, /* xter done */
+ EXEC_ERR = 6, /* recover error */
+} state_t;
+
struct sniiic_softc {
device_t sc_dev;
struct i2c_controller sc_ic;
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
- bus_addr_t sc_iob;
bus_size_t sc_ios;
void *sc_ih;
kmutex_t sc_lock;
kmutex_t sc_mtx;
kcondvar_t sc_cv;
volatile bool sc_busy;
+ state_t sc_state;
+ u_int sc_frequency;
+ u_int sc_clkrate;
int sc_phandle;
};
@@ -90,9 +134,9 @@ static int sni_i2c_intr(void *);
static void sni_i2c_reset(struct sniiic_softc *);
static void sni_i2c_flush(struct sniiic_softc *);
-#define I2C_READ(sc, reg) \
+#define CSR_READ(sc, reg) \
bus_space_read_4((sc)->sc_ioh,(sc)->sc_ioh,(reg))
-#define I2C_WRITE(sc, reg, val) \
+#define CSR_WRITE(sc, reg, val) \
bus_space_write_4((sc)->sc_ioh,(sc)->sc_ioh,(reg),(val))
static const struct device_compatible_entry compat_data[] = {
@@ -146,7 +190,6 @@ sniiic_fdt_attach(device_t parent, devic
sc->sc_dev = self;
sc->sc_iot = faa->faa_bst;
sc->sc_ioh = ioh;
- sc->sc_iob = addr;
sc->sc_ios = size;
sc->sc_phandle = phandle;
@@ -213,7 +256,6 @@ sniiic_acpi_attach(device_t parent, devi
sc->sc_dev = self;
sc->sc_iot = aa->aa_memt;
sc->sc_ioh = ioh;
- sc->sc_iob = mem->ar_base;
sc->sc_ios = mem->ar_length;
sc->sc_phandle = 0;