Module Name:    src
Committed By:   thorpej
Date:           Sun Jan 12 17:48:42 UTC 2020

Modified Files:
        src/sys/arch/arm/sunxi: sunxi_twi.c
        src/sys/dev/i2c: files.i2c gttwsi_core.c gttwsireg.h gttwsivar.h
        src/sys/dev/marvell: gttwsi.c

Log Message:
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.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/sunxi/sunxi_twi.c
cvs rdiff -u -r1.107 -r1.108 src/sys/dev/i2c/files.i2c
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/i2c/gttwsi_core.c
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/i2c/gttwsireg.h
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/i2c/gttwsivar.h
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/marvell/gttwsi.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/sunxi/sunxi_twi.c
diff -u src/sys/arch/arm/sunxi/sunxi_twi.c:1.10 src/sys/arch/arm/sunxi/sunxi_twi.c:1.11
--- src/sys/arch/arm/sunxi/sunxi_twi.c:1.10	Sun Jul  1 21:16:19 2018
+++ src/sys/arch/arm/sunxi/sunxi_twi.c	Sun Jan 12 17:48:42 2020
@@ -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 <jmcne...@invisible.ca>
@@ -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 @@ __KERNEL_RCSID(0, "$NetBSD: sunxi_twi.c,
 #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 @@ const struct fdtbus_i2c_controller_func 
 	.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 @@ sunxi_twi_set_clock(struct gttwsi_softc 
 	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_set_clock(struct gttwsi_softc 
 		}
 	}
 
-	sunxi_twi_reg_write(sc, TWSI_BAUDRATE, baud);
+	gttwsi_write_4(sc, TWSI_BAUDRATE, baud);
 	delay(10000);
 }
 
@@ -202,9 +178,7 @@ sunxi_twi_attach(device_t parent, device
 	    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.

Index: src/sys/dev/i2c/files.i2c
diff -u src/sys/dev/i2c/files.i2c:1.107 src/sys/dev/i2c/files.i2c:1.108
--- src/sys/dev/i2c/files.i2c:1.107	Fri Jan  3 18:00:05 2020
+++ src/sys/dev/i2c/files.i2c	Sun Jan 12 17:48:42 2020
@@ -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 @@ define	motoi2c
 file	dev/i2c/motoi2c.c			motoi2c
 define	mvi2c
 file	dev/i2c/gttwsi_core.c			mvi2c
-defflag opt_gttwsi.h				GTTWSI_ALLWINNER
 
 #
 # I2C client devices

Index: src/sys/dev/i2c/gttwsi_core.c
diff -u src/sys/dev/i2c/gttwsi_core.c:1.11 src/sys/dev/i2c/gttwsi_core.c:1.12
--- src/sys/dev/i2c/gttwsi_core.c:1.11	Sat Jan 11 22:21:25 2020
+++ src/sys/dev/i2c/gttwsi_core.c	Sun Jan 12 17:48:42 2020
@@ -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_write_byte(void *v, ui
 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 @@ gttwsi_attach_subr(device_t self, bus_sp
 	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 @@ gttwsi_attach_subr(device_t self, bus_sp
 	 */
 	/* reset */
 	gttwsi_write_4(sc, TWSI_SOFTRESET, SOFTRESET_VAL);
-
 }
 
 void

Index: src/sys/dev/i2c/gttwsireg.h
diff -u src/sys/dev/i2c/gttwsireg.h:1.3 src/sys/dev/i2c/gttwsireg.h:1.4
--- src/sys/dev/i2c/gttwsireg.h:1.3	Thu Sep 11 11:14:44 2014
+++ src/sys/dev/i2c/gttwsireg.h	Sun Jan 12 17:48:42 2020
@@ -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
 
-#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
+	/* 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
+
+	/* 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

Index: src/sys/dev/i2c/gttwsivar.h
diff -u src/sys/dev/i2c/gttwsivar.h:1.5 src/sys/dev/i2c/gttwsivar.h:1.6
--- src/sys/dev/i2c/gttwsivar.h:1.5	Wed Dec 25 14:08:47 2019
+++ src/sys/dev/i2c/gttwsivar.h	Sun Jan 12 17:48:42 2020
@@ -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 @@ struct gttwsi_softc {
 	kmutex_t sc_mtx;
 	kcondvar_t sc_cv;
 
-	bool sc_iflg_rwc;
+	const bus_size_t *sc_regmap;	/* GTTWSI_NREGS entries */
 
-	uint32_t (*sc_reg_read)(struct gttwsi_softc *, uint32_t);
-	void (*sc_reg_write)(struct gttwsi_softc *, uint32_t, uint32_t);
+	bool sc_iflg_rwc;
 };
 
-void	gttwsi_attach_subr(device_t, bus_space_tag_t, bus_space_handle_t);
+void	gttwsi_attach_subr(device_t, bus_space_tag_t, bus_space_handle_t,
+			   const bus_size_t *);
 void	gttwsi_config_children(device_t);
 
+uint32_t gttwsi_read_4(struct gttwsi_softc *, uint32_t);
+void	gttwsi_write_4(struct gttwsi_softc *, uint32_t, uint32_t);
+
 int	gttwsi_intr(void *);
 
 #endif /* _DEV_MARVELL_GTTSWI_VAR_H_ */

Index: src/sys/dev/marvell/gttwsi.c
diff -u src/sys/dev/marvell/gttwsi.c:1.11 src/sys/dev/marvell/gttwsi.c:1.12
--- src/sys/dev/marvell/gttwsi.c:1.11	Fri Sep  6 00:56:12 2013
+++ src/sys/dev/marvell/gttwsi.c	Sun Jan 12 17:48:42 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: gttwsi.c,v 1.11 2013/09/06 00:56:12 matt Exp $	*/
+/*	$NetBSD: gttwsi.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.c,v 1.11 2013/09/06 00:56:12 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gttwsi.c,v 1.12 2020/01/12 17:48:42 thorpej Exp $");
 #include "locators.h"
 
 #include <sys/param.h>
@@ -87,6 +87,16 @@ __KERNEL_RCSID(0, "$NetBSD: gttwsi.c,v 1
 
 #include <dev/marvell/marvellvar.h>
 
+static const bus_size_t marvell_twsi_regmap[GTTWSI_NREGS] = {
+	[TWSI_SLAVEADDR]	= TWSI_MARVELL_SLAVEADDR,
+	[TWSI_EXTEND_SLAVEADDR]	= TWSI_MARVELL_EXTEND_SLAVEADDR,
+	[TWSI_DATA]		= TWSI_MARVELL_DATA,
+	[TWSI_CONTROL]		= TWSI_MARVELL_CONTROL,
+	[TWSI_STATUS]		= TWSI_MARVELL_STATUS,
+	[TWSI_BAUDRATE]		= TWSI_MARVELL_BAUDRATE,
+	[TWSI_SOFTRESET]	= TWSI_MARVELL_SOFTRESET,
+};
+
 static int	gttwsi_match(device_t, cfdata_t, void *);
 static void	gttwsi_attach(device_t, device_t, void *);
 
@@ -124,7 +134,7 @@ gttwsi_attach(device_t parent, device_t 
 		return;
 	}
 
-	gttwsi_attach_subr(self, mva->mva_iot, ioh);
+	gttwsi_attach_subr(self, mva->mva_iot, ioh, marvell_twsi_regmap);
 
 	marvell_intr_establish(mva->mva_irq, IPL_BIO, gttwsi_intr,
 	    device_private(self));

Reply via email to