Source-Changes-HG archive

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

[src/trunk]: src/sys Clean up gttwsi's register access stuff:



details:   https://anonhg.NetBSD.org/src/rev/ac1c0bd26019
branches:  trunk
changeset: 467066:ac1c0bd26019
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Sun Jan 12 17:48:42 2020 +0000

description:
Clean up gttwsi's register access stuff:
- Garbage-collect the obsolete GTTWSI_ALLWINNER option; it hasn't been
  needed since FDT'ization of the Allwinner support code.
- Redefine thw "TWSI_*" register definitions to clearly call out:
  -> The Marvell flavor of the offsets
  -> The Allwinner flavor of the offsets
  ...and make the regular definitions indices into a register map.
- Pass the appropriate register map from the front-end to the core.
- Remove the customer register read/write callbacks -- they are no longer
  needed now that each front-end passes an appropriate register map to
  the core.

diffstat:

 sys/arch/arm/sunxi/sunxi_twi.c |  56 +++++++++++------------------------------
 sys/dev/i2c/files.i2c          |   3 +-
 sys/dev/i2c/gttwsi_core.c      |  43 ++++++++++---------------------
 sys/dev/i2c/gttwsireg.h        |  50 ++++++++++++++++++++++---------------
 sys/dev/i2c/gttwsivar.h        |  13 ++++++---
 sys/dev/marvell/gttwsi.c       |  16 +++++++++--
 6 files changed, 81 insertions(+), 100 deletions(-)

diffs (truncated from 365 to 300 lines):

diff -r a1b80d7d9003 -r ac1c0bd26019 sys/arch/arm/sunxi/sunxi_twi.c
--- a/sys/arch/arm/sunxi/sunxi_twi.c    Sun Jan 12 17:46:55 2020 +0000
+++ b/sys/arch/arm/sunxi/sunxi_twi.c    Sun Jan 12 17:48:42 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_twi.c,v 1.10 2018/07/01 21:16:19 jmcneill Exp $ */
+/* $NetBSD: sunxi_twi.c,v 1.11 2020/01/12 17:48:42 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -26,14 +26,9 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "opt_gttwsi.h"
-#ifdef GTTWSI_ALLWINNER
-# error Do not define GTTWSI_ALLWINNER when using this driver
-#endif
-
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: sunxi_twi.c,v 1.10 2018/07/01 21:16:19 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_twi.c,v 1.11 2020/01/12 17:48:42 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -52,22 +47,14 @@
 #define         TWI_CCR_CLK_M  __BITS(6,3)
 #define         TWI_CCR_CLK_N  __BITS(2,0)
 
-static uint8_t sunxi_twi_regmap_rd[] = {
-       [TWSI_SLAVEADDR/4]              = 0x00,
-       [TWSI_EXTEND_SLAVEADDR/4]       = 0x04,
-       [TWSI_DATA/4]                   = 0x08,
-       [TWSI_CONTROL/4]                = 0x0c,
-       [TWSI_STATUS/4]                 = 0x10,
-       [TWSI_SOFTRESET/4]              = 0x18,
-};
-
-static uint8_t sunxi_twi_regmap_wr[] = {
-       [TWSI_SLAVEADDR/4]              = 0x00,
-       [TWSI_EXTEND_SLAVEADDR/4]       = 0x04,
-       [TWSI_DATA/4]                   = 0x08,
-       [TWSI_CONTROL/4]                = 0x0c,
-       [TWSI_BAUDRATE/4]               = 0x14,
-       [TWSI_SOFTRESET/4]              = 0x18,
+static const bus_size_t sunxi_twi_regmap[] = {
+       [TWSI_SLAVEADDR]        = TWSI_ALLWINNER_SLAVEADDR,
+       [TWSI_EXTEND_SLAVEADDR] = TWSI_ALLWINNER_EXTEND_SLAVEADDR,
+       [TWSI_DATA]             = TWSI_ALLWINNER_DATA,
+       [TWSI_CONTROL]          = TWSI_ALLWINNER_CONTROL,
+       [TWSI_STATUS]           = TWSI_ALLWINNER_STATUS,
+       [TWSI_BAUDRATE]         = TWSI_ALLWINNER_BAUDRATE,
+       [TWSI_SOFTRESET]        = TWSI_ALLWINNER_SOFTRESET,
 };
 
 static int sunxi_twi_match(device_t, cfdata_t, void *);
@@ -106,18 +93,6 @@
        .get_tag = sunxi_twi_get_tag,
 };
 
-static uint32_t
-sunxi_twi_reg_read(struct gttwsi_softc *sc, uint32_t reg)
-{
-       return bus_space_read_4(sc->sc_bust, sc->sc_bush, sunxi_twi_regmap_rd[reg/4]);
-}
-
-static void
-sunxi_twi_reg_write(struct gttwsi_softc *sc, uint32_t reg, uint32_t val)
-{
-       bus_space_write_4(sc->sc_bust, sc->sc_bush, sunxi_twi_regmap_wr[reg/4], val);
-}
-
 static u_int
 sunxi_twi_calc_rate(u_int parent_rate, u_int n, u_int m)
 {
@@ -130,11 +105,12 @@
        uint32_t baud;
        u_int n, m, best_rate;
 
-       baud = sunxi_twi_reg_read(sc, TWSI_BAUDRATE);
+       baud = gttwsi_read_4(sc, TWSI_BAUDRATE);
 
        for (best_rate = 0, n = 0; n < 8; n++) {
                for (m = 0; m < 16; m++) {
-                       const u_int tmp_rate = sunxi_twi_calc_rate(parent_rate, n, m);
+                       const u_int tmp_rate =
+                           sunxi_twi_calc_rate(parent_rate, n, m);
                        if (tmp_rate <= rate && tmp_rate > best_rate) {
                                best_rate = tmp_rate;
                                baud = __SHIFTIN(n, TWI_CCR_CLK_N) |
@@ -143,7 +119,7 @@
                }
        }
 
-       sunxi_twi_reg_write(sc, TWSI_BAUDRATE, baud);
+       gttwsi_write_4(sc, TWSI_BAUDRATE, baud);
        delay(10000);
 }
 
@@ -202,9 +178,7 @@
            conf->iflg_rwc);
 
        /* Attach gttwsi core */
-       sc->sc_reg_read = sunxi_twi_reg_read;
-       sc->sc_reg_write = sunxi_twi_reg_write;
-       gttwsi_attach_subr(self, bst, bsh);
+       gttwsi_attach_subr(self, bst, bsh, sunxi_twi_regmap);
 
        /*
         * Set clock rate to 100kHz.
diff -r a1b80d7d9003 -r ac1c0bd26019 sys/dev/i2c/files.i2c
--- a/sys/dev/i2c/files.i2c     Sun Jan 12 17:46:55 2020 +0000
+++ b/sys/dev/i2c/files.i2c     Sun Jan 12 17:48:42 2020 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files.i2c,v 1.107 2020/01/03 18:00:05 jmcneill Exp $
+#      $NetBSD: files.i2c,v 1.108 2020/01/12 17:48:42 thorpej Exp $
 
 obsolete defflag       opt_i2cbus.h            I2C_SCAN
 define i2cbus { }
@@ -55,7 +55,6 @@
 file   dev/i2c/motoi2c.c                       motoi2c
 define mvi2c
 file   dev/i2c/gttwsi_core.c                   mvi2c
-defflag opt_gttwsi.h                           GTTWSI_ALLWINNER
 
 #
 # I2C client devices
diff -r a1b80d7d9003 -r ac1c0bd26019 sys/dev/i2c/gttwsi_core.c
--- a/sys/dev/i2c/gttwsi_core.c Sun Jan 12 17:46:55 2020 +0000
+++ b/sys/dev/i2c/gttwsi_core.c Sun Jan 12 17:48:42 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: gttwsi_core.c,v 1.11 2020/01/11 22:21:25 thorpej Exp $ */
+/*     $NetBSD: gttwsi_core.c,v 1.12 2020/01/12 17:48:42 thorpej Exp $ */
 /*
  * Copyright (c) 2008 Eiji Kawauchi.
  * All rights reserved.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gttwsi_core.c,v 1.11 2020/01/11 22:21:25 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gttwsi_core.c,v 1.12 2020/01/12 17:48:42 thorpej Exp $");
 #include "locators.h"
 
 #include <sys/param.h>
@@ -92,45 +92,35 @@
 static int     gttwsi_wait(struct gttwsi_softc *, uint32_t, uint32_t,
                            uint32_t, int);
 
-static inline uint32_t
-gttwsi_default_read_4(struct gttwsi_softc *sc, uint32_t reg)
+uint32_t
+gttwsi_read_4(struct gttwsi_softc *sc, uint32_t reg)
 {
-       uint32_t val = bus_space_read_4(sc->sc_bust, sc->sc_bush, reg);
+       const uint32_t val = bus_space_read_4(sc->sc_bust, sc->sc_bush,
+                                             sc->sc_regmap[reg]);
 #ifdef TWSI_DEBUG
-       printf("I2C:R:%02x:%02x\n", reg, val);
+       printf("I2C:R:[%u]%02x:%02x\n", reg, sc->sc_regmap[reg], val);
 #else
        DELAY(TWSI_READ_DELAY);
 #endif
        return val;
 }
 
-static inline void
-gttwsi_default_write_4(struct gttwsi_softc *sc, uint32_t reg, uint32_t val)
+void
+gttwsi_write_4(struct gttwsi_softc *sc, uint32_t reg, uint32_t val)
 {
+
        bus_space_write_4(sc->sc_bust, sc->sc_bush, reg, val);
 #ifdef TWSI_DEBUG
-       printf("I2C:W:%02x:%02x\n", reg, val);
+       printf("I2C:W:[%u]%02x:%02x\n", reg, sc->sc_regmap[reg], val);
 #else
        DELAY(TWSI_WRITE_DELAY);
 #endif
-       return;
-}
-
-static inline uint32_t
-gttwsi_read_4(struct gttwsi_softc *sc, uint32_t reg)
-{
-       return sc->sc_reg_read(sc, reg);
-}
-
-static inline void
-gttwsi_write_4(struct gttwsi_softc *sc, uint32_t reg, uint32_t val)
-{
-       return sc->sc_reg_write(sc, reg, val);
 }
 
 /* ARGSUSED */
 void
-gttwsi_attach_subr(device_t self, bus_space_tag_t iot, bus_space_handle_t ioh)
+gttwsi_attach_subr(device_t self, bus_space_tag_t iot, bus_space_handle_t ioh,
+                  const bus_size_t *regmap)
 {
        struct gttwsi_softc * const sc = device_private(self);
        prop_dictionary_t cfg = device_properties(self);
@@ -141,11 +131,7 @@
        sc->sc_dev = self;
        sc->sc_bust = iot;
        sc->sc_bush = ioh;
-
-       if (sc->sc_reg_read == NULL)
-               sc->sc_reg_read = gttwsi_default_read_4;
-       if (sc->sc_reg_write == NULL)
-               sc->sc_reg_write = gttwsi_default_write_4;
+       sc->sc_regmap = regmap;
 
        mutex_init(&sc->sc_mtx, MUTEX_DEFAULT, IPL_BIO);
        cv_init(&sc->sc_cv, device_xname(self));
@@ -166,7 +152,6 @@
         */
        /* reset */
        gttwsi_write_4(sc, TWSI_SOFTRESET, SOFTRESET_VAL);
-
 }
 
 void
diff -r a1b80d7d9003 -r ac1c0bd26019 sys/dev/i2c/gttwsireg.h
--- a/sys/dev/i2c/gttwsireg.h   Sun Jan 12 17:46:55 2020 +0000
+++ b/sys/dev/i2c/gttwsireg.h   Sun Jan 12 17:48:42 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: gttwsireg.h,v 1.3 2014/09/11 11:14:44 jmcneill Exp $ */
+/* $NetBSD: gttwsireg.h,v 1.4 2020/01/12 17:48:42 thorpej Exp $ */
 
 /*
  * Copyright (c) 2008 Eiji Kawauchi.
@@ -27,27 +27,37 @@
 #ifndef _GTTWSIREG_H_
 #define _GTTWSIREG_H_
 
-#include "opt_gttwsi.h"
+#define GTTWSI_SIZE            0x100
+#define        GTTWSI_NREGS            7
 
-#define GTTWSI_SIZE            0x100
+       /* reg map indices */
+#define        TWSI_SLAVEADDR                  0
+#define        TWSI_EXTEND_SLAVEADDR           1
+#define        TWSI_DATA                       2
+#define        TWSI_CONTROL                    3
+#define        TWSI_STATUS                     4
+#define        TWSI_BAUDRATE                   5
+#define        TWSI_SOFTRESET                  6
 
-#if defined(GTTWSI_ALLWINNER)
-#define TWSI_SLAVEADDR         0x00
-#define TWSI_EXTEND_SLAVEADDR  0x04
-#define TWSI_DATA              0x08
-#define TWSI_CONTROL           0x0c
-#define TWSI_STATUS            0x10
-#define TWSI_BAUDRATE          0x14
-#define TWSI_SOFTRESET         0x18
-#else
-#define        TWSI_SLAVEADDR          0x00
-#define        TWSI_EXTEND_SLAVEADDR   0x10
-#define        TWSI_DATA               0x04
-#define        TWSI_CONTROL            0x08
-#define        TWSI_STATUS             0x0c    /* for read */
-#define        TWSI_BAUDRATE           0x0c    /* for write */
-#define        TWSI_SOFTRESET          0x1c
-#endif
+       /* register offsets for Allwinner implementations */
+#define        TWSI_ALLWINNER_SLAVEADDR        0x00
+#define        TWSI_ALLWINNER_EXTEND_SLAVEADDR 0x04
+#define        TWSI_ALLWINNER_DATA             0x08
+#define        TWSI_ALLWINNER_CONTROL          0x0c
+#define        TWSI_ALLWINNER_STATUS           0x10
+#define        TWSI_ALLWINNER_BAUDRATE         0x14
+#define        TWSI_ALLWINNER_SOFTRESET        0x18
+#define        TWSI_ALLWINNER_ENH_FEAT         0x1c
+#define        TWSI_ALLWINNER_LINE_CTRL        0x20
+
+       /* register offsets for Marvell implementations */
+#define        TWSI_MARVELL_SLAVEADDR          0x00
+#define        TWSI_MARVELL_EXTEND_SLAVEADDR   0x10
+#define        TWSI_MARVELL_DATA               0x04
+#define        TWSI_MARVELL_CONTROL            0x08
+#define        TWSI_MARVELL_STATUS             0x0c    /* for read */
+#define        TWSI_MARVELL_BAUDRATE           0x0c    /* for write */
+#define        TWSI_MARVELL_SOFTRESET          0x1c
 
 #define        SLAVEADDR_GCE_MASK      0x01
 #define        SLAVEADDR_SADDR_MASK    0xfe
diff -r a1b80d7d9003 -r ac1c0bd26019 sys/dev/i2c/gttwsivar.h
--- a/sys/dev/i2c/gttwsivar.h   Sun Jan 12 17:46:55 2020 +0000
+++ b/sys/dev/i2c/gttwsivar.h   Sun Jan 12 17:48:42 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: gttwsivar.h,v 1.5 2019/12/25 14:08:47 thorpej Exp $    */
+/*     $NetBSD: gttwsivar.h,v 1.6 2020/01/12 17:48:42 thorpej Exp $    */
 /*
  * Copyright (c) 2008 Eiji Kawauchi.
  * All rights reserved.
@@ -88,15 +88,18 @@
        kmutex_t sc_mtx;



Home | Main Index | Thread Index | Old Index